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