int dbfile_read_all_hashes(struct hash_tree *tree) { int ret; sqlite3 *db; sqlite3_stmt *stmt = NULL; char *filename; uint64_t ino, subvolid, size; struct filerec *file; db = dbfile_get_handle(); if (!db) return ENOENT; ret = dbfile_check_version(db); if (ret) return ret; ret = sqlite3_prepare_v2(db, "SELECT ino, subvol, filename, size from files;", -1, &stmt, NULL); if (ret) { perror_sqlite(ret, "preparing statement"); return ret; } while ((ret = sqlite3_step(stmt)) == SQLITE_ROW) { ino = sqlite3_column_int64(stmt, 0); subvolid = sqlite3_column_int64(stmt, 1); filename = (char *)sqlite3_column_text(stmt, 2); size = sqlite3_column_int64(stmt, 3); file = filerec_new(filename, ino, subvolid, size); if (!file) { ret = ENOMEM; goto out_finalize; } ret = dbfile_walk_file_hashes(db, file, load_into_hash_tree_cb, tree); if (ret) goto out_finalize; } if (ret != SQLITE_DONE) { perror_sqlite(ret, "retrieving hashes from table"); ret = EIO; goto out_finalize; } ret = 0; out_finalize: sqlite3_finalize(stmt); return ret; }
int dbfile_populate_hashes(struct rb_root *d_tree) { int ret; sqlite3 *db; sqlite3_stmt *stmt = NULL; char *filename; uint64_t ino, subvolid; uint64_t num_hashes; struct filerec *file; struct bloom_cb_priv priv; db = dbfile_get_handle(); if (!db) return ENOENT; ret = dbfile_count_rows(db, &num_hashes, NULL); if (ret) return ret; priv.d_tree = d_tree; ret = bloom_init(&priv.bloom, num_hashes, 0.01); if (ret) return ret; ret = sqlite3_prepare_v2(db, "SELECT ino, subvol, filename from files;", -1, &stmt, NULL); if (ret) { perror_sqlite(ret, "preparing statement"); goto out_bloom; } while ((ret = sqlite3_step(stmt)) == SQLITE_ROW) { ino = sqlite3_column_int64(stmt, 0); subvolid = sqlite3_column_int64(stmt, 1); filename = (char *)sqlite3_column_text(stmt, 2); file = filerec_new(filename, ino, subvolid); if (!file) { ret = ENOMEM; goto out_finalize; } ret = dbfile_walk_file_hashes(db, file, load_into_bloom_cb, &priv); if (ret) goto out_finalize; } if (ret != SQLITE_DONE) { perror_sqlite(ret, "retrieving file info from table"); goto out_finalize; } ret = 0; out_finalize: sqlite3_finalize(stmt); out_bloom: bloom_free(&priv.bloom); return ret; }