* Allocate linked list with extra space for calculated fields

git-svn-id: trunk@12756 -
This commit is contained in:
blikblum 2009-02-20 12:55:08 +00:00
parent e8782e0985
commit d1315e82c3
2 changed files with 23 additions and 10 deletions

View File

@ -170,8 +170,6 @@ begin
DatabaseError(ReturnString, Self);
sqlite3_step(vm);
ColumnCount := sqlite3_column_count(vm);
//Set BufferSize
FRowBufferSize := (SizeOf(PPChar) * ColumnCount);
//Prepare the array of pchar2sql functions
SetLength(FGetSqlStr, ColumnCount);
for i := 0 to ColumnCount - 1 do
@ -272,7 +270,7 @@ procedure TSqlite3Dataset.BuildLinkedList;
var
TempItem: PDataRecord;
vm: Pointer;
Counter: Integer;
Counter, ColumnCount: Integer;
begin
//Get AutoInc Field initial value
if FAutoIncFieldNo <> -1 then
@ -287,7 +285,12 @@ begin
TempItem := FBeginItem;
FRecordCount := 0;
FRowCount := sqlite3_column_count(vm);
ColumnCount := sqlite3_column_count(vm);
FRowCount := ColumnCount;
//add extra rows for calculated fields
if FCalcFieldList <> nil then
Inc(FRowCount, FCalcFieldList.Count);
FRowBufferSize := (SizeOf(PPChar) * FRowCount);
FReturnCode := sqlite3_step(vm);
while FReturnCode = SQLITE_ROW do
begin
@ -296,8 +299,11 @@ begin
TempItem^.Next^.Previous := TempItem;
TempItem := TempItem^.Next;
GetMem(TempItem^.Row, FRowBufferSize);
for Counter := 0 to FRowCount - 1 do
for Counter := 0 to ColumnCount - 1 do
TempItem^.Row[Counter] := StrNew(sqlite3_column_text(vm, Counter));
//initialize calculated fields with nil
for Counter := ColumnCount to FRowCount - 1 do
TempItem^.Row[Counter] := nil;
FReturnCode := sqlite3_step(vm);
end;
sqlite3_finalize(vm);

View File

@ -124,8 +124,6 @@ begin
sqlite_step(vm, @ColumnCount, @ColumnValues, @ColumnNames);
//Prepare the array of pchar2sql functions
SetLength(FGetSqlStr, ColumnCount);
//Set BufferSize
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
@ -226,7 +224,7 @@ var
TempItem: PDataRecord;
vm: Pointer;
ColumnNames, ColumnValues: PPChar;
Counter: Integer;
Counter, ColumnCount: Integer;
begin
//Get AutoInc Field initial value
if FAutoIncFieldNo <> -1 then
@ -241,7 +239,13 @@ begin
TempItem := FBeginItem;
FRecordCount := 0;
FReturnCode := sqlite_step(vm, @FRowCount, @ColumnValues, @ColumnNames);
FReturnCode := sqlite_step(vm, @ColumnCount, @ColumnValues, @ColumnNames);
FRowCount := ColumnCount;
//add extra rows for calculated fields
if FCalcFieldList <> nil then
Inc(FRowCount, FCalcFieldList.Count);
FRowBufferSize := (SizeOf(PPChar) * FRowCount);
while FReturnCode = SQLITE_ROW do
begin
Inc(FRecordCount);
@ -249,8 +253,11 @@ begin
TempItem^.Next^.Previous := TempItem;
TempItem := TempItem^.Next;
GetMem(TempItem^.Row, FRowBufferSize);
for Counter := 0 to FRowCount - 1 do
for Counter := 0 to ColumnCount - 1 do
TempItem^.Row[Counter] := StrNew(ColumnValues[Counter]);
//initialize calculated fields with nil
for Counter := ColumnCount to FRowCount - 1 do
TempItem^.Row[Counter] := nil;
FReturnCode := sqlite_step(vm, @FRowCount, @ColumnValues, @ColumnNames);
end;
sqlite_finalize(vm, nil);