int ret = sqlite3_open(filename.c_str(), &db);
if (ret != SQLITE_OK) {
fprintf(stderr, "%s: %s\n", filename.c_str(), sqlite3_errmsg(db));
- exit(1);
+ abort();
+ }
+
+ // Set an effectively infinite timeout for waiting for write locks;
+ // if we get SQLITE_LOCKED, we just exit out, so this is much better.
+ ret = sqlite3_busy_timeout(db, 3600000);
+ if (ret != SQLITE_OK) {
+ fprintf(stderr, "sqlite3_busy_timeout: %s\n", sqlite3_errmsg(db));
+ abort();
}
sqlite3_exec(db, R"(
sqlite3_exec(db, "CREATE UNIQUE INDEX only_one_state ON state (1);", nullptr, nullptr, nullptr); // Ignore errors.
sqlite3_exec(db, R"(
- CREATE TABLE IF NOT EXISTS settings (settings BLOB, uniqifier NOT NULL DEFAULT 1 UNIQUE);
+ CREATE TABLE IF NOT EXISTS settings (settings BLOB);
)",
nullptr, nullptr, nullptr); // Ignore errors.
int ret = sqlite3_prepare_v2(db, "SELECT state FROM state", -1, &stmt, 0);
if (ret != SQLITE_OK) {
fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
ret = sqlite3_step(stmt);
bool ok = state.ParseFromArray(sqlite3_column_blob(stmt, 0), sqlite3_column_bytes(stmt, 0));
if (!ok) {
fprintf(stderr, "State in database is corrupted!\n");
- exit(1);
+ abort();
}
} else if (ret != SQLITE_DONE) {
fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
ret = sqlite3_finalize(stmt);
if (ret != SQLITE_OK) {
fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
return state;
int ret = sqlite3_exec(db, "BEGIN", nullptr, nullptr, nullptr);
if (ret != SQLITE_OK) {
fprintf(stderr, "BEGIN: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
sqlite3_stmt *stmt;
ret = sqlite3_prepare_v2(db, "REPLACE INTO state VALUES (?)", -1, &stmt, 0);
if (ret != SQLITE_OK) {
fprintf(stderr, "REPLACE prepare: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
sqlite3_bind_blob(stmt, 1, serialized.data(), serialized.size(), SQLITE_STATIC);
ret = sqlite3_step(stmt);
if (ret == SQLITE_ROW) {
fprintf(stderr, "REPLACE step: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
ret = sqlite3_finalize(stmt);
if (ret != SQLITE_OK) {
fprintf(stderr, "REPLACE finalize: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
ret = sqlite3_exec(db, "COMMIT", nullptr, nullptr, nullptr);
if (ret != SQLITE_OK) {
fprintf(stderr, "COMMIT: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
}
int ret = sqlite3_prepare_v2(db, "SELECT settings FROM settings", -1, &stmt, 0);
if (ret != SQLITE_OK) {
fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
ret = sqlite3_step(stmt);
bool ok = settings.ParseFromArray(sqlite3_column_blob(stmt, 0), sqlite3_column_bytes(stmt, 0));
if (!ok) {
fprintf(stderr, "State in database is corrupted!\n");
- exit(1);
+ abort();
}
} else if (ret != SQLITE_DONE) {
fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
ret = sqlite3_finalize(stmt);
if (ret != SQLITE_OK) {
fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
return settings;
int ret = sqlite3_exec(db, "BEGIN", nullptr, nullptr, nullptr);
if (ret != SQLITE_OK) {
fprintf(stderr, "BEGIN: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
sqlite3_stmt *stmt;
ret = sqlite3_prepare_v2(db, "REPLACE INTO settings VALUES (?)", -1, &stmt, 0);
if (ret != SQLITE_OK) {
fprintf(stderr, "REPLACE prepare: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
sqlite3_bind_blob(stmt, 1, serialized.data(), serialized.size(), SQLITE_STATIC);
ret = sqlite3_step(stmt);
if (ret == SQLITE_ROW) {
fprintf(stderr, "REPLACE step: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
ret = sqlite3_finalize(stmt);
if (ret != SQLITE_OK) {
fprintf(stderr, "REPLACE finalize: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
ret = sqlite3_exec(db, "COMMIT", nullptr, nullptr, nullptr);
if (ret != SQLITE_OK) {
fprintf(stderr, "COMMIT: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
}
int ret = sqlite3_prepare_v2(db, "SELECT frames FROM filev2 WHERE filename=? AND size=?", -1, &stmt, 0);
if (ret != SQLITE_OK) {
fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
sqlite3_bind_text(stmt, 1, filename.data(), filename.size(), SQLITE_STATIC);
bool ok = file_contents.ParseFromArray(sqlite3_column_blob(stmt, 0), sqlite3_column_bytes(stmt, 0));
if (!ok) {
fprintf(stderr, "Frame list in database is corrupted!\n");
- exit(1);
+ abort();
}
} else if (ret != SQLITE_DONE) {
fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
ret = sqlite3_finalize(stmt);
if (ret != SQLITE_OK) {
fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
vector<FrameOnDiskAndStreamIdx> frames;
frame.frame.pts = stream.pts(i);
frame.frame.offset = stream.offset(i);
frame.frame.size = stream.file_size(i);
+ if (i < stream.audio_size_size()) {
+ frame.frame.audio_size = stream.audio_size(i);
+ } else {
+ frame.frame.audio_size = 0;
+ }
frames.push_back(frame);
}
}
int ret = sqlite3_exec(db, "BEGIN", nullptr, nullptr, nullptr);
if (ret != SQLITE_OK) {
fprintf(stderr, "BEGIN: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
// Delete any existing instances with this filename.
stream->mutable_pts()->Reserve(frames.size());
stream->mutable_offset()->Reserve(frames.size());
stream->mutable_file_size()->Reserve(frames.size());
+ stream->mutable_audio_size()->Reserve(frames.size());
for (const FrameOnDiskAndStreamIdx &frame : frames) {
if (frame.stream_idx != stream_idx) {
continue;
stream->add_pts(frame.frame.pts);
stream->add_offset(frame.frame.offset);
stream->add_file_size(frame.frame.size);
+ stream->add_audio_size(frame.frame.audio_size);
}
}
string serialized;
ret = sqlite3_prepare_v2(db, "REPLACE INTO filev2 (filename, size, frames) VALUES (?, ?, ?)", -1, &stmt, 0);
if (ret != SQLITE_OK) {
fprintf(stderr, "INSERT prepare: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
sqlite3_bind_text(stmt, 1, filename.data(), filename.size(), SQLITE_STATIC);
ret = sqlite3_step(stmt);
if (ret == SQLITE_ROW) {
fprintf(stderr, "REPLACE step: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
ret = sqlite3_finalize(stmt);
if (ret != SQLITE_OK) {
fprintf(stderr, "REPLACE finalize: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
// Commit.
ret = sqlite3_exec(db, "COMMIT", nullptr, nullptr, nullptr);
if (ret != SQLITE_OK) {
fprintf(stderr, "COMMIT: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
}
int ret = sqlite3_exec(db, "BEGIN", nullptr, nullptr, nullptr);
if (ret != SQLITE_OK) {
fprintf(stderr, "BEGIN: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
ret = sqlite3_exec(db, R"(
if (ret != SQLITE_OK) {
fprintf(stderr, "CREATE TEMPORARY TABLE: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
// Insert the new rows.
ret = sqlite3_prepare_v2(db, "INSERT INTO used_filenames (filename) VALUES (?)", -1, &stmt, 0);
if (ret != SQLITE_OK) {
fprintf(stderr, "INSERT prepare: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
for (const string &filename : used_filenames) {
ret = sqlite3_step(stmt);
if (ret == SQLITE_ROW) {
fprintf(stderr, "INSERT step: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
ret = sqlite3_reset(stmt);
if (ret == SQLITE_ROW) {
fprintf(stderr, "INSERT reset: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
}
ret = sqlite3_finalize(stmt);
if (ret != SQLITE_OK) {
fprintf(stderr, "INSERT finalize: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
ret = sqlite3_exec(db, R"(
if (ret != SQLITE_OK) {
fprintf(stderr, "DELETE: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
ret = sqlite3_exec(db, R"(
if (ret != SQLITE_OK) {
fprintf(stderr, "DROP TABLE: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
// Commit.
ret = sqlite3_exec(db, "COMMIT", nullptr, nullptr, nullptr);
if (ret != SQLITE_OK) {
fprintf(stderr, "COMMIT: %s\n", sqlite3_errmsg(db));
- exit(1);
+ abort();
}
}