gemini-search

A simple search engine for Geminispace
git clone git://git.laack.co/gemini-search.git
Log | Files | Refs | README

sqlite3_opt_unlock_notify.c (1773B)


      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