node-sqlite3
node-sqlite3 copied to clipboard
Add sync versions of exec, run, get, all methods
Synchronous methods are very useful for batch scripts.
I think supporting both of synchronous version and asynchronous one is so good.
Oops, sometimes this pull request fails with segfault like the following but I have no idea to resolve this problem.
Any comments?
(lldb) bt
* thread #1: tid = 0xeb5ed, 0x00007fff8dabcc82 libsystem_kernel.dylib`__kill + 10, name = 'npm', queue = 'com.apple.main-thread', stop reason = signal SIGSEGV
* frame #0: 0x00007fff8dabcc82 libsystem_kernel.dylib`__kill + 10
frame #1: 0x000000010079fe48 node`uv_kill + 9
frame #2: 0x000000010067bf1c node`node::Kill(v8::FunctionCallbackInfo<v8::Value> const&) + 175
frame #3: 0x000000010017f1ce node`v8::internal::FunctionCallbackArguments::Call(void (*)(v8::FunctionCallbackInfo<v8::Value> const&)) + 158
frame #4: 0x00000001001a86ee node`v8::internal::MaybeHandle<v8::internal::Object> v8::internal::HandleApiCallHelper<false>(v8::internal::Isolate*, v8::internal::(anonymous namespace)::BuiltinArguments<(v8::internal::BuiltinExtraArguments)1>&) + 1070
frame #5: 0x00000001001ab4ed node`v8::internal::Builtin_HandleApiCall(int, v8::internal::Object**, v8::internal::Isolate*) + 61
frame #6: 0x00001ae35fa060bb
frame #7: 0x00001ae35fccd2a5
frame #8: 0x00001ae35fcc567e
frame #9: 0x00001ae35fa93612
frame #10: 0x00001ae35fa9305b
frame #11: 0x00001ae35fa19494
frame #12: 0x00001ae35fcc54f4
frame #13: 0x00001ae35fa93612
frame #14: 0x00001ae35fa9305b
frame #15: 0x00001ae35fa19494
frame #16: 0x00001ae35fcc5288
frame #17: 0x00001ae35fcc4ff9
frame #18: 0x00001ae35fa19f7d
frame #19: 0x00001ae35fa189e2
frame #20: 0x00000001002eb49c node`v8::internal::Invoke(bool, v8::internal::Handle<v8::internal::JSFunction>, v8::internal::Handle<v8::internal::Object>, int, v8::internal::Handle<v8::internal::Object>*) + 732
frame #21: 0x0000000100165fe4 node`v8::Function::Call(v8::Local<v8::Context>, v8::Local<v8::Value>, int, v8::Local<v8::Value>*) + 276
frame #22: 0x0000000100670830 node`node::AsyncWrap::MakeCallback(v8::Local<v8::Function>, int, v8::Local<v8::Value>*) + 650
frame #23: 0x00000001006ad8c0 node`node::ProcessWrap::OnExit(uv_process_s*, long long, int) + 260
frame #24: 0x000000010079fdb6 node`uv__chld + 318
frame #25: 0x00000001007a0dfe node`uv__signal_event + 133
frame #26: 0x00000001007a87ae node`uv__io_poll + 1579
frame #27: 0x000000010079a7c9 node`uv_run + 335
frame #28: 0x0000000100681c98 node`node::Start(int, char**) + 567
frame #29: 0x0000000100000c34 node`start + 52
I've just pushed 518d470 to add sync version of finialize and to read stmt from baton instance has.
I didn't other idea to fix the segfault.
It might be needed to prepare sync version of constructor?
what is going on here? this is very nice feature
@co3k are you still using this, does it work better now? I just created #926 without realizing this was already here.
And yes, I think the constructor should be sync always.
I tried to make the constructor synchronous in https://github.com/Yaska/node-sqlite3/commit/f4d77908044ce0bc68c86c7a5b77c731ba674800, and while it is working when I run it manually, the tests segfault:
$ node
> s=require('.')
{ Database: [Function: Database],
[...]
> db=new s.Database(':memory:')
Database { open: false, filename: ':memory:', mode: 65542 }
> db.getSync('select 5', console.log)
{ '5': 5 }
it crashes when running the tests:
$ lldb node -- ./node_modules/.bin/mocha -R spec
(lldb) target create "node"
Current executable set to 'node' (x86_64).
(lldb) settings set -- target.run-args "./node_modules/.bin/mocha" "-R" "spec"
(lldb) run
Process 69504 launched: '/Users/wmertens/.nix-profile/bin/node' (x86_64)
query properties
1) "before all" hook
blob
Process 69504 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSEGV
frame #0: 0x00007fff7ba2990a libsystem_kernel.dylib`__kill + 10
libsystem_kernel.dylib`__kill:
-> 0x7fff7ba2990a <+10>: jae 0x7fff7ba29914 ; <+20>
0x7fff7ba2990c <+12>: movq %rax, %rdi
0x7fff7ba2990f <+15>: jmp 0x7fff7ba2176c ; cerror_nocancel
0x7fff7ba29914 <+20>: retq
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSEGV
* frame #0: 0x00007fff7ba2990a libsystem_kernel.dylib`__kill + 10
frame #1: 0x0000000101a0d569 libuv.1.dylib`uv_kill + 9
frame #2: 0x00000001008233c8 node`node::Kill(v8::FunctionCallbackInfo<v8::Value> const&) + 200
frame #3: 0x00000001000c3ca9 node`v8::internal::FunctionCallbackArguments::Call(void (*)(v8::FunctionCallbackInfo<v8::Value> const&)) + 425
frame #4: 0x000000010012935b node`v8::internal::MaybeHandle<v8::internal::Object> v8::internal::(anonymous namespace)::HandleApiCallHelper<false>(v8::internal::Isolate*, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::FunctionTemplateInfo>, v8::internal::Handle<v8::internal::Object>, v8::internal::BuiltinArguments) + 843
frame #5: 0x0000000100128911 node`v8::internal::Builtin_Impl_HandleApiCall(v8::internal::BuiltinArguments, v8::internal::Isolate*) + 273
frame #6: 0x00003217d930463d
frame #7: 0x00003217d93f474a
frame #8: 0x00003217d93bf9ce
frame #9: 0x00003217d93f474a
frame #10: 0x00003217d93bf9ce
frame #11: 0x00003217d9305d1b
frame #12: 0x00003217d93f474a
frame #13: 0x00003217d93bf9ce
frame #14: 0x00003217d93f48a5
frame #15: 0x00003217d93bf9ce
frame #16: 0x00003217d9305d1b
frame #17: 0x00003217d93be479
frame #18: 0x00003217d930410d
frame #19: 0x00000001003edc4d node`v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, bool, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, int, v8::internal::Handle<v8::internal::Object>*, v8::internal::Handle<v8::internal::Object>, v8::internal::Execution::MessageHandling) + 637
frame #20: 0x00000001003ed95c node`v8::internal::Execution::Call(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, int, v8::internal::Handle<v8::internal::Object>*) + 140
frame #21: 0x00000001000aa270 node`v8::Function::Call(v8::Local<v8::Context>, v8::Local<v8::Value>, int, v8::Local<v8::Value>*) + 384
frame #22: 0x000000010081bff3 node`node::InternalMakeCallback(node::Environment*, v8::Local<v8::Object>, v8::Local<v8::Function>, int, v8::Local<v8::Value>*, node::async_context) + 179
frame #23: 0x000000010081c0e9 node`node::MakeCallback(v8::Isolate*, v8::Local<v8::Object>, char const*, int, v8::Local<v8::Value>*, node::async_context) + 169
frame #24: 0x00000001008267dd node`node::EmitExit(node::Environment*) + 189
frame #25: 0x000000010082da4b node`node::Start(v8::Isolate*, node::IsolateData*, int, char const* const*, int, char const* const*) + 875
frame #26: 0x00000001008270a7 node`node::Start(uv_loop_s*, int, char const* const*, int, char const* const*) + 439
frame #27: 0x0000000100826bb6 node`node::Start(int, char**) + 486
frame #28: 0x0000000100001054 node`start + 52
I don't really know what I'm doing 😅 - any hints on what could be wrong @springmeyer @co3k ?
@co3k, since https://github.com/JoshuaWise/better-sqlite3 is currently being actively developed and is supposed to be a purely synchronous implementation of Sqlite3, is this PR still valid? If not, could you please close it since it's over two years old and I'm currently helping to clean up here? Thanks
I would love to see this land in node-sqlite3 so if someone is able to rebase and refactor into N-API, that'd be great!