+
+/* Store the subblock chunk signatures for a specified object. The object
+ * itself must have already been indexed in the database. */
+void LocalDb::StoreChunkSignatures(ObjectReference ref,
+ const void *buf, size_t len,
+ const string& algorithm)
+{
+ int rc;
+ sqlite3_stmt *stmt;
+
+ stmt = Prepare("select blockid from block_index "
+ "where segmentid = ? and object = ?");
+ sqlite3_bind_int64(stmt, 1, SegmentToId(ref.get_segment()));
+ string obj = ref.get_sequence();
+ sqlite3_bind_text(stmt, 2, obj.c_str(), obj.size(), SQLITE_TRANSIENT);
+
+ rc = sqlite3_step(stmt);
+ if (rc != SQLITE_ROW) {
+ fprintf(stderr,
+ "Could not determine blockid in StoreChunkSignatures!\n");
+ ReportError(rc);
+ fatal("Error getting blockid");
+ }
+ int64_t blockid = sqlite3_column_int64(stmt, 0);
+ sqlite3_finalize(stmt);
+
+ stmt = Prepare("insert or replace "
+ "into subblock_signatures(blockid, algorithm, signatures) "
+ "values (?, ?, ?)");
+ sqlite3_bind_int64(stmt, 1, blockid);
+ sqlite3_bind_text(stmt, 2, algorithm.c_str(), algorithm.size(),
+ SQLITE_TRANSIENT);
+ sqlite3_bind_blob(stmt, 3, buf, len, SQLITE_TRANSIENT);
+
+ rc = sqlite3_step(stmt);
+ if (rc != SQLITE_DONE) {
+ fprintf(stderr, "Could not insert sub-block checksums!\n");
+ ReportError(rc);
+ }
+
+ sqlite3_finalize(stmt);
+}