static */
| 111 | |
| 112 | /* static */ |
| 113 | Status Sqlite::Open(const string& path, int flags, Sqlite** db) { |
| 114 | flags |= SQLITE_OPEN_PRIVATECACHE; |
| 115 | flags |= SQLITE_OPEN_URI; |
| 116 | sqlite3* sqlite = nullptr; |
| 117 | int rc = sqlite3_open_v2(path.c_str(), &sqlite, flags, nullptr); |
| 118 | if (rc != SQLITE_OK) { |
| 119 | *db = nullptr; |
| 120 | return PrintfStatus(rc, "Sqlite::Open(%s) failed: %s", path.c_str(), |
| 121 | sqlite3_errstr(rc)); |
| 122 | } |
| 123 | CHECK_EQ(SQLITE_OK, sqlite3_extended_result_codes(sqlite, 1)); |
| 124 | CHECK_EQ(SQLITE_OK, sqlite3_snapfn_init(sqlite, nullptr, nullptr)); |
| 125 | // Prepare these tiny privileged statements for SqliteTransaction |
| 126 | // so it can do less work, particularly in its constructor, per |
| 127 | // Google C++ Style. |
| 128 | sqlite3_stmt* begin = PrepareRawOrDie(sqlite, "BEGIN"); |
| 129 | sqlite3_stmt* commit = PrepareRawOrDie(sqlite, "COMMIT"); |
| 130 | sqlite3_stmt* rollback = PrepareRawOrDie(sqlite, "ROLLBACK"); |
| 131 | *db = new Sqlite(sqlite, begin, commit, rollback); |
| 132 | Status s = Status::OK(); |
| 133 | // Up until 2016 the default SQLite page_size was 1024. This ensures |
| 134 | // the new default regardless of linkage unless configured otherwise. |
| 135 | s.Update(SetPragma(*db, "page_size", "4096")); |
| 136 | // TensorFlow is designed to work well in all SQLite modes. However |
| 137 | // users might find tuning some these pragmas rewarding, depending on |
| 138 | // various considerations. Pragmas are set on a best-effort basis and |
| 139 | // might be ignored. |
| 140 | s.Update(EnvPragma(*db, "secure_delete", "TF_SQLITE_SECURE_DELETE")); |
| 141 | s.Update(EnvPragma(*db, "page_size", "TF_SQLITE_PAGE_SIZE")); |
| 142 | s.Update(EnvPragma(*db, "journal_mode", "TF_SQLITE_JOURNAL_MODE")); |
| 143 | s.Update(EnvPragma(*db, "synchronous", "TF_SQLITE_SYNCHRONOUS")); |
| 144 | s.Update(EnvPragma(*db, "mmap_size", "TF_SQLITE_MMAP_SIZE")); |
| 145 | s.Update(EnvPragma(*db, "locking_mode", "TF_SQLITE_LOCKING_MODE")); |
| 146 | s.Update(EnvPragma(*db, "cache_size", "TF_SQLITE_CACHE_SIZE")); |
| 147 | s.Update(EnvPragma(*db, "auto_vacuum", "TF_SQLITE_AUTO_VACUUM")); |
| 148 | DCHECK((*db)->RefCountIsOne()); |
| 149 | if (!s.ok()) { |
| 150 | (*db)->Unref(); |
| 151 | *db = nullptr; |
| 152 | } |
| 153 | return s; |
| 154 | } |
| 155 | |
| 156 | Sqlite::~Sqlite() { |
| 157 | sqlite3_finalize(rollback_); |
nothing calls this directly
no test coverage detected