символы Юникода в FFI Smalltalk при вызове OpenDBX - PullRequest
2 голосов
/ 06 марта 2011

Мне нужно вставить некоторые строки, содержащие символы, не входящие в 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 ]

4 голосов
/ 07 марта 2011

Я думаю, у меня была такая же проблема.Необходимо кодировать данные, используя ту же кодировку, что и сервер.В настоящее время вы должны иметь возможность задавать кодировку следующим образом:

settings :=     DBXConnectionSettings
                host: 'host.com'
                port: '5432'
                database: 'grss'
                userName: 'username'
                userPassword: 'password';
                encodingStrategy: (DBXStaticEncoding newForEncoding: #utf8).

Если кодировка неизвестна, можно использовать DBXAutomaticEncoding вместо DBXStaticEncoding.Это должно работать на базе данных postgresql.

1 голос
/ 11 марта 2011

Я до сих пор не знаю, как ответить кому-то здесь, в stackoverflow. Во всяком случае, то, что говорит Пану, должно работать:

settings :=     DBXConnectionSettings
                host: 'host.com'
                port: '5432'
                database: 'grss'
                userName: 'username'
                userPassword: 'password';
                encodingStrategy: (DBXStaticEncoding newForEncoding: #utf8).

без необходимости использования директивы UTF8TextConverter. Это способ сделать это с SqueakDBX. И это не имеет ничего общего с GlorpDBX, это просто SqueakDBX. Если последняя версия ConfigurationOfSqueakDBX не обновлена, просто обновите ее до последних версий с помощью браузера Monticello.

1 голос
/ 06 марта 2011

Кажется, проблема в WideString.Кажется, что FFI не может преобразовать из экземпляров WideString в C char *

Можете ли вы использовать обычный ByteString вместо широкого?может быть, FFI можно исправить, чтобы он мог это сделать?

0 голосов
/ 07 марта 2011

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

UTF8TextConverter >> convertToSystemString

и

UTF8TextConverter >> convertFromSystemString

0 голосов
/ 07 марта 2011

char FFI * хочет ByteString.Может быть, Postgres может использовать UTF-8 напрямую?Если это так, вам просто нужно сказать squeakToUtf8.

...