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
@ -33,36 +33,36 @@ unit sqlite3ds;
{$mode objfpc}
{$H+}
{ $Define DEBUG}
{.$Define DEBUG_SQLITEDS}
interface
uses
Classes, SysUtils, customsqliteds;
Classes, SysUtils, CustomSqliteDS;
type
{ TSqlite3Dataset }
TSqlite3Dataset = class (TCustomSqliteDataset)
TSqlite3Dataset = class(TCustomSqliteDataset)
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 GetSqliteVersion: String; override;
procedure InternalCloseHandle;override;
procedure InternalCloseHandle; override;
procedure BuildLinkedList; override;
protected
procedure InternalInitFieldDefs; override;
function GetRowsAffected:Integer; override;
public
procedure ExecuteDirect(const ASql: String);override;
procedure ExecuteDirect(const ASQL: 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;
implementation
uses
sqlite3,db;
sqlite3, db;
function SqliteCode2Str(Code: Integer): String;
begin
@ -97,11 +97,11 @@ begin
SQLITE_NOTADB : Result := 'SQLITE_NOTADB';
SQLITE_DONE : Result := 'SQLITE_DONE';
else
Result:='Unknown Return Value';
Result := 'Unknown Return Value';
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
CodeError, TempInt: Integer;
begin
@ -118,15 +118,15 @@ end;
{ TSqlite3Dataset }
function TSqlite3Dataset.SqliteExec(ASql: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer;
function TSqlite3Dataset.SqliteExec(ASQL: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer;
begin
Result:=sqlite3_exec(FSqliteHandle, ASql, ACallback, Data, nil);
Result := sqlite3_exec(FSqliteHandle, ASQL, ACallback, Data, nil);
end;
procedure TSqlite3Dataset.InternalCloseHandle;
begin
sqlite3_close(FSqliteHandle);
FSqliteHandle:=nil;
FSqliteHandle := nil;
//todo:handle return data
end;
@ -144,7 +144,7 @@ begin
FReturnCode := sqlite3_prepare(Result, CheckFileSql, -1, @vm, nil);
if FReturnCode <> SQLITE_OK then
begin
ErrorStr := SqliteCode2Str(FReturnCode) + ' - ' + sqlite3_errmsg(Result);;
ErrorStr := SqliteCode2Str(FReturnCode) + ' - ' + sqlite3_errmsg(Result);
sqlite3_close(Result);
DatabaseError(ErrorStr, Self);
end;
@ -160,12 +160,12 @@ var
i, ColumnCount: Integer;
AType: TFieldType;
begin
{$ifdef DEBUG}
{$ifdef DEBUG_SQLITEDS}
WriteLn('##TSqlite3Dataset.InternalInitFieldDefs##');
{$endif}
FAutoIncFieldNo := -1;
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
DatabaseError(ReturnString, Self);
sqlite3_step(vm);
@ -176,145 +176,145 @@ begin
SetLength(FGetSqlStr, ColumnCount);
for i := 0 to ColumnCount - 1 do
begin
ColumnStr := UpperCase(String(sqlite3_column_decltype(vm, i)));
if (ColumnStr = 'INTEGER') or (ColumnStr = 'INT') then
begin
if AutoIncrementKey and (UpperCase(String(sqlite3_column_name(vm, i))) = UpperCase(PrimaryKey)) then
begin
AType := ftAutoInc;
FAutoIncFieldNo := i;
end
else
AType := ftInteger;
end else if Pos('VARCHAR', ColumnStr) = 1 then
begin
AType := ftString;
end else if Pos('BOOL', ColumnStr) = 1 then
begin
AType := ftBoolean;
end else if Pos('AUTOINC', ColumnStr) = 1 then
begin
AType := ftAutoInc;
if FAutoIncFieldNo = -1 then
FAutoIncFieldNo := i;
end else if (Pos('FLOAT', ColumnStr) = 1) or (Pos('NUMERIC', ColumnStr) = 1) then
begin
AType := ftFloat;
end else if (ColumnStr = 'DATETIME') then
begin
AType := ftDateTime;
end else if (ColumnStr = 'DATE') then
begin
AType := ftDate;
end else if (ColumnStr = 'LARGEINT') then
begin
AType := ftLargeInt;
end else if (ColumnStr = 'TIME') then
begin
AType := ftTime;
end else if (ColumnStr = 'TEXT') then
begin
AType := ftMemo;
end else if (ColumnStr = 'CURRENCY') then
begin
AType := ftCurrency;
end else if (ColumnStr = 'WORD') then
begin
AType := ftWord;
end else if (ColumnStr = '') then
begin
case sqlite3_column_type(vm, i) of
SQLITE_INTEGER:
AType := ftInteger;
SQLITE_FLOAT:
AType := ftFloat;
else
AType := ftString;
end;
end else
begin
AType := ftString;
end;
FieldDefs.Add(String(sqlite3_column_name(vm, i)), AType, FieldSizeMap[AType = ftString]);
//Set the pchar2sql function
if AType in [ftString, ftMemo] then
FGetSqlStr[i] := @Char2SqlStr
else
FGetSqlStr[i] := @Num2SqlStr;
{$ifdef DEBUG}
writeln(' Field[',i,'] Name: ', sqlite3_column_name(vm,i));
writeln(' Field[',i,'] Type: ', sqlite3_column_decltype(vm,i));
{$endif}
ColumnStr := UpperCase(String(sqlite3_column_decltype(vm, i)));
if (ColumnStr = 'INTEGER') or (ColumnStr = 'INT') then
begin
if AutoIncrementKey and (UpperCase(String(sqlite3_column_name(vm, i))) = UpperCase(PrimaryKey)) then
begin
AType := ftAutoInc;
FAutoIncFieldNo := i;
end
else
AType := ftInteger;
end else if Pos('VARCHAR', ColumnStr) = 1 then
begin
AType := ftString;
end else if Pos('BOOL', ColumnStr) = 1 then
begin
AType := ftBoolean;
end else if Pos('AUTOINC', ColumnStr) = 1 then
begin
AType := ftAutoInc;
if FAutoIncFieldNo = -1 then
FAutoIncFieldNo := i;
end else if (Pos('FLOAT', ColumnStr) = 1) or (Pos('NUMERIC', ColumnStr) = 1) then
begin
AType := ftFloat;
end else if (ColumnStr = 'DATETIME') then
begin
AType := ftDateTime;
end else if (ColumnStr = 'DATE') then
begin
AType := ftDate;
end else if (ColumnStr = 'LARGEINT') then
begin
AType := ftLargeInt;
end else if (ColumnStr = 'TIME') then
begin
AType := ftTime;
end else if (ColumnStr = 'TEXT') then
begin
AType := ftMemo;
end else if (ColumnStr = 'CURRENCY') then
begin
AType := ftCurrency;
end else if (ColumnStr = 'WORD') then
begin
AType := ftWord;
end else if (ColumnStr = '') then
begin
case sqlite3_column_type(vm, i) of
SQLITE_INTEGER:
AType := ftInteger;
SQLITE_FLOAT:
AType := ftFloat;
else
AType := ftString;
end;
end else
begin
AType := ftString;
end;
FieldDefs.Add(String(sqlite3_column_name(vm, i)), AType, FieldSizeMap[AType = ftString]);
//Set the pchar2sql function
if AType in [ftString, ftMemo] then
FGetSqlStr[i] := @Char2SQLStr
else
FGetSqlStr[i] := @Num2SQLStr;
{$ifdef DEBUG_SQLITEDS}
WriteLn(' Field[', i, '] Name: ', sqlite3_column_name(vm, i));
WriteLn(' Field[', i, '] Type: ', sqlite3_column_decltype(vm, i));
{$endif}
end;
sqlite3_finalize(vm);
{$ifdef DEBUG}
writeln(' FieldDefs.Count: ', FieldDefs.Count);
{$ifdef DEBUG_SQLITEDS}
WriteLn(' FieldDefs.Count: ', FieldDefs.Count);
{$endif}
end;
function TSqlite3Dataset.GetRowsAffected: Integer;
begin
Result:=sqlite3_changes(FSqliteHandle);
Result := sqlite3_changes(FSqliteHandle);
end;
procedure TSqlite3Dataset.ExecuteDirect(const ASql: String);
procedure TSqlite3Dataset.ExecuteDirect(const ASQL: String);
var
vm:Pointer;
vm: Pointer;
begin
FReturnCode:=sqlite3_prepare(FSqliteHandle,Pchar(ASql),-1,@vm,nil);
FReturnCode := sqlite3_prepare(FSqliteHandle, Pchar(ASQL), -1, @vm, nil);
if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString,Self);
FReturnCode:=sqlite3_step(vm);
DatabaseError(ReturnString, Self);
FReturnCode := sqlite3_step(vm);
sqlite3_finalize(vm);
end;
procedure TSqlite3Dataset.BuildLinkedList;
var
TempItem:PDataRecord;
vm:Pointer;
Counter:Integer;
TempItem: PDataRecord;
vm: Pointer;
Counter: Integer;
begin
//Get AutoInc Field initial value
if FAutoIncFieldNo <> -1 then
sqlite3_exec(FSqliteHandle,PChar('Select Max('+Fields[FAutoIncFieldNo].FieldName+') from ' + FTableName),
@GetAutoIncValue,@FNextAutoInc,nil);
sqlite3_exec(FSqliteHandle, PChar('Select Max(' + Fields[FAutoIncFieldNo].FieldName +
') 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
DatabaseError(ReturnString,Self);
DatabaseError(ReturnString, Self);
FDataAllocated:=True;
FDataAllocated := True;
TempItem:=FBeginItem;
FRecordCount:=0;
FRowCount:=sqlite3_column_count(vm);
FReturnCode:=sqlite3_step(vm);
TempItem := FBeginItem;
FRecordCount := 0;
FRowCount := sqlite3_column_count(vm);
FReturnCode := sqlite3_step(vm);
while FReturnCode = SQLITE_ROW do
begin
Inc(FRecordCount);
New(TempItem^.Next);
TempItem^.Next^.Previous:=TempItem;
TempItem:=TempItem^.Next;
GetMem(TempItem^.Row,FRowBufferSize);
TempItem^.Next^.Previous := TempItem;
TempItem := TempItem^.Next;
GetMem(TempItem^.Row, FRowBufferSize);
for Counter := 0 to FRowCount - 1 do
TempItem^.Row[Counter]:=StrNew(sqlite3_column_text(vm,Counter));
FReturnCode:=sqlite3_step(vm);
TempItem^.Row[Counter] := StrNew(sqlite3_column_text(vm, Counter));
FReturnCode := sqlite3_step(vm);
end;
sqlite3_finalize(vm);
// Attach EndItem
TempItem^.Next:=FEndItem;
FEndItem^.Previous:=TempItem;
TempItem^.Next := FEndItem;
FEndItem^.Previous := TempItem;
// Alloc temporary item used in append/insert
GetMem(FCacheItem^.Row,FRowBufferSize);
GetMem(FCacheItem^.Row, FRowBufferSize);
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
GetMem(FBeginItem^.Row,FRowBufferSize);
GetMem(FBeginItem^.Row, FRowBufferSize);
//Todo: see if is better to nullif using FillDWord
for Counter := 0 to FRowCount - 1 do
FBeginItem^.Row[Counter]:=nil;
FBeginItem^.Row[Counter] := nil;
end;
function TSqlite3Dataset.ReturnString: String;
@ -327,9 +327,9 @@ begin
Result := String(sqlite3_version());
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
vm:Pointer;
vm: Pointer;
procedure FillStrings;
begin
@ -343,7 +343,8 @@ var
begin
while FReturnCode = SQLITE_ROW do
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);
end;
end;
@ -351,14 +352,14 @@ begin
if FSqliteHandle = nil then
GetSqliteHandle;
Result := '';
FReturnCode := sqlite3_prepare(FSqliteHandle,Pchar(ASql), -1, @vm, nil);
FReturnCode := sqlite3_prepare(FSqliteHandle,Pchar(ASQL), -1, @vm, nil);
if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString,Self);
DatabaseError(ReturnString, Self);
FReturnCode := sqlite3_step(vm);
if (FReturnCode = SQLITE_ROW) and (sqlite3_column_count(vm) > 0) then
begin
Result := String(sqlite3_column_text(vm,0));
Result := String(sqlite3_column_text(vm, 0));
if AStrList <> nil then
begin
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
@ -33,42 +33,42 @@ unit sqliteds;
{$mode objfpc}
{$H+}
{ $Define DEBUG}
{.$Define DEBUG_SQLITEDS}
interface
uses
Classes, SysUtils, customsqliteds;
Classes, SysUtils, CustomSqliteDS;
type
{ TSqliteDataset }
TSqliteDataset = class (TCustomSqliteDataset)
TSqliteDataset = class(TCustomSqliteDataset)
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 GetSqliteEncoding: String;
function GetSqliteVersion: String; override;
procedure InternalCloseHandle;override;
procedure InternalCloseHandle; override;
procedure BuildLinkedList; override;
protected
procedure InternalInitFieldDefs; override;
function GetRowsAffected:Integer; override;
public
procedure ExecuteDirect(const ASql: String);override;
procedure ExecuteDirect(const ASQL: 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;
end;
implementation
uses
sqlite,db;
sqlite, db;
//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
CodeError, TempInt: Integer;
begin
@ -85,15 +85,15 @@ end;
{ TSqliteDataset }
function TSqliteDataset.SqliteExec(ASql: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer;
function TSqliteDataset.SqliteExec(ASQL: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer;
begin
Result:=sqlite_exec(FSqliteHandle, ASql, ACallback, Data, nil);
Result := sqlite_exec(FSqliteHandle, ASQL, ACallback, Data, nil);
end;
procedure TSqliteDataset.InternalCloseHandle;
begin
sqlite_close(FSqliteHandle);
FSqliteHandle:=nil;
FSqliteHandle := nil;
end;
function TSqliteDataset.InternalGetHandle: Pointer;
@ -103,29 +103,29 @@ begin
Result := sqlite_open(PChar(FFileName), 0, @ErrorStr);
if Result = nil then
begin
DatabaseError('Error opening "' + FFileName +'": ' + String(ErrorStr));
DatabaseError('Error opening "' + FFileName + '": ' + String(ErrorStr));
sqlite_freemem(ErrorStr);
end;
end;
procedure TSqliteDataset.InternalInitFieldDefs;
var
ColumnCount,i:Integer;
AType:TFieldType;
vm:Pointer;
ColumnNames,ColumnValues:PPChar;
ColumnStr:String;
ColumnCount, i:Integer;
AType: TFieldType;
vm: Pointer;
ColumnNames, ColumnValues:PPChar;
ColumnStr: String;
begin
FieldDefs.Clear;
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
DatabaseError(ReturnString, Self);
sqlite_step(vm,@ColumnCount,@ColumnValues,@ColumnNames);
sqlite_step(vm, @ColumnCount, @ColumnValues, @ColumnNames);
//Prepare the array of pchar2sql functions
SetLength(FGetSqlStr,ColumnCount);
SetLength(FGetSqlStr, ColumnCount);
//Set BufferSize
FRowBufferSize:=(SizeOf(PPChar)*ColumnCount);
FRowBufferSize := (SizeOf(PPChar) * ColumnCount);
// Sqlite is typeless (allows any type in any field)
// regardless of what is in Create Table, but returns
// exactly what is in Create Table statement
@ -144,18 +144,18 @@ begin
end
else
AType := ftInteger;
end else if Pos('VARCHAR',ColumnStr) = 1 then
end else if Pos('VARCHAR', ColumnStr) = 1 then
begin
AType := ftString;
end else if Pos('BOOL',ColumnStr) = 1 then
end else if Pos('BOOL', ColumnStr) = 1 then
begin
AType := ftBoolean;
end else if Pos('AUTOINC',ColumnStr) = 1 then
end else if Pos('AUTOINC', ColumnStr) = 1 then
begin
AType := ftAutoInc;
if FAutoIncFieldNo = -1 then
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
AType := ftFloat;
end else if (ColumnStr = 'DATETIME') then
@ -188,10 +188,10 @@ begin
else
FieldDefs.Add(String(ColumnNames[i]), AType);
//Set the pchar2sql function
if AType in [ftString,ftMemo] then
FGetSqlStr[i]:=@Char2SqlStr
if AType in [ftString, ftMemo] then
FGetSqlStr[i] := @Char2SQLStr
else
FGetSqlStr[i]:=@Num2SqlStr;
FGetSqlStr[i] := @Num2SQLStr;
end;
sqlite_finalize(vm, nil);
{
@ -202,108 +202,116 @@ end;
function TSqliteDataset.GetRowsAffected: Integer;
begin
Result:=sqlite_changes(FSqliteHandle);
//Result:=sqlite_last_statement_changes(FSqliteHandle);
Result := sqlite_changes(FSqliteHandle);
//Result := sqlite_last_statement_changes(FSqliteHandle);
end;
procedure TSqliteDataset.ExecuteDirect(const ASql: String);
procedure TSqliteDataset.ExecuteDirect(const ASQL: String);
var
vm:Pointer;
ColumnNames,ColumnValues:PPChar;
ColCount:Integer;
vm: Pointer;
ColumnNames, ColumnValues: PPChar;
ColCount: Integer;
begin
FReturnCode:=sqlite_compile(FSqliteHandle,Pchar(ASql),nil,@vm,nil);
FReturnCode := sqlite_compile(FSqliteHandle, Pchar(ASQL), nil, @vm, nil);
if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString,Self);
FReturnCode:=sqlite_step(vm,@ColCount,@ColumnValues,@ColumnNames);
FReturnCode := sqlite_step(vm, @ColCount, @ColumnValues, @ColumnNames);
sqlite_finalize(vm, nil);
end;
procedure TSqliteDataset.BuildLinkedList;
var
TempItem:PDataRecord;
vm:Pointer;
ColumnNames,ColumnValues:PPChar;
Counter:Integer;
TempItem: PDataRecord;
vm: Pointer;
ColumnNames, ColumnValues: PPChar;
Counter: Integer;
begin
//Get AutoInc Field initial value
if FAutoIncFieldNo <> -1 then
sqlite_exec(FSqliteHandle,PChar('Select Max('+Fields[FAutoIncFieldNo].FieldName+') from ' + FTableName),
@GetAutoIncValue,@FNextAutoInc,nil);
sqlite_exec(FSqliteHandle, PChar('Select Max(' + Fields[FAutoIncFieldNo].FieldName + ') from ' + FTableName),
@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
DatabaseError(ReturnString,Self);
DatabaseError(ReturnString, Self);
FDataAllocated:=True;
FDataAllocated := True;
TempItem:=FBeginItem;
FRecordCount:=0;
FReturnCode:=sqlite_step(vm,@FRowCount,@ColumnValues,@ColumnNames);
TempItem := FBeginItem;
FRecordCount := 0;
FReturnCode := sqlite_step(vm, @FRowCount, @ColumnValues, @ColumnNames);
while FReturnCode = SQLITE_ROW do
begin
Inc(FRecordCount);
New(TempItem^.Next);
TempItem^.Next^.Previous:=TempItem;
TempItem:=TempItem^.Next;
GetMem(TempItem^.Row,FRowBufferSize);
TempItem^.Next^.Previous := TempItem;
TempItem := TempItem^.Next;
GetMem(TempItem^.Row, FRowBufferSize);
for Counter := 0 to FRowCount - 1 do
TempItem^.Row[Counter]:=StrNew(ColumnValues[Counter]);
FReturnCode:=sqlite_step(vm,@FRowCount,@ColumnValues,@ColumnNames);
TempItem^.Row[Counter] := StrNew(ColumnValues[Counter]);
FReturnCode := sqlite_step(vm, @FRowCount, @ColumnValues, @ColumnNames);
end;
sqlite_finalize(vm, nil);
// Attach EndItem
TempItem^.Next:=FEndItem;
FEndItem^.Previous:=TempItem;
TempItem^.Next := FEndItem;
FEndItem^.Previous := TempItem;
// Alloc item used in append/insert
GetMem(FCacheItem^.Row,FRowBufferSize);
GetMem(FCacheItem^.Row, FRowBufferSize);
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
GetMem(FBeginItem^.Row,FRowBufferSize);
GetMem(FBeginItem^.Row, FRowBufferSize);
for Counter := 0 to FRowCount - 1 do
FBeginItem^.Row[Counter]:=nil;
FBeginItem^.Row[Counter] := nil;
end;
function TSqliteDataset.ReturnString: String;
begin
case FReturnCode of
SQLITE_OK : Result := 'SQLITE_OK';
SQLITE_ERROR : Result := 'SQLITE_ERROR';
SQLITE_INTERNAL : Result := 'SQLITE_INTERNAL';
SQLITE_PERM : Result := 'SQLITE_PERM';
SQLITE_ABORT : Result := 'SQLITE_ABORT';
SQLITE_BUSY : Result := 'SQLITE_BUSY';
SQLITE_LOCKED : Result := 'SQLITE_LOCKED';
SQLITE_NOMEM : Result := 'SQLITE_NOMEM';
SQLITE_READONLY : Result := 'SQLITE_READONLY';
SQLITE_INTERRUPT : Result := 'SQLITE_INTERRUPT';
SQLITE_IOERR : Result := 'SQLITE_IOERR';
SQLITE_CORRUPT : Result := 'SQLITE_CORRUPT';
SQLITE_NOTFOUND : Result := 'SQLITE_NOTFOUND';
SQLITE_FULL : Result := 'SQLITE_FULL';
SQLITE_CANTOPEN : Result := 'SQLITE_CANTOPEN';
SQLITE_PROTOCOL : Result := 'SQLITE_PROTOCOL';
SQLITE_EMPTY : Result := 'SQLITE_EMPTY';
SQLITE_SCHEMA : Result := 'SQLITE_SCHEMA';
SQLITE_TOOBIG : Result := 'SQLITE_TOOBIG';
SQLITE_CONSTRAINT : Result := 'SQLITE_CONSTRAINT';
SQLITE_MISMATCH : Result := 'SQLITE_MISMATCH';
SQLITE_MISUSE : Result := 'SQLITE_MISUSE';
SQLITE_NOLFS : Result := 'SQLITE_NOLFS';
SQLITE_AUTH : Result := 'SQLITE_AUTH';
SQLITE_FORMAT : Result := 'SQLITE_FORMAT';
SQLITE_RANGE : Result := 'SQLITE_RANGE';
SQLITE_ROW : begin Result := 'SQLITE_ROW - not an error'; Exit; end;
SQLITE_DONE : begin Result := 'SQLITE_DONE - not an error'; Exit; end;
case FReturnCode of
SQLITE_OK : Result := 'SQLITE_OK';
SQLITE_ERROR : Result := 'SQLITE_ERROR';
SQLITE_INTERNAL : Result := 'SQLITE_INTERNAL';
SQLITE_PERM : Result := 'SQLITE_PERM';
SQLITE_ABORT : Result := 'SQLITE_ABORT';
SQLITE_BUSY : Result := 'SQLITE_BUSY';
SQLITE_LOCKED : Result := 'SQLITE_LOCKED';
SQLITE_NOMEM : Result := 'SQLITE_NOMEM';
SQLITE_READONLY : Result := 'SQLITE_READONLY';
SQLITE_INTERRUPT : Result := 'SQLITE_INTERRUPT';
SQLITE_IOERR : Result := 'SQLITE_IOERR';
SQLITE_CORRUPT : Result := 'SQLITE_CORRUPT';
SQLITE_NOTFOUND : Result := 'SQLITE_NOTFOUND';
SQLITE_FULL : Result := 'SQLITE_FULL';
SQLITE_CANTOPEN : Result := 'SQLITE_CANTOPEN';
SQLITE_PROTOCOL : Result := 'SQLITE_PROTOCOL';
SQLITE_EMPTY : Result := 'SQLITE_EMPTY';
SQLITE_SCHEMA : Result := 'SQLITE_SCHEMA';
SQLITE_TOOBIG : Result := 'SQLITE_TOOBIG';
SQLITE_CONSTRAINT : Result := 'SQLITE_CONSTRAINT';
SQLITE_MISMATCH : Result := 'SQLITE_MISMATCH';
SQLITE_MISUSE : Result := 'SQLITE_MISUSE';
SQLITE_NOLFS : Result := 'SQLITE_NOLFS';
SQLITE_AUTH : Result := 'SQLITE_AUTH';
SQLITE_FORMAT : Result := 'SQLITE_FORMAT';
SQLITE_RANGE : Result := 'SQLITE_RANGE';
SQLITE_ROW :
begin
Result := 'SQLITE_ROW - not an error';
Exit;
end;
SQLITE_DONE :
begin
Result := 'SQLITE_DONE - not an error';
Exit;
end;
else
Result:='Unknow Return Value';
end;
Result:=Result+' - '+sqlite_error_string(FReturnCode);
Result := 'Unknow Return Value';
end;
Result := Result + ' - ' + sqlite_error_string(FReturnCode);
end;
function TSqliteDataset.GetSqliteEncoding: String;
@ -316,7 +324,7 @@ begin
Result := String(sqlite_version);
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
vm: Pointer;
ColumnNames, ColumnValues: PPChar;
@ -335,15 +343,16 @@ var
while FReturnCode = SQLITE_ROW do
begin
// I know, this code is really dirty!!
AStrList.AddObject(String(ColumnValues[0]), TObject(PtrInt(StrToInt(String(ColumnValues[1])))));
FReturnCode:=sqlite_step(vm, @ColCount, @ColumnValues, @ColumnNames);
AStrList.AddObject(String(ColumnValues[0]),
TObject(PtrInt(StrToInt(String(ColumnValues[1])))));
FReturnCode := sqlite_step(vm, @ColCount, @ColumnValues, @ColumnNames);
end;
end;
begin
if FSqliteHandle = nil then
GetSqliteHandle;
Result := '';
FReturnCode := sqlite_compile(FSqliteHandle, PChar(ASql), nil, @vm, nil);
FReturnCode := sqlite_compile(FSqliteHandle, PChar(ASQL), nil, @vm, nil);
if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString,Self);