Выпущена сборка 3.3.1.11241. Поддержка BASE64 и другое.

Привет всем.

В данном промежуточном выпуске внесены следующие изменения:

  1. Добавлена поддержка кодовой страницы BASE64 (IB: v9.0.3+. ODS:13.1+)
  2. Улучшена информативность ошибок связанных с OUT-значениями параметров
  3. Исправлено формирование данных колонки DBSCHEMA_COLUMNS::COLLATION_NAME. Если кодовая страница получаемых данных отличается от кодовой страницы колонки, то в COLLATION_NAME будет установлен NULL.

По поводу BASE64

  1. Почитать про BASE64 можно здесь. Исходя из содержимого BASE64-строк, которые формирует сервер, применяется MIME-кодирование. То есть, задействуются терминальные выравнивающие символы «=»
  2. Судя по всему, это кодовая страница предназначена для собственных нужд Interbase. Поэтому сервер не утруждает себя проверками содержимого колонок с этой кодовой страницей. Впрочем, c другими кодовыми страницами он тоже не напрягается.
  3. Кодовую страницу BASE64 нельзя использовать в качестве кодовой страницы подключения.
  4. При принудительном перекодировании BASE64-данных в другую кодовую страницу, сервер вам вернет строку с исходными BASE64-символами.
  5. При запросе (клиентом) BASE64-данных в виде UNICODE-текста, провайдер возвращает UNICODE-представление BASE64-символов
  6. При установке (клиентом) BASE64-данных в виде UNICODE-текста, провайдер предполагает что это UNICODE-представление BASE64-символов
  7. При перекодировании между мультибайтным и UNICODE представлением BASE64-текста, провайдер осуществляет контроль структуры BASE64-строки. Провайдер допускает наличие пробелов после последнего символа BASE64-строки.
  8. Провайдер обрабатывает BASE64 как «стабильную» кодовую страницу. Это означает, что кодовая страница подключения на неё не влияет.
  9. Провайдер не поддерживает правильную работу с 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]

Leave a Comment