www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - problem creating a berkeley db binding

reply JT <jt nomail.com> writes:
i'm trying to create a binding for berkeley db dll and quickly ran into some
problems, how do i translate statement below.

int DB->open(DB *db, DB_TXN *txnid, const char *file,
    const char *database, DBTYPE type, u_int32_t flags, int mode);

my normal approach would be,

extern (C) {
	int function(DB* db, DB_TXN* txnid, char* file, char* database, DBTYPE type,
u_int32_t flags, int mode) DB->open;
}

but real problem is 'DB->open', can anoybody suggest a workaround for this. DB
is just a simple struct (struct DB;)
Aug 30 2009
next sibling parent reply Sergey Gromov <snake.scaly gmail.com> writes:
Sun, 30 Aug 2009 11:28:16 -0400, JT wrote:

 i'm trying to create a binding for berkeley db dll and quickly ran
 into some problems, how do i translate statement below.
 
 int DB->open(DB *db, DB_TXN *txnid, const char *file,
     const char *database, DBTYPE type, u_int32_t flags, int mode);
This is not a valid C or C++ statement, nor a declaration. It's usually hard to translate an invalid code to a different language.
 my normal approach would be,
 
 extern (C) {
 	int function(DB* db, DB_TXN* txnid, char* file, char* database, DBTYPE type,
u_int32_t flags, int mode) DB->open;
 }
If open() is a method of DB struct then it uses some sort of C++ calling convention, probably thiscall. Thiscall is incompatilbe with cdecl, so extern(C) won't work.
 but real problem is 'DB->open', can anoybody suggest a workaround for
 this. DB is just a simple struct (struct DB;)
I can only guess here that what you want is extern(C++) interface DB { int open(DB_TXN* txnid, char* file, char* database, DBTYPE type, u_int32_t flags, int mode); } But, without a link to source you try to bind to, it's only a wild guess.
Aug 30 2009
parent JT <jt nomail.com> writes:
Sergey Gromov Wrote:

 Sun, 30 Aug 2009 11:28:16 -0400, JT wrote:
 
 i'm trying to create a binding for berkeley db dll and quickly ran
 into some problems, how do i translate statement below.
 
 int DB->open(DB *db, DB_TXN *txnid, const char *file,
     const char *database, DBTYPE type, u_int32_t flags, int mode);
This is not a valid C or C++ statement, nor a declaration. It's usually hard to translate an invalid code to a different language.
 my normal approach would be,
 
 extern (C) {
 	int function(DB* db, DB_TXN* txnid, char* file, char* database, DBTYPE type,
u_int32_t flags, int mode) DB->open;
 }
If open() is a method of DB struct then it uses some sort of C++ calling convention, probably thiscall. Thiscall is incompatilbe with cdecl, so extern(C) won't work.
 but real problem is 'DB->open', can anoybody suggest a workaround for
 this. DB is just a simple struct (struct DB;)
I can only guess here that what you want is extern(C++) interface DB { int open(DB_TXN* txnid, char* file, char* database, DBTYPE type, u_int32_t flags, int mode); } But, without a link to source you try to bind to, it's only a wild guess.
thanks, unfortunately the source is too long to include here, it was a Berkeley DB from Oracle. is there a binding already made for this library. :P
Aug 30 2009
prev sibling next sibling parent reply Mike Parker <aldacron gmail.com> writes:
JT wrote:
 i'm trying to create a binding for berkeley db dll and quickly ran into some
problems, how do i translate statement below.
 
 int DB->open(DB *db, DB_TXN *txnid, const char *file,
     const char *database, DBTYPE type, u_int32_t flags, int mode);
 
 my normal approach would be,
 
 extern (C) {
 	int function(DB* db, DB_TXN* txnid, char* file, char* database, DBTYPE type,
u_int32_t flags, int mode) DB->open;
 }
 
 but real problem is 'DB->open', can anoybody suggest a workaround for this. DB
is just a simple struct (struct DB;)
The function name is not 'DB->open'. That's something used in the comments. Nearly all functions in Berkeley DB are declared as function pointers used as struct fields. So what you'll want is something like this: extern(C): struct DB { int function(DB* db, DB_TXN* txnid, char* file, char* database, DBTYPE type, u_int32_t flags, int mode) open; } Along with all of the rest of the DB function pointers and the numerous inner structs declared in the C headers.
Aug 31 2009
parent JT <jt nomail.com> writes:
Mike Parker Wrote:

 JT wrote:
 i'm trying to create a binding for berkeley db dll and quickly ran into some
problems, how do i translate statement below.
 
 int DB->open(DB *db, DB_TXN *txnid, const char *file,
     const char *database, DBTYPE type, u_int32_t flags, int mode);
 
 my normal approach would be,
 
 extern (C) {
 	int function(DB* db, DB_TXN* txnid, char* file, char* database, DBTYPE type,
u_int32_t flags, int mode) DB->open;
 }
 
 but real problem is 'DB->open', can anoybody suggest a workaround for this. DB
is just a simple struct (struct DB;)
The function name is not 'DB->open'. That's something used in the comments. Nearly all functions in Berkeley DB are declared as function pointers used as struct fields. So what you'll want is something like this: extern(C): struct DB { int function(DB* db, DB_TXN* txnid, char* file, char* database, DBTYPE type, u_int32_t flags, int mode) open; } Along with all of the rest of the DB function pointers and the numerous inner structs declared in the C headers.
thank you so much Mike. yeah i just noticed that.
Aug 31 2009
prev sibling parent BLS <windevguy hotmail.de> writes:
JT wrote:
 i'm trying to create a binding for berkeley db dll and quickly ran into some
problems, how do i translate statement below.
 
 int DB->open(DB *db, DB_TXN *txnid, const char *file,
     const char *database, DBTYPE type, u_int32_t flags, int mode);
 
 my normal approach would be,
 
 extern (C) {
 	int function(DB* db, DB_TXN* txnid, char* file, char* database, DBTYPE type,
u_int32_t flags, int mode) DB->open;
 }
 
 but real problem is 'DB->open', can anoybody suggest a workaround for this. DB
is just a simple struct (struct DB;)
Maybe this project is interesting. last update may 2007 http://code.google.com/p/db4d/
Sep 03 2009