1 /* Copyright 2017 The TensorFlow Authors. All Rights Reserved. 2 3 Licensed under the Apache License, Version 2.0 (the "License"); 4 you may not use this file except in compliance with the License. 5 You may obtain a copy of the License at 6 7 http://www.apache.org/licenses/LICENSE-2.0 8 9 Unless required by applicable law or agreed to in writing, software 10 distributed under the License is distributed on an "AS IS" BASIS, 11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 See the License for the specific language governing permissions and 13 limitations under the License. 14 ==============================================================================*/ 15 #ifndef TENSORFLOW_CORE_LIB_DB_SQLITE_H_ 16 #define TENSORFLOW_CORE_LIB_DB_SQLITE_H_ 17 18 #include <mutex> 19 20 #include "sqlite3.h" 21 #include "tensorflow/core/lib/core/refcount.h" 22 #include "tensorflow/core/lib/core/status.h" 23 #include "tensorflow/core/lib/core/stringpiece.h" 24 #include "tensorflow/core/platform/macros.h" 25 #include "tensorflow/core/platform/thread_annotations.h" 26 #include "tensorflow/core/platform/types.h" 27 28 /// TensorFlow SQLite Veneer 29 /// 30 /// - Memory safety 31 /// - Less boilerplate 32 /// - Removes deprecated stuff 33 /// - Pretends UTF16 doesn't exist 34 /// - Transaction compile-time safety 35 /// - Statically loads our native extensions 36 /// - Error reporting via tensorflow::Status et al. 37 /// 38 /// SQLite>=3.8.2 needs to be supported until April 2019, which is when 39 /// Ubuntu 14.04 LTS becomes EOL. 40 41 namespace tensorflow { 42 43 class SqliteLock; 44 class SqliteStatement; 45 class SqliteTransaction; 46 47 /// \brief SQLite connection object. 48 /// 49 /// The SQLite connection is closed automatically by the destructor. 50 /// Reference counting ensures that happens after its statements are 51 /// destructed. 52 /// 53 /// Instances are reference counted and can be shared between threads. 54 /// This class offers the same thread safety behaviors as the SQLite 55 /// API itself. 56 /// 57 /// This veneer uses auto-commit mode by default, which means a 4ms 58 /// fsync() happens after every write unless a SqliteTransaction is 59 /// used or WAL mode is enabled beforehand. 60 class LOCKABLE Sqlite : public core::RefCounted { 61 public: 62 /// \brief Closes SQLite connection, which can take milliseconds. 63 virtual ~Sqlite(); 64 65 /// \brief Opens SQLite database file. 66 /// 67 /// Most users will want to set flags to SQLITE_OPEN_READWRITE | 68 /// SQLITE_OPEN_CREATE. There are many other open flags; here are 69 /// notes on a few of them: 70 /// 71 /// - SQLITE_OPEN_READONLY: Allowed if no WAL journal is active. 72 /// - SQLITE_OPEN_SHAREDCACHE: Will be ignored because this veneer 73 /// doesn't support the unlock notify API. 74 /// - SQLITE_OPEN_NOMUTEX: Means access to this connection MUST be 75 /// serialized by the caller in accordance with the same contracts 76 /// implemented by this API. 77 /// 78 /// This function sets PRAGMA values from TF_SQLITE_* environment 79 /// variables. See sqlite.cc to learn more. 80 static Status Open(const string& path, int flags, Sqlite** db); 81 82 /// \brief Creates SQLite statement. 83 /// 84 /// This routine should never fail if sql is valid and does not 85 /// reference tables. When tables are referenced, system calls are 86 /// needed which can take microseconds. When the schema changes, this 87 /// routine will retry automatically and then possibly fail. 88 /// 89 /// The returned statement holds a reference to this object. 90 Status Prepare(const StringPiece& sql, SqliteStatement* stmt); 91 SqliteStatement PrepareOrDie(const StringPiece& sql); 92 93 /// \brief Returns extended result code of last error. 94 /// 95 /// If the most recent API call was successful, the result is 96 /// undefined. The legacy result code can be obtained by saying 97 /// errcode() & 0xff. 98 int errcode() const EXCLUSIVE_LOCKS_REQUIRED(this) { 99 return sqlite3_extended_errcode(db_); 100 } 101 102 /// \brief Returns pointer to current error message state. 103 const char* errmsg() const EXCLUSIVE_LOCKS_REQUIRED(this) { 104 return sqlite3_errmsg(db_); 105 } 106 107 /// \brief Returns rowid assigned to last successful insert. 108 int64 last_insert_rowid() const EXCLUSIVE_LOCKS_REQUIRED(this) { 109 return sqlite3_last_insert_rowid(db_); 110 } 111 112 /// \brief Returns number of rows directly changed by last write. 113 int64 changes() const EXCLUSIVE_LOCKS_REQUIRED(this) { 114 return sqlite3_changes(db_); 115 } 116 117 private: 118 friend class SqliteLock; 119 friend class SqliteStatement; 120 friend class SqliteTransaction; 121 122 Sqlite(sqlite3* db, sqlite3_stmt* begin, sqlite3_stmt* commit, 123 sqlite3_stmt* rollback) noexcept 124 : db_(db), begin_(begin), commit_(commit), rollback_(rollback) {} 125 126 sqlite3* const db_; 127 sqlite3_stmt* const begin_; 128 sqlite3_stmt* const commit_; 129 sqlite3_stmt* const rollback_; 130 bool is_in_transaction_ = false; 131 132 TF_DISALLOW_COPY_AND_ASSIGN(Sqlite); 133 }; 134 135 /// \brief SQLite prepared statement. 136 /// 137 /// Instances can only be shared between threads if caller serializes 138 /// access from first Bind*() to *Reset(). 139 /// 140 /// When reusing a statement in a loop, be certain to not have jumps 141 /// betwixt Bind*() and *Reset(). 142 class SqliteStatement { 143 public: 144 /// \brief Initializes an empty statement to be assigned later. 145 SqliteStatement() noexcept = default; 146 147 /// \brief Finalizes statement. 148 /// 149 /// This can take milliseconds if it was blocking the Sqlite 150 /// connection object from being freed. 151 ~SqliteStatement() { 152 sqlite3_finalize(stmt_); 153 if (db_ != nullptr) db_->Unref(); 154 } 155 156 /// \brief Returns true if statement is initialized. 157 explicit operator bool() const { return stmt_ != nullptr; } 158 159 /// \brief Returns SQL text from when this query was prepared. 160 const char* sql() const { return sqlite3_sql(stmt_); } 161 162 /// \brief Number of bytes bound since last *Reset(). 163 uint64 size() { return size_; } 164 165 /// \brief Executes query for fetching arbitrary rows. 166 /// 167 /// `is_done` will always be set to true unless SQLITE_ROW is 168 /// returned by the underlying API. If status() is already in an 169 /// error state, then this method is a no-op and the existing status 170 /// is returned. 171 /// 172 /// The OrDie version returns `!is_done` which, if true, indicates a 173 /// row is available. 174 /// 175 /// This statement should be Reset() or destructed when when finished 176 /// with the result. 177 Status Step(bool* is_done); 178 bool StepOrDie() TF_MUST_USE_RESULT; 179 180 /// \brief Executes query when only one row is desired. 181 /// 182 /// If a row isn't returned, an internal error Status is returned 183 /// that won't be reflected in the connection error state. 184 /// 185 /// This statement should be Reset() or destructed when when finished 186 /// with the result. 187 Status StepOnce(); 188 const SqliteStatement& StepOnceOrDie(); 189 190 /// \brief Executes query, ensures zero rows returned, then Reset(). 191 /// 192 /// If a row is returned, an internal error Status is returned that 193 /// won't be reflected in the connection error state. 194 Status StepAndReset(); 195 void StepAndResetOrDie(); 196 197 /// \brief Resets statement so it can be executed again. 198 /// 199 /// Implementation note: This method diverges from canonical API 200 /// behavior by calling sqlite3_clear_bindings() in addition to 201 /// sqlite3_reset(). That makes the veneer safer; we haven't found a 202 /// super compelling reason yet to call them independently. 203 void Reset(); 204 205 /// \brief Binds signed 64-bit integer to 1-indexed query parameter. 206 void BindInt(int parameter, int64 value) { 207 Update(sqlite3_bind_int64(stmt_, parameter, value), parameter); 208 size_ += sizeof(int64); 209 } 210 void BindInt(const char* parameter, int64 value) { 211 BindInt(GetParameterIndex(parameter), value); 212 } 213 214 /// \brief Binds double to 1-indexed query parameter. 215 void BindDouble(int parameter, double value) { 216 Update(sqlite3_bind_double(stmt_, parameter, value), parameter); 217 size_ += sizeof(double); 218 } 219 void BindDouble(const char* parameter, double value) { 220 BindDouble(GetParameterIndex(parameter), value); 221 } 222 223 /// \brief Copies UTF-8 text to 1-indexed query parameter. 224 /// 225 /// If NUL characters are present, they will still go in the DB and 226 /// be successfully retrieved by ColumnString(); however, the 227 /// behavior of these values with SQLite functions is undefined. 228 /// 229 /// When using the unsafe methods, the data must not be changed or 230 /// freed until this statement is Reset() or finalized. 231 void BindText(int parameter, const StringPiece& text) { 232 Update(sqlite3_bind_text64(stmt_, parameter, text.data(), text.size(), 233 SQLITE_TRANSIENT, SQLITE_UTF8), 234 parameter); 235 size_ += text.size(); 236 } 237 void BindText(const char* parameter, const StringPiece& text) { 238 BindText(GetParameterIndex(parameter), text); 239 } 240 void BindTextUnsafe(int parameter, const StringPiece& text) { 241 Update(sqlite3_bind_text64(stmt_, parameter, text.data(), text.size(), 242 SQLITE_STATIC, SQLITE_UTF8), 243 parameter); 244 size_ += text.size(); 245 } 246 void BindTextUnsafe(const char* parameter, const StringPiece& text) { 247 BindTextUnsafe(GetParameterIndex(parameter), text); 248 } 249 250 /// \brief Copies binary data to 1-indexed query parameter. 251 /// 252 /// When using the unsafe methods, the data must not be changed or 253 /// freed until this statement is Reset() or finalized. 254 void BindBlob(int parameter, const StringPiece& blob) { 255 Update(sqlite3_bind_blob64(stmt_, parameter, blob.data(), blob.size(), 256 SQLITE_TRANSIENT), 257 parameter); 258 size_ += blob.size(); 259 } 260 void BindBlob(const char* parameter, const StringPiece& blob) { 261 BindBlob(GetParameterIndex(parameter), blob); 262 } 263 void BindBlobUnsafe(int parameter, const StringPiece& blob) { 264 Update(sqlite3_bind_blob64(stmt_, parameter, blob.data(), blob.size(), 265 SQLITE_STATIC), 266 parameter); 267 size_ += blob.size(); 268 } 269 void BindBlobUnsafe(const char* parameter, const StringPiece& text) { 270 BindBlobUnsafe(GetParameterIndex(parameter), text); 271 } 272 273 /// \brief Returns number of columns in result set. 274 int ColumnCount() const TF_MUST_USE_RESULT { 275 return sqlite3_column_count(stmt_); 276 } 277 278 /// \brief Returns type of 0-indexed column value in row data. 279 /// 280 /// Please note that SQLite is dynamically typed and the type of a 281 /// particular column can vary from row to row. 282 int ColumnType(int column) const TF_MUST_USE_RESULT { 283 return sqlite3_column_type(stmt_, column); 284 } 285 286 /// \brief Returns 0-indexed column from row result coerced as an integer. 287 int64 ColumnInt(int column) const TF_MUST_USE_RESULT { 288 return sqlite3_column_int64(stmt_, column); 289 } 290 291 /// \brief Returns 0-indexed column from row result coerced as a double. 292 double ColumnDouble(int column) const TF_MUST_USE_RESULT { 293 return sqlite3_column_double(stmt_, column); 294 } 295 296 /// \brief Copies 0-indexed column from row result coerced as a string. 297 /// 298 /// NULL values are returned as empty string. This method should be 299 /// used for both BLOB and TEXT columns. See also: ColumnType(). 300 string ColumnString(int column) const TF_MUST_USE_RESULT { 301 auto data = sqlite3_column_blob(stmt_, column); 302 if (data == nullptr) return ""; 303 return {static_cast<const char*>(data), 304 static_cast<size_t>(ColumnSize(column))}; 305 } 306 307 /// \brief Returns pointer to binary data at 0-indexed column. 308 /// 309 /// Empty values are returned as NULL. The returned memory will no 310 /// longer be valid the next time Step() or Reset() is called. No NUL 311 /// terminator is added. 312 StringPiece ColumnStringUnsafe(int column) const TF_MUST_USE_RESULT { 313 return {static_cast<const char*>(sqlite3_column_blob(stmt_, column)), 314 static_cast<size_t>(ColumnSize(column))}; 315 } 316 317 /// \brief Returns number of bytes stored at 0-indexed column. 318 int ColumnSize(int column) const TF_MUST_USE_RESULT { 319 return sqlite3_column_bytes(stmt_, column); 320 } 321 322 /// \brief Move constructor, after which <other> is reset to empty. 323 SqliteStatement(SqliteStatement&& other) noexcept 324 : db_(other.db_), stmt_(other.stmt_), bind_error_(other.bind_error_) { 325 other.db_ = nullptr; 326 other.stmt_ = nullptr; 327 other.bind_error_ = SQLITE_OK; 328 } 329 330 /// \brief Move assignment, after which <other> is reset to empty. 331 SqliteStatement& operator=(SqliteStatement&& other) noexcept { 332 if (&other != this) { 333 if (db_ != nullptr) db_->Unref(); 334 if (stmt_ != nullptr) sqlite3_finalize(stmt_); 335 db_ = other.db_; 336 stmt_ = other.stmt_; 337 bind_error_ = other.bind_error_; 338 size_ = other.size_; 339 other.db_ = nullptr; 340 other.stmt_ = nullptr; 341 other.bind_error_ = SQLITE_OK; 342 other.size_ = 0; 343 } 344 return *this; 345 } 346 347 private: 348 friend class Sqlite; 349 350 SqliteStatement(Sqlite* db, sqlite3_stmt* stmt) noexcept 351 : db_(db), stmt_(stmt) { 352 db_->Ref(); 353 } 354 355 void Update(int rc, int parameter) { 356 // Binding strings can fail if they exceed length limit. 357 if (TF_PREDICT_FALSE(rc != SQLITE_OK)) { 358 if (bind_error_ == SQLITE_OK) { 359 bind_error_ = rc; 360 bind_error_parameter_ = parameter; 361 } 362 } 363 } 364 365 int GetParameterIndex(const char* parameter) { 366 int index = sqlite3_bind_parameter_index(stmt_, parameter); 367 DCHECK(index > 0); // OK to compile away since it'll fail again 368 return index; 369 } 370 371 Sqlite* db_ = nullptr; 372 sqlite3_stmt* stmt_ = nullptr; 373 int bind_error_ = SQLITE_OK; 374 int bind_error_parameter_ = 0; 375 uint64 size_ = 0; 376 377 TF_DISALLOW_COPY_AND_ASSIGN(SqliteStatement); 378 }; 379 380 /// \brief Reentrant SQLite connection object lock 381 /// 382 /// This is a no-op if SQLITE_OPEN_NOMUTEX was used. 383 class SCOPED_LOCKABLE SqliteLock { 384 public: 385 explicit SqliteLock(Sqlite& db) EXCLUSIVE_LOCK_FUNCTION(db) 386 : mutex_(sqlite3_db_mutex(db.db_)) { 387 sqlite3_mutex_enter(mutex_); 388 } 389 SqliteLock(Sqlite& db, std::try_to_lock_t) EXCLUSIVE_LOCK_FUNCTION(db) 390 : mutex_(sqlite3_db_mutex(db.db_)) { 391 if (TF_PREDICT_FALSE(sqlite3_mutex_try(mutex_) != SQLITE_OK)) { 392 is_locked_ = false; 393 } 394 } 395 ~SqliteLock() UNLOCK_FUNCTION() { 396 if (is_locked_) sqlite3_mutex_leave(mutex_); 397 } 398 explicit operator bool() const { return is_locked_; } 399 400 private: 401 sqlite3_mutex* const mutex_; 402 bool is_locked_ = true; 403 TF_DISALLOW_COPY_AND_ASSIGN(SqliteLock); 404 }; 405 #define SqliteLock(x) static_assert(0, "sqlite_lock_decl_missing_name"); 406 407 /// \brief SQLite transaction scope. 408 /// 409 /// This class acquires an exclusive lock on the connection object (if 410 /// mutexes weren't disabled) and runs BEGIN / ROLLBACK automatically. 411 /// Unlike SqliteLock this scope is non-reentrant. To avoid program 412 /// crashes, business logic should use the EXCLUSIVE_LOCK_FUNCTION and 413 /// LOCKS_EXCLUDED annotations as much as possible. 414 class SCOPED_LOCKABLE SqliteTransaction { 415 public: 416 /// \brief Locks db and begins deferred transaction. 417 /// 418 /// This will crash if a transaction is already active. 419 explicit SqliteTransaction(Sqlite& db) EXCLUSIVE_LOCK_FUNCTION(db); 420 421 /// \brief Runs ROLLBACK and unlocks. 422 ~SqliteTransaction() UNLOCK_FUNCTION(); 423 424 /// \brief Commits transaction. 425 /// 426 /// If this is successful, a new transaction will be started, which 427 /// is rolled back when exiting the scope. 428 Status Commit(); 429 430 private: 431 void Begin(); 432 Sqlite* const db_; 433 434 TF_DISALLOW_COPY_AND_ASSIGN(SqliteTransaction); 435 }; 436 437 #define SQLITE_EXCLUSIVE_TRANSACTIONS_REQUIRED(...) \ 438 EXCLUSIVE_LOCKS_REQUIRED(__VA_ARGS__) 439 #define SQLITE_TRANSACTIONS_EXCLUDED(...) LOCKS_EXCLUDED(__VA_ARGS__) 440 441 inline SqliteStatement Sqlite::PrepareOrDie(const StringPiece& sql) { 442 SqliteStatement stmt; 443 TF_CHECK_OK(Prepare(sql, &stmt)); 444 return stmt; 445 } 446 447 } // namespace tensorflow 448 449 #endif // TENSORFLOW_CORE_LIB_DB_SQLITE_H_ 450