Выпущена сборка 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]