Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wants to merge 5 commits into
base: master
Choose a base branch
from

Conversation

co3k
Copy link

@co3k co3k commented Oct 5, 2015

Synchronous methods are very useful for batch scripts.

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

@co3k
Copy link
Author

co3k commented Oct 15, 2015

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
Copy link
Author

co3k commented Oct 15, 2015

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
Copy link
Author

co3k commented Oct 16, 2015

It might be needed to prepare sync version of constructor?

@dcrystalj
Copy link

what is going on here? this is very nice feature

@wmertens
Copy link
Contributor

wmertens commented Dec 26, 2017

@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
Copy link
Contributor

I tried to make the constructor synchronous in Yaska@f4d7790, 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 ?

@bedwardly-down
Copy link

@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

@daniellockyer
Copy link
Member

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!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants