Вести с полей. Знакомимся c IBP v3.3.

Сегодня завершено кодирование нового выпуска провайдера — 3.3. Точнее оно было закончено вчера. Но сегодня, созерцая в «Process Explorer» отрицательное значение «Page Faults» у fb_inet_server.exe, решил не наступать на эти грабли с переполнением. Ну и, в результате, внес еще пару улучшений в код. Итак.

Благодаря последним изменениям в коде, стало возможным выполнение вот таких вот вещей:

option explicit

dim cn
set cn=createobject("ADODB.Connection")
cn.Provider="LCPI.IBProvider.3"

call cn.Open("location=localhost:d:\database\employee.fdb;ctype=win1251",_
             "SYSDBA","masterkey")

wscript.echo "DBMS Name       :"&cstr(cn.Properties("DBMS Name").Value)
wscript.echo "DBMS Version    :"&cstr(cn.Properties("DBMS Version").Value)
wscript.echo "Provider Version:"&cstr(cn.Properties("Provider Version").Value)
wscript.echo ""

dim script
script= _
 " set autoddl on;"&vbCrLf& _
 " set transaction;"&vbCrLf& _
 " create generator GEN_ID_TEST_TABLE;"&vbCrLf& _
 " create table TEST_TABLE"&vbCrLf& _
 "  (ID INTEGER NOT NULL PRIMARY KEY,TEXT BLOB SUB_TYPE TEXT);"&vbCrLf& _
 " create trigger BI_TEST_TABLE for TEST_TABLE"&vbCrLf& _
 "  before insert"&vbCrLf& _
 "  as"&vbCrLf& _
 "  begin"&vbCrLf& _
 "   if(NEW.ID IS NULL) then"&vbCrLf& _
 "    NEW.ID=GEN_ID(GEN_ID_TEST_TABLE,1);"&vbCrLf& _
 "  end;"&vbCrLf& _
 " insert into TEST_TABLE (text) values('record 1');"&vbCrLf& _
 " insert into TEST_TABLE (text) values('record 2');"&vbCrLf& _
 " set term !!;"&vbCrLf& _
 " select * from TEST_TABLE!!"&vbCrLf& _
 " set terminator ;!!"&vbCrLf& _
 " set autoddl off;"&vbCrLf& _
 " drop table TEST_TABLE;"&vbCrLf& _
 " drop generator GEN_ID_TEST_TABLE;"&vbCrLf& _
 " commit;"

wscript.echo script

dim ra
dim rs
set rs=cn.Execute(script,ra)

dim n
n=0
dim nRecs
dim iCol

do while(not (rs is nothing))
 n=n+1

 wscript.echo "---------- "&cstr(n)
 wscript.echo "rows_affected:"&cstr(ra)

 if(rs.State=0)then 'adStateClosed
  wscript.echo "no recordset"
 else
  nRecs=0

  while(not rs.eof)
   nRecs=nRecs+1

   for iCol=0 to rs.Fields.count-1
    wscript.echo " ["&rs(iCol).Name&"]="&cstr_sn(rs(iCol).Value)
   next 'iCol

   wscript.echo ""
   call rs.MoveNext()
  wend

  wscript.echo "record count: "&cstr(nRecs)
 end if

 '----
 set rs=rs.NextRecordset(ra)
loop

wscript.echo ""
wscript.echo "----------"
wscript.echo "total results: "&cstr(n)

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
private 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
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

На выходе получается следующее:

DBMS Name :Firebird
DBMS Version :2.5.0.26089
Provider Version:3.3.0.11104

set autoddl on;
set transaction;
create generator GEN_ID_TEST_TABLE;
create table TEST_TABLE
(ID INTEGER NOT NULL PRIMARY KEY,TEXT BLOB SUB_TYPE TEXT);
create trigger BI_TEST_TABLE for TEST_TABLE
before insert
as
begin
if(NEW.ID IS NULL) then
NEW.ID=GEN_ID(GEN_ID_TEST_TABLE,1);
end;
insert into TEST_TABLE (text) values(‘record 1’);
insert into TEST_TABLE (text) values(‘record 2’);
set term !!;
select * from TEST_TABLE!!
set terminator ;!!
set autoddl off;
drop table TEST_TABLE;
drop generator GEN_ID_TEST_TABLE;
commit;
———- 1
rows_affected:-1
no recordset
———- 2
rows_affected:-1
no recordset
———- 3
rows_affected:-1
no recordset
———- 4
rows_affected:-1
no recordset
———- 5
rows_affected:1
no recordset
———- 6
rows_affected:1
no recordset
———- 7
rows_affected:-1

[ID]=1
[TEXT]=record 1

[ID]=2
[TEXT]=record 2

record count: 2
———- 8
rows_affected:-1
no recordset
———- 9
rows_affected:-1
no recordset
———- 10
rows_affected:-1
no recordset
———-
total results: 10

Я думаю, какие-либо дополнительные комментарии здесь будут лишними. 🙂

Ну только если — останавливаться на достигнутом пока не собираемся.

Официальный выпуск нового релиза — будет в первой половине этого месяца. Я искренне в это верю.

Leave a Comment