sqlite3_opt_unlock_notify.c raw

   1  // Copyright (C) 2018 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
   2  //
   3  // Use of this source code is governed by an MIT-style
   4  // license that can be found in the LICENSE file.
   5  
   6  #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
   7  #include <stdio.h>
   8  #ifndef USE_LIBSQLITE3
   9  #include "sqlite3-binding.h"
  10  #else
  11  #include <sqlite3.h>
  12  #endif
  13  
  14  extern int unlock_notify_wait(sqlite3 *db);
  15  
  16  int
  17  _sqlite3_step_blocking(sqlite3_stmt *stmt)
  18  {
  19    int rv;
  20    sqlite3* db;
  21  
  22    db = sqlite3_db_handle(stmt);
  23    for (;;) {
  24      rv = sqlite3_step(stmt);
  25      if (rv != SQLITE_LOCKED) {
  26        break;
  27      }
  28      if (sqlite3_extended_errcode(db) != SQLITE_LOCKED_SHAREDCACHE) {
  29        break;
  30      }
  31      rv = unlock_notify_wait(db);
  32      if (rv != SQLITE_OK) {
  33        break;
  34      }
  35      sqlite3_reset(stmt);
  36    }
  37  
  38    return rv;
  39  }
  40  
  41  int
  42  _sqlite3_step_row_blocking(sqlite3_stmt* stmt, long long* rowid, long long* changes)
  43  {
  44    int rv;
  45    sqlite3* db;
  46  
  47    db = sqlite3_db_handle(stmt);
  48    for (;;) {
  49      rv = sqlite3_step(stmt);
  50      if (rv!=SQLITE_LOCKED) {
  51        break;
  52      }
  53      if (sqlite3_extended_errcode(db) != SQLITE_LOCKED_SHAREDCACHE) {
  54        break;
  55      }
  56      rv = unlock_notify_wait(db);
  57      if (rv != SQLITE_OK) {
  58        break;
  59      }
  60      sqlite3_reset(stmt);
  61    }
  62  
  63    *rowid = (long long) sqlite3_last_insert_rowid(db);
  64    *changes = (long long) sqlite3_changes(db);
  65    return rv;
  66  }
  67  
  68  int
  69  _sqlite3_prepare_v2_blocking(sqlite3 *db, const char *zSql, int nBytes, sqlite3_stmt **ppStmt, const char **pzTail)
  70  {
  71    int rv;
  72  
  73    for (;;) {
  74      rv = sqlite3_prepare_v2(db, zSql, nBytes, ppStmt, pzTail);
  75      if (rv!=SQLITE_LOCKED) {
  76        break;
  77      }
  78      if (sqlite3_extended_errcode(db) != SQLITE_LOCKED_SHAREDCACHE) {
  79        break;
  80      }
  81      rv = unlock_notify_wait(db);
  82      if (rv != SQLITE_OK) {
  83        break;
  84      }
  85    }
  86  
  87    return rv;
  88  }
  89  #endif
  90