Patch from Luiz Americo, bug #12703

- Format code to get consistent use of spacing, indentation and capitalization.

git-svn-id: trunk@12242 -
This commit is contained in:
joost 2008-11-27 11:03:02 +00:00
parent 1446eb9dc2
commit 332d850f1e
3 changed files with 577 additions and 569 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
unit sqlite3ds; unit Sqlite3DS;
{ {
This is TSqlite3Dataset, a TDataset descendant class for use with fpc compiler This is TSqlite3Dataset, a TDataset descendant class for use with fpc compiler
@ -33,36 +33,36 @@ unit sqlite3ds;
{$mode objfpc} {$mode objfpc}
{$H+} {$H+}
{ $Define DEBUG} {.$Define DEBUG_SQLITEDS}
interface interface
uses uses
Classes, SysUtils, customsqliteds; Classes, SysUtils, CustomSqliteDS;
type type
{ TSqlite3Dataset } { TSqlite3Dataset }
TSqlite3Dataset = class (TCustomSqliteDataset) TSqlite3Dataset = class(TCustomSqliteDataset)
private private
function SqliteExec(ASql:PChar; ACallback: TSqliteCdeclCallback; Data: Pointer):Integer;override; function SqliteExec(ASQL: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer; override;
function InternalGetHandle: Pointer; override; function InternalGetHandle: Pointer; override;
function GetSqliteVersion: String; override; function GetSqliteVersion: String; override;
procedure InternalCloseHandle;override; procedure InternalCloseHandle; override;
procedure BuildLinkedList; override; procedure BuildLinkedList; override;
protected protected
procedure InternalInitFieldDefs; override; procedure InternalInitFieldDefs; override;
function GetRowsAffected:Integer; override; function GetRowsAffected:Integer; override;
public public
procedure ExecuteDirect(const ASql: String);override; procedure ExecuteDirect(const ASQL: String); override;
function ReturnString: String; override; function ReturnString: String; override;
function QuickQuery(const ASql:String;const AStrList: TStrings;FillObjects:Boolean):String;override; function QuickQuery(const ASQL: String; const AStrList: TStrings; FillObjects: Boolean): String; override;
end; end;
implementation implementation
uses uses
sqlite3,db; sqlite3, db;
function SqliteCode2Str(Code: Integer): String; function SqliteCode2Str(Code: Integer): String;
begin begin
@ -97,11 +97,11 @@ begin
SQLITE_NOTADB : Result := 'SQLITE_NOTADB'; SQLITE_NOTADB : Result := 'SQLITE_NOTADB';
SQLITE_DONE : Result := 'SQLITE_DONE'; SQLITE_DONE : Result := 'SQLITE_DONE';
else else
Result:='Unknown Return Value'; Result := 'Unknown Return Value';
end; end;
end; end;
function GetAutoIncValue(NextValue: Pointer; Columns: Integer; ColumnValues: PPChar; ColumnNames: PPChar): integer; cdecl; function GetAutoIncValue(NextValue: Pointer; Columns: Integer; ColumnValues: PPChar; ColumnNames: PPChar): Integer; cdecl;
var var
CodeError, TempInt: Integer; CodeError, TempInt: Integer;
begin begin
@ -118,15 +118,15 @@ end;
{ TSqlite3Dataset } { TSqlite3Dataset }
function TSqlite3Dataset.SqliteExec(ASql: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer; function TSqlite3Dataset.SqliteExec(ASQL: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer;
begin begin
Result:=sqlite3_exec(FSqliteHandle, ASql, ACallback, Data, nil); Result := sqlite3_exec(FSqliteHandle, ASQL, ACallback, Data, nil);
end; end;
procedure TSqlite3Dataset.InternalCloseHandle; procedure TSqlite3Dataset.InternalCloseHandle;
begin begin
sqlite3_close(FSqliteHandle); sqlite3_close(FSqliteHandle);
FSqliteHandle:=nil; FSqliteHandle := nil;
//todo:handle return data //todo:handle return data
end; end;
@ -144,7 +144,7 @@ begin
FReturnCode := sqlite3_prepare(Result, CheckFileSql, -1, @vm, nil); FReturnCode := sqlite3_prepare(Result, CheckFileSql, -1, @vm, nil);
if FReturnCode <> SQLITE_OK then if FReturnCode <> SQLITE_OK then
begin begin
ErrorStr := SqliteCode2Str(FReturnCode) + ' - ' + sqlite3_errmsg(Result);; ErrorStr := SqliteCode2Str(FReturnCode) + ' - ' + sqlite3_errmsg(Result);
sqlite3_close(Result); sqlite3_close(Result);
DatabaseError(ErrorStr, Self); DatabaseError(ErrorStr, Self);
end; end;
@ -160,12 +160,12 @@ var
i, ColumnCount: Integer; i, ColumnCount: Integer;
AType: TFieldType; AType: TFieldType;
begin begin
{$ifdef DEBUG} {$ifdef DEBUG_SQLITEDS}
WriteLn('##TSqlite3Dataset.InternalInitFieldDefs##'); WriteLn('##TSqlite3Dataset.InternalInitFieldDefs##');
{$endif} {$endif}
FAutoIncFieldNo := -1; FAutoIncFieldNo := -1;
FieldDefs.Clear; FieldDefs.Clear;
FReturnCode := sqlite3_prepare(FSqliteHandle, PChar(FSql), -1, @vm, nil); FReturnCode := sqlite3_prepare(FSqliteHandle, PChar(FSQL), -1, @vm, nil);
if FReturnCode <> SQLITE_OK then if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString, Self); DatabaseError(ReturnString, Self);
sqlite3_step(vm); sqlite3_step(vm);
@ -176,145 +176,145 @@ begin
SetLength(FGetSqlStr, ColumnCount); SetLength(FGetSqlStr, ColumnCount);
for i := 0 to ColumnCount - 1 do for i := 0 to ColumnCount - 1 do
begin begin
ColumnStr := UpperCase(String(sqlite3_column_decltype(vm, i))); ColumnStr := UpperCase(String(sqlite3_column_decltype(vm, i)));
if (ColumnStr = 'INTEGER') or (ColumnStr = 'INT') then if (ColumnStr = 'INTEGER') or (ColumnStr = 'INT') then
begin begin
if AutoIncrementKey and (UpperCase(String(sqlite3_column_name(vm, i))) = UpperCase(PrimaryKey)) then if AutoIncrementKey and (UpperCase(String(sqlite3_column_name(vm, i))) = UpperCase(PrimaryKey)) then
begin begin
AType := ftAutoInc; AType := ftAutoInc;
FAutoIncFieldNo := i; FAutoIncFieldNo := i;
end end
else else
AType := ftInteger; AType := ftInteger;
end else if Pos('VARCHAR', ColumnStr) = 1 then end else if Pos('VARCHAR', ColumnStr) = 1 then
begin begin
AType := ftString; AType := ftString;
end else if Pos('BOOL', ColumnStr) = 1 then end else if Pos('BOOL', ColumnStr) = 1 then
begin begin
AType := ftBoolean; AType := ftBoolean;
end else if Pos('AUTOINC', ColumnStr) = 1 then end else if Pos('AUTOINC', ColumnStr) = 1 then
begin begin
AType := ftAutoInc; AType := ftAutoInc;
if FAutoIncFieldNo = -1 then if FAutoIncFieldNo = -1 then
FAutoIncFieldNo := i; FAutoIncFieldNo := i;
end else if (Pos('FLOAT', ColumnStr) = 1) or (Pos('NUMERIC', ColumnStr) = 1) then end else if (Pos('FLOAT', ColumnStr) = 1) or (Pos('NUMERIC', ColumnStr) = 1) then
begin begin
AType := ftFloat; AType := ftFloat;
end else if (ColumnStr = 'DATETIME') then end else if (ColumnStr = 'DATETIME') then
begin begin
AType := ftDateTime; AType := ftDateTime;
end else if (ColumnStr = 'DATE') then end else if (ColumnStr = 'DATE') then
begin begin
AType := ftDate; AType := ftDate;
end else if (ColumnStr = 'LARGEINT') then end else if (ColumnStr = 'LARGEINT') then
begin begin
AType := ftLargeInt; AType := ftLargeInt;
end else if (ColumnStr = 'TIME') then end else if (ColumnStr = 'TIME') then
begin begin
AType := ftTime; AType := ftTime;
end else if (ColumnStr = 'TEXT') then end else if (ColumnStr = 'TEXT') then
begin begin
AType := ftMemo; AType := ftMemo;
end else if (ColumnStr = 'CURRENCY') then end else if (ColumnStr = 'CURRENCY') then
begin begin
AType := ftCurrency; AType := ftCurrency;
end else if (ColumnStr = 'WORD') then end else if (ColumnStr = 'WORD') then
begin begin
AType := ftWord; AType := ftWord;
end else if (ColumnStr = '') then end else if (ColumnStr = '') then
begin begin
case sqlite3_column_type(vm, i) of case sqlite3_column_type(vm, i) of
SQLITE_INTEGER: SQLITE_INTEGER:
AType := ftInteger; AType := ftInteger;
SQLITE_FLOAT: SQLITE_FLOAT:
AType := ftFloat; AType := ftFloat;
else else
AType := ftString; AType := ftString;
end; end;
end else end else
begin begin
AType := ftString; AType := ftString;
end; end;
FieldDefs.Add(String(sqlite3_column_name(vm, i)), AType, FieldSizeMap[AType = ftString]); FieldDefs.Add(String(sqlite3_column_name(vm, i)), AType, FieldSizeMap[AType = ftString]);
//Set the pchar2sql function //Set the pchar2sql function
if AType in [ftString, ftMemo] then if AType in [ftString, ftMemo] then
FGetSqlStr[i] := @Char2SqlStr FGetSqlStr[i] := @Char2SQLStr
else else
FGetSqlStr[i] := @Num2SqlStr; FGetSqlStr[i] := @Num2SQLStr;
{$ifdef DEBUG} {$ifdef DEBUG_SQLITEDS}
writeln(' Field[',i,'] Name: ', sqlite3_column_name(vm,i)); WriteLn(' Field[', i, '] Name: ', sqlite3_column_name(vm, i));
writeln(' Field[',i,'] Type: ', sqlite3_column_decltype(vm,i)); WriteLn(' Field[', i, '] Type: ', sqlite3_column_decltype(vm, i));
{$endif} {$endif}
end; end;
sqlite3_finalize(vm); sqlite3_finalize(vm);
{$ifdef DEBUG} {$ifdef DEBUG_SQLITEDS}
writeln(' FieldDefs.Count: ', FieldDefs.Count); WriteLn(' FieldDefs.Count: ', FieldDefs.Count);
{$endif} {$endif}
end; end;
function TSqlite3Dataset.GetRowsAffected: Integer; function TSqlite3Dataset.GetRowsAffected: Integer;
begin begin
Result:=sqlite3_changes(FSqliteHandle); Result := sqlite3_changes(FSqliteHandle);
end; end;
procedure TSqlite3Dataset.ExecuteDirect(const ASql: String); procedure TSqlite3Dataset.ExecuteDirect(const ASQL: String);
var var
vm:Pointer; vm: Pointer;
begin begin
FReturnCode:=sqlite3_prepare(FSqliteHandle,Pchar(ASql),-1,@vm,nil); FReturnCode := sqlite3_prepare(FSqliteHandle, Pchar(ASQL), -1, @vm, nil);
if FReturnCode <> SQLITE_OK then if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString,Self); DatabaseError(ReturnString, Self);
FReturnCode:=sqlite3_step(vm); FReturnCode := sqlite3_step(vm);
sqlite3_finalize(vm); sqlite3_finalize(vm);
end; end;
procedure TSqlite3Dataset.BuildLinkedList; procedure TSqlite3Dataset.BuildLinkedList;
var var
TempItem:PDataRecord; TempItem: PDataRecord;
vm:Pointer; vm: Pointer;
Counter:Integer; Counter: Integer;
begin begin
//Get AutoInc Field initial value //Get AutoInc Field initial value
if FAutoIncFieldNo <> -1 then if FAutoIncFieldNo <> -1 then
sqlite3_exec(FSqliteHandle,PChar('Select Max('+Fields[FAutoIncFieldNo].FieldName+') from ' + FTableName), sqlite3_exec(FSqliteHandle, PChar('Select Max(' + Fields[FAutoIncFieldNo].FieldName +
@GetAutoIncValue,@FNextAutoInc,nil); ') from ' + FTableName), @GetAutoIncValue, @FNextAutoInc, nil);
FReturnCode:=sqlite3_prepare(FSqliteHandle,Pchar(FSql),-1,@vm,nil); FReturnCode := sqlite3_prepare(FSqliteHandle, PChar(FSQL), -1, @vm, nil);
if FReturnCode <> SQLITE_OK then if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString,Self); DatabaseError(ReturnString, Self);
FDataAllocated:=True; FDataAllocated := True;
TempItem:=FBeginItem; TempItem := FBeginItem;
FRecordCount:=0; FRecordCount := 0;
FRowCount:=sqlite3_column_count(vm); FRowCount := sqlite3_column_count(vm);
FReturnCode:=sqlite3_step(vm); FReturnCode := sqlite3_step(vm);
while FReturnCode = SQLITE_ROW do while FReturnCode = SQLITE_ROW do
begin begin
Inc(FRecordCount); Inc(FRecordCount);
New(TempItem^.Next); New(TempItem^.Next);
TempItem^.Next^.Previous:=TempItem; TempItem^.Next^.Previous := TempItem;
TempItem:=TempItem^.Next; TempItem := TempItem^.Next;
GetMem(TempItem^.Row,FRowBufferSize); GetMem(TempItem^.Row, FRowBufferSize);
for Counter := 0 to FRowCount - 1 do for Counter := 0 to FRowCount - 1 do
TempItem^.Row[Counter]:=StrNew(sqlite3_column_text(vm,Counter)); TempItem^.Row[Counter] := StrNew(sqlite3_column_text(vm, Counter));
FReturnCode:=sqlite3_step(vm); FReturnCode := sqlite3_step(vm);
end; end;
sqlite3_finalize(vm); sqlite3_finalize(vm);
// Attach EndItem // Attach EndItem
TempItem^.Next:=FEndItem; TempItem^.Next := FEndItem;
FEndItem^.Previous:=TempItem; FEndItem^.Previous := TempItem;
// Alloc temporary item used in append/insert // Alloc temporary item used in append/insert
GetMem(FCacheItem^.Row,FRowBufferSize); GetMem(FCacheItem^.Row, FRowBufferSize);
for Counter := 0 to FRowCount - 1 do for Counter := 0 to FRowCount - 1 do
FCacheItem^.Row[Counter]:=nil; FCacheItem^.Row[Counter] := nil;
// Fill FBeginItem.Row with nil -> necessary for avoid exceptions in empty datasets // Fill FBeginItem.Row with nil -> necessary for avoid exceptions in empty datasets
GetMem(FBeginItem^.Row,FRowBufferSize); GetMem(FBeginItem^.Row, FRowBufferSize);
//Todo: see if is better to nullif using FillDWord //Todo: see if is better to nullif using FillDWord
for Counter := 0 to FRowCount - 1 do for Counter := 0 to FRowCount - 1 do
FBeginItem^.Row[Counter]:=nil; FBeginItem^.Row[Counter] := nil;
end; end;
function TSqlite3Dataset.ReturnString: String; function TSqlite3Dataset.ReturnString: String;
@ -327,9 +327,9 @@ begin
Result := String(sqlite3_version()); Result := String(sqlite3_version());
end; end;
function TSqlite3Dataset.QuickQuery(const ASql:String;const AStrList: TStrings;FillObjects:Boolean):String; function TSqlite3Dataset.QuickQuery(const ASQL: String; const AStrList: TStrings; FillObjects:Boolean): String;
var var
vm:Pointer; vm: Pointer;
procedure FillStrings; procedure FillStrings;
begin begin
@ -343,7 +343,8 @@ var
begin begin
while FReturnCode = SQLITE_ROW do while FReturnCode = SQLITE_ROW do
begin begin
AStrList.AddObject(String(sqlite3_column_text(vm,0)), TObject(PtrInt(sqlite3_column_int(vm,1)))); AStrList.AddObject(String(sqlite3_column_text(vm, 0)),
TObject(PtrInt(sqlite3_column_int(vm, 1))));
FReturnCode := sqlite3_step(vm); FReturnCode := sqlite3_step(vm);
end; end;
end; end;
@ -351,14 +352,14 @@ begin
if FSqliteHandle = nil then if FSqliteHandle = nil then
GetSqliteHandle; GetSqliteHandle;
Result := ''; Result := '';
FReturnCode := sqlite3_prepare(FSqliteHandle,Pchar(ASql), -1, @vm, nil); FReturnCode := sqlite3_prepare(FSqliteHandle,Pchar(ASQL), -1, @vm, nil);
if FReturnCode <> SQLITE_OK then if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString,Self); DatabaseError(ReturnString, Self);
FReturnCode := sqlite3_step(vm); FReturnCode := sqlite3_step(vm);
if (FReturnCode = SQLITE_ROW) and (sqlite3_column_count(vm) > 0) then if (FReturnCode = SQLITE_ROW) and (sqlite3_column_count(vm) > 0) then
begin begin
Result := String(sqlite3_column_text(vm,0)); Result := String(sqlite3_column_text(vm, 0));
if AStrList <> nil then if AStrList <> nil then
begin begin
if FillObjects and (sqlite3_column_count(vm) > 1) then if FillObjects and (sqlite3_column_count(vm) > 1) then

View File

@ -1,4 +1,4 @@
unit sqliteds; unit SqliteDS;
{ {
This is TSqliteDataset, a TDataset descendant class for use with fpc compiler This is TSqliteDataset, a TDataset descendant class for use with fpc compiler
@ -33,42 +33,42 @@ unit sqliteds;
{$mode objfpc} {$mode objfpc}
{$H+} {$H+}
{ $Define DEBUG} {.$Define DEBUG_SQLITEDS}
interface interface
uses uses
Classes, SysUtils, customsqliteds; Classes, SysUtils, CustomSqliteDS;
type type
{ TSqliteDataset } { TSqliteDataset }
TSqliteDataset = class (TCustomSqliteDataset) TSqliteDataset = class(TCustomSqliteDataset)
private private
function SqliteExec(ASql:PChar; ACallback: TSqliteCdeclCallback; Data: Pointer):Integer;override; function SqliteExec(ASQL: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer; override;
function InternalGetHandle: Pointer; override; function InternalGetHandle: Pointer; override;
function GetSqliteEncoding: String; function GetSqliteEncoding: String;
function GetSqliteVersion: String; override; function GetSqliteVersion: String; override;
procedure InternalCloseHandle;override; procedure InternalCloseHandle; override;
procedure BuildLinkedList; override; procedure BuildLinkedList; override;
protected protected
procedure InternalInitFieldDefs; override; procedure InternalInitFieldDefs; override;
function GetRowsAffected:Integer; override; function GetRowsAffected:Integer; override;
public public
procedure ExecuteDirect(const ASql: String);override; procedure ExecuteDirect(const ASQL: String); override;
function ReturnString: String; override; function ReturnString: String; override;
function QuickQuery(const ASql:String;const AStrList: TStrings;FillObjects:Boolean):String;override; function QuickQuery(const ASQL: String; const AStrList: TStrings; FillObjects: Boolean): String; override;
property SqliteEncoding: String read GetSqliteEncoding; property SqliteEncoding: String read GetSqliteEncoding;
end; end;
implementation implementation
uses uses
sqlite,db; sqlite, db;
//function sqlite_last_statement_changes(dbhandle:Pointer):longint;cdecl;external 'sqlite' name 'sqlite_last_statement_changes'; //function sqlite_last_statement_changes(dbhandle:Pointer):longint;cdecl;external 'sqlite' name 'sqlite_last_statement_changes';
function GetAutoIncValue(NextValue: Pointer; Columns: Integer; ColumnValues: PPChar; ColumnNames: PPChar): integer; cdecl; function GetAutoIncValue(NextValue: Pointer; Columns: Integer; ColumnValues: PPChar; ColumnNames: PPChar): Integer; cdecl;
var var
CodeError, TempInt: Integer; CodeError, TempInt: Integer;
begin begin
@ -85,15 +85,15 @@ end;
{ TSqliteDataset } { TSqliteDataset }
function TSqliteDataset.SqliteExec(ASql: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer; function TSqliteDataset.SqliteExec(ASQL: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer;
begin begin
Result:=sqlite_exec(FSqliteHandle, ASql, ACallback, Data, nil); Result := sqlite_exec(FSqliteHandle, ASQL, ACallback, Data, nil);
end; end;
procedure TSqliteDataset.InternalCloseHandle; procedure TSqliteDataset.InternalCloseHandle;
begin begin
sqlite_close(FSqliteHandle); sqlite_close(FSqliteHandle);
FSqliteHandle:=nil; FSqliteHandle := nil;
end; end;
function TSqliteDataset.InternalGetHandle: Pointer; function TSqliteDataset.InternalGetHandle: Pointer;
@ -103,29 +103,29 @@ begin
Result := sqlite_open(PChar(FFileName), 0, @ErrorStr); Result := sqlite_open(PChar(FFileName), 0, @ErrorStr);
if Result = nil then if Result = nil then
begin begin
DatabaseError('Error opening "' + FFileName +'": ' + String(ErrorStr)); DatabaseError('Error opening "' + FFileName + '": ' + String(ErrorStr));
sqlite_freemem(ErrorStr); sqlite_freemem(ErrorStr);
end; end;
end; end;
procedure TSqliteDataset.InternalInitFieldDefs; procedure TSqliteDataset.InternalInitFieldDefs;
var var
ColumnCount,i:Integer; ColumnCount, i:Integer;
AType:TFieldType; AType: TFieldType;
vm:Pointer; vm: Pointer;
ColumnNames,ColumnValues:PPChar; ColumnNames, ColumnValues:PPChar;
ColumnStr:String; ColumnStr: String;
begin begin
FieldDefs.Clear; FieldDefs.Clear;
FAutoIncFieldNo := -1; FAutoIncFieldNo := -1;
FReturnCode := sqlite_compile(FSqliteHandle,PChar(FSql),nil,@vm,nil); FReturnCode := sqlite_compile(FSqliteHandle, PChar(FSQL), nil, @vm, nil);
if FReturnCode <> SQLITE_OK then if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString, Self); DatabaseError(ReturnString, Self);
sqlite_step(vm,@ColumnCount,@ColumnValues,@ColumnNames); sqlite_step(vm, @ColumnCount, @ColumnValues, @ColumnNames);
//Prepare the array of pchar2sql functions //Prepare the array of pchar2sql functions
SetLength(FGetSqlStr,ColumnCount); SetLength(FGetSqlStr, ColumnCount);
//Set BufferSize //Set BufferSize
FRowBufferSize:=(SizeOf(PPChar)*ColumnCount); FRowBufferSize := (SizeOf(PPChar) * ColumnCount);
// Sqlite is typeless (allows any type in any field) // Sqlite is typeless (allows any type in any field)
// regardless of what is in Create Table, but returns // regardless of what is in Create Table, but returns
// exactly what is in Create Table statement // exactly what is in Create Table statement
@ -144,18 +144,18 @@ begin
end end
else else
AType := ftInteger; AType := ftInteger;
end else if Pos('VARCHAR',ColumnStr) = 1 then end else if Pos('VARCHAR', ColumnStr) = 1 then
begin begin
AType := ftString; AType := ftString;
end else if Pos('BOOL',ColumnStr) = 1 then end else if Pos('BOOL', ColumnStr) = 1 then
begin begin
AType := ftBoolean; AType := ftBoolean;
end else if Pos('AUTOINC',ColumnStr) = 1 then end else if Pos('AUTOINC', ColumnStr) = 1 then
begin begin
AType := ftAutoInc; AType := ftAutoInc;
if FAutoIncFieldNo = -1 then if FAutoIncFieldNo = -1 then
FAutoIncFieldNo := i; FAutoIncFieldNo := i;
end else if (Pos('FLOAT',ColumnStr)=1) or (Pos('NUMERIC',ColumnStr)=1) then end else if (Pos('FLOAT', ColumnStr)=1) or (Pos('NUMERIC', ColumnStr) = 1) then
begin begin
AType := ftFloat; AType := ftFloat;
end else if (ColumnStr = 'DATETIME') then end else if (ColumnStr = 'DATETIME') then
@ -188,10 +188,10 @@ begin
else else
FieldDefs.Add(String(ColumnNames[i]), AType); FieldDefs.Add(String(ColumnNames[i]), AType);
//Set the pchar2sql function //Set the pchar2sql function
if AType in [ftString,ftMemo] then if AType in [ftString, ftMemo] then
FGetSqlStr[i]:=@Char2SqlStr FGetSqlStr[i] := @Char2SQLStr
else else
FGetSqlStr[i]:=@Num2SqlStr; FGetSqlStr[i] := @Num2SQLStr;
end; end;
sqlite_finalize(vm, nil); sqlite_finalize(vm, nil);
{ {
@ -202,108 +202,116 @@ end;
function TSqliteDataset.GetRowsAffected: Integer; function TSqliteDataset.GetRowsAffected: Integer;
begin begin
Result:=sqlite_changes(FSqliteHandle); Result := sqlite_changes(FSqliteHandle);
//Result:=sqlite_last_statement_changes(FSqliteHandle); //Result := sqlite_last_statement_changes(FSqliteHandle);
end; end;
procedure TSqliteDataset.ExecuteDirect(const ASql: String); procedure TSqliteDataset.ExecuteDirect(const ASQL: String);
var var
vm:Pointer; vm: Pointer;
ColumnNames,ColumnValues:PPChar; ColumnNames, ColumnValues: PPChar;
ColCount:Integer; ColCount: Integer;
begin begin
FReturnCode:=sqlite_compile(FSqliteHandle,Pchar(ASql),nil,@vm,nil); FReturnCode := sqlite_compile(FSqliteHandle, Pchar(ASQL), nil, @vm, nil);
if FReturnCode <> SQLITE_OK then if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString,Self); DatabaseError(ReturnString,Self);
FReturnCode:=sqlite_step(vm,@ColCount,@ColumnValues,@ColumnNames); FReturnCode := sqlite_step(vm, @ColCount, @ColumnValues, @ColumnNames);
sqlite_finalize(vm, nil); sqlite_finalize(vm, nil);
end; end;
procedure TSqliteDataset.BuildLinkedList; procedure TSqliteDataset.BuildLinkedList;
var var
TempItem:PDataRecord; TempItem: PDataRecord;
vm:Pointer; vm: Pointer;
ColumnNames,ColumnValues:PPChar; ColumnNames, ColumnValues: PPChar;
Counter:Integer; Counter: Integer;
begin begin
//Get AutoInc Field initial value //Get AutoInc Field initial value
if FAutoIncFieldNo <> -1 then if FAutoIncFieldNo <> -1 then
sqlite_exec(FSqliteHandle,PChar('Select Max('+Fields[FAutoIncFieldNo].FieldName+') from ' + FTableName), sqlite_exec(FSqliteHandle, PChar('Select Max(' + Fields[FAutoIncFieldNo].FieldName + ') from ' + FTableName),
@GetAutoIncValue,@FNextAutoInc,nil); @GetAutoIncValue, @FNextAutoInc, nil);
FReturnCode:=sqlite_compile(FSqliteHandle,Pchar(FSql),nil,@vm,nil); FReturnCode := sqlite_compile(FSqliteHandle, PChar(FSQL), nil, @vm, nil);
if FReturnCode <> SQLITE_OK then if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString,Self); DatabaseError(ReturnString, Self);
FDataAllocated:=True; FDataAllocated := True;
TempItem:=FBeginItem; TempItem := FBeginItem;
FRecordCount:=0; FRecordCount := 0;
FReturnCode:=sqlite_step(vm,@FRowCount,@ColumnValues,@ColumnNames); FReturnCode := sqlite_step(vm, @FRowCount, @ColumnValues, @ColumnNames);
while FReturnCode = SQLITE_ROW do while FReturnCode = SQLITE_ROW do
begin begin
Inc(FRecordCount); Inc(FRecordCount);
New(TempItem^.Next); New(TempItem^.Next);
TempItem^.Next^.Previous:=TempItem; TempItem^.Next^.Previous := TempItem;
TempItem:=TempItem^.Next; TempItem := TempItem^.Next;
GetMem(TempItem^.Row,FRowBufferSize); GetMem(TempItem^.Row, FRowBufferSize);
for Counter := 0 to FRowCount - 1 do for Counter := 0 to FRowCount - 1 do
TempItem^.Row[Counter]:=StrNew(ColumnValues[Counter]); TempItem^.Row[Counter] := StrNew(ColumnValues[Counter]);
FReturnCode:=sqlite_step(vm,@FRowCount,@ColumnValues,@ColumnNames); FReturnCode := sqlite_step(vm, @FRowCount, @ColumnValues, @ColumnNames);
end; end;
sqlite_finalize(vm, nil); sqlite_finalize(vm, nil);
// Attach EndItem // Attach EndItem
TempItem^.Next:=FEndItem; TempItem^.Next := FEndItem;
FEndItem^.Previous:=TempItem; FEndItem^.Previous := TempItem;
// Alloc item used in append/insert // Alloc item used in append/insert
GetMem(FCacheItem^.Row,FRowBufferSize); GetMem(FCacheItem^.Row, FRowBufferSize);
for Counter := 0 to FRowCount - 1 do for Counter := 0 to FRowCount - 1 do
FCacheItem^.Row[Counter]:=nil; FCacheItem^.Row[Counter] := nil;
// Fill FBeginItem.Row with nil -> necessary for avoid exceptions in empty datasets // Fill FBeginItem.Row with nil -> necessary for avoid exceptions in empty datasets
GetMem(FBeginItem^.Row,FRowBufferSize); GetMem(FBeginItem^.Row, FRowBufferSize);
for Counter := 0 to FRowCount - 1 do for Counter := 0 to FRowCount - 1 do
FBeginItem^.Row[Counter]:=nil; FBeginItem^.Row[Counter] := nil;
end; end;
function TSqliteDataset.ReturnString: String; function TSqliteDataset.ReturnString: String;
begin begin
case FReturnCode of case FReturnCode of
SQLITE_OK : Result := 'SQLITE_OK'; SQLITE_OK : Result := 'SQLITE_OK';
SQLITE_ERROR : Result := 'SQLITE_ERROR'; SQLITE_ERROR : Result := 'SQLITE_ERROR';
SQLITE_INTERNAL : Result := 'SQLITE_INTERNAL'; SQLITE_INTERNAL : Result := 'SQLITE_INTERNAL';
SQLITE_PERM : Result := 'SQLITE_PERM'; SQLITE_PERM : Result := 'SQLITE_PERM';
SQLITE_ABORT : Result := 'SQLITE_ABORT'; SQLITE_ABORT : Result := 'SQLITE_ABORT';
SQLITE_BUSY : Result := 'SQLITE_BUSY'; SQLITE_BUSY : Result := 'SQLITE_BUSY';
SQLITE_LOCKED : Result := 'SQLITE_LOCKED'; SQLITE_LOCKED : Result := 'SQLITE_LOCKED';
SQLITE_NOMEM : Result := 'SQLITE_NOMEM'; SQLITE_NOMEM : Result := 'SQLITE_NOMEM';
SQLITE_READONLY : Result := 'SQLITE_READONLY'; SQLITE_READONLY : Result := 'SQLITE_READONLY';
SQLITE_INTERRUPT : Result := 'SQLITE_INTERRUPT'; SQLITE_INTERRUPT : Result := 'SQLITE_INTERRUPT';
SQLITE_IOERR : Result := 'SQLITE_IOERR'; SQLITE_IOERR : Result := 'SQLITE_IOERR';
SQLITE_CORRUPT : Result := 'SQLITE_CORRUPT'; SQLITE_CORRUPT : Result := 'SQLITE_CORRUPT';
SQLITE_NOTFOUND : Result := 'SQLITE_NOTFOUND'; SQLITE_NOTFOUND : Result := 'SQLITE_NOTFOUND';
SQLITE_FULL : Result := 'SQLITE_FULL'; SQLITE_FULL : Result := 'SQLITE_FULL';
SQLITE_CANTOPEN : Result := 'SQLITE_CANTOPEN'; SQLITE_CANTOPEN : Result := 'SQLITE_CANTOPEN';
SQLITE_PROTOCOL : Result := 'SQLITE_PROTOCOL'; SQLITE_PROTOCOL : Result := 'SQLITE_PROTOCOL';
SQLITE_EMPTY : Result := 'SQLITE_EMPTY'; SQLITE_EMPTY : Result := 'SQLITE_EMPTY';
SQLITE_SCHEMA : Result := 'SQLITE_SCHEMA'; SQLITE_SCHEMA : Result := 'SQLITE_SCHEMA';
SQLITE_TOOBIG : Result := 'SQLITE_TOOBIG'; SQLITE_TOOBIG : Result := 'SQLITE_TOOBIG';
SQLITE_CONSTRAINT : Result := 'SQLITE_CONSTRAINT'; SQLITE_CONSTRAINT : Result := 'SQLITE_CONSTRAINT';
SQLITE_MISMATCH : Result := 'SQLITE_MISMATCH'; SQLITE_MISMATCH : Result := 'SQLITE_MISMATCH';
SQLITE_MISUSE : Result := 'SQLITE_MISUSE'; SQLITE_MISUSE : Result := 'SQLITE_MISUSE';
SQLITE_NOLFS : Result := 'SQLITE_NOLFS'; SQLITE_NOLFS : Result := 'SQLITE_NOLFS';
SQLITE_AUTH : Result := 'SQLITE_AUTH'; SQLITE_AUTH : Result := 'SQLITE_AUTH';
SQLITE_FORMAT : Result := 'SQLITE_FORMAT'; SQLITE_FORMAT : Result := 'SQLITE_FORMAT';
SQLITE_RANGE : Result := 'SQLITE_RANGE'; SQLITE_RANGE : Result := 'SQLITE_RANGE';
SQLITE_ROW : begin Result := 'SQLITE_ROW - not an error'; Exit; end; SQLITE_ROW :
SQLITE_DONE : begin Result := 'SQLITE_DONE - not an error'; Exit; end; begin
Result := 'SQLITE_ROW - not an error';
Exit;
end;
SQLITE_DONE :
begin
Result := 'SQLITE_DONE - not an error';
Exit;
end;
else else
Result:='Unknow Return Value'; Result := 'Unknow Return Value';
end; end;
Result:=Result+' - '+sqlite_error_string(FReturnCode); Result := Result + ' - ' + sqlite_error_string(FReturnCode);
end; end;
function TSqliteDataset.GetSqliteEncoding: String; function TSqliteDataset.GetSqliteEncoding: String;
@ -316,7 +324,7 @@ begin
Result := String(sqlite_version); Result := String(sqlite_version);
end; end;
function TSqliteDataset.QuickQuery(const ASql:String;const AStrList: TStrings;FillObjects:Boolean):String; function TSqliteDataset.QuickQuery(const ASQL: String; const AStrList: TStrings; FillObjects: Boolean): String;
var var
vm: Pointer; vm: Pointer;
ColumnNames, ColumnValues: PPChar; ColumnNames, ColumnValues: PPChar;
@ -335,15 +343,16 @@ var
while FReturnCode = SQLITE_ROW do while FReturnCode = SQLITE_ROW do
begin begin
// I know, this code is really dirty!! // I know, this code is really dirty!!
AStrList.AddObject(String(ColumnValues[0]), TObject(PtrInt(StrToInt(String(ColumnValues[1]))))); AStrList.AddObject(String(ColumnValues[0]),
FReturnCode:=sqlite_step(vm, @ColCount, @ColumnValues, @ColumnNames); TObject(PtrInt(StrToInt(String(ColumnValues[1])))));
FReturnCode := sqlite_step(vm, @ColCount, @ColumnValues, @ColumnNames);
end; end;
end; end;
begin begin
if FSqliteHandle = nil then if FSqliteHandle = nil then
GetSqliteHandle; GetSqliteHandle;
Result := ''; Result := '';
FReturnCode := sqlite_compile(FSqliteHandle, PChar(ASql), nil, @vm, nil); FReturnCode := sqlite_compile(FSqliteHandle, PChar(ASQL), nil, @vm, nil);
if FReturnCode <> SQLITE_OK then if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString,Self); DatabaseError(ReturnString,Self);