www.pudn.com > FIBPlus.v6.9.5.forD5-2007.FS.rar > Commonib.pas, change:2009-02-06,size:7223b
{***************************************************************}
{ FIBPlus - component library for direct access to Firebird and }
{ InterBase databases }
{ }
{ FIBPlus is based in part on the product }
{ Free IB Components, written by Gregory H. Deatz for }
{ Hoagland, Longo, Moran, Dunst & Doukas Company. }
{ mailto:gdeatz@hlmdd.com }
{ }
{ Copyright (c) 1998-2007 Devrace Ltd. }
{ Written by Serge Buzadzhy (buzz@devrace.com) }
{ }
{ ------------------------------------------------------------- }
{ FIBPlus home page: http://www.fibplus.com/ }
{ FIBPlus support : http://www.devrace.com/support/ }
{ ------------------------------------------------------------- }
{ }
{ Please see the file License.txt for full license information }
{***************************************************************}
unit Commonib;
interface
{$I FIBPlus.inc}
uses
{$IFDEF WINDOWS}
Windows, Classes, SysUtils, FIBQuery,FIBDatabase,pFIBQuery;
{$ENDIF}
{$IFDEF LINUX}
Types, Classes, SysUtils, FIBQuery,FIBDatabase,pFIBQuery,ibase;
{$ENDIF}
const
ibftSmallInt = 7;
ibftInteger = 8;
ibftQuad = 9;
ibftFloat = 10;
ibftD_Float = 11;
ibftDate = 12; // IB 6.0
ibftTime = 13; // IB 6.0
ibftChar = 14;
ibftInt64 = 16; // IB 6.0
ibftDouble = 27;
ibftDateTime = 35;
ibftTimeStamp = 35;
ibftVarChar = 37;
ibftCString = 40;
ibftBlob = 261;
{---- Please!!!! Dont write in Russian!!! Функция преобразования значения поля типа BLOB в строку ------}
function IBBlobToStr(BlobField : TFIBXSQLVAR) : string;
{---- Функция преобразования типа поля в строку ------}
{$IFDEF VER130}
function FieldTypeToStr(FieldType, FieldSubType, FieldLen, FieldScale, FieldSegmentLen, FieldCharacterLen : integer;
SQLDialect : integer = 1; FullInfo : boolean = FALSE) : string;
{$ENDIF}
procedure ExecSQL(aTransaction:TFIBTransaction; const SQLText:string;
ParamValues:array of variant
);
function RecordCountInQuery(FQuery:TFIBQuery):integer;
implementation
uses SQLTxtRtns;
function RecordCountInQuery(FQuery:TFIBQuery):integer;
var QueryCount:TFIBQuery;
i:integer;
begin
Result:=0;
if (FQuery=nil) or (FQuery.Transaction=nil) or
(not FQuery.Transaction.Active)
then Exit;
QueryCount:=TFIBQuery.Create(nil);
with QueryCount do
try
QueryCount.ParamCheck:=true;
Database :=FQuery.Database;
Transaction:=FQuery.Transaction;
SQL.Text :=CountSelect(FQuery.SQL.Text);
if SQL.Text='' then Exit;
for i:=0 to Pred(Params.Count) do
Params[i].Value:=FQuery.Params.ByName[Params[i].Name].Value;
ExecQuery;
Result:=Fields[0].asInteger
finally
QueryCount.Free
end
end;
function IBBlobToStr(BlobField : TFIBXSQLVAR) : string;
var
Strm : TMemoryStream;
begin
Result := '';
if BlobField.IsNull then
Exit;
Strm := TMemoryStream.Create;
try
BlobField.SaveToStream(Strm);
Strm.Position := 0;
SetLength(Result,Strm.Size);
Strm.Read(Result[1],Strm.Size);
finally
Strm.Free;
end;
end;
{$IFDEF VER130}
function FieldTypeToStr(FieldType, FieldSubType, FieldLen, FieldScale, FieldSegmentLen, FieldCharacterLen : integer;
SQLDialect : integer = 1; FullInfo : boolean = FALSE) : string;
function LengthInChars : string;
begin
if FieldLen FieldCharacterLen then
Result := IntToStr(FieldCharacterLen)
else
Result := IntToStr(FieldLen);
end;
begin
Result := '';
case FieldType of
ibftBlob : begin
Result := 'BLOB';
if FullInfo then
Result := Result + ' sub_type '+ IntToStr(FieldSubType)+ ' segment size '+IntToStr(FieldSegmentLen);
end;
ibftChar : begin
Result := 'CHAR';
if FullInfo then
Result := Result + '('+ LengthInChars +')';
end;
ibftVarChar : begin
Result := 'VARCHAR';
if FullInfo then
Result := Result + '('+ LengthInChars +')';
end;
ibftCString : begin
Result := 'CSTRING';
if FullInfo then
Result := Result + '('+IntToStr(FieldLen)+')';
end;
ibftDate : Result := 'DATE';
ibftTime : Result := 'TIME';
ibftDateTime : if SQLDialect = 3 then
Result := 'TIMESTAMP'
else
Result := 'DATE';
ibftSmallInt : Result := 'SMALLINT';
ibftInteger : if FieldScale 0 then
begin
Result := 'NUMERIC';
if FullInfo then
Result := Result + '(9,' + IntToStr(-1 * FieldScale) + ')';
end
else
Result := 'INTEGER';
ibftInt64 : begin
Result := 'NUMERIC';
if FullInfo then
Result := Result + '(18,' + IntToStr(-1 * FieldScale) + ')';
end;
ibftDouble : if FieldScale 0 then
begin
Result := 'NUMERIC';
if FullInfo then
Result := Result + '(15,' + IntToStr(-1 * FieldScale) + ')';
end
else
Result := 'DOUBLE PRECISION';
ibftFloat : Result := 'FLOAT';
end;
end;
{$ENDIF}
var vQueryList:TList;
function FindQuery(aTransaction:TFIBTransaction; const SQLText:string):TFIBQuery;
var i:integer;
begin
Result:=nil;
for i:=0 to Pred(vQueryList.Count) do
with TFIBQuery(vQueryList[i])do
if SQL.Text=SQLText then
begin
if (Transaction=nil) then Transaction:=aTransaction;
if (Transaction=aTransaction) then
begin
Result:=TFIBQuery(vQueryList[i]); Break;
end
end;
// end for
if Result=nil then
begin
Result:=TpFIBQuery.Create(nil);
Result.ParamCheck:=True;
Result.Transaction:=aTransaction;
Result.SQL.Text:=SQLText;
vQueryList.Add(Result);
end;
end;
procedure ExecSQL(aTransaction:TFIBTransaction; const SQLText:string;
ParamValues:array of variant
);
var i:integer;
begin
with FindQuery(aTransaction,SQLText) do
begin
if not Prepared then Prepare;
for i:=0 to Pred(Params.Count) do
Params[i].asVariant:=ParamValues[i];
ExecQuery;
end;
end;
initialization
vQueryList:=TList.Create;
finalization
vQueryList.Free
end.