bool DB::Connection::connect(const char * #if HAVE_SQL_TRACE connectionLabel #endif ) { // Create and set file permissions if the DB does not exist. int fd = open(_dbpath.c_str(), O_CREAT, S_IRUSR | S_IWUSR); if (fd == -1) { DB::logError("Could not open database: %s (errno %i)", _dbpath.c_str(), errno); return false; } ::close(fd); int rv = sqlite3_open_v2(_dbpath.c_str(), &_db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, NULL); if (rv != SQLITE_OK) { reportErrorDB(_db); return false; } int foreignKeyEnabled = 0; rv = sqlite3_db_config(_db,SQLITE_DBCONFIG_ENABLE_FKEY,1,&foreignKeyEnabled); if (rv != SQLITE_OK) { reportErrorDB(_db); return false; } if (foreignKeyEnabled != 1) { DB::logError("Connection::connect: foreign key support not enabled"); return false; } rv = sqlite3_busy_timeout(_db, 15000); // 15 seconds if (rv != SQLITE_OK) { reportErrorDB(_db); return false; } #if HAVE_SQL_TRACE sqlite3_trace(_db, xTrace, const_cast<char *>(connectionLabel)); #endif return true; }
static void reportError(sqlite3_stmt *stmt) { if (!stmt) { DB::logError("sqlite3_stmt pointer is NULL"); return; } reportErrorDB(sqlite3_db_handle(stmt)); }
bool DB::Connection::connect(const char * #if HAVE_SQL_TRACE connectionLabel #endif ) { // Circumvent the sqlite3 reliance on umask to enforce secure permissions mode_t saved_umask = umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); int rv = sqlite3_open_v2(_dbpath.c_str(), &_db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, NULL); // Restore umask to avoid side effects (void) umask(saved_umask); if (rv != SQLITE_OK) { reportErrorDB(_db); return false; } int foreignKeyEnabled = 0; rv = sqlite3_db_config(_db,SQLITE_DBCONFIG_ENABLE_FKEY,1,&foreignKeyEnabled); if (rv != SQLITE_OK) { reportErrorDB(_db); return false; } if (foreignKeyEnabled != 1) { DB::logError("Connection::connect: foreign key support not enabled"); return false; } rv = sqlite3_busy_timeout(_db, 15000); // 15 seconds if (rv != SQLITE_OK) { reportErrorDB(_db); return false; } #if HAVE_SQL_TRACE sqlite3_trace(_db, xTrace, const_cast<char *>(connectionLabel)); #endif return true; }
DB::Statement DB::Connection::prepare(const std::string &format, ...){ // pstatement will hold a dynamically allocated string that needs to be deleted. char *pstatement = NULL; // short form char statement[128]; va_list args; va_start(args, format); int cneeded = vsnprintf(statement,sizeof(statement),format.c_str(),args); va_end(args); if (cneeded<0) { DB::logError("Connection::prepare: vsnprintf encoding error"); return Statement(); } if (((size_t)cneeded)>=sizeof(statement)) { // long form pstatement = new char[cneeded+1]; if (!pstatement) { DB::logError("Connection::prepare: out of memory"); return Statement(); } va_start(args, format); bool ok = vsnprintf(pstatement,cneeded+1,format.c_str(),args)==cneeded; va_end(args); if (!ok) { DB::logError("Connection::prepare: vsnprintf error"); delete[] pstatement; return Statement(); } } sqlite3_stmt *stmt = NULL; int rv = sqlite3_prepare_v2(_db, pstatement ? pstatement : statement, cneeded+1, &stmt, NULL); if (pstatement) delete[] pstatement; if (rv != SQLITE_OK) { reportErrorDB(_db); if (stmt) sqlite3_finalize(stmt); return Statement(); } if (!stmt) { DB::logError("Connection::prepare: expected sqlite3_prepare_v2 to return a compiled " "statement, got NULL, out of memory ?"); return Statement(); } return Statement(stmt); }
bool DB::Connection::setBusyTimeout(int ms) { int rv = sqlite3_busy_timeout(_db, ms); if (rv != SQLITE_OK) { reportErrorDB(_db); return false; } return true; }