X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=localdb.cc;h=9bd33d9337cbbb4ca391ebd95ac7ade354bcf449;hb=7deb2384709f61697b430e9756cae4fd6e011f03;hp=733babdcfbcdc8c9929392415c6dce53b1d0ded9;hpb=c7c7041c1b79ffb27647d74a6a345dfcfbf9f190;p=cumulus.git diff --git a/localdb.cc b/localdb.cc index 733babd..9bd33d9 100644 --- a/localdb.cc +++ b/localdb.cc @@ -22,10 +22,12 @@ using std::string; -void LocalDb::Open(const char *path) +void LocalDb::Open(const char *path, const char *snapshot_name) { int rc; + snapshot = snapshot_name; + rc = sqlite3_open(path, &db); if (rc) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); @@ -57,8 +59,8 @@ void LocalDb::StoreObject(const ObjectReference& ref, int rc; sqlite3_stmt *stmt; static const char s[] = - "insert into block_index(segment, object, checksum, size) " - "values (?, ?, ?, ?)"; + "insert into block_index(segment, object, checksum, size, timestamp) " + "values (?, ?, ?, ?, julianday('now'))"; const char *tail; rc = sqlite3_prepare_v2(db, s, strlen(s), &stmt, &tail); @@ -115,3 +117,33 @@ ObjectReference LocalDb::FindObject(const string &checksum, int64_t size) return ref; } + +void LocalDb::UseObject(const ObjectReference& ref) +{ + int rc; + sqlite3_stmt *stmt; + static const char s[] = + "insert into snapshot_contents " + "select blockid, ? as snapshot from block_index " + "where segment = ? and object = ?"; + const char *tail; + + rc = sqlite3_prepare_v2(db, s, strlen(s), &stmt, &tail); + if (rc != SQLITE_OK) { + return; + } + + sqlite3_bind_text(stmt, 1, snapshot.c_str(), snapshot.size(), + SQLITE_TRANSIENT); + string seg = ref.get_segment(); + sqlite3_bind_text(stmt, 2, seg.c_str(), seg.size(), SQLITE_TRANSIENT); + string obj = ref.get_sequence(); + sqlite3_bind_text(stmt, 3, obj.c_str(), obj.size(), SQLITE_TRANSIENT); + + rc = sqlite3_step(stmt); + if (rc != SQLITE_DONE) { + fprintf(stderr, "Could not execute INSERT statement!\n"); + } + + sqlite3_finalize(stmt); +}