X-Git-Url: http://git.vrable.net/?p=cumulus.git;a=blobdiff_plain;f=localdb.cc;h=fd86605a18860fda2d8b8da448e7917410086099;hp=a23ca5e83d2a3e2bca38ec14b225e4e845898163;hb=HEAD;hpb=cdcf66f45ce73b29f8e7e7c4b6c6d20fc3c93575 diff --git a/localdb.cc b/localdb.cc index a23ca5e..fd86605 100644 --- a/localdb.cc +++ b/localdb.cc @@ -32,12 +32,14 @@ #include #include +#include #include #include "localdb.h" #include "store.h" #include "util.h" +using std::map; using std::max; using std::min; using std::set; @@ -319,7 +321,7 @@ bool LocalDb::IsOldObject(const string &checksum, int64_t size, double *age, sqlite3_stmt *stmt; bool found = false; - stmt = Prepare("select segmentid, object, timestamp, expired " + stmt = Prepare("select segmentid, object, julianday(timestamp), expired " "from block_index where checksum = ? and size = ?"); sqlite3_bind_text(stmt, 1, checksum.c_str(), checksum.size(), SQLITE_TRANSIENT); @@ -452,7 +454,7 @@ void LocalDb::UseObject(const ObjectReference& ref) // size will have a reference size capped at just less than the full object // size (we can't tell if some bytes were referenced multiple times, and // thus we conservatively assume some bytes might still be unreferenced). - int64_t new_refs = old_size; + int64_t new_refs; if (ref.has_range()) { new_refs = ref.get_range_length(); } else { @@ -494,7 +496,8 @@ void LocalDb::SetSegmentMetadata(const std::string &segment, stmt = Prepare("update segments set path = ?, checksum = ?, " "type = ?, data_size = ?, disk_size = ?, " - "mtime = coalesce(mtime, julianday('now')) " + "timestamp = coalesce(julianday(timestamp), " + " julianday('now')) " "where segmentid = ?"); sqlite3_bind_text(stmt, 1, path.c_str(), path.size(), SQLITE_TRANSIENT); @@ -515,36 +518,33 @@ void LocalDb::SetSegmentMetadata(const std::string &segment, sqlite3_finalize(stmt); } -bool LocalDb::GetSegmentMetadata(const string &segment, - string *seg_path, - string *seg_checksum) +map LocalDb::GetSegmentMetadata(const string &segment) { int rc; sqlite3_stmt *stmt; - ObjectReference ref; - int found = false; + map info; + + // Names in the returned map, in the order returned from the select + // statement below. + static const char *fields[] = { + "datetime", "path", "checksum", "data_size", "disk_size", "type", NULL + }; - stmt = Prepare("select path, checksum from segments where segment = ?"); + stmt = Prepare("select datetime(timestamp), path, checksum, " + " data_size, disk_size, type " + "from segments where segment = ?"); sqlite3_bind_text(stmt, 1, segment.c_str(), segment.size(), SQLITE_TRANSIENT); rc = sqlite3_step(stmt); if (rc == SQLITE_DONE) { } else if (rc == SQLITE_ROW) { - found = true; - const char *val; - - val = (const char *)sqlite3_column_text(stmt, 0); - if (val == NULL) - found = false; - else - *seg_path = val; - - val = (const char *)sqlite3_column_text(stmt, 1); - if (val == NULL) - found = false; - else - *seg_checksum = val; + info["segment"] = segment; + for (int i = 0; fields[i] != NULL; i++) { + const char *val = (const char *)sqlite3_column_text(stmt, i); + if (val != NULL) + info[fields[i]] = val; + } } else { fprintf(stderr, "Could not execute SELECT statement!\n"); ReportError(rc); @@ -552,7 +552,7 @@ bool LocalDb::GetSegmentMetadata(const string &segment, sqlite3_finalize(stmt); - return found; + return info; } /* Look up and return the packed representation of the subblock chunk