#include "localdb.h"
#include "store.h"
+#include "util.h"
using std::min;
using std::string;
rc = sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, &tail);
if (rc != SQLITE_OK) {
ReportError(rc);
- throw IOException(string("Error preparing statement: ") + sql);
+ fatal(string("Error preparing statement: ") + sql);
}
return stmt;
if (rc) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
- throw IOException("Error opening local database");
+ fatal("Error opening local database");
}
rc = sqlite3_exec(db, "begin", NULL, NULL, NULL);
if (rc) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
- throw IOException("Error starting transaction");
+ fatal("Error starting transaction");
}
sqlite3_extended_result_codes(db, 1);
if (rc != SQLITE_DONE) {
ReportError(rc);
sqlite3_close(db);
- throw IOException("Database execution error!");
+ fatal("Database execution error!");
}
snapshotid = sqlite3_last_insert_rowid(db);
if (snapshotid == 0) {
ReportError(rc);
sqlite3_close(db);
- throw IOException("Find snapshot id");
+ fatal("Find snapshot id");
}
/* Create a temporary table which will be used to keep track of the objects
if (rc != SQLITE_OK) {
ReportError(rc);
sqlite3_close(db);
- throw IOException("Database initialization");
+ fatal("Database initialization");
}
rc = sqlite3_exec(db,
"create unique index snapshot_refs_index "
if (rc != SQLITE_OK) {
ReportError(rc);
sqlite3_close(db);
- throw IOException("Database initialization");
+ fatal("Database initialization");
}
}
SQLITE_TRANSIENT);
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE) {
- throw IOException("Could not execute INSERT statement!");
+ fatal("Could not execute INSERT statement!");
}
sqlite3_finalize(stmt);
rc = sqlite3_step(stmt);
if (rc == SQLITE_DONE) {
- throw IOException("No segment found by id");
+ fatal("No segment found by id");
} else if (rc == SQLITE_ROW) {
result = sqlite3_column_int64(stmt, 0);
} else {
- throw IOException("Error executing find segment by id query");
+ fatal("Error executing find segment by id query");
}
sqlite3_finalize(stmt);
rc = sqlite3_step(stmt);
if (rc == SQLITE_DONE) {
- throw IOException("No segment found by id");
+ fatal("No segment found by id");
} else if (rc == SQLITE_ROW) {
result = (const char *)sqlite3_column_text(stmt, 0);
} else {
- throw IOException("Error executing find segment by id query");
+ fatal("Error executing find segment by id query");
}
sqlite3_finalize(stmt);
fprintf(stderr,
"Could not determine blockid in StoreChunkSignatures!\n");
ReportError(rc);
- throw IOException("Error getting blockid");
+ fatal("Error getting blockid");
}
int64_t blockid = sqlite3_column_int64(stmt, 0);
sqlite3_finalize(stmt);
if (statcache_out == NULL) {
fprintf(stderr, "Error opening statcache %s: %m\n",
statcache_tmp_path.c_str());
- throw IOException("Error opening statcache");
+ fatal("Error opening statcache");
}
old_metadata_eof = false;
waitpid(signature_pid, &status, 0);
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
- throw IOException("Signature filter process error");
+ fatal("Signature filter process error");
}
}
tar_write(buf, TAR_BLOCK_SIZE);
if (close(filter_fd) != 0)
- throw IOException("Error closing Tarfile");
+ fatal("Error closing Tarfile");
/* ...and wait for filter process to finish. */
int status;
waitpid(filter_pid, &status, 0);
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
- throw IOException("Filter process error");
+ fatal("Filter process error");
}
close(real_fd);
/* Create a pipe for communicating with the filter process. */
if (pipe(fds) < 0) {
- throw IOException("Unable to create pipe for filter");
+ fatal("Unable to create pipe for filter");
}
/* Create a child process which can exec() the filter program. */
pid = fork();
if (pid < 0)
- throw IOException("Unable to fork filter process");
+ fatal("Unable to fork filter process");
if (pid > 0) {
/* Parent process */
if (errno == EINTR)
continue;
fprintf(stderr, "Write error: %m\n");
- throw IOException("Write error");
+ fatal("Write error");
}
len -= res;
* metadata. Currently implemented as map<string, string>. */
typedef std::map<std::string, std::string> dictionary;
-/* IOException will be thrown if an error occurs while reading or writing in
- * one of the I/O wrappers. Depending upon the context; this may be fatal or
- * not--typically, errors reading/writing the store will be serious, but errors
- * reading an individual file are less so. */
-class IOException : public std::exception {
-private:
- std::string error;
-public:
- explicit IOException(const std::string &err) { error = err; }
- virtual ~IOException() throw () { }
- std::string getError() const { return error; }
-};
-
/* Simplified TAR header--we only need to store regular files, don't need to
* handle long filenames, etc. */
static const int TAR_BLOCK_SIZE = 512;
long long parse_int(const std::string &s);
void cloexec(int fd);
-void fatal(std::string msg);
+void fatal(std::string msg) __attribute__((noreturn));
#endif // _LBS_TARSTORE_H