sqlite3_opt_unlock_notify.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
  6. #include <stdio.h>
  7. #ifndef USE_LIBSQLITE3
  8. #include "sqlite3-binding.h"
  9. #else
  10. #include <sqlite3.h>
  11. #endif
  12. extern int unlock_notify_wait(sqlite3 *db);
  13. int
  14. _sqlite3_step_blocking(sqlite3_stmt *stmt)
  15. {
  16. int rv;
  17. sqlite3* db;
  18. db = sqlite3_db_handle(stmt);
  19. for (;;) {
  20. rv = sqlite3_step(stmt);
  21. if (rv != SQLITE_LOCKED) {
  22. break;
  23. }
  24. if (sqlite3_extended_errcode(db) != SQLITE_LOCKED_SHAREDCACHE) {
  25. break;
  26. }
  27. rv = unlock_notify_wait(db);
  28. if (rv != SQLITE_OK) {
  29. break;
  30. }
  31. sqlite3_reset(stmt);
  32. }
  33. return rv;
  34. }
  35. int
  36. _sqlite3_step_row_blocking(sqlite3_stmt* stmt, long long* rowid, long long* changes)
  37. {
  38. int rv;
  39. sqlite3* db;
  40. db = sqlite3_db_handle(stmt);
  41. for (;;) {
  42. rv = sqlite3_step(stmt);
  43. if (rv!=SQLITE_LOCKED) {
  44. break;
  45. }
  46. if (sqlite3_extended_errcode(db) != SQLITE_LOCKED_SHAREDCACHE) {
  47. break;
  48. }
  49. rv = unlock_notify_wait(db);
  50. if (rv != SQLITE_OK) {
  51. break;
  52. }
  53. sqlite3_reset(stmt);
  54. }
  55. *rowid = (long long) sqlite3_last_insert_rowid(db);
  56. *changes = (long long) sqlite3_changes(db);
  57. return rv;
  58. }
  59. int
  60. _sqlite3_prepare_v2_blocking(sqlite3 *db, const char *zSql, int nBytes, sqlite3_stmt **ppStmt, const char **pzTail)
  61. {
  62. int rv;
  63. for (;;) {
  64. rv = sqlite3_prepare_v2(db, zSql, nBytes, ppStmt, pzTail);
  65. if (rv!=SQLITE_LOCKED) {
  66. break;
  67. }
  68. if (sqlite3_extended_errcode(db) != SQLITE_LOCKED_SHAREDCACHE) {
  69. break;
  70. }
  71. rv = unlock_notify_wait(db);
  72. if (rv != SQLITE_OK) {
  73. break;
  74. }
  75. }
  76. return rv;
  77. }
  78. #endif