I am trying to create a native extension in dart for postgresql. I compiled the CC file in .o, then in .so (the generic object I assume). Now it is called libpsql.so, and I put it in the same directory as my .dart file. The first line of the dart file is #import (dart-ext: libpsql); but he continues to tell me that resources are unavailable.
My dart code
#library("psql"); #import("dart-ext:libpsql_dart"); class Database { var mDb; var mUser; var mDbname; var mPasswd; var mHost; var mPort; var mTable;
And here is my C ++ code.
#include <string.h> #include <stdio.h> #include <libpq-fe.h> #include "dart_api.h" Dart_NativeFunction ResolveName(Dart_Handle name, int argc); DART_EXPORT Dart_Handle psql_dart_Init(Dart_Handle parent_library) { if (Dart_IsError(parent_library)) return parent_library; Dart_Handle result_code = Dart_SetNativeResolver(parent_library, ResolveName); if (Dart_IsError(result_code)) return result_code; return Dart_Null(); } Dart_Handle HandleError(Dart_Handle handle) { if (Dart_IsError(handle)) Dart_PropagateError(handle); return handle; } void Connect(Dart_NativeArguments args) { Dart_EnterScope(); PGconn *conn; const char *conninfo = "user=postgres;password=postgres;host=localhost;port=5432;dbname=reviewdb"; conn = PQconnectdb(conninfo); /* Check to see that the backend connection was successfully made */ if (PQstatus(conn) != CONNECTION_OK) { fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn)); PQfinish(conn); } Dart_Handle result = HandleError(Dart_NewInteger((int64_t) conn)); Dart_SetReturnValue(args, result); Dart_ExitScope(); } Dart_NativeFunction ResolveName(Dart_Handle name, int argc) { assert(Dart_IsString8(name)); const char* cname; Dart_Handle check_error = Dart_StringToCString(name, &cname); if (Dart_IsError(check_error)) Dart_PropagateError(check_error); Dart_NativeFunction result = NULL; if (strcmp("Connect", cname) == 0) result = Connect; Dart_ExitScope(); return result; }
Html script includes
<script type="application/dart" src="web/lib/psql.dart"></script> <script type="application/dart" src="web/test_dart.dart"></script>
And last, my compiling command line:
g++ -fPIC
After testing the new code, I commented on my Connect function as follows:
void Connect(Dart_NativeArguments args) { Dart_EnterScope(); // PGconn *conn; // const char *conninfo = "user=postgres password=postgres host=localhost port=5432"; // conn = PQconnectdb(conninfo); // // /* Check to see that the backend connection was successfully made */ // if (PQstatus(conn) != CONNECTION_OK) // { // fprintf(stderr, "Connection to database failed: %s", // PQerrorMessage(conn)); // PQfinish(conn); // exit(1); // } // PQfinish(conn); Dart_Handle result = HandleError(Dart_NewInteger( 0)); Dart_SetReturnValue(args, result); Dart_ExitScope(); }
Exit:
worked? Segmentation fault (core dumped)
And am I still getting the SegFault idea?
My gdb stacktrace:
Starting program: /home/<user>/Documents/dart/dart-sdk/bin/dart test_dart.dart [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". worked? Program received signal SIGSEGV, Segmentation fault. dart::Api::NewHandle (isolate=0x948a40, raw=0x7ffff7f80021) at runtime/vm/dart_api_impl.cc:114 114 runtime/vm/dart_api_impl.cc: No such file or directory. (gdb) bt #0 dart::Api::NewHandle (isolate=0x948a40, raw=0x7ffff7f80021) at runtime/vm/dart_api_impl.cc:114 #1 0x000000000042e121 in dart::Dart_Invoke (target=<optimized out>, name=0x959b90, number_of_arguments=<optimized out>, arguments=<optimized out>) at runtime/vm/dart_api_impl.cc:3543 #2 0x00000000004097ee in main (argc=<optimized out>, argv=<optimized out>) at runtime/bin/main.cc:724