cline 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/bin/cline +0 -0
  2. package/bin/cline-darwin-amd64 +0 -0
  3. package/bin/cline-darwin-arm64 +0 -0
  4. package/bin/cline-host +0 -0
  5. package/bin/cline-host-darwin-amd64 +0 -0
  6. package/bin/cline-host-darwin-arm64 +0 -0
  7. package/bin/cline-host-linux-amd64 +0 -0
  8. package/bin/cline-host-linux-arm64 +0 -0
  9. package/bin/cline-linux-amd64 +0 -0
  10. package/bin/cline-linux-arm64 +0 -0
  11. package/cline-core.js +24143 -16610
  12. package/extension/package.json +12 -4
  13. package/node_modules/b4a/LICENSE +201 -0
  14. package/node_modules/b4a/README.md +153 -0
  15. package/node_modules/b4a/browser.js +563 -0
  16. package/node_modules/b4a/index.js +188 -0
  17. package/node_modules/b4a/lib/ascii.js +31 -0
  18. package/node_modules/b4a/lib/base64.js +65 -0
  19. package/node_modules/b4a/lib/hex.js +51 -0
  20. package/node_modules/b4a/lib/utf16le.js +40 -0
  21. package/node_modules/b4a/lib/utf8.js +141 -0
  22. package/node_modules/b4a/package.json +49 -0
  23. package/node_modules/b4a/react-native.js +5 -0
  24. package/node_modules/bare-events/LICENSE +201 -0
  25. package/node_modules/bare-events/README.md +25 -0
  26. package/node_modules/bare-events/global.d.ts +15 -0
  27. package/node_modules/bare-events/global.js +5 -0
  28. package/node_modules/bare-events/index.d.ts +94 -0
  29. package/node_modules/bare-events/index.js +355 -0
  30. package/node_modules/bare-events/lib/errors.js +32 -0
  31. package/node_modules/bare-events/package.json +61 -0
  32. package/node_modules/bare-events/web.d.ts +79 -0
  33. package/node_modules/bare-events/web.js +347 -0
  34. package/node_modules/bare-fs/CMakeLists.txt +13 -0
  35. package/node_modules/bare-fs/LICENSE +201 -0
  36. package/node_modules/bare-fs/README.md +29 -0
  37. package/node_modules/bare-fs/binding.c +2238 -0
  38. package/node_modules/bare-fs/binding.js +1 -0
  39. package/node_modules/bare-fs/index.d.ts +1115 -0
  40. package/node_modules/bare-fs/index.js +2330 -0
  41. package/node_modules/bare-fs/lib/constants.d.ts +49 -0
  42. package/node_modules/bare-fs/lib/constants.js +49 -0
  43. package/node_modules/bare-fs/lib/errors.d.ts +11 -0
  44. package/node_modules/bare-fs/lib/errors.js +55 -0
  45. package/node_modules/bare-fs/package.json +71 -0
  46. package/node_modules/bare-fs/prebuilds/android-arm/bare-fs.bare +0 -0
  47. package/node_modules/bare-fs/prebuilds/android-arm64/bare-fs.bare +0 -0
  48. package/node_modules/bare-fs/prebuilds/android-ia32/bare-fs.bare +0 -0
  49. package/node_modules/bare-fs/prebuilds/android-x64/bare-fs.bare +0 -0
  50. package/node_modules/bare-fs/prebuilds/darwin-arm64/bare-fs.bare +0 -0
  51. package/node_modules/bare-fs/prebuilds/darwin-x64/bare-fs.bare +0 -0
  52. package/node_modules/bare-fs/prebuilds/ios-arm64/bare-fs.bare +0 -0
  53. package/node_modules/bare-fs/prebuilds/ios-arm64-simulator/bare-fs.bare +0 -0
  54. package/node_modules/bare-fs/prebuilds/ios-x64-simulator/bare-fs.bare +0 -0
  55. package/node_modules/bare-fs/prebuilds/linux-arm64/bare-fs.bare +0 -0
  56. package/node_modules/bare-fs/prebuilds/linux-x64/bare-fs.bare +0 -0
  57. package/node_modules/bare-fs/prebuilds/win32-arm64/bare-fs.bare +0 -0
  58. package/node_modules/bare-fs/prebuilds/win32-x64/bare-fs.bare +0 -0
  59. package/node_modules/bare-fs/promises.d.ts +282 -0
  60. package/node_modules/bare-fs/promises.js +90 -0
  61. package/node_modules/bare-os/CMakeLists.txt +13 -0
  62. package/node_modules/bare-os/LICENSE +201 -0
  63. package/node_modules/bare-os/README.md +11 -0
  64. package/node_modules/bare-os/binding.c +1119 -0
  65. package/node_modules/bare-os/binding.js +1 -0
  66. package/node_modules/bare-os/index.d.ts +109 -0
  67. package/node_modules/bare-os/index.js +99 -0
  68. package/node_modules/bare-os/lib/constants.js +6 -0
  69. package/node_modules/bare-os/lib/errors.js +22 -0
  70. package/node_modules/bare-os/package.json +46 -0
  71. package/node_modules/bare-os/prebuilds/android-arm/bare-os.bare +0 -0
  72. package/node_modules/bare-os/prebuilds/android-arm64/bare-os.bare +0 -0
  73. package/node_modules/bare-os/prebuilds/android-ia32/bare-os.bare +0 -0
  74. package/node_modules/bare-os/prebuilds/android-x64/bare-os.bare +0 -0
  75. package/node_modules/bare-os/prebuilds/darwin-arm64/bare-os.bare +0 -0
  76. package/node_modules/bare-os/prebuilds/darwin-x64/bare-os.bare +0 -0
  77. package/node_modules/bare-os/prebuilds/ios-arm64/bare-os.bare +0 -0
  78. package/node_modules/bare-os/prebuilds/ios-arm64-simulator/bare-os.bare +0 -0
  79. package/node_modules/bare-os/prebuilds/ios-x64-simulator/bare-os.bare +0 -0
  80. package/node_modules/bare-os/prebuilds/linux-arm64/bare-os.bare +0 -0
  81. package/node_modules/bare-os/prebuilds/linux-x64/bare-os.bare +0 -0
  82. package/node_modules/bare-os/prebuilds/win32-arm64/bare-os.bare +0 -0
  83. package/node_modules/bare-os/prebuilds/win32-x64/bare-os.bare +0 -0
  84. package/node_modules/bare-path/LICENSE +201 -0
  85. package/node_modules/bare-path/NOTICE +28 -0
  86. package/node_modules/bare-path/README.md +19 -0
  87. package/node_modules/bare-path/index.js +11 -0
  88. package/node_modules/bare-path/lib/constants.js +11 -0
  89. package/node_modules/bare-path/lib/posix.js +242 -0
  90. package/node_modules/bare-path/lib/shared.js +67 -0
  91. package/node_modules/bare-path/lib/win32.js +513 -0
  92. package/node_modules/bare-path/package.json +36 -0
  93. package/node_modules/bare-stream/LICENSE +201 -0
  94. package/node_modules/bare-stream/README.md +15 -0
  95. package/node_modules/bare-stream/global.js +8 -0
  96. package/node_modules/bare-stream/index.d.ts +237 -0
  97. package/node_modules/bare-stream/index.js +355 -0
  98. package/node_modules/bare-stream/package.json +61 -0
  99. package/node_modules/bare-stream/promises.js +3 -0
  100. package/node_modules/bare-stream/web.d.ts +73 -0
  101. package/node_modules/bare-stream/web.js +229 -0
  102. package/node_modules/bare-url/CMakeLists.txt +27 -0
  103. package/node_modules/bare-url/LICENSE +201 -0
  104. package/node_modules/bare-url/README.md +19 -0
  105. package/node_modules/bare-url/binding.c +188 -0
  106. package/node_modules/bare-url/binding.js +1 -0
  107. package/node_modules/bare-url/global.d.ts +12 -0
  108. package/node_modules/bare-url/global.js +2 -0
  109. package/node_modules/bare-url/index.d.ts +39 -0
  110. package/node_modules/bare-url/index.js +450 -0
  111. package/node_modules/bare-url/lib/errors.d.ts +8 -0
  112. package/node_modules/bare-url/lib/errors.js +38 -0
  113. package/node_modules/bare-url/lib/url-search-params.d.ts +21 -0
  114. package/node_modules/bare-url/lib/url-search-params.js +176 -0
  115. package/node_modules/bare-url/package.json +51 -0
  116. package/node_modules/bare-url/prebuilds/android-arm/bare-url.bare +0 -0
  117. package/node_modules/bare-url/prebuilds/android-arm64/bare-url.bare +0 -0
  118. package/node_modules/bare-url/prebuilds/android-ia32/bare-url.bare +0 -0
  119. package/node_modules/bare-url/prebuilds/android-x64/bare-url.bare +0 -0
  120. package/node_modules/bare-url/prebuilds/darwin-arm64/bare-url.bare +0 -0
  121. package/node_modules/bare-url/prebuilds/darwin-x64/bare-url.bare +0 -0
  122. package/node_modules/bare-url/prebuilds/ios-arm64/bare-url.bare +0 -0
  123. package/node_modules/bare-url/prebuilds/ios-arm64-simulator/bare-url.bare +0 -0
  124. package/node_modules/bare-url/prebuilds/ios-x64-simulator/bare-url.bare +0 -0
  125. package/node_modules/bare-url/prebuilds/linux-arm64/bare-url.bare +0 -0
  126. package/node_modules/bare-url/prebuilds/linux-x64/bare-url.bare +0 -0
  127. package/node_modules/bare-url/prebuilds/win32-arm64/bare-url.bare +0 -0
  128. package/node_modules/bare-url/prebuilds/win32-x64/bare-url.bare +0 -0
  129. package/node_modules/better-sqlite3/deps/download.sh +1 -1
  130. package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.c +122 -81
  131. package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.h +45 -45
  132. package/node_modules/better-sqlite3/lib/database.js +1 -1
  133. package/node_modules/better-sqlite3/package.json +4 -7
  134. package/node_modules/better-sqlite3/src/addon.cpp +47 -0
  135. package/node_modules/better-sqlite3/src/better_sqlite3.cpp +44 -2164
  136. package/node_modules/better-sqlite3/src/objects/backup.cpp +120 -0
  137. package/node_modules/better-sqlite3/src/objects/backup.hpp +36 -0
  138. package/node_modules/better-sqlite3/src/objects/database.cpp +417 -0
  139. package/node_modules/better-sqlite3/src/objects/database.hpp +103 -0
  140. package/node_modules/better-sqlite3/src/objects/statement-iterator.cpp +113 -0
  141. package/node_modules/better-sqlite3/src/objects/statement-iterator.hpp +50 -0
  142. package/node_modules/better-sqlite3/src/objects/statement.cpp +383 -0
  143. package/node_modules/better-sqlite3/src/objects/statement.hpp +58 -0
  144. package/node_modules/better-sqlite3/src/util/bind-map.cpp +73 -0
  145. package/node_modules/better-sqlite3/src/util/binder.cpp +193 -0
  146. package/node_modules/better-sqlite3/src/util/constants.cpp +172 -0
  147. package/node_modules/better-sqlite3/src/util/custom-aggregate.cpp +121 -0
  148. package/node_modules/better-sqlite3/src/util/custom-function.cpp +59 -0
  149. package/node_modules/better-sqlite3/src/util/custom-table.cpp +409 -0
  150. package/node_modules/better-sqlite3/src/util/data-converter.cpp +17 -0
  151. package/node_modules/better-sqlite3/src/util/data.cpp +194 -0
  152. package/node_modules/better-sqlite3/src/util/helpers.cpp +109 -0
  153. package/node_modules/better-sqlite3/src/util/macros.cpp +63 -0
  154. package/node_modules/better-sqlite3/src/util/query-macros.cpp +71 -0
  155. package/node_modules/better-sqlite3/src/util/row-builder.cpp +49 -0
  156. package/node_modules/events-universal/LICENSE +201 -0
  157. package/node_modules/events-universal/README.md +17 -0
  158. package/node_modules/events-universal/bare.js +1 -0
  159. package/node_modules/events-universal/default.js +1 -0
  160. package/node_modules/events-universal/index.js +1 -0
  161. package/node_modules/events-universal/package.json +39 -0
  162. package/node_modules/events-universal/react-native.js +1 -0
  163. package/node_modules/{fs-constants → fast-fifo}/LICENSE +1 -1
  164. package/node_modules/fast-fifo/README.md +78 -0
  165. package/node_modules/fast-fifo/fixed-size.js +39 -0
  166. package/node_modules/fast-fifo/index.js +48 -0
  167. package/node_modules/fast-fifo/package.json +28 -0
  168. package/node_modules/{base64-js → streamx}/LICENSE +1 -1
  169. package/node_modules/streamx/README.md +489 -0
  170. package/node_modules/streamx/index.js +1184 -0
  171. package/node_modules/streamx/package.json +34 -0
  172. package/node_modules/tar-fs/README.md +23 -34
  173. package/node_modules/tar-fs/index.js +211 -184
  174. package/node_modules/tar-fs/package.json +27 -7
  175. package/node_modules/tar-stream/README.md +34 -19
  176. package/node_modules/tar-stream/constants.js +14 -0
  177. package/node_modules/tar-stream/extract.js +341 -192
  178. package/node_modules/tar-stream/headers.js +201 -175
  179. package/node_modules/tar-stream/pack.js +226 -194
  180. package/node_modules/tar-stream/package.json +23 -46
  181. package/node_modules/text-decoder/LICENSE +201 -0
  182. package/node_modules/text-decoder/README.md +36 -0
  183. package/node_modules/text-decoder/index.js +64 -0
  184. package/node_modules/text-decoder/lib/browser-decoder.js +17 -0
  185. package/node_modules/text-decoder/lib/pass-through-decoder.js +19 -0
  186. package/node_modules/text-decoder/lib/utf8-decoder.js +104 -0
  187. package/node_modules/text-decoder/package.json +38 -0
  188. package/package.json +1 -1
  189. package/proto/cline/account.proto +10 -8
  190. package/proto/cline/browser.proto +3 -1
  191. package/proto/cline/checkpoints.proto +5 -3
  192. package/proto/cline/commands.proto +4 -2
  193. package/proto/cline/common.proto +5 -7
  194. package/proto/cline/dictation.proto +3 -1
  195. package/proto/cline/file.proto +36 -34
  196. package/proto/cline/hooks.proto +3 -2
  197. package/proto/cline/mcp.proto +6 -4
  198. package/proto/cline/models.proto +189 -19
  199. package/proto/cline/oca_account.proto +6 -7
  200. package/proto/cline/slash.proto +3 -1
  201. package/proto/cline/state.proto +144 -292
  202. package/proto/cline/task.proto +4 -2
  203. package/proto/cline/ui.proto +25 -24
  204. package/proto/cline/web.proto +3 -1
  205. package/proto/descriptor_set.pb +0 -0
  206. package/proto/host/diff.proto +5 -4
  207. package/proto/host/env.proto +8 -7
  208. package/proto/host/testing.proto +3 -3
  209. package/proto/host/window.proto +2 -2
  210. package/proto/host/workspace.proto +13 -12
  211. package/node_modules/base64-js/README.md +0 -34
  212. package/node_modules/base64-js/base64js.min.js +0 -1
  213. package/node_modules/base64-js/index.d.ts +0 -3
  214. package/node_modules/base64-js/index.js +0 -150
  215. package/node_modules/base64-js/package.json +0 -47
  216. package/node_modules/better-sqlite3/src/better_sqlite3.hpp +0 -1036
  217. package/node_modules/bl/.travis.yml +0 -17
  218. package/node_modules/bl/BufferList.js +0 -396
  219. package/node_modules/bl/LICENSE.md +0 -13
  220. package/node_modules/bl/README.md +0 -247
  221. package/node_modules/bl/bl.js +0 -84
  222. package/node_modules/bl/package.json +0 -37
  223. package/node_modules/bl/test/convert.js +0 -21
  224. package/node_modules/bl/test/indexOf.js +0 -492
  225. package/node_modules/bl/test/isBufferList.js +0 -32
  226. package/node_modules/bl/test/test.js +0 -869
  227. package/node_modules/buffer/AUTHORS.md +0 -70
  228. package/node_modules/buffer/LICENSE +0 -21
  229. package/node_modules/buffer/README.md +0 -410
  230. package/node_modules/buffer/index.d.ts +0 -186
  231. package/node_modules/buffer/index.js +0 -1817
  232. package/node_modules/buffer/package.json +0 -96
  233. package/node_modules/chownr/LICENSE +0 -15
  234. package/node_modules/chownr/README.md +0 -3
  235. package/node_modules/chownr/chownr.js +0 -167
  236. package/node_modules/chownr/package.json +0 -29
  237. package/node_modules/fs-constants/README.md +0 -26
  238. package/node_modules/fs-constants/browser.js +0 -1
  239. package/node_modules/fs-constants/index.js +0 -1
  240. package/node_modules/fs-constants/package.json +0 -19
  241. package/node_modules/ieee754/LICENSE +0 -11
  242. package/node_modules/ieee754/README.md +0 -51
  243. package/node_modules/ieee754/index.d.ts +0 -10
  244. package/node_modules/ieee754/index.js +0 -85
  245. package/node_modules/ieee754/package.json +0 -52
  246. package/node_modules/inherits/LICENSE +0 -16
  247. package/node_modules/inherits/README.md +0 -42
  248. package/node_modules/inherits/inherits.js +0 -9
  249. package/node_modules/inherits/inherits_browser.js +0 -27
  250. package/node_modules/inherits/package.json +0 -29
  251. package/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  252. package/node_modules/readable-stream/GOVERNANCE.md +0 -136
  253. package/node_modules/readable-stream/LICENSE +0 -47
  254. package/node_modules/readable-stream/README.md +0 -106
  255. package/node_modules/readable-stream/errors-browser.js +0 -127
  256. package/node_modules/readable-stream/errors.js +0 -116
  257. package/node_modules/readable-stream/experimentalWarning.js +0 -17
  258. package/node_modules/readable-stream/lib/_stream_duplex.js +0 -126
  259. package/node_modules/readable-stream/lib/_stream_passthrough.js +0 -37
  260. package/node_modules/readable-stream/lib/_stream_readable.js +0 -1027
  261. package/node_modules/readable-stream/lib/_stream_transform.js +0 -190
  262. package/node_modules/readable-stream/lib/_stream_writable.js +0 -641
  263. package/node_modules/readable-stream/lib/internal/streams/async_iterator.js +0 -180
  264. package/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -183
  265. package/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -96
  266. package/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -86
  267. package/node_modules/readable-stream/lib/internal/streams/from-browser.js +0 -3
  268. package/node_modules/readable-stream/lib/internal/streams/from.js +0 -52
  269. package/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -86
  270. package/node_modules/readable-stream/lib/internal/streams/state.js +0 -22
  271. package/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  272. package/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  273. package/node_modules/readable-stream/package.json +0 -68
  274. package/node_modules/readable-stream/readable-browser.js +0 -9
  275. package/node_modules/readable-stream/readable.js +0 -16
  276. package/node_modules/string_decoder/LICENSE +0 -48
  277. package/node_modules/string_decoder/README.md +0 -47
  278. package/node_modules/string_decoder/lib/string_decoder.js +0 -296
  279. package/node_modules/string_decoder/package.json +0 -34
  280. package/node_modules/tar-fs/.travis.yml +0 -6
  281. package/node_modules/tar-fs/test/fixtures/a/hello.txt +0 -1
  282. package/node_modules/tar-fs/test/fixtures/b/a/test.txt +0 -1
  283. package/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
  284. package/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
  285. package/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
  286. package/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
  287. package/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
  288. package/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
  289. package/node_modules/tar-fs/test/fixtures/e/file +0 -0
  290. package/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
  291. package/node_modules/tar-fs/test/index.js +0 -346
  292. package/node_modules/tar-stream/sandbox.js +0 -11
  293. package/node_modules/util-deprecate/History.md +0 -16
  294. package/node_modules/util-deprecate/LICENSE +0 -24
  295. package/node_modules/util-deprecate/README.md +0 -53
  296. package/node_modules/util-deprecate/browser.js +0 -67
  297. package/node_modules/util-deprecate/node.js +0 -6
  298. package/node_modules/util-deprecate/package.json +0 -27
  299. package/test-startup.sh +0 -14
@@ -0,0 +1,113 @@
1
+ StatementIterator::StatementIterator(Statement* stmt, bool bound) :
2
+ node::ObjectWrap(),
3
+ stmt(stmt),
4
+ handle(stmt->handle),
5
+ db_state(stmt->db->GetState()),
6
+ bound(bound),
7
+ safe_ints(stmt->safe_ints),
8
+ mode(stmt->mode),
9
+ alive(true),
10
+ logged(!db_state->has_logger) {
11
+ assert(stmt != NULL);
12
+ assert(handle != NULL);
13
+ assert(stmt->bound == bound);
14
+ assert(stmt->alive == true);
15
+ assert(stmt->locked == false);
16
+ assert(db_state->iterators < USHRT_MAX);
17
+ stmt->locked = true;
18
+ db_state->iterators += 1;
19
+ }
20
+
21
+ // The ~Statement destructor currently covers any state this object creates.
22
+ // Additionally, we actually DON'T want to revert stmt->locked or db_state
23
+ // ->iterators in this destructor, to ensure deterministic database access.
24
+ StatementIterator::~StatementIterator() {}
25
+
26
+ void StatementIterator::Next(NODE_ARGUMENTS info) {
27
+ assert(alive == true);
28
+ db_state->busy = true;
29
+ if (!logged) {
30
+ logged = true;
31
+ if (stmt->db->Log(OnlyIsolate, handle)) {
32
+ db_state->busy = false;
33
+ Throw();
34
+ return;
35
+ }
36
+ }
37
+ int status = sqlite3_step(handle);
38
+ db_state->busy = false;
39
+ if (status == SQLITE_ROW) {
40
+ UseIsolate;
41
+ UseContext;
42
+ info.GetReturnValue().Set(
43
+ NewRecord(isolate, ctx, Data::GetRowJS(isolate, ctx, handle, safe_ints, mode), db_state->addon, false)
44
+ );
45
+ } else {
46
+ if (status == SQLITE_DONE) Return(info);
47
+ else Throw();
48
+ }
49
+ }
50
+
51
+ void StatementIterator::Return(NODE_ARGUMENTS info) {
52
+ Cleanup();
53
+ STATEMENT_RETURN_LOGIC(DoneRecord(OnlyIsolate, db_state->addon));
54
+ }
55
+
56
+ void StatementIterator::Throw() {
57
+ Cleanup();
58
+ Database* db = stmt->db;
59
+ STATEMENT_THROW_LOGIC();
60
+ }
61
+
62
+ void StatementIterator::Cleanup() {
63
+ assert(alive == true);
64
+ alive = false;
65
+ stmt->locked = false;
66
+ db_state->iterators -= 1;
67
+ sqlite3_reset(handle);
68
+ }
69
+
70
+ INIT(StatementIterator::Init) {
71
+ v8::Local<v8::FunctionTemplate> t = NewConstructorTemplate(isolate, data, JS_new, "StatementIterator");
72
+ SetPrototypeMethod(isolate, data, t, "next", JS_next);
73
+ SetPrototypeMethod(isolate, data, t, "return", JS_return);
74
+ SetPrototypeSymbolMethod(isolate, data, t, v8::Symbol::GetIterator(isolate), JS_symbolIterator);
75
+ return t->GetFunction(OnlyContext).ToLocalChecked();
76
+ }
77
+
78
+ NODE_METHOD(StatementIterator::JS_new) {
79
+ UseAddon;
80
+ if (!addon->privileged_info) return ThrowTypeError("Disabled constructor");
81
+ assert(info.IsConstructCall());
82
+
83
+ StatementIterator* iter;
84
+ {
85
+ NODE_ARGUMENTS info = *addon->privileged_info;
86
+ STATEMENT_START_LOGIC(REQUIRE_STATEMENT_RETURNS_DATA, DOES_ADD_ITERATOR);
87
+ iter = new StatementIterator(stmt, bound);
88
+ }
89
+ UseIsolate;
90
+ UseContext;
91
+ iter->Wrap(info.This());
92
+ SetFrozen(isolate, ctx, info.This(), addon->cs.statement, addon->privileged_info->This());
93
+
94
+ info.GetReturnValue().Set(info.This());
95
+ }
96
+
97
+ NODE_METHOD(StatementIterator::JS_next) {
98
+ StatementIterator* iter = Unwrap<StatementIterator>(info.This());
99
+ REQUIRE_DATABASE_NOT_BUSY(iter->db_state);
100
+ if (iter->alive) iter->Next(info);
101
+ else info.GetReturnValue().Set(DoneRecord(OnlyIsolate, iter->db_state->addon));
102
+ }
103
+
104
+ NODE_METHOD(StatementIterator::JS_return) {
105
+ StatementIterator* iter = Unwrap<StatementIterator>(info.This());
106
+ REQUIRE_DATABASE_NOT_BUSY(iter->db_state);
107
+ if (iter->alive) iter->Return(info);
108
+ else info.GetReturnValue().Set(DoneRecord(OnlyIsolate, iter->db_state->addon));
109
+ }
110
+
111
+ NODE_METHOD(StatementIterator::JS_symbolIterator) {
112
+ info.GetReturnValue().Set(info.This());
113
+ }
@@ -0,0 +1,50 @@
1
+ class StatementIterator : public node::ObjectWrap {
2
+ public:
3
+
4
+ // The ~Statement destructor currently covers any state this object creates.
5
+ // Additionally, we actually DON'T want to revert stmt->locked or db_state
6
+ // ->iterators in this destructor, to ensure deterministic database access.
7
+ ~StatementIterator();
8
+
9
+ static INIT(Init);
10
+
11
+ private:
12
+
13
+ explicit StatementIterator(Statement* stmt, bool bound);
14
+
15
+ void Next(NODE_ARGUMENTS info);
16
+ void Return(NODE_ARGUMENTS info);
17
+ void Throw();
18
+ void Cleanup();
19
+
20
+ static inline v8::Local<v8::Object> NewRecord(
21
+ v8::Isolate* isolate,
22
+ v8::Local<v8::Context> ctx,
23
+ v8::Local<v8::Value> value,
24
+ Addon* addon,
25
+ bool done
26
+ ) {
27
+ v8::Local<v8::Object> record = v8::Object::New(isolate);
28
+ record->Set(ctx, addon->cs.value.Get(isolate), value).FromJust();
29
+ record->Set(ctx, addon->cs.done.Get(isolate), v8::Boolean::New(isolate, done)).FromJust();
30
+ return record;
31
+ }
32
+
33
+ static inline v8::Local<v8::Object> DoneRecord(v8::Isolate* isolate, Addon* addon) {
34
+ return NewRecord(isolate, OnlyContext, v8::Undefined(isolate), addon, true);
35
+ }
36
+
37
+ static NODE_METHOD(JS_new);
38
+ static NODE_METHOD(JS_next);
39
+ static NODE_METHOD(JS_return);
40
+ static NODE_METHOD(JS_symbolIterator);
41
+
42
+ Statement* const stmt;
43
+ sqlite3_stmt* const handle;
44
+ Database::State* const db_state;
45
+ const bool bound;
46
+ const bool safe_ints;
47
+ const char mode;
48
+ bool alive;
49
+ bool logged;
50
+ };
@@ -0,0 +1,383 @@
1
+ Statement::Statement(
2
+ Database* db,
3
+ sqlite3_stmt* handle,
4
+ sqlite3_uint64 id,
5
+ bool returns_data
6
+ ) :
7
+ node::ObjectWrap(),
8
+ db(db),
9
+ handle(handle),
10
+ extras(new Extras(id)),
11
+ alive(true),
12
+ locked(false),
13
+ bound(false),
14
+ has_bind_map(false),
15
+ safe_ints(db->GetState()->safe_ints),
16
+ mode(Data::FLAT),
17
+ returns_data(returns_data) {
18
+ assert(db != NULL);
19
+ assert(handle != NULL);
20
+ assert(db->GetState()->open);
21
+ assert(!db->GetState()->busy);
22
+ db->AddStatement(this);
23
+ }
24
+
25
+ Statement::~Statement() {
26
+ if (alive) db->RemoveStatement(this);
27
+ CloseHandles();
28
+ delete extras;
29
+ }
30
+
31
+ // Whenever this is used, db->RemoveStatement must be invoked beforehand.
32
+ void Statement::CloseHandles() {
33
+ if (alive) {
34
+ alive = false;
35
+ sqlite3_finalize(handle);
36
+ }
37
+ }
38
+
39
+ // Returns the Statement's bind map (creates it upon first execution).
40
+ BindMap* Statement::GetBindMap(v8::Isolate* isolate) {
41
+ if (has_bind_map) return &extras->bind_map;
42
+ BindMap* bind_map = &extras->bind_map;
43
+ int param_count = sqlite3_bind_parameter_count(handle);
44
+ for (int i = 1; i <= param_count; ++i) {
45
+ const char* name = sqlite3_bind_parameter_name(handle, i);
46
+ if (name != NULL) bind_map->Add(isolate, name + 1, i);
47
+ }
48
+ has_bind_map = true;
49
+ return bind_map;
50
+ }
51
+
52
+ Statement::Extras::Extras(sqlite3_uint64 id)
53
+ : bind_map(0), id(id) {}
54
+
55
+ INIT(Statement::Init) {
56
+ v8::Local<v8::FunctionTemplate> t = NewConstructorTemplate(isolate, data, JS_new, "Statement");
57
+ SetPrototypeMethod(isolate, data, t, "run", JS_run);
58
+ SetPrototypeMethod(isolate, data, t, "get", JS_get);
59
+ SetPrototypeMethod(isolate, data, t, "all", JS_all);
60
+ SetPrototypeMethod(isolate, data, t, "iterate", JS_iterate);
61
+ SetPrototypeMethod(isolate, data, t, "bind", JS_bind);
62
+ SetPrototypeMethod(isolate, data, t, "pluck", JS_pluck);
63
+ SetPrototypeMethod(isolate, data, t, "expand", JS_expand);
64
+ SetPrototypeMethod(isolate, data, t, "raw", JS_raw);
65
+ SetPrototypeMethod(isolate, data, t, "safeIntegers", JS_safeIntegers);
66
+ SetPrototypeMethod(isolate, data, t, "columns", JS_columns);
67
+ SetPrototypeGetter(isolate, data, t, "busy", JS_busy);
68
+ return t->GetFunction(OnlyContext).ToLocalChecked();
69
+ }
70
+
71
+ NODE_METHOD(Statement::JS_new) {
72
+ UseAddon;
73
+ if (!addon->privileged_info) {
74
+ return ThrowTypeError("Statements can only be constructed by the db.prepare() method");
75
+ }
76
+ assert(info.IsConstructCall());
77
+ Database* db = Unwrap<Database>(addon->privileged_info->This());
78
+ REQUIRE_DATABASE_OPEN(db->GetState());
79
+ REQUIRE_DATABASE_NOT_BUSY(db->GetState());
80
+
81
+ v8::Local<v8::String> source = (*addon->privileged_info)[0].As<v8::String>();
82
+ v8::Local<v8::Object> database = (*addon->privileged_info)[1].As<v8::Object>();
83
+ bool pragmaMode = (*addon->privileged_info)[2].As<v8::Boolean>()->Value();
84
+ int flags = SQLITE_PREPARE_PERSISTENT;
85
+
86
+ if (pragmaMode) {
87
+ REQUIRE_DATABASE_NO_ITERATORS_UNLESS_UNSAFE(db->GetState());
88
+ flags = 0;
89
+ }
90
+
91
+ UseIsolate;
92
+ v8::String::Utf8Value utf8(isolate, source);
93
+ sqlite3_stmt* handle;
94
+ const char* tail;
95
+
96
+ if (sqlite3_prepare_v3(db->GetHandle(), *utf8, utf8.length() + 1, flags, &handle, &tail) != SQLITE_OK) {
97
+ return db->ThrowDatabaseError();
98
+ }
99
+ if (handle == NULL) {
100
+ return ThrowRangeError("The supplied SQL string contains no statements");
101
+ }
102
+ // https://github.com/WiseLibs/better-sqlite3/issues/975#issuecomment-1520934678
103
+ for (char c; (c = *tail); ) {
104
+ if (IS_SKIPPED(c)) {
105
+ ++tail;
106
+ continue;
107
+ }
108
+ if (c == '/' && tail[1] == '*') {
109
+ tail += 2;
110
+ for (char c; (c = *tail); ++tail) {
111
+ if (c == '*' && tail[1] == '/') {
112
+ tail += 2;
113
+ break;
114
+ }
115
+ }
116
+ } else if (c == '-' && tail[1] == '-') {
117
+ tail += 2;
118
+ for (char c; (c = *tail); ++tail) {
119
+ if (c == '\n') {
120
+ ++tail;
121
+ break;
122
+ }
123
+ }
124
+ } else {
125
+ sqlite3_finalize(handle);
126
+ return ThrowRangeError("The supplied SQL string contains more than one statement");
127
+ }
128
+ }
129
+
130
+ UseContext;
131
+ bool returns_data = sqlite3_column_count(handle) >= 1 || pragmaMode;
132
+ Statement* stmt = new Statement(db, handle, addon->NextId(), returns_data);
133
+ stmt->Wrap(info.This());
134
+ SetFrozen(isolate, ctx, info.This(), addon->cs.reader, v8::Boolean::New(isolate, returns_data));
135
+ SetFrozen(isolate, ctx, info.This(), addon->cs.readonly, v8::Boolean::New(isolate, sqlite3_stmt_readonly(handle) != 0));
136
+ SetFrozen(isolate, ctx, info.This(), addon->cs.source, source);
137
+ SetFrozen(isolate, ctx, info.This(), addon->cs.database, database);
138
+
139
+ info.GetReturnValue().Set(info.This());
140
+ }
141
+
142
+ NODE_METHOD(Statement::JS_run) {
143
+ STATEMENT_START(ALLOW_ANY_STATEMENT, DOES_MUTATE);
144
+ sqlite3* db_handle = db->GetHandle();
145
+ int total_changes_before = sqlite3_total_changes(db_handle);
146
+
147
+ sqlite3_step(handle);
148
+ if (sqlite3_reset(handle) == SQLITE_OK) {
149
+ int changes = sqlite3_total_changes(db_handle) == total_changes_before ? 0 : sqlite3_changes(db_handle);
150
+ sqlite3_int64 id = sqlite3_last_insert_rowid(db_handle);
151
+ Addon* addon = db->GetAddon();
152
+ UseContext;
153
+ v8::Local<v8::Object> result = v8::Object::New(isolate);
154
+ result->Set(ctx, addon->cs.changes.Get(isolate), v8::Int32::New(isolate, changes)).FromJust();
155
+ result->Set(ctx, addon->cs.lastInsertRowid.Get(isolate),
156
+ stmt->safe_ints
157
+ ? v8::BigInt::New(isolate, id).As<v8::Value>()
158
+ : v8::Number::New(isolate, (double)id).As<v8::Value>()
159
+ ).FromJust();
160
+ STATEMENT_RETURN(result);
161
+ }
162
+ STATEMENT_THROW();
163
+ }
164
+
165
+ NODE_METHOD(Statement::JS_get) {
166
+ STATEMENT_START(REQUIRE_STATEMENT_RETURNS_DATA, DOES_NOT_MUTATE);
167
+ int status = sqlite3_step(handle);
168
+ if (status == SQLITE_ROW) {
169
+ v8::Local<v8::Value> result = Data::GetRowJS(isolate, OnlyContext, handle, stmt->safe_ints, stmt->mode);
170
+ sqlite3_reset(handle);
171
+ STATEMENT_RETURN(result);
172
+ } else if (status == SQLITE_DONE) {
173
+ sqlite3_reset(handle);
174
+ STATEMENT_RETURN(v8::Undefined(isolate));
175
+ }
176
+ sqlite3_reset(handle);
177
+ STATEMENT_THROW();
178
+ }
179
+
180
+ NODE_METHOD(Statement::JS_all) {
181
+ STATEMENT_START(REQUIRE_STATEMENT_RETURNS_DATA, DOES_NOT_MUTATE);
182
+ UseContext;
183
+ const bool safe_ints = stmt->safe_ints;
184
+ const char mode = stmt->mode;
185
+
186
+ #if !defined(NODE_MODULE_VERSION) || NODE_MODULE_VERSION < 127
187
+ bool js_error = false;
188
+ uint32_t row_count = 0;
189
+ v8::Local<v8::Array> result = v8::Array::New(isolate, 0);
190
+
191
+ while (sqlite3_step(handle) == SQLITE_ROW) {
192
+ if (row_count == 0xffffffff) { ThrowRangeError("Array overflow (too many rows returned)"); js_error = true; break; }
193
+ result->Set(ctx, row_count++, Data::GetRowJS(isolate, ctx, handle, safe_ints, mode)).FromJust();
194
+ }
195
+
196
+ if (sqlite3_reset(handle) == SQLITE_OK && !js_error) {
197
+ STATEMENT_RETURN(result);
198
+ }
199
+ if (js_error) db->GetState()->was_js_error = true;
200
+ STATEMENT_THROW();
201
+ #else
202
+ v8::LocalVector<v8::Value> rows(isolate);
203
+ rows.reserve(8);
204
+
205
+ if (mode == Data::FLAT) {
206
+ RowBuilder rowBuilder(isolate, handle, safe_ints);
207
+ while (sqlite3_step(handle) == SQLITE_ROW) {
208
+ rows.emplace_back(rowBuilder.GetRowJS());
209
+ }
210
+ } else {
211
+ while (sqlite3_step(handle) == SQLITE_ROW) {
212
+ rows.emplace_back(Data::GetRowJS(isolate, ctx, handle, safe_ints, mode));
213
+ }
214
+ }
215
+
216
+ if (sqlite3_reset(handle) == SQLITE_OK) {
217
+ if (rows.size() > 0xffffffff) {
218
+ ThrowRangeError("Array overflow (too many rows returned)");
219
+ db->GetState()->was_js_error = true;
220
+ } else {
221
+ STATEMENT_RETURN(v8::Array::New(isolate, rows.data(), rows.size()));
222
+ }
223
+ }
224
+ STATEMENT_THROW();
225
+ #endif
226
+ }
227
+
228
+ NODE_METHOD(Statement::JS_iterate) {
229
+ UseAddon;
230
+ UseIsolate;
231
+ v8::Local<v8::Function> c = addon->StatementIterator.Get(isolate);
232
+ addon->privileged_info = &info;
233
+ v8::MaybeLocal<v8::Object> maybeIterator = c->NewInstance(OnlyContext, 0, NULL);
234
+ addon->privileged_info = NULL;
235
+ if (!maybeIterator.IsEmpty()) info.GetReturnValue().Set(maybeIterator.ToLocalChecked());
236
+ }
237
+
238
+ NODE_METHOD(Statement::JS_bind) {
239
+ Statement* stmt = Unwrap<Statement>(info.This());
240
+ if (stmt->bound) return ThrowTypeError("The bind() method can only be invoked once per statement object");
241
+ REQUIRE_DATABASE_OPEN(stmt->db->GetState());
242
+ REQUIRE_DATABASE_NOT_BUSY(stmt->db->GetState());
243
+ REQUIRE_STATEMENT_NOT_LOCKED(stmt);
244
+ STATEMENT_BIND(stmt->handle);
245
+ stmt->bound = true;
246
+ info.GetReturnValue().Set(info.This());
247
+ }
248
+
249
+ NODE_METHOD(Statement::JS_pluck) {
250
+ Statement* stmt = Unwrap<Statement>(info.This());
251
+ if (!stmt->returns_data) return ThrowTypeError("The pluck() method is only for statements that return data");
252
+ REQUIRE_DATABASE_NOT_BUSY(stmt->db->GetState());
253
+ REQUIRE_STATEMENT_NOT_LOCKED(stmt);
254
+ bool use = true;
255
+ if (info.Length() != 0) { REQUIRE_ARGUMENT_BOOLEAN(first, use); }
256
+ stmt->mode = use ? Data::PLUCK : stmt->mode == Data::PLUCK ? Data::FLAT : stmt->mode;
257
+ info.GetReturnValue().Set(info.This());
258
+ }
259
+
260
+ NODE_METHOD(Statement::JS_expand) {
261
+ Statement* stmt = Unwrap<Statement>(info.This());
262
+ if (!stmt->returns_data) return ThrowTypeError("The expand() method is only for statements that return data");
263
+ REQUIRE_DATABASE_NOT_BUSY(stmt->db->GetState());
264
+ REQUIRE_STATEMENT_NOT_LOCKED(stmt);
265
+ bool use = true;
266
+ if (info.Length() != 0) { REQUIRE_ARGUMENT_BOOLEAN(first, use); }
267
+ stmt->mode = use ? Data::EXPAND : stmt->mode == Data::EXPAND ? Data::FLAT : stmt->mode;
268
+ info.GetReturnValue().Set(info.This());
269
+ }
270
+
271
+ NODE_METHOD(Statement::JS_raw) {
272
+ Statement* stmt = Unwrap<Statement>(info.This());
273
+ if (!stmt->returns_data) return ThrowTypeError("The raw() method is only for statements that return data");
274
+ REQUIRE_DATABASE_NOT_BUSY(stmt->db->GetState());
275
+ REQUIRE_STATEMENT_NOT_LOCKED(stmt);
276
+ bool use = true;
277
+ if (info.Length() != 0) { REQUIRE_ARGUMENT_BOOLEAN(first, use); }
278
+ stmt->mode = use ? Data::RAW : stmt->mode == Data::RAW ? Data::FLAT : stmt->mode;
279
+ info.GetReturnValue().Set(info.This());
280
+ }
281
+
282
+ NODE_METHOD(Statement::JS_safeIntegers) {
283
+ Statement* stmt = Unwrap<Statement>(info.This());
284
+ REQUIRE_DATABASE_NOT_BUSY(stmt->db->GetState());
285
+ REQUIRE_STATEMENT_NOT_LOCKED(stmt);
286
+ if (info.Length() == 0) stmt->safe_ints = true;
287
+ else { REQUIRE_ARGUMENT_BOOLEAN(first, stmt->safe_ints); }
288
+ info.GetReturnValue().Set(info.This());
289
+ }
290
+
291
+ NODE_METHOD(Statement::JS_columns) {
292
+ Statement* stmt = Unwrap<Statement>(info.This());
293
+ if (!stmt->returns_data) return ThrowTypeError("The columns() method is only for statements that return data");
294
+ REQUIRE_DATABASE_OPEN(stmt->db->GetState());
295
+ REQUIRE_DATABASE_NOT_BUSY(stmt->db->GetState());
296
+ Addon* addon = stmt->db->GetAddon();
297
+ UseIsolate;
298
+
299
+ #if !defined(NODE_MODULE_VERSION) || NODE_MODULE_VERSION < 127
300
+ UseContext;
301
+ int column_count = sqlite3_column_count(stmt->handle);
302
+ v8::Local<v8::Array> columns = v8::Array::New(isolate);
303
+
304
+ v8::Local<v8::String> name = addon->cs.name.Get(isolate);
305
+ v8::Local<v8::String> columnName = addon->cs.column.Get(isolate);
306
+ v8::Local<v8::String> tableName = addon->cs.table.Get(isolate);
307
+ v8::Local<v8::String> databaseName = addon->cs.database.Get(isolate);
308
+ v8::Local<v8::String> typeName = addon->cs.type.Get(isolate);
309
+
310
+ for (int i = 0; i < column_count; ++i) {
311
+ v8::Local<v8::Object> column = v8::Object::New(isolate);
312
+
313
+ column->Set(ctx, name,
314
+ InternalizedFromUtf8OrNull(isolate, sqlite3_column_name(stmt->handle, i), -1)
315
+ ).FromJust();
316
+ column->Set(ctx, columnName,
317
+ InternalizedFromUtf8OrNull(isolate, sqlite3_column_origin_name(stmt->handle, i), -1)
318
+ ).FromJust();
319
+ column->Set(ctx, tableName,
320
+ InternalizedFromUtf8OrNull(isolate, sqlite3_column_table_name(stmt->handle, i), -1)
321
+ ).FromJust();
322
+ column->Set(ctx, databaseName,
323
+ InternalizedFromUtf8OrNull(isolate, sqlite3_column_database_name(stmt->handle, i), -1)
324
+ ).FromJust();
325
+ column->Set(ctx, typeName,
326
+ InternalizedFromUtf8OrNull(isolate, sqlite3_column_decltype(stmt->handle, i), -1)
327
+ ).FromJust();
328
+
329
+ columns->Set(ctx, i, column).FromJust();
330
+ }
331
+
332
+ info.GetReturnValue().Set(columns);
333
+ #else
334
+ v8::LocalVector<v8::Name> keys(isolate);
335
+ keys.reserve(5);
336
+ keys.emplace_back(addon->cs.name.Get(isolate).As<v8::Name>());
337
+ keys.emplace_back(addon->cs.column.Get(isolate).As<v8::Name>());
338
+ keys.emplace_back(addon->cs.table.Get(isolate).As<v8::Name>());
339
+ keys.emplace_back(addon->cs.database.Get(isolate).As<v8::Name>());
340
+ keys.emplace_back(addon->cs.type.Get(isolate).As<v8::Name>());
341
+
342
+ int column_count = sqlite3_column_count(stmt->handle);
343
+ v8::LocalVector<v8::Value> columns(isolate);
344
+ columns.reserve(column_count);
345
+
346
+ for (int i = 0; i < column_count; ++i) {
347
+ v8::LocalVector<v8::Value> values(isolate);
348
+ keys.reserve(5);
349
+ values.emplace_back(
350
+ InternalizedFromUtf8OrNull(isolate, sqlite3_column_name(stmt->handle, i), -1)
351
+ );
352
+ values.emplace_back(
353
+ InternalizedFromUtf8OrNull(isolate, sqlite3_column_origin_name(stmt->handle, i), -1)
354
+ );
355
+ values.emplace_back(
356
+ InternalizedFromUtf8OrNull(isolate, sqlite3_column_table_name(stmt->handle, i), -1)
357
+ );
358
+ values.emplace_back(
359
+ InternalizedFromUtf8OrNull(isolate, sqlite3_column_database_name(stmt->handle, i), -1)
360
+ );
361
+ values.emplace_back(
362
+ InternalizedFromUtf8OrNull(isolate, sqlite3_column_decltype(stmt->handle, i), -1)
363
+ );
364
+ columns.emplace_back(
365
+ v8::Object::New(isolate,
366
+ v8::Object::New(isolate)->GetPrototype(),
367
+ keys.data(),
368
+ values.data(),
369
+ keys.size()
370
+ )
371
+ );
372
+ }
373
+
374
+ info.GetReturnValue().Set(
375
+ v8::Array::New(isolate, columns.data(), columns.size())
376
+ );
377
+ #endif
378
+ }
379
+
380
+ NODE_GETTER(Statement::JS_busy) {
381
+ Statement* stmt = Unwrap<Statement>(info.This());
382
+ info.GetReturnValue().Set(stmt->alive && stmt->locked);
383
+ }
@@ -0,0 +1,58 @@
1
+ class Statement : public node::ObjectWrap { friend class StatementIterator;
2
+ public:
3
+
4
+ ~Statement();
5
+
6
+ // Whenever this is used, db->RemoveStatement must be invoked beforehand.
7
+ void CloseHandles();
8
+
9
+ // Used to support ordered containers.
10
+ static inline bool Compare(Statement const * const a, Statement const * const b) {
11
+ return a->extras->id < b->extras->id;
12
+ }
13
+
14
+ // Returns the Statement's bind map (creates it upon first execution).
15
+ BindMap* GetBindMap(v8::Isolate* isolate);
16
+
17
+ static INIT(Init);
18
+
19
+ private:
20
+
21
+ // A class for holding values that are less often used.
22
+ class Extras { friend class Statement;
23
+ explicit Extras(sqlite3_uint64 id);
24
+ BindMap bind_map;
25
+ const sqlite3_uint64 id;
26
+ };
27
+
28
+ explicit Statement(
29
+ Database* db,
30
+ sqlite3_stmt* handle,
31
+ sqlite3_uint64 id,
32
+ bool returns_data
33
+ );
34
+
35
+ static NODE_METHOD(JS_new);
36
+ static NODE_METHOD(JS_run);
37
+ static NODE_METHOD(JS_get);
38
+ static NODE_METHOD(JS_all);
39
+ static NODE_METHOD(JS_iterate);
40
+ static NODE_METHOD(JS_bind);
41
+ static NODE_METHOD(JS_pluck);
42
+ static NODE_METHOD(JS_expand);
43
+ static NODE_METHOD(JS_raw);
44
+ static NODE_METHOD(JS_safeIntegers);
45
+ static NODE_METHOD(JS_columns);
46
+ static NODE_GETTER(JS_busy);
47
+
48
+ Database* const db;
49
+ sqlite3_stmt* const handle;
50
+ Extras* const extras;
51
+ bool alive;
52
+ bool locked;
53
+ bool bound;
54
+ bool has_bind_map;
55
+ bool safe_ints;
56
+ char mode;
57
+ const bool returns_data;
58
+ };
@@ -0,0 +1,73 @@
1
+ class BindMap {
2
+ public:
3
+
4
+ // This nested class represents a single mapping between a parameter name
5
+ // and its associated parameter index in a prepared statement.
6
+ class Pair { friend class BindMap;
7
+ public:
8
+
9
+ inline int GetIndex() {
10
+ return index;
11
+ }
12
+
13
+ inline v8::Local<v8::String> GetName(v8::Isolate* isolate) {
14
+ return name.Get(isolate);
15
+ }
16
+
17
+ private:
18
+
19
+ explicit Pair(v8::Isolate* isolate, const char* name, int index)
20
+ : name(isolate, InternalizedFromUtf8(isolate, name, -1)), index(index) {}
21
+
22
+ explicit Pair(v8::Isolate* isolate, Pair* pair)
23
+ : name(isolate, pair->name), index(pair->index) {}
24
+
25
+ const v8::Global<v8::String> name;
26
+ const int index;
27
+ };
28
+
29
+ explicit BindMap(char _) {
30
+ assert(_ == 0);
31
+ pairs = NULL;
32
+ capacity = 0;
33
+ length = 0;
34
+ }
35
+
36
+ ~BindMap() {
37
+ while (length) pairs[--length].~Pair();
38
+ FREE_ARRAY<Pair>(pairs);
39
+ }
40
+
41
+ inline Pair* GetPairs() {
42
+ return pairs;
43
+ }
44
+
45
+ inline int GetSize() {
46
+ return length;
47
+ }
48
+
49
+ // Adds a pair to the bind map, expanding the capacity if necessary.
50
+ void Add(v8::Isolate* isolate, const char* name, int index) {
51
+ assert(name != NULL);
52
+ if (capacity == length) Grow(isolate);
53
+ new (pairs + length++) Pair(isolate, name, index);
54
+ }
55
+
56
+ private:
57
+
58
+ void Grow(v8::Isolate* isolate) {
59
+ assert(capacity == length);
60
+ capacity = (capacity << 1) | 2;
61
+ Pair* new_pairs = ALLOC_ARRAY<Pair>(capacity);
62
+ for (int i = 0; i < length; ++i) {
63
+ new (new_pairs + i) Pair(isolate, pairs + i);
64
+ pairs[i].~Pair();
65
+ }
66
+ FREE_ARRAY<Pair>(pairs);
67
+ pairs = new_pairs;
68
+ }
69
+
70
+ Pair* pairs;
71
+ int capacity;
72
+ int length;
73
+ };