Выпущена сборка 3.3.1.11241. Поддержка BASE64 и другое.
Привет всем.
В данном промежуточном выпуске внесены следующие изменения:
- Добавлена поддержка кодовой страницы BASE64 (IB: v9.0.3+. ODS:13.1+)
- Улучшена информативность ошибок связанных с OUT-значениями параметров
- Исправлено формирование данных колонки DBSCHEMA_COLUMNS::COLLATION_NAME. Если кодовая страница получаемых данных отличается от кодовой страницы колонки, то в COLLATION_NAME будет установлен NULL.
По поводу BASE64
- Почитать про BASE64 можно здесь. Исходя из содержимого BASE64-строк, которые формирует сервер, применяется MIME-кодирование. То есть, задействуются терминальные выравнивающие символы «=»
- Судя по всему, это кодовая страница предназначена для собственных нужд Interbase. Поэтому сервер не утруждает себя проверками содержимого колонок с этой кодовой страницей. Впрочем, c другими кодовыми страницами он тоже не напрягается.
- Кодовую страницу BASE64 нельзя использовать в качестве кодовой страницы подключения.
- При принудительном перекодировании BASE64-данных в другую кодовую страницу, сервер вам вернет строку с исходными BASE64-символами.
- При запросе (клиентом) BASE64-данных в виде UNICODE-текста, провайдер возвращает UNICODE-представление BASE64-символов
- При установке (клиентом) BASE64-данных в виде UNICODE-текста, провайдер предполагает что это UNICODE-представление BASE64-символов
- При перекодировании между мультибайтным и UNICODE представлением BASE64-текста, провайдер осуществляет контроль структуры BASE64-строки. Провайдер допускает наличие пробелов после последнего символа BASE64-строки.
- Провайдер обрабатывает BASE64 как «стабильную» кодовую страницу. Это означает, что кодовая страница подключения на неё не влияет.
- Провайдер не поддерживает правильную работу с BASE64-блобами. Потому что, в случае Interbase, все текстовые блобы (SUB_TYPE TEXT) обрабатываются с использованием кодовой страницы подключения.
Демонстрация «стабильности» BASE64
option explicit '+++++++++++++++++++++++++++++++++ private const c_db_location= _ "vxpsp2-ib100:e:\database\ibp_test_ib100_d3.gdb" private const c_db_user_id= _ "SYSDBA" private const c_db_password= _ "masterkey" private const c_gds32= _ "d:\users\dima\IB_FB_YA\IB100\gds32.dll" '+++++++++++++++++++++++++++++++++ call create_table() call print_info("NONE") call print_info("WIN1251") call print_info("UNICODE_FSS") call drop_table() call wscript.quit(0) '+++++++++++++++++++++++++++++++++ private function create_connection(cn_charset) wscript.echo "connect to database [ctype="&cn_charset&"]" dim cn set cn=createobject("ADODB.Connection") cn.Provider="LCPI.IBProvider.3" call cn.Open _ ("location="&c_db_location&";"& _ "unicode_mode=false;"& _ "ctype="&cn_charset&";"& _ "auto_commit=true;"& _ "dbclient_library="&c_gds32, _ c_db_user_id, _ c_db_password) set create_connection=cn end function 'create_connection '+++++++++++++++++++++++++++++++++ private sub create_table() wscript.echo "------------ CREATE TABLE" dim cn set cn=create_connection("NONE") call cn.Execute _ ("CREATE TABLE TEST_CS"&vbCrLf& _ "(COL_WIN1251 CHAR(8) CHARACTER SET WIN1251,"&vbCrLf& _ "COL_FSS CHAR(8) CHARACTER SET UNICODE_FSS,"&vbCrLf& _ "COL_BASE64 CHAR(8) CHARACTER SET BASE64)") wscript.echo "" end sub 'create_table '+++++++++++++++++++++++++++++++++ private sub drop_table() wscript.echo "------------ DROP TABLE" dim cn set cn=create_connection("NONE") call cn.Execute("DROP TABLE TEST_CS") wscript.echo "" end sub 'drop_table '+++++++++++++++++++++++++++++++++ private sub print_info(cn_charset) wscript.echo "------------ PRINT INFO" dim cn set cn=create_connection(cn_charset) dim rs '----- wscript.echo "" wscript.echo "in schema:" 'adSchemaColumns set rs=cn.OpenSchema _ (4,Array(empty,empty,"TEST_CS")) while(not rs.eof) call print_col_metadata(rs.fields) call rs.MoveNext() wend end sub 'print_info '+++++++++++++++++++++++++++++++++ private sub print_col_metadata(fields) dim str str=fields("COLUMN_NAME").value str=str&" [len:"&cstr_sn(fields("CHARACTER_MAXIMUM_LENGTH").value)&"]" str=str&" [cset:"&cstr_sn(fields("CHARACTER_SET_NAME").value)&"]" str=str&" [coll:"&cstr_sn(fields("COLLATION_NAME").value)&"]" wscript.echo str end sub 'print_col_metadata '+++++++++++++++++++++++++++++++++ function cstr_sn(s) if(IsNull(s))then cstr_sn="#NULL#" elseif(IsEmpty(s))then cstr_sn="#EMPTY#" elseif(IsArray(s))then cstr_sn="#ARRAY#" else cstr_sn=cstr(s) end if end function 'cstr_sn '+++++++++++++++++++++++++++++++++
Вывод:
———— CREATE TABLE
connect to database [ctype=NONE]
———— PRINT INFO
connect to database [ctype=NONE]
in schema:
COL_WIN1251 [len:8] [cset:WIN1251] [coll:WIN1251]
COL_FSS [len:24] [cset:UNICODE_FSS] [coll:UNICODE_FSS]
COL_BASE64 [len:8] [cset:BASE64] [coll:BASE64]
———— PRINT INFO
connect to database [ctype=WIN1251]
in schema:
COL_WIN1251 [len:8] [cset:WIN1251] [coll:WIN1251]
COL_FSS [len:24] [cset:WIN1251] [coll:#NULL#]
COL_BASE64 [len:8] [cset:BASE64] [coll:BASE64]
———— PRINT INFO
connect to database [ctype=UNICODE_FSS]
in schema:
COL_WIN1251 [len:8] [cset:UNICODE_FSS] [coll:#NULL#]
COL_FSS [len:24] [cset:UNICODE_FSS] [coll:UNICODE_FSS]
COL_BASE64 [len:8] [cset:BASE64] [coll:BASE64]
———— DROP TABLE
connect to database [ctype=NONE]