node-sqlite3 icon indicating copy to clipboard operation
node-sqlite3 copied to clipboard

Add sync versions of exec, run, get, all methods

Open co3k opened this issue 10 years ago • 8 comments

Synchronous methods are very useful for batch scripts.

I think supporting both of synchronous version and asynchronous one is so good.

co3k avatar Oct 05 '15 08:10 co3k

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

co3k avatar Oct 15 '15 05:10 co3k

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.

co3k avatar Oct 15 '15 05:10 co3k

It might be needed to prepare sync version of constructor?

co3k avatar Oct 16 '15 00:10 co3k

what is going on here? this is very nice feature

dcrystalj avatar Mar 15 '16 00:03 dcrystalj

@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.

wmertens avatar Dec 26 '17 21:12 wmertens

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 ?

wmertens avatar Dec 26 '17 23:12 wmertens

@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

thearchivalone avatar Mar 06 '20 03:03 thearchivalone

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!

daniellockyer avatar Sep 08 '22 21:09 daniellockyer