96 |
|
const sQueryJournal = '*Q:''%s'',%d,%d,%d,%d:%s' + LineEnding; |
97 |
|
const sTransStartJnl = '*S:''%s'',%d,%d,%d,%d:%s,%d:%s,%d' + LineEnding; |
98 |
|
const sTransCommitJnl = '*C:''%s'',%d,%d,%d' + LineEnding; |
99 |
+ |
const sTransCommitFailJnl = '*F:''%s'',%d,%d,%d' + LineEnding; |
100 |
|
const sTransCommitRetJnl = '*c:''%s'',%d,%d,%d,%d' + LineEnding; |
101 |
|
const sTransRollBackJnl = '*R:''%s'',%d,%d,%d' + LineEnding; |
102 |
+ |
const sTransRollBackFailJnl = '*f:''%s'',%d,%d,%d' + LineEnding; |
103 |
|
const sTransRollBackRetJnl = '*r:''%s'',%d,%d,%d,%d' + LineEnding; |
104 |
|
private |
105 |
|
FOptions: TJournalOptions; |
117 |
|
public |
118 |
|
{IJournallingHook} |
119 |
|
procedure TransactionStart(Tr: ITransaction); |
120 |
< |
function TransactionEnd( TransactionID: integer; Action: TTransactionAction): boolean; |
120 |
> |
function TransactionEnd( TransactionID: integer; Completion: TTrCompletionState): boolean; |
121 |
|
procedure TransactionRetained(Tr: ITransaction; OldTransactionID: integer; |
122 |
|
Action: TTransactionAction); |
123 |
|
procedure ExecQuery(Stmt: IStatement); |
124 |
+ |
procedure ExecImmediateJnl(sql: AnsiString; tr: ITransaction); |
125 |
|
public |
126 |
|
{Client side Journaling} |
127 |
|
function JournalingActive: boolean; |
486 |
|
'process_name', |
487 |
|
'trusted_role', |
488 |
|
'org_filename', |
489 |
< |
'utf8_ilename', |
489 |
> |
'utf8_filename', |
490 |
|
'ext_call_depth', |
491 |
|
'auth_block', |
492 |
|
'client_version', |
650 |
|
var LogEntry: AnsiString; |
651 |
|
TPBText: AnsiString; |
652 |
|
begin |
650 |
– |
FDoNotJournal := true; |
653 |
|
if not (joNoServerTable in FOptions) then |
654 |
|
try |
655 |
+ |
FDoNotJournal := true; |
656 |
|
GetAttachment.ExecuteSQL(Tr,sqlRecordJournalEntry,[FSessionID,Tr.GetTransactionID,NULL]); |
657 |
|
finally |
658 |
|
FDoNotJournal := false; |
671 |
|
end; |
672 |
|
|
673 |
|
function TFBJournaling.TransactionEnd(TransactionID: integer; |
674 |
< |
Action: TTransactionAction): boolean; |
674 |
> |
Completion: TTrCompletionState): boolean; |
675 |
|
|
676 |
|
var LogEntry: AnsiString; |
677 |
|
begin |
678 |
|
Result := false; |
679 |
< |
case Action of |
680 |
< |
TARollback: |
679 |
> |
case Completion of |
680 |
> |
trRolledback: |
681 |
|
begin |
682 |
|
LogEntry := Format(sTransRollbackJnl,[FBFormatDateTime(GetDateTimeFmt,Now), |
683 |
|
GetAttachment.GetAttachmentID, |
684 |
|
FSessionID,TransactionID]); |
685 |
|
Result := true; |
686 |
|
end; |
687 |
< |
TACommit: |
687 |
> |
|
688 |
> |
trRollbackFailed: |
689 |
> |
begin |
690 |
> |
LogEntry := Format(sTransRollbackFailJnl,[FBFormatDateTime(GetDateTimeFmt,Now), |
691 |
> |
GetAttachment.GetAttachmentID, |
692 |
> |
FSessionID,TransactionID]); |
693 |
> |
Result := true; |
694 |
> |
end; |
695 |
> |
|
696 |
> |
trCommitted: |
697 |
|
begin |
698 |
|
LogEntry := Format(sTransCommitJnl,[FBFormatDateTime(GetDateTimeFmt,Now), |
699 |
|
GetAttachment.GetAttachmentID, |
700 |
|
FSessionID,TransactionID]); |
701 |
|
Result := true; |
702 |
|
end; |
703 |
+ |
|
704 |
+ |
trCommitFailed: |
705 |
+ |
begin |
706 |
+ |
LogEntry := Format(sTransCommitFailJnl,[FBFormatDateTime(GetDateTimeFmt,Now), |
707 |
+ |
GetAttachment.GetAttachmentID, |
708 |
+ |
FSessionID,TransactionID]); |
709 |
+ |
Result := true; |
710 |
+ |
end; |
711 |
|
end; |
712 |
|
if assigned(FJournalFileStream) then |
713 |
|
FJournalFileStream.Write(LogEntry[1],Length(LogEntry)); |
730 |
|
if assigned(FJournalFileStream) then |
731 |
|
FJournalFileStream.Write(LogEntry[1],Length(LogEntry)); |
732 |
|
|
713 |
– |
FDoNotJournal := true; |
733 |
|
if not (joNoServerTable in FOptions) then |
734 |
|
try |
735 |
+ |
FDoNotJournal := true; |
736 |
|
GetAttachment.ExecuteSQL(Tr,sqlRecordJournalEntry,[FSessionID,Tr.GetTransactionID,OldTransactionID]); |
737 |
|
finally |
738 |
|
FDoNotJournal := false; |
753 |
|
FJournalFileStream.Write(LogEntry[1],Length(LogEntry)); |
754 |
|
end; |
755 |
|
|
756 |
+ |
procedure TFBJournaling.ExecImmediateJnl(sql: AnsiString; tr: ITransaction); |
757 |
+ |
var LogEntry: AnsiString; |
758 |
+ |
begin |
759 |
+ |
LogEntry := Format(sQueryJournal,[FBFormatDateTime(GetDateTimeFmt,Now), |
760 |
+ |
GetAttachment.GetAttachmentID, |
761 |
+ |
FSessionID, |
762 |
+ |
tr.GetTransactionID, |
763 |
+ |
Length(sql),sql]); |
764 |
+ |
if assigned(FJournalFileStream) then |
765 |
+ |
FJournalFileStream.Write(LogEntry[1],Length(LogEntry)); |
766 |
+ |
end; |
767 |
+ |
|
768 |
|
function TFBJournaling.JournalingActive: boolean; |
769 |
|
begin |
770 |
|
Result := (FJournalFileStream <> nil) and not FDoNotJournal; |
1094 |
|
|
1095 |
|
procedure TFBAttachment.ExecImmediate(TPB: array of byte; sql: AnsiString; |
1096 |
|
aSQLDialect: integer); |
1097 |
+ |
var tr: ITransaction; |
1098 |
|
begin |
1099 |
< |
ExecImmediate(StartTransaction(TPB,taCommit),sql,aSQLDialect); |
1099 |
> |
tr := StartTransaction(TPB,taCommit); |
1100 |
> |
try |
1101 |
> |
ExecImmediate(tr,sql,aSQLDialect); |
1102 |
> |
tr.Commit; |
1103 |
> |
except |
1104 |
> |
tr.Rollback(true); |
1105 |
> |
raise; |
1106 |
> |
end; |
1107 |
|
end; |
1108 |
|
|
1109 |
|
procedure TFBAttachment.ExecImmediate(transaction: ITransaction; sql: AnsiString); |
1113 |
|
|
1114 |
|
procedure TFBAttachment.ExecImmediate(TPB: array of byte; sql: AnsiString); |
1115 |
|
begin |
1116 |
< |
ExecImmediate(StartTransaction(TPB,taCommit),sql,FSQLDialect); |
1116 |
> |
ExecImmediate(TPB,sql,FSQLDialect); |
1117 |
|
end; |
1118 |
|
|
1119 |
|
function TFBAttachment.ExecuteSQL(TPB: array of byte; sql: AnsiString; |
1120 |
|
SQLDialect: integer; params: array of const): IResults; |
1121 |
+ |
var tr: ITransaction; |
1122 |
|
begin |
1123 |
< |
Result := ExecuteSQL(StartTransaction(TPB,taCommit),sql,SQLDialect,params); |
1123 |
> |
tr := StartTransaction(TPB,taCommit); |
1124 |
> |
try |
1125 |
> |
Result := ExecuteSQL(tr,sql,SQLDialect,params); |
1126 |
> |
tr.Commit; |
1127 |
> |
except |
1128 |
> |
tr.Rollback(true); |
1129 |
> |
raise; |
1130 |
> |
end; |
1131 |
|
end; |
1132 |
|
|
1133 |
|
function TFBAttachment.ExecuteSQL(transaction: ITransaction; sql: AnsiString; |
1143 |
|
function TFBAttachment.ExecuteSQL(TPB: array of byte; sql: AnsiString; |
1144 |
|
params: array of const): IResults; |
1145 |
|
begin |
1146 |
< |
Result := ExecuteSQL(StartTransaction(TPB,taCommit),sql,params); |
1146 |
> |
Result := ExecuteSQL(TPB,sql,FSQLDialect,params); |
1147 |
|
end; |
1148 |
|
|
1149 |
|
function TFBAttachment.ExecuteSQL(transaction: ITransaction; sql: AnsiString; |
1150 |
|
params: array of const): IResults; |
1151 |
|
begin |
1152 |
< |
with Prepare(transaction,sql,FSQLDialect) do |
1105 |
< |
begin |
1106 |
< |
SetParameters(SQLParams,params); |
1107 |
< |
Result := Execute; |
1108 |
< |
end; |
1152 |
> |
Result := ExecuteSQL(transaction,sql,FSQLDialect,params); |
1153 |
|
end; |
1154 |
|
|
1155 |
|
function TFBAttachment.OpenCursor(transaction: ITransaction; sql: AnsiString; |
1242 |
|
|
1243 |
|
function TFBAttachment.OpenCursorAtStart(sql: AnsiString; Scrollable: boolean; |
1244 |
|
params: array of const): IResultSet; |
1245 |
+ |
var tr: ITransaction; |
1246 |
|
begin |
1247 |
< |
Result := OpenCursorAtStart(StartTransaction([isc_tpb_read,isc_tpb_wait,isc_tpb_concurrency],taCommit),sql,FSQLDialect, |
1248 |
< |
Scrollable,params); |
1247 |
> |
tr := StartTransaction([isc_tpb_read,isc_tpb_wait,isc_tpb_concurrency],taCommit); |
1248 |
> |
try |
1249 |
> |
Result := OpenCursorAtStart(tr,sql,FSQLDialect,Scrollable,params); |
1250 |
> |
tr.Commit; |
1251 |
> |
except |
1252 |
> |
tr.Rollback(true); |
1253 |
> |
raise; |
1254 |
> |
end; |
1255 |
|
end; |
1256 |
|
|
1257 |
|
function TFBAttachment.OpenCursorAtStart(sql: AnsiString; |
1258 |
|
params: array of const): IResultSet; |
1259 |
|
begin |
1260 |
< |
Result := OpenCursorAtStart(StartTransaction([isc_tpb_read,isc_tpb_wait,isc_tpb_concurrency],taCommit),sql,FSQLDialect, |
1210 |
< |
false,params); |
1260 |
> |
Result := OpenCursorAtStart(sql,false,params); |
1261 |
|
end; |
1262 |
|
|
1263 |
|
function TFBAttachment.Prepare(transaction: ITransaction; sql: AnsiString; |