@@ -7,6 +7,7 @@ interface
7
7
uses
8
8
Classes
9
9
, SysUtils
10
+ , SyncObjs
10
11
, SQLite3Conn
11
12
, SQLDB
12
13
, IRCLogBot.Common
@@ -16,6 +17,7 @@ interface
16
17
{ TDatabase }
17
18
TDatabase = class (TObject)
18
19
private
20
+ FCriticalSection: TCriticalSection;
19
21
FConnection: TSQLite3Connection;
20
22
FTransaction: TSQLTransaction;
21
23
FQuery: TSQLQuery;
@@ -60,67 +62,85 @@ procedure TDatabase.SetupTables;
60
62
61
63
procedure TDatabase.Insert (ANickName, AChannel, AMessage: String);
62
64
begin
65
+ FCriticalSection.Acquire;
63
66
try
64
- debug(' Starting Transaction...' );
65
- FTransaction.StartTransaction;
66
- debug(' Inserting: <%s> [%s] "%s"' , [ANickName, AChannel, AMessage]);
67
- FConnection.ExecuteDirect(Format(
68
- ' INSERT INTO logs (nick, channel, message) VALUES (%s, %s, %s)' ,
69
- [QuotedStr(ANickName), QuotedStr(AChannel), QuotedStr(AMessage)]));
70
- FTransaction.Commit;
71
- debug(' Transaction committed.' );
72
- except
73
- on e:Exception do
74
- begin
75
- FTransaction.Rollback;
76
- debug(' Error inserting message: %s' , [e.Message]);
67
+ try
68
+ debug(' Starting Transaction...' );
69
+ FTransaction.StartTransaction;
70
+ try
71
+ debug(' Inserting: <%s> [%s] "%s"' , [ANickName, AChannel, AMessage]);
72
+ FConnection.ExecuteDirect(Format(
73
+ ' INSERT INTO logs (nick, channel, message) VALUES (%s, %s, %s)' ,
74
+ [QuotedStr(ANickName), QuotedStr(AChannel), QuotedStr(AMessage)]));
75
+ finally
76
+ FTransaction.Commit;
77
+ debug(' Transaction committed.' );
78
+ end ;
79
+ except
80
+ on e:Exception do
81
+ begin
82
+ FTransaction.Rollback;
83
+ debug(' Error inserting message: %s' , [e.Message]);
84
+ end ;
77
85
end ;
86
+ finally
87
+ FCriticalSection.Release;
78
88
end ;
79
89
end ;
80
90
81
91
function TDatabase.Get (ACount: Integer): TStringList;
82
92
begin
83
93
Result:= TStringList.Create;
94
+ FCriticalSection.Acquire;
84
95
try
85
96
debug(' Starting transaction.' );
86
97
FTransaction.StartTransaction;
87
- FQuery.SQL.Text:= Format(
88
- ' SELECT timestamp, nick, channel, message FROM logs ORDER BY id DESC LIMIT %d' ,
89
- [ACount]
90
- );
91
- FQuery.Open;
92
- if FQuery.RecordCount > 0 then
93
- begin
94
- FQuery.First;
95
- repeat
96
- debug(' Retrieving: %s [%s] %s: %s' , [
97
- FQuery.FieldByName(' timestamp' ).AsString,
98
- FQuery.FieldByName(' channel' ).AsString,
99
- FQuery.FieldByName(' nick' ).AsString,
100
- FQuery.FieldByName(' message' ).AsString
101
- ]);
102
- Result.Insert(0 , Format(' %s [%s] %s: %s' ,[
103
- FQuery.FieldByName(' timestamp' ).AsString,
104
- FQuery.FieldByName(' channel' ).AsString,
105
- FQuery.FieldByName(' nick' ).AsString,
106
- FQuery.FieldByName(' message' ).AsString
107
- ]));
108
- FQuery.Next;
109
- until FQuery.EOF;
110
- FQuery.Close;
111
- FTransaction.EndTransaction;
112
- debug(' Transaction ended.' );
113
- end ;
114
- except
115
- on e:Exception do
116
- begin
117
- debug(' Error retrieving lines: %s' , [e.Message]);
98
+ try
99
+ try
100
+ FQuery.SQL.Text:= Format(
101
+ ' SELECT timestamp, nick, channel, message FROM logs ORDER BY id DESC LIMIT %d' ,
102
+ [ACount]
103
+ );
104
+ FQuery.Open;
105
+ if FQuery.RecordCount > 0 then
106
+ begin
107
+ FQuery.First;
108
+ repeat
109
+ debug(' Retrieving: %s [%s] %s: %s' , [
110
+ FQuery.FieldByName(' timestamp' ).AsString,
111
+ FQuery.FieldByName(' channel' ).AsString,
112
+ FQuery.FieldByName(' nick' ).AsString,
113
+ FQuery.FieldByName(' message' ).AsString
114
+ ]);
115
+ Result.Insert(0 , Format(' %s [%s] %s: %s' ,[
116
+ FQuery.FieldByName(' timestamp' ).AsString,
117
+ FQuery.FieldByName(' channel' ).AsString,
118
+ FQuery.FieldByName(' nick' ).AsString,
119
+ FQuery.FieldByName(' message' ).AsString
120
+ ]));
121
+ FQuery.Next;
122
+ until FQuery.EOF;
123
+ FQuery.Close;
124
+ end ;
125
+ finally
126
+ FTransaction.EndTransaction;
127
+ debug(' Transaction ended.' );
128
+ end ;
129
+ except
130
+ on e:Exception do
131
+ begin
132
+ FTransaction.Rollback;
133
+ debug(' Error retrieving lines: %s' , [e.Message]);
134
+ end ;
118
135
end ;
136
+ finally
137
+ FCriticalSection.Release;
119
138
end ;
120
139
end ;
121
140
122
141
constructor TDatabase.Create(ADatabaseFile: String);
123
142
begin
143
+ FCriticalSection:= TCriticalSection.Create;
124
144
FConnection:= TSQLite3Connection.Create(nil );
125
145
FTransaction:= TSQLTransaction.Create(FConnection);
126
146
FConnection.Transaction:= FTransaction;
@@ -133,6 +153,7 @@ constructor TDatabase.Create(ADatabaseFile: String);
133
153
134
154
destructor TDatabase.Destroy;
135
155
begin
156
+ FCriticalSection.Free;
136
157
FQuery.Free;
137
158
FTransaction.Free;
138
159
FConnection.Free;
0 commit comments