⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asgsqlite3.pas

📁 定时器for timer for ic chip
💻 PAS
📖 第 1 页 / 共 5 页
字号:
              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 + -