// Copyright (C) 2018 Yasuhiro Matsumoto . // // Use of this source code is governed by an MIT-style // license that can be found in the LICENSE file. #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY #include #include "sqlite3-binding.h" extern int unlock_notify_wait(sqlite3 *db); int _sqlite3_step_blocking(sqlite3_stmt *stmt) { int rv; sqlite3* db; db = sqlite3_db_handle(stmt); for (;;) { rv = sqlite3_step(stmt); if (rv != SQLITE_LOCKED) { break; } if (sqlite3_extended_errcode(db) != SQLITE_LOCKED_SHAREDCACHE) { break; } rv = unlock_notify_wait(db); if (rv != SQLITE_OK) { break; } sqlite3_reset(stmt); } return rv; } int _sqlite3_step_row_blocking(sqlite3_stmt* stmt, long long* rowid, long long* changes) { int rv; sqlite3* db; db = sqlite3_db_handle(stmt); for (;;) { rv = sqlite3_step(stmt); if (rv!=SQLITE_LOCKED) { break; } if (sqlite3_extended_errcode(db) != SQLITE_LOCKED_SHAREDCACHE) { break; } rv = unlock_notify_wait(db); if (rv != SQLITE_OK) { break; } sqlite3_reset(stmt); } *rowid = (long long) sqlite3_last_insert_rowid(db); *changes = (long long) sqlite3_changes(db); return rv; } int _sqlite3_prepare_v2_blocking(sqlite3 *db, const char *zSql, int nBytes, sqlite3_stmt **ppStmt, const char **pzTail) { int rv; for (;;) { rv = sqlite3_prepare_v2(db, zSql, nBytes, ppStmt, pzTail); if (rv!=SQLITE_LOCKED) { break; } if (sqlite3_extended_errcode(db) != SQLITE_LOCKED_SHAREDCACHE) { break; } rv = unlock_notify_wait(db); if (rv != SQLITE_OK) { break; } } return rv; } #endif