ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/runtime/IBSQL.pas
(Generate patch)

Comparing ibx/trunk/runtime/IBSQL.pas (file contents):
Revision 25 by tony, Sat Mar 14 10:44:03 2015 UTC vs.
Revision 39 by tony, Tue May 17 08:14:52 2016 UTC

# Line 35 | Line 35 | unit IBSQL;
35  
36   {$Mode Delphi}
37  
38 + {$IF FPC_FULLVERSION >= 20700 }
39 + {$codepage UTF8}
40 + {$ENDIF}
41 +
42   { IBSQL param names in dialect 3 quoted format (e.g. :"MyParam") are by default disabled.
43  
44   Dialect 3 quoted format parameter names represent a significant overhead and are of
# Line 76 | Line 80 | uses
80   {$ELSE}
81    baseunix, unix,
82   {$ENDIF}
83 <  SysUtils, Classes, Forms, Controls, IBHeader,
83 >  SysUtils, Classes, IBHeader,
84    IBErrorCodes, IBExternals, DB, IB, IBDatabase, IBUtils, IBXConst;
85  
86   const
# Line 328 | Line 332 | type
332    TIBSQL = class(TComponent)
333    private
334      FIBLoaded: Boolean;
335 +    FOnSQLChanged: TNotifyEvent;
336      FUniqueParamNames: Boolean;
337      function GetFieldCount: integer;
338      procedure SetUniqueParamNames(AValue: Boolean);
# Line 366 | Line 371 | type
371      procedure SetSQL(Value: TStrings);
372      procedure SetTransaction(Value: TIBTransaction);
373      procedure SQLChanging(Sender: TObject);
374 <    procedure BeforeTransactionEnd(Sender: TObject);
374 >    procedure SQLChanged(Sender: TObject);
375 >    procedure BeforeTransactionEnd(Sender: TObject; Action: TTransactionAction);
376    public
377      constructor Create(AOwner: TComponent); override;
378      destructor Destroy; override;
# Line 412 | Line 418 | type
418      property SQL: TStrings read FSQL write SetSQL;
419      property Transaction: TIBTransaction read GetTransaction write SetTransaction;
420      property OnSQLChanging: TNotifyEvent read FOnSQLChanging write FOnSQLChanging;
421 +    property OnSQLChanged: TNotifyEvent read FOnSQLChanged write FOnSQLChanged;
422    end;
423  
424   implementation
# Line 2137 | Line 2144 | end;
2144  
2145   { TIBSQL }
2146   constructor TIBSQL.Create(AOwner: TComponent);
2147 + var  GUID : TGUID;
2148   begin
2149    inherited Create(AOwner);
2150    FIBLoaded := False;
# Line 2153 | Line 2161 | begin
2161    FRecordCount := 0;
2162    FSQL := TStringList.Create;
2163    TStringList(FSQL).OnChanging := SQLChanging;
2164 +  TStringList(FSQL).OnChange := SQLChanged;
2165    FProcessedSQL := TStringList.Create;
2166    FHandle := nil;
2167    FSQLParams := TIBXSQLDA.Create(self,daInput);
2168    FSQLRecord := TIBXSQLDA.Create(self,daOutput);
2169    FSQLType := SQLUnknown;
2170    FParamCheck := True;
2171 <  FCursor := Name + RandomString(8);
2171 >  CreateGuid(GUID);
2172 >  FCursor := GUIDToString(GUID);
2173    if AOwner is TIBDatabase then
2174      Database := TIBDatabase(AOwner)
2175    else
# Line 2311 | Line 2321 | begin
2321        FBOF := True;
2322        FEOF := False;
2323        FRecordCount := 0;
2324 +      if not (csDesigning in ComponentState) then
2325 +        MonitorHook.SQLExecute(Self);
2326        if FGoToFirstRecordOnExecute then
2327          Next;
2328      end;
# Line 2321 | Line 2333 | begin
2333                              Database.SQLDialect,
2334                              FSQLParams.AsXSQLDA,
2335                              FSQLRecord.AsXSQLDA), True);
2336 +      if not (csDesigning in ComponentState) then
2337 +        MonitorHook.SQLExecute(Self);
2338   (*      if (fetch_res <> 0) and (fetch_res <> isc_deadlock) then
2339        begin
2340           { Sometimes a prepared stored procedure appears to get
# Line 2343 | Line 2357 | begin
2357                             TRHandle,
2358                             @FHandle,
2359                             Database.SQLDialect,
2360 <                           FSQLParams.AsXSQLDA), True)
2360 >                           FSQLParams.AsXSQLDA), True);
2361 >      if not (csDesigning in ComponentState) then
2362 >        MonitorHook.SQLExecute(Self);
2363    end;
2364 <  if not (csDesigning in ComponentState) then
2365 <    MonitorHook.SQLExecute(Self);
2364 >  FBase.DoAfterExecQuery(self);
2365 > //  writeln('Rows Affected = ',RowsAffected);
2366   end;
2367  
2368   function TIBSQL.GetEOF: Boolean;
# Line 2458 | Line 2474 | begin
2474         SQLUpdate, SQLDelete])) then
2475      result := ''
2476    else begin
2477 <    info_request := Char(isc_info_sql_get_plan);
2477 >    info_request := isc_info_sql_get_plan;
2478      Call(isc_dsql_sql_info(StatusVector, @FHandle, 2, @info_request,
2479                             SizeOf(result_buffer), result_buffer), True);
2480 <    if (result_buffer[0] <> Char(isc_info_sql_get_plan)) then
2480 >    if (result_buffer[0] <> isc_info_sql_get_plan) then
2481        IBError(ibxeUnknownError, [nil]);
2482      result_length := isc_vax_integer(@result_buffer[1], 2);
2483      SetString(result, nil, result_length);
# Line 2478 | Line 2494 | end;
2494  
2495   function TIBSQL.GetRowsAffected: Integer;
2496   var
2481  result_buffer: array[0..1048] of Char;
2497    info_request: Char;
2498 +  RB: TResultBuffer;
2499   begin
2500    if not Prepared then
2501      result := -1
2502    else begin
2503 <    info_request := Char(isc_info_sql_records);
2504 <    if isc_dsql_sql_info(StatusVector, @FHandle, 1, @info_request,
2505 <                         SizeOf(result_buffer), result_buffer) > 0 then
2506 <      IBDatabaseError;
2507 <    if (result_buffer[0] <> Char(isc_info_sql_records)) then
2508 <      result := -1
2509 <    else
2510 <    case SQLType of
2511 <    SQLUpdate:   Result := isc_vax_integer(@result_buffer[6], 4);
2512 <    SQLDelete:   Result := isc_vax_integer(@result_buffer[13], 4);
2513 <    SQLInsert:   Result := isc_vax_integer(@result_buffer[27], 4);
2514 <    else         Result := -1 ;
2515 <    end ;
2503 >    RB := TResultBuffer.Create;
2504 >    try
2505 >      info_request := isc_info_sql_records;
2506 >      if isc_dsql_sql_info(StatusVector, @FHandle, 1, @info_request,
2507 >                         RB.Size, RB.buffer) > 0 then
2508 >        IBDatabaseError;
2509 >      case SQLType of
2510 >      SQLInsert, SQLUpdate: {Covers Insert or Update as well as individual update}
2511 >        Result := RB.GetValue(isc_info_sql_records, isc_info_req_insert_count)+
2512 >         RB.GetValue(isc_info_sql_records, isc_info_req_update_count);
2513 >      SQLDelete:
2514 >        Result := RB.GetValue(isc_info_sql_records, isc_info_req_delete_count);
2515 >      SQLExecProcedure:
2516 >        Result :=  RB.GetValue(isc_info_sql_records, isc_info_req_insert_count) +
2517 >                   RB.GetValue(isc_info_sql_records, isc_info_req_update_count) +
2518 >                   RB.GetValue(isc_info_sql_records, isc_info_req_delete_count);
2519 >      else
2520 >        Result := 0;
2521 >      end;
2522 >    finally
2523 >      RB.Free;
2524 >    end;
2525    end;
2526   end;
2527  
# Line 2548 | Line 2573 | const
2573    end;
2574  
2575   begin
2576 +  sParamName := '';
2577    slNames := TStringList.Create;
2578    try
2579      { Do some initializations of variables }
# Line 2708 | Line 2734 | begin
2734      { After preparing the statement, query the stmt type and possibly
2735        create a FSQLRecord "holder" }
2736      { Get the type of the statement }
2737 <    type_item := Char(isc_info_sql_stmt_type);
2737 >    type_item := isc_info_sql_stmt_type;
2738      Call(isc_dsql_sql_info(StatusVector, @FHandle, 1, @type_item,
2739                           SizeOf(res_buffer), res_buffer), True);
2740 <    if (res_buffer[0] <> Char(isc_info_sql_stmt_type)) then
2740 >    if (res_buffer[0] <> isc_info_sql_stmt_type) then
2741        IBError(ibxeUnknownError, [nil]);
2742      stmt_len := isc_vax_integer(@res_buffer[1], 2);
2743      FSQLType := TIBSQLTypes(isc_vax_integer(@res_buffer[3], stmt_len));
# Line 2800 | Line 2826 | begin
2826    if FHandle <> nil then FreeHandle;
2827   end;
2828  
2829 < procedure TIBSQL.BeforeTransactionEnd(Sender: TObject);
2829 > procedure TIBSQL.SQLChanged(Sender: TObject);
2830 > begin
2831 >  if assigned(OnSQLChanged) then
2832 >    OnSQLChanged(self);
2833 > end;
2834 >
2835 > procedure TIBSQL.BeforeTransactionEnd(Sender: TObject;
2836 >  Action: TTransactionAction);
2837   begin
2838    if (FOpen) then
2839      Close;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines