ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/branches/journaling/fbintf/client/2.5/FB25Statement.pas
(Generate patch)

Comparing ibx/trunk/fbintf/client/2.5/FB25Statement.pas (file contents):
Revision 60 by tony, Mon Mar 27 15:21:02 2017 UTC vs.
Revision 270 by tony, Fri Jan 18 11:10:37 2019 UTC

# Line 121 | Line 121 | type
121    TIBXSQLVAR = class(TSQLVarData)
122    private
123      FStatement: TFB25Statement;
124 +    FFirebird25ClientAPI: TFB25ClientAPI;
125      FBlob: IBlob;             {Cache references}
126      FArray: IArray;
127      FNullIndicator: short;
# Line 177 | Line 178 | type
178      function GetXSQLDA: PXSQLDA;
179    protected
180      FStatement: TFB25Statement;
181 +    FFirebird25ClientAPI: TFB25ClientAPI;
182      function GetTransactionSeqNo: integer; override;
183      procedure FreeXSQLDA;
184      function GetStatement: IStatement; override;
# Line 241 | Line 243 | type
243    private
244      FDBHandle: TISC_DB_HANDLE;
245      FHandle: TISC_STMT_HANDLE;
246 +    FFirebird25ClientAPI: TFB25ClientAPI;
247      FSQLParams: TIBXINPUTSQLDA;
248      FSQLRecord: TIBXOUTPUTSQLDA;
249      FCursor: AnsiString;               { Cursor name...}
# Line 252 | Line 255 | type
255      procedure InternalPrepare; override;
256      function InternalExecute(aTransaction: ITransaction): IResults; override;
257      function InternalOpenCursor(aTransaction: ITransaction): IResultSet; override;
258 +    procedure ProcessSQL(sql: AnsiString; GenerateParamNames: boolean; var processedSQL: AnsiString); override;
259      procedure FreeHandle; override;
260      procedure InternalClose(Force: boolean); override;
261    public
262      constructor Create(Attachment: TFB25Attachment; Transaction: ITransaction;
263        sql: AnsiString; aSQLDialect: integer);
264      constructor CreateWithParameterNames(Attachment: TFB25Attachment;
265 <      Transaction: ITransaction; sql: AnsiString; aSQLDialect: integer; GenerateParamNames: boolean);
265 >      Transaction: ITransaction; sql: AnsiString; aSQLDialect: integer; GenerateParamNames: boolean;
266 >      CaseSensitiveParams: boolean=false);
267      destructor Destroy; override;
268      function FetchNext: boolean;
269  
# Line 441 | Line 446 | procedure TIBXSQLVAR.Initialize;
446   begin
447    inherited Initialize;
448    FOwnsSQLData := true;
449 <  with FirebirdClientAPI, FXSQLVar^ do
449 >  with FFirebird25ClientAPI, FXSQLVar^ do
450    begin
451      case sqltype and (not 1) of
452        SQL_TEXT, SQL_TYPE_DATE, SQL_TYPE_TIME, SQL_TIMESTAMP,
# Line 502 | Line 507 | begin
507        FXSQLVAR^.sqlind := nil;
508      end;
509    end;
510 +  Changed;
511   end;
512  
513   procedure TIBXSQLVAR.SetSQLData(AValue: PByte; len: cardinal);
# Line 511 | Line 517 | begin
517    FXSQLVAR^.sqldata := AValue;
518    FXSQLVAR^.sqllen := len;
519    FOwnsSQLData := false;
520 +  Changed;
521   end;
522  
523   procedure TIBXSQLVAR.SetScale(aValue: integer);
524   begin
525    FXSQLVAR^.sqlscale := aValue;
526 +  Changed;
527   end;
528  
529   procedure TIBXSQLVAR.SetDataLength(len: cardinal);
# Line 523 | Line 531 | begin
531    if not FOwnsSQLData then
532      FXSQLVAR^.sqldata := nil;
533    FXSQLVAR^.sqllen := len;
534 <  with FirebirdClientAPI do
534 >  with FFirebird25ClientAPI do
535      IBAlloc(FXSQLVAR^.sqldata, 0, FXSQLVAR^.sqllen);
536    FOwnsSQLData := true;
537 +  Changed;
538   end;
539  
540   procedure TIBXSQLVAR.SetSQLType(aValue: cardinal);
541   begin
542    FXSQLVAR^.sqltype := aValue or (FXSQLVAR^.sqltype and 1);
543 +  Changed;
544   end;
545  
546   procedure TIBXSQLVAR.SetCharSetID(aValue: cardinal);
547   begin
548    if aValue <> GetCharSetID then
549 <  case SQLType of
550 <  SQL_VARYING, SQL_TEXT:
551 <      FXSQLVAR^.sqlsubtype := (aValue and $FF) or (FXSQLVAR^.sqlsubtype and not $FF);
552 <
553 <  SQL_BLOB,
554 <  SQL_ARRAY:
555 <    IBError(ibxeInvalidDataConversion,[nil]);
549 >  begin
550 >    case SQLType of
551 >    SQL_VARYING, SQL_TEXT:
552 >        FXSQLVAR^.sqlsubtype := (aValue and $FF) or (FXSQLVAR^.sqlsubtype and not $FF);
553 >
554 >    SQL_BLOB,
555 >    SQL_ARRAY:
556 >      IBError(ibxeInvalidDataConversion,[nil]);
557 >    end;
558 >  Changed;
559    end;
560   end;
561  
# Line 550 | Line 563 | constructor TIBXSQLVAR.Create(aParent: T
563   begin
564    inherited Create(aParent,aIndex);
565    FStatement := aParent.Statement;
566 +  FFirebird25ClientAPI := aParent.FFirebird25ClientAPI;
567   end;
568  
569   procedure TIBXSQLVAR.FreeSQLData;
# Line 620 | Line 634 | procedure TIBXINPUTSQLDA.Bind;
634   begin
635    if Count = 0 then
636      Count := 1;
637 <  with Firebird25ClientAPI do
637 >  with FFirebird25ClientAPI do
638    begin
639      if (FXSQLDA <> nil) then
640         if isc_dsql_describe_bind(StatusVector, @(FStatement.Handle), FStatement.SQLDialect,
# Line 652 | Line 666 | procedure TIBXOUTPUTSQLDA.Bind;
666   begin
667    { Allocate an initial output descriptor (with one column) }
668    Count := 1;
669 <  with Firebird25ClientAPI do
669 >  with FFirebird25ClientAPI do
670    begin
671      { Using isc_dsql_describe, get the right size for the columns... }
672      if isc_dsql_describe(StatusVector, @(FStatement.Handle), FStatement.SQLDialect, FXSQLDA) > 0 then
# Line 687 | Line 701 | begin
701      len := sqllen;
702      if not IsNull and ((sqltype and (not 1)) = SQL_VARYING) then
703      begin
704 <      with FirebirdClientAPI do
704 >      with FFirebird25ClientAPI do
705          len := DecodeInteger(data,2);
706        Inc(data,2);
707      end;
# Line 704 | Line 718 | constructor TIBXSQLDA.Create(aStatement:
718   begin
719    inherited Create;
720    FStatement := aStatement;
721 +  FFirebird25ClientAPI := aStatement.FFirebird25ClientAPI;
722    FSize := 0;
723   //  writeln('Creating ',ClassName);
724   end;
# Line 790 | Line 805 | begin
805        OldSize := 0;
806      if Count > FSize then
807      begin
808 <      Firebird25ClientAPI.IBAlloc(FXSQLDA, OldSize, XSQLDA_LENGTH(Count));
808 >      FFirebird25ClientAPI.IBAlloc(FXSQLDA, OldSize, XSQLDA_LENGTH(Count));
809        SetLength(FColumnList, FCount);
810        FXSQLDA^.version := SQLDA_VERSION1;
811        p := @FXSQLDA^.sqlvar[0];
# Line 888 | Line 903 | end;
903   procedure TFB25Statement.GetDsqlInfo(info_request: byte; buffer: ISQLInfoResults
904    );
905   begin
906 <  with Firebird25ClientAPI, buffer as TSQLInfoResultsBuffer do
906 >  with FFirebird25ClientAPI, buffer as TSQLInfoResultsBuffer do
907    if isc_dsql_sql_info(StatusVector, @(FHandle), 1, @info_request,
908                       GetBufSize, Buffer) > 0 then
909      IBDatabaseError;
# Line 905 | Line 920 | begin
920      IBError(ibxeEmptyQuery, [nil]);
921    try
922      CheckTransaction(FTransactionIntf);
923 <    with Firebird25ClientAPI do
923 >    with FFirebird25ClientAPI do
924      begin
925        Call(isc_dsql_alloc_statement2(StatusVector, @(FDBHandle),
926                                        @FHandle), True);
# Line 913 | Line 928 | begin
928        if FHasParamNames then
929        begin
930          if FProcessedSQL = '' then
931 <          FSQLParams.PreprocessSQL(FSQL,FGenerateParamNames,FProcessedSQL);
931 >          ProcessSQL(FSQL,FGenerateParamNames,FProcessedSQL);
932          Call(isc_dsql_prepare(StatusVector, @(TRHandle), @FHandle, 0,
933                   PAnsiChar(FProcessedSQL), FSQLDialect, nil), True);
934        end
# Line 999 | Line 1014 | begin
1014  
1015    try
1016      TRHandle := (aTransaction as TFB25Transaction).Handle;
1017 <    with Firebird25ClientAPI do
1017 >    with FFirebird25ClientAPI do
1018      begin
1019        if FCollectStatistics then
1020          GetPerfCounters(FBeforeStats);
# Line 1038 | Line 1053 | begin
1053         RemoveMonitor(aTransaction as TFB25Transaction);
1054    end;
1055    FExecTransactionIntf := aTransaction;
1056 +  FSQLRecord.FTransaction := aTransaction as TFB25Transaction;
1057 +  FSQLRecord.FTransactionSeqNo := FSQLRecord.FTransaction.TransactionSeqNo;
1058    Inc(FChangeSeqNo);
1059   end;
1060  
# Line 1058 | Line 1075 | begin
1075    if (FSQLParams.FTransactionSeqNo < (FTransactionIntf as TFB25transaction).TransactionSeqNo) then
1076      IBError(ibxeInterfaceOutofDate,[nil]);
1077  
1078 < with Firebird25ClientAPI do
1078 > with FFirebird25ClientAPI do
1079   begin
1080     if FCollectStatistics then
1081       GetPerfCounters(FBeforeStats);
# Line 1097 | Line 1114 | begin
1114   Inc(FChangeSeqNo);
1115   end;
1116  
1117 + procedure TFB25Statement.ProcessSQL(sql: AnsiString; GenerateParamNames: boolean;
1118 +  var processedSQL: AnsiString);
1119 + begin
1120 +  FSQLParams.PreprocessSQL(sql,GenerateParamNames, processedSQL);
1121 + end;
1122 +
1123   procedure TFB25Statement.FreeHandle;
1124   var
1125    isc_res: ISC_STATUS;
# Line 1105 | Line 1128 | begin
1128    ReleaseInterfaces;
1129    try
1130      if FHandle <> nil then
1131 <    with Firebird25ClientAPI do
1131 >    with FFirebird25ClientAPI do
1132      begin
1133        isc_res :=
1134          Call(isc_dsql_free_statement(StatusVector, @FHandle, DSQL_drop), False);
# Line 1125 | Line 1148 | var
1148   begin
1149    if (FHandle <> nil) and (SQLStatementType = SQLSelect) and FOpen then
1150    try
1151 <    with Firebird25ClientAPI do
1151 >    with FFirebird25ClientAPI do
1152      begin
1153        isc_res := Call(
1154                     isc_dsql_free_statement(StatusVector, @FHandle, DSQL_close),
# Line 1150 | Line 1173 | constructor TFB25Statement.Create(Attach
1173   begin
1174    inherited Create(Attachment,Transaction,sql,aSQLDialect);
1175    FDBHandle := Attachment.Handle;
1176 +  FFirebird25ClientAPI := Attachment.Firebird25ClientAPI;
1177 +  OnDatabaseError := FFirebird25ClientAPI.IBDataBaseError;
1178    FSQLParams := TIBXINPUTSQLDA.Create(self);
1179    FSQLRecord := TIBXOUTPUTSQLDA.Create(self);
1180    InternalPrepare;
1181   end;
1182  
1183 < constructor TFB25Statement.CreateWithParameterNames(Attachment: TFB25Attachment;
1184 <  Transaction: ITransaction; sql: AnsiString; aSQLDialect: integer;
1185 <  GenerateParamNames: boolean);
1183 > constructor TFB25Statement.CreateWithParameterNames(
1184 >  Attachment: TFB25Attachment; Transaction: ITransaction; sql: AnsiString;
1185 >  aSQLDialect: integer; GenerateParamNames: boolean;
1186 >  CaseSensitiveParams: boolean);
1187   begin
1188    inherited CreateWithParameterNames(Attachment,Transaction,sql,aSQLDialect,GenerateParamNames);
1189    FDBHandle := Attachment.Handle;
1190 +  FFirebird25ClientAPI := Attachment.Firebird25ClientAPI;
1191 +  OnDatabaseError := FFirebird25ClientAPI.IBDataBaseError;
1192    FSQLParams := TIBXINPUTSQLDA.Create(self);
1193 +  FSQLParams.CaseSensitiveParams := CaseSensitiveParams;
1194    FSQLRecord := TIBXOUTPUTSQLDA.Create(self);
1195    InternalPrepare;
1196   end;
# Line 1183 | Line 1212 | begin
1212    if FEOF then
1213      IBError(ibxeEOF,[nil]);
1214  
1215 <  with Firebird25ClientAPI do
1215 >  with FFirebird25ClientAPI do
1216    begin
1217      { Go to the next record... }
1218      fetch_res :=
# Line 1209 | Line 1238 | begin
1238        FBOF := false;
1239        result := true;
1240      end;
1241 +    if FCollectStatistics then
1242 +    begin
1243 +      GetPerfCounters(FAfterStats);
1244 +      FStatisticsAvailable := true;
1245 +    end;
1246    end;
1247    FSQLRecord.RowChange;
1248    if FEOF then
# Line 1241 | Line 1275 | begin
1275      result := ''
1276    else
1277    begin
1278 <    RB := TSQLInfoResultsBuffer.Create(4*4096);
1278 >    RB := TSQLInfoResultsBuffer.Create(FFirebird25ClientAPI,4*4096);
1279      GetDsqlInfo(isc_info_sql_get_plan,RB);
1280       if RB.Count > 0 then
1281       Result := RB[0].GetAsString;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines