For an exercise with uFFi i am try an C-Connector for MariaDB like
Garage or UBDC
As in "Unified FFI Februar 12 2020" I made Helper-classes:

FFILibrary subclass: #MariaDBLibC

FFIOpaqueObject subclass: #MariaDBHandle
MariaDBHandle >> unixModuleName [
   ^ '/usr/lib/x86_64-linux-gnu/libmariadb.so'
]

and a class

Object subclass: #MariaDBDriver
   instanceVariableNames: 'connectionHandle'

"Accessors"
MariaDBDriver >> connectionHandle [  ^ connectionHandle ]
MariaDBDriver >> connectionHandle: aHandle [  connectionHandle := aHandle ]
MariaDBDriver class >> ffiLibrary [   ^ MariaDBLibC ]

"API Methods"
MariaDBDriver >> clientInfo [  ^ self class clientInfo ]

MariaDBDriver class >> clientInfo [
   ^ self ffiCall: #(String mysql_get_client_info(void))
]

For a first simple Test I choosed the c-api-funtion:
„const char * mysql_get_client_info(void )“

In Playground I executed:
driver := MariaDBDriver fromConnectionString:
'mariaDB://localhost:5432/sodbxtest?&user=sodbxtest&password=sodbxtest'.

driver clientInfo inspect.
And I get the expected result: String „10.2.9“

But the second test with c-api-funtcion fails
„MYSQL * mysql_init(NULL)“

MariaDBDriver >> init [
   | aNullHandle |
   aNullHandle := ExternalAddress null.
   self connectionHandle: (self class init: aNullHandle).
]

MariaDBDriver class >> init: aNullHandle [
   ^ self ffiCall: #(MariaDBHandle * mysql_init(ExternalAddress aNullHandle)).
]

In Playground I again executed:
driver := MariaDBDriver fromConnectionString:
'mariaDB://localhost:5432/sodbxtest?&user=sodbxtest&password=sodbxtest'.

driver init inspect.
" A call to an external function failed"

Any ideas what is wrong??

Thanks
Georg

Reply via email to