}
void LocalDb::Open(const char *path, const char *snapshot_name,
- const char *snapshot_scheme)
+ const char *snapshot_scheme, double intent)
{
int rc;
/* Insert this snapshot into the database, and determine the integer key
* which will be used to identify it. */
sqlite3_stmt *stmt = Prepare("insert into "
- "snapshots(name, scheme, timestamp) "
- "values (?, ?, julianday('now'))");
+ "snapshots(name, scheme, timestamp, intent) "
+ "values (?, ?, julianday('now'), ?)");
sqlite3_bind_text(stmt, 1, snapshot_name, strlen(snapshot_name),
SQLITE_TRANSIENT);
if (snapshot_scheme == NULL)
else
sqlite3_bind_text(stmt, 2, snapshot_scheme, strlen(snapshot_scheme),
SQLITE_TRANSIENT);
+ sqlite3_bind_double(stmt, 3, intent);
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE) {
} else if (rc == SQLITE_ROW) {
ref = ObjectReference(IdToSegment(sqlite3_column_int64(stmt, 0)),
(const char *)sqlite3_column_text(stmt, 1));
+ ref.set_range(0, size);
} else {
fprintf(stderr, "Could not execute SELECT statement!\n");
ReportError(rc);
sqlite3_stmt *stmt;
bool found = false;
+ // Special objects (such as the zero object) aren't stored in segments, and
+ // so are always available.
+ if (!ref.is_normal())
+ return true;
+
stmt = Prepare("select count(*) from block_index "
"where segmentid = ? and object = ? and expired is null");
sqlite3_bind_int64(stmt, 1, SegmentToId(ref.get_segment()));
int rc;
sqlite3_stmt *stmt;
+ if (!ref.is_normal())
+ return;
+
stmt = Prepare("insert or ignore into snapshot_refs "
"select segmentid, object, size from block_index "
"where segmentid = ? and object = ?");