From c9d3d3c38db271e4ac2b9f86e2f82a2cb2d3d282 Mon Sep 17 00:00:00 2001 From: Ansgar Becker Date: Wed, 1 Jan 2020 19:12:10 +0100 Subject: [PATCH] Issue #12: Proper implementation of TSQLiteQuery.ColIsPrimaryKeyPart() --- source/dbconnection.pas | 18 ++++++++++++++++++ source/dbstructures.pas | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/source/dbconnection.pas b/source/dbconnection.pas index 49932d2e..1225d27b 100644 --- a/source/dbconnection.pas +++ b/source/dbconnection.pas @@ -7137,8 +7137,26 @@ end; function TSQLiteQuery.ColIsPrimaryKeyPart(Column: Integer): Boolean; +var + MetaResult: Integer; + TableNm, ColumnNm: String; + DataType, CollSeq: PAnsiChar; + NotNull, PrimaryKey, Autoinc: Integer; begin Result := False; + TableNm := TableName(Column); + ColumnNm := FColumnOrgNames[Column]; + if not TableNm.IsEmpty then begin + MetaResult := FConnection.Lib.sqlite3_table_column_metadata(FConnection.FHandle, + PAnsiChar(Utf8Encode(FConnection.Database)), + PAnsiChar(Utf8Encode(TableNm)), + PAnsiChar(Utf8Encode(ColumnNm)), + DataType, CollSeq, NotNull, PrimaryKey, Autoinc + ); + if MetaResult <> SQLITE_ERROR then begin + Result := PrimaryKey.ToBoolean; + end; + end; end; diff --git a/source/dbstructures.pas b/source/dbstructures.pas index 0b418637..a92e75d6 100644 --- a/source/dbstructures.pas +++ b/source/dbstructures.pas @@ -536,6 +536,10 @@ const sqlite3_column_table_name: function(pStmt: Psqlite3_stmt; N: Integer): PAnsiChar; cdecl; sqlite3_column_origin_name: function(pStmt: Psqlite3_stmt; N: Integer): PAnsiChar; cdecl; sqlite3_next_stmt: function(ppDb: Psqlite3; pStmt: Psqlite3_stmt): Psqlite3_stmt; cdecl; + sqlite3_table_column_metadata: function(ppDb: Psqlite3; + zDbName, zTableName, zColumnName: PAnsiChar; + var pzDataType, pzCollSeq: PAnsiChar; var pNotNull, pPrimaryKey, pAutoinc: Integer + ): Integer; cdecl; private procedure AssignProcedures; override; end; @@ -7949,6 +7953,7 @@ begin AssignProc(@sqlite3_column_table_name, 'sqlite3_column_table_name'); AssignProc(@sqlite3_column_origin_name, 'sqlite3_column_origin_name'); AssignProc(@sqlite3_next_stmt, 'sqlite3_next_stmt'); + AssignProc(@sqlite3_table_column_metadata, 'sqlite3_table_column_metadata'); end;