From c665c1c2fb8209f9aa2f587a37c8add127056117 Mon Sep 17 00:00:00 2001 From: Anton Nesterov Date: Tue, 20 Aug 2024 13:09:35 +0200 Subject: [PATCH] [feat] nodejs bindings Signed-off-by: Anton Nesterov --- binding.gyp | 6 +++--- {cgo => binding}/dal.cc | 7 +++---- binding/dal.go | 24 ++++++++++++++++++++++++ {cgo => binding}/dal.h | 8 ++------ {cgo => binding}/go.mod | 2 +- {cgo => binding}/go.sum | 0 cgo/dal.go | 27 --------------------------- package.json | 2 +- 8 files changed, 34 insertions(+), 42 deletions(-) rename {cgo => binding}/dal.cc (75%) create mode 100644 binding/dal.go rename {cgo => binding}/dal.h (91%) rename {cgo => binding}/go.mod (98%) rename {cgo => binding}/go.sum (100%) delete mode 100644 cgo/dal.go diff --git a/binding.gyp b/binding.gyp index 9402057..d7c405a 100644 --- a/binding.gyp +++ b/binding.gyp @@ -3,10 +3,10 @@ { 'target_name': 'dal', 'sources': [ - 'cgo/dal.h', - 'cgo/dal.cc' + 'binding/dal.h', + 'binding/dal.cc' ], - 'libraries': [ '../cgo/dal.a' ], + 'libraries': [ '../binding/dal.a' ], 'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ], "include_dirs": [ " -#include #include "dal.h" static void _InitSQLite(const Napi::CallbackInfo& args) { Napi::Buffer buf = args[0].As>(); - char * charstr = reinterpret_cast(buf.Data()); + GoString charstr = {reinterpret_cast(buf.Data()), long(buf.Length())}; InitSQLite(charstr); } static Napi::Value Handle(const Napi::CallbackInfo& args) { Napi::Buffer buf = args[0].As>(); - char * charstr = reinterpret_cast(buf.Data()); - GoSlice result = HandleQuery(charstr); + GoSlice input = {reinterpret_cast(buf.Data()), long(buf.Length()), long(buf.Length())}; + GoSlice result = HandleQuery(input); return Napi::Buffer::Copy(args.Env(), reinterpret_cast(result.data), result.len); } diff --git a/binding/dal.go b/binding/dal.go new file mode 100644 index 0000000..ffdba2a --- /dev/null +++ b/binding/dal.go @@ -0,0 +1,24 @@ +package main + +import "C" +import ( + "strings" + + _ "github.com/mattn/go-sqlite3" + "l12.xyz/dal/facade" +) + +//export InitSQLite +func InitSQLite(pragmas string) { + pragmasArray := strings.Split(pragmas, ";") + facade.InitSQLite(pragmasArray) +} + +//export HandleQuery +func HandleQuery(input []byte) []byte { + var out []byte + facade.HandleQuery(&input, &out) + return out +} + +func main() {} diff --git a/cgo/dal.h b/binding/dal.h similarity index 91% rename from cgo/dal.h rename to binding/dal.h index 4abe57e..9da9f6b 100644 --- a/cgo/dal.h +++ b/binding/dal.h @@ -19,10 +19,6 @@ typedef struct { const char *p; ptrdiff_t n; } _GoString_; /* Start of preamble from import "C" comments. */ -#line 3 "dal.go" - #include - -#line 1 "cgo-generated-wrapper" /* End of preamble from import "C" comments. */ @@ -78,8 +74,8 @@ typedef struct { void *data; GoInt len; GoInt cap; } GoSlice; extern "C" { #endif -extern void InitSQLite(char* pragmas); -extern GoSlice HandleQuery(char* input); +extern void InitSQLite(GoString pragmas); +extern GoSlice HandleQuery(GoSlice input); #ifdef __cplusplus } diff --git a/cgo/go.mod b/binding/go.mod similarity index 98% rename from cgo/go.mod rename to binding/go.mod index c01c7e5..2648e27 100644 --- a/cgo/go.mod +++ b/binding/go.mod @@ -1,4 +1,4 @@ -module srv +module binding go 1.22.6 diff --git a/cgo/go.sum b/binding/go.sum similarity index 100% rename from cgo/go.sum rename to binding/go.sum diff --git a/cgo/dal.go b/cgo/dal.go deleted file mode 100644 index 05b46e5..0000000 --- a/cgo/dal.go +++ /dev/null @@ -1,27 +0,0 @@ -package main - -// #include -import "C" -import ( - "strings" - - _ "github.com/mattn/go-sqlite3" - "l12.xyz/dal/facade" -) - -//export InitSQLite -func InitSQLite(pragmas *C.char) { - str := C.GoString(pragmas) - pragmasArray := strings.Split(str, ";") - facade.InitSQLite(pragmasArray) -} - -//export HandleQuery -func HandleQuery(input *C.char) []byte { - var in, out []byte - in = []byte(C.GoString(input)) - facade.HandleQuery(&in, &out) - return out -} - -func main() {} diff --git a/package.json b/package.json index 89a978f..f9ed759 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "test:dal": "bun test dal/__test__", "test:serve": "cd dal/__test__/srv && go run main.go", "fmt": "prettier --write .", - "cgo:prepare":"cd cgo && go build -buildmode=c-archive -o dal.a ./dal.go", + "preinstall":"cd binding && go build -buildmode=c-archive -o dal.a ./dal.go", "cgo:build": "node-gyp configure build" } }