Browse Source

* Allocate linked list with extra space for calculated fields

git-svn-id: trunk@12756 -
blikblum 16 years ago
parent
commit
d1315e82c3
2 changed files with 23 additions and 10 deletions
  1. 11 5
      packages/fcl-db/src/sqlite/sqlite3ds.pas
  2. 12 5
      packages/fcl-db/src/sqlite/sqliteds.pas

+ 11 - 5
packages/fcl-db/src/sqlite/sqlite3ds.pas

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

+ 12 - 5
packages/fcl-db/src/sqlite/sqliteds.pas

@@ -124,8 +124,6 @@ begin
   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
-  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
@@ -226,7 +224,7 @@ var
   TempItem: PDataRecord;
   TempItem: PDataRecord;
   vm: Pointer;
   vm: Pointer;
   ColumnNames, ColumnValues: PPChar;
   ColumnNames, ColumnValues: PPChar;
-  Counter: Integer;
+  Counter, ColumnCount: Integer;
 begin
 begin
   //Get AutoInc Field initial value
   //Get AutoInc Field initial value
   if FAutoIncFieldNo <> -1 then
   if FAutoIncFieldNo <> -1 then
@@ -241,7 +239,13 @@ begin
 
 
   TempItem := FBeginItem;
   TempItem := FBeginItem;
   FRecordCount := 0;
   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
   while FReturnCode = SQLITE_ROW do
   begin
   begin
     Inc(FRecordCount);
     Inc(FRecordCount);
@@ -249,8 +253,11 @@ begin
     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 ColumnCount - 1 do
       TempItem^.Row[Counter] := StrNew(ColumnValues[Counter]);
       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);
     FReturnCode := sqlite_step(vm, @FRowCount, @ColumnValues, @ColumnNames);
   end;
   end;
   sqlite_finalize(vm, nil);
   sqlite_finalize(vm, nil);