символы юникода в вызове Smalltalk FFI для OpenDBX
Мне нужно вставить в базу данных несколько строк, содержащих символы, отличные от ASCII (Postgress). Вот минимальный пример. Я получаю "не мог принудить аргументы" на <cdecl: long 'odbx_query' (ulong char* ulong) module: 'opendbx'>
. Насколько я понимаю, это ошибка FFI, и вызов даже не попал на сервер базы данных, но я не уверен.
| conn settings sql |
settings := DBXConnectionSettings
host: 'host.com'
port: '5432'
database: 'grss'
userName: 'username'
userPassword: 'password'.
conn := DBXConnection platform: DBXPostgresPlatform new settings: settings.
conn connectAndOpen.
sql := 'select ''', (WideString fromPacked: 269), ''' from dual'.
conn execute: sql.
conn close.
conn disconnect.
5 ответов:
Я думаю, что у меня была та же проблема. Следует кодировать данные, используя ту же кодировку, что и сервер. В настоящее время вы должны иметь возможность указать кодировку следующим образом:
settings := DBXConnectionSettings host: 'host.com' port: '5432' database: 'grss' userName: 'username' userPassword: 'password'; encodingStrategy: (DBXStaticEncoding newForEncoding: #utf8).
Если кодировка не известна, можно использовать
DBXAutomaticEncoding
вместоDBXStaticEncoding
. Это должно работать на базе данных postgresql.
Проблема, по-видимому, заключается в расширении. Похоже, что FFI не может преобразовать экземпляры WideString в C char *
Можно ли использовать обычный Байтестринг вместо широкого? может быть, FFI можно было бы исправить, чтобы он мог это сделать?
Я до сих пор не знаю, как ответить кому-то здесь, в stackoverflow. Во всяком случае, то, что говорит пану, должно сработать:
settings := DBXConnectionSettings host: 'host.com' port: '5432' database: 'grss' userName: 'username' userPassword: 'password'; encodingStrategy: (DBXStaticEncoding newForEncoding: #utf8).
Без необходимости использования direclty UTF8TextConverter. Вот как это делается с помощью SqueakDBX. И это не имеет ничего общего с GlorpDBX, это просто SqueakDBX. Если последняя Конфигурацияfsqueakdbx не обновляется, просто обновите ее до последней версии с помощью браузера Monticello.