📄 asgsqlite3.pas
字号:
With FieldDefs.AddFieldDef Do
Begin
If FieldType <> ftString Then
Begin
Name := colname;
DataType := FieldType;
If FieldType = ftFloat Then
Precision := FieldDec;
End Else
Begin
Name := colname;
DataType := FieldType;
Size := FieldLen;
End;
End;
End;
MaxStrLen := MaxStrLen + GetNativeFieldSize(I + 1); // compensate for terminating zero
FResult.SetBufSize(MaxStrLen + 1 + SizeOf(TBookmark));
End;
End;
End;
End;
End;
End;
Function TASQLite3DB.SQLite3_GetNextResult(DB: TSQLiteDB; TheStatement: Pointer; FParams: TParams; Sender: TObject): Pointer;
Var
I: integer;
minmin: integer;
RV: integer;
mv: integer;
// RowIdCol: Integer; // column containing rowid
convertbuf: TConvertBuffer;
pData: PAnsiChar;
BlobStream: TMemoryStream;
Begin
Result := Nil;
With (Sender As TASQLite3BaseQuery) Do
Begin
FillChar(ResultStr^, MaxBuf, 0);
RV := SQLite3_Step(TheStatement);
If RV = SQLITE_ROW Then
Begin
// retrieve data
If (Sender Is TASQLite3Query) Then
minmin := 1
Else
minmin := 1; // compensate for 'rowid'
For I := 0 To SQLite3_Column_count(TheStatement) - minmin Do
Begin
If I = RowIdCol Then
Begin // just save rowid
RowId := SQLite3_Column_int(TheStatement, I);
End Else
Begin
// ok, i can find-out that the fiels is null but.... eh....
// if SQLite3_column_type(theStatement, i) = 5 then begin
// end;
pData := SQLite3_Column_text(TheStatement, I);
If pData = Nil Then pData := ''; // james
If FTypeLess Then
Begin
mv := GetNativeFieldSize(I + 1);
If StrLen(pData) < cardinal(mv) Then
mv := StrLen(pData);
Move(pData^, (ResultStr + GetFieldOffset(I + 1))^, mv);
End Else
Begin
Case FieldDefs[I].DataType Of // DI
ftString: // DI
Begin // DI
mv := GetNativeFieldSize(I + 1);
If pData <> Nil Then //OL
Begin
If StrLen(pData) < cardinal(mv) Then
mv := StrLen(pData) + 1; // plus onennnnnnnnnnnnnnnn
Move(pData^, (ResultStr + GetFieldOffset(I + 1))^, mv);
End;
End; // DI
ftMemo, ftGraphic, ftFmtMemo, ftBlob: // DI
Begin // DI
// create memory stream to save blob;
pData := SQLite3_Column_blob(TheStatement, I);
BlobStream := TMemoryStream.Create;
If pData <> Nil Then
BlobStream.Write(pData^, SQLite3_Column_bytes(TheStatement, I))
Else
Begin
pData := '';
BlobStream.Write(pData^, 0);
End;
Move(BlobStream, (ResultStr + GetFieldOffset(I + 1))^, SizeOf(BlobStream));
End; // DI
Else // DI
Begin // DI
convertbuf := UnpackBuffer(pData, FieldDefs[I].DataType);
Move(convertbuf, (ResultStr + GetFieldOffset(I + 1))^, GetFieldSize(I + 1));
End;
End;
End;
End
End;
Result := ResultStr;
End;
If RV In [SQLITE_DONE] Then Result := Nil;
If RV In [SQLITE_ERROR, SQLITE_MISUSE] Then //f.e. inserting NULL in field declared as NOT NULL
ShowError;
End;
End;
Procedure TASQLite3DB.SQLite3_CloseResult(TheStatement: Pointer);
Var
RV: integer;
Begin
If TheStatement <> Nil Then
Begin
SQLite3_Reset(TheStatement);
RV := SQLite3_Finalize(TheStatement);
If RV <> 0 Then Raise AsgError.Create('SQLiteExecute error: ' + IntToStr(RV));
End;
End;
Function TASQLite3DB.SQLite3_Execute(DB: TSQLiteDB; TheStatement: String; FParams: TParams; Sender: TObject): integer;
Var
p: Pointer;
{$IFDEF ASQLITE_D6PLUS}
Cursor: TDBScreenCursor;
{$ENDIF}
Begin
SQLite3_Execute := 0;
If Not (Sender Is TASQLite3BaseQuery) Then exit;
Try
With (Sender As TASQLite3BaseQuery) Do
Begin
{$IFDEF ASQLITE_D6PLUS}
If Assigned(DBScreen) And (FSQLCursor) Then
Begin
Cursor := DBScreen.Cursor;
DBScreen.Cursor := dcrSQLWait;
End;
{$ENDIF}
RowId := -1;
FStatement := Connection.SQLite3_PrepareResult(Connection.DBHandle, PAnsiChar(TheStatement), FParams, Sender);
Repeat
p := Connection.SQLite3_GetNextResult(Connection.DBHandle, FStatement, FParams, Sender);
If p <> Nil Then
FResult.Add(ResultStr, RowId);
Until p = Nil;
Connection.SQLite3_CloseResult(FStatement);
FStatement := Nil;
End;
Finally
{$IFDEF ASQLITE_D6PLUS}
If Assigned(DBScreen) And ((Sender As TASQLite3BaseQuery).FSQLCursor) Then
Begin
DBScreen.Cursor := Cursor;
If DBScreen.Cursor = dcrSQLWait Then
DBScreen.Cursor := dcrDefault;
End;
{$ENDIF}
End;
End;
Function TASQLite3DB.FGetDriverDLL: String;
Begin
DebugEnter('TASQLite3DB.FGetDriverDLL');
If FDriverDll = '' Then
FDriverDll := 'SQLite3.dll';
FGetDriverDLL := FDriverDll;
DebugLeave('TASQLite3DB.FGetDriverDLL');
End;
Function TASQLite3DB.FGetDefaultExt: String;
Begin
DebugEnter('TASQLite3DB.FGetDefaultExt');
If FDefaultExt = '' Then
FDefaultExt := '.sqb';
FGetDefaultExt := FDefaultExt;
DebugLeave('TASQLite3DB.FGetDefaultExt');
End;
Procedure TASQLite3DB.FSetDatabase(Database: String);
Begin
DebugEnter('TASQLite3DB.FSetDatabase ' + Database);
FDatabase := Trim(Database);
If ExtractFileExt(FDatabase) = '' Then // GPA
FDatabase := FDatabase + FDefaultExt; // GPA
DebugLeave('TASQLite3DB.FSetDatabase');
End;
Procedure TASQLite3DB.ShowDatabases(List: TStrings);
Var
sr: TSearchRec;
Begin
DebugEnter('TASQLite3DB.ShowDatabases');
If DefaultExt = '' Then
DefaultExt := '.sqb';
If DefaultExt[1] <> '.' Then
DefaultExt := '.' + DefaultExt;
If DefaultDir <> '' Then
If DefaultDir[Length(DefaultDir)] <> '\' Then
DefaultDir := DefaultDir + '\';
If FindFirst(FDefaultDir + '*' + DefaultExt, faAnyFile, sr) = 0 Then
Begin
Repeat
List.Add(sr.Name);
Until FindNext(sr) <> 0;
SysUtils.FindClose(sr);
End;
DebugLeave('TASQLite3DB.ShowDatabases');
End;
Procedure TASQLite3DB.GetTableNames(List: TStrings; SystemTables: boolean = false);
Var
ResultPtr: Pointer;
ResultStr: ^Pointer;
RowCount: cardinal;
ColCount: cardinal;
ErrMsg: PAnsiChar;
I: integer;
Begin
DebugEnter('TASQLite3DB.GetTableNames');
If Not FConnected Then
Connected := true;
If FConnected Then
Begin
SQLite3_GetTable(DBHandle, PAnsiChar(
'SELECT name FROM sqlite_master WHERE type="table" ORDER BY name'),
ResultPtr, RowCount, ColCount, ErrMsg);
ResultStr := ResultPtr;
List.Clear;
inc(ResultStr); // ignore header
For I := 1 To RowCount Do
Begin
If (CompareText('name', PAnsiChar(ResultStr^)) <> 0) Then
List.Add(PAnsiChar(ResultStr^));
inc(ResultStr);
End;
If Assigned(ResultPtr) Then SQLite3_FreeTable(ResultPtr);
End;
DebugLeave('TASQLite3DB.GetTableNames');
End;
Procedure TASQLite3DB.GetIndexFieldNames(IndexName: String; List: TStrings);
Var
ResultPtr: Pointer;
ResultStr: ^Pointer;
RowCount: cardinal;
ColCount: cardinal;
ErrMsg: PAnsiChar;
I: integer;
Begin
DebugEnter('TASQLite3DB.GetIndexFieldNames');
If Not FConnected Then
Connected := true;
If FConnected Then
Begin
SQLite3_GetTable(DBHandle, PAnsiChar(
'PRAGMA index_info("' + IndexName + '");'),
ResultPtr, RowCount, ColCount, ErrMsg);
ResultStr := ResultPtr;
List.Clear;
inc(ResultStr, 5);
For I := 1 To RowCount Do
Begin
List.Insert(0, PAnsiChar(ResultStr^));
inc(ResultStr, 3);
End;
If Assigned(ResultPtr) Then SQLite3_FreeTable(ResultPtr);
End;
DebugLeave('TASQLite3DB.GetIndexFieldNames');
End;
Procedure TASQLite3DB.GetIndexNames(List: TStrings; SystemTables: boolean = false);
Var
ResultPtr: Pointer;
ResultStr: ^Pointer;
RowCount: cardinal;
ColCount: cardinal;
ErrMsg: PAnsiChar;
I: integer;
Begin
DebugEnter('TASQLite3DB.GetIndexNames');
If Not FConnected Then
Connected := true;
If FConnected Then
Begin
SQLite3_GetTable(DBHandle, PAnsiChar(
'SELECT name FROM sqlite_master WHERE type="index" ORDER BY name'),
ResultPtr, RowCount, ColCount, ErrMsg);
ResultStr := ResultPtr;
List.Clear;
inc(ResultStr); // ignore header
For I := 1 To RowCount Do
Begin
List.Add(PAnsiChar(ResultStr^));
inc(ResultStr);
End;
If Assigned(ResultPtr) Then SQLite3_FreeTable(ResultPtr);
End;
DebugLeave('TASQLite3DB.GetIndexNames');
End;
Procedure TASQLite3DB.GetFieldNames(TableName: String; List: TStrings);
Var
ResultPtr: Pointer;
ResultStr: ^Pointer;
RowCount: cardinal;
ColCount: cardinal;
ErrMsg: PAnsiChar;
I: integer;
Begin
DebugEnter('TASQLite3DB.GetFieldNames ' + TableName);
If Not FConnected Then
Connected := true;
If FConnected Then
Begin
SQLite3_GetTable(DBHandle, PAnsiChar('PRAGMA table_info("' + TableName + '");'),
ResultPtr, RowCount, ColCount, ErrMsg);
ResultStr := ResultPtr;
List.Clear;
inc(ResultStr, 6); // headers can be ignored
For I := 1 To RowCount Do
Begin
inc(ResultStr);
List.Add(PAnsiChar(ResultStr^)); // the second field contains the fieldname
inc(ResultStr, 5);
End;
If Assigned(ResultPtr) Then SQLite3_FreeTable(ResultPtr);
End;
DebugLeave('TASQLite3DB.GetFieldNames');
End;
Procedure TASQLite3DB.GetPrimaryKeys(TableName: String; List: TStrings);
Var
ResultPtr: Pointer;
ResultStr: ^Pointer;
// PK: ^Pointer;
RowCount: cardinal;
ColCount: cardinal;
ErrMsg: PAnsiChar;
Temp: String;
I: integer;
Begin
DebugEnter('TASQLite3DB.GetPrimaryKeys ' + TableName);
If Not FConnected Then
Connected := true;
If FConnected Then
Begin
SQLite3_GetTable(DBHand
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -