символы юникода в вызове 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 2

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.

Чаре ИФИ* хочет ByteString. Может быть, postgres может использовать UTF-8 напрямую? Если да, то вам просто придется сказать squeakToUtf8.

Исправлено с помощью

UTF8TextConverter >> convertToSystemString

И

UTF8TextConverter >> convertFromSystemString