Sto provando a creare un'estensione nativa in dart per postgresql. Ho compilato il file CC in .o quindi in .so (oggetto condiviso credo). Ora è chiamato libpsql.so e l'ho inserito nella stessa directory del mio file .dart. La prima riga del file dardo è #import (dart-ext: libpsql); ma continua a dirmi che le risorse non sono disponibili.Dart
Il mio codice dardo
#library("psql");
#import("dart-ext:libpsql_dart");
class Database {
var mDb;
var mUser;
var mDbname;
var mPasswd;
var mHost;
var mPort;
var mTable;
//String toString() => "<PostgreSQL: [email protected]$_host:$_port/$_table>";
Database(host,user,passwd,dbname) : this.mUser = user, this.mHost = host, this.mPasswd = passwd, this.mDbname = dbname {
mDb = _connect(host,user,passwd,dbname);
}
}
_connect(host,user,passwd,dbname) native 'Connect';
E qui è il mio codice C++.
#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 sceneggiatura includono
<script type="application/dart" src="web/lib/psql.dart"></script>
<script type="application/dart" src="web/test_dart.dart"></script>
E l'ultimo, il mio compilazione riga di comando:
g++ -fPIC --verbose -I/home/{linux user}/Documents/dart/dart-sdk/include/ -lpq -I/usr/include/postgresql -c psql_dart.cc
gcc -shared -Wl,-soname,libpsql.so -o libpsql.so psql_dart.o
Dopo aver testato il nuovo codice ho commentato la mia funzione di collegare in questo modo:
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();
}
L'uscita :
worked?
Segmentation fault (core dumped)
E ho ancora qualche idea su SegFault?
mio 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
la compilazione con 'g ++ -O2 -DDART_SHARED_LIB -I/home/plaudet/Documents/dardo/dardo-sdk/include -rdynamic -fPIC -shared dart_psql.cc -I/usr/include/PostgreSQL -L/usr /lib/postgresql/9.1/lib -lpq -o dart_psql' Ancora non funziona –
Ho provato il codice minimo per l'estensione nativa, ricompilato, ancora non funziona, ho bisogno dell'aiuto di qualcuno che è stato in grado di compilare ed eseguire qualsiasi estensione nativa del dardo. Per favore. –
Quali errori stai attualmente ricevendo quando provi ad eseguire l'applicazione (nota che c'è un problema con il dart-editor che non riconosce la sintassi di importazione dart-ext). Ma quando provi ad eseguirlo cosa ottieni? Quando ho compilato la copia delle informazioni per ottenere un file 'libpsql.so' e I #import ('dart-ext: psql'); vede la risorsa ma non riesce a caricarla (non trova la funzione di inizializzazione) –