From 0d71ef61fc24c337b8a2a4ebc940e583fb6cfede Mon Sep 17 00:00:00 2001 From: marco Date: Sun, 12 Jun 2011 15:34:43 +0000 Subject: [PATCH] * Committed patch from LacaK2 that adds some SQL unicode fieldtypes for sqlite3 Mantis #18670 git-svn-id: trunk@17732 - --- .../fcl-db/src/sqldb/sqlite/sqlite3conn.pp | 59 +++++++++++++++---- 1 file changed, 49 insertions(+), 10 deletions(-) diff --git a/packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp b/packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp index 4606b2ff66..9e7080537a 100644 --- a/packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp +++ b/packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp @@ -158,6 +158,7 @@ Var cu1: currency; do1: double; parms : array of Integer; + wstr1: widestring; begin for I:=1 to high(fparambinding)+1 do @@ -183,6 +184,7 @@ begin end; ftFMTBcd, ftstring, + ftFixedChar, ftmemo: begin // According to SQLite documentation, CLOB's (ftMemo) have the Text affinity str1:= p.asstring; checkerror(sqlite3_bind_text(fstatement,I,pcharstr(str1), length(str1),@freebindstring)); @@ -191,6 +193,11 @@ begin str1:= P.asstring; checkerror(sqlite3_bind_blob(fstatement,I,pcharstr(str1), length(str1),@freebindstring)); end; + ftWideString, ftFixedWideChar, ftWideMemo: + begin + wstr1:=P.AsWideString; + checkerror(sqlite3_bind_text16(fstatement,I, PWideChar(wstr1), length(wstr1)*sizeof(WideChar), sqlite3_destructor_type(SQLITE_TRANSIENT))); + end else DatabaseErrorFmt(SUnsupportedParameter, [Fieldtypenames[P.DataType], Self]); end; { Case } @@ -259,16 +266,33 @@ var int1: integer; st: psqlite3_stmt; fnum: integer; + p1: Pointer; begin st:=TSQLite3Cursor(cursor).fstatement; fnum:= FieldDef.fieldno - 1; - int1:= sqlite3_column_bytes(st,fnum); + case FieldDef.DataType of + ftWideMemo: + begin + p1 := sqlite3_column_text16(st,fnum); + int1 := sqlite3_column_bytes16(st,fnum); + end; + ftMemo: + begin + p1 := sqlite3_column_text(st,fnum); + int1 := sqlite3_column_bytes(st,fnum); + end; + else //ftBlob + begin + p1 := sqlite3_column_blob(st,fnum); + int1 := sqlite3_column_bytes(st,fnum); + end; + end; - ReAllocMem(ABlobBuf^.BlobBuffer^.Buffer,int1); + ReAllocMem(ABlobBuf^.BlobBuffer^.Buffer, int1); if int1 > 0 then - move(sqlite3_column_text(st,fnum)^,ABlobBuf^.BlobBuffer^.Buffer^,int1); + move(p1^, ABlobBuf^.BlobBuffer^.Buffer^, int1); ABlobBuf^.BlobBuffer^.Size := int1; end; @@ -314,7 +338,7 @@ Type end; Const - FieldMapCount = 20; + FieldMapCount = 23; FieldMap : Array [1..FieldMapCount] of TFieldMap = ( (n:'INT'; t: ftInteger), (n:'LARGEINT'; t:ftlargeInt), @@ -335,7 +359,10 @@ Const (n:'DECIMAL'; t: ftBCD), (n:'TEXT'; t: ftmemo), (n:'CLOB'; t: ftmemo), - (n:'BLOB'; t: ftBlob) + (n:'BLOB'; t: ftBlob), + (n:'NCHAR'; t: ftFixedWideChar), + (n:'NVARCHAR'; t: ftWideString), + (n:'NCLOB'; t: ftWideMemo) { Template: (n:''; t: ft) } @@ -378,7 +405,11 @@ begin // handle some specials. size1:=0; case ft1 of - ftString: begin + ftString, + ftFixedChar, + ftFixedWideChar, + ftWideString: + begin fi:=pos('(',FD); if (fi>0) then begin @@ -494,13 +525,10 @@ function TSQLite3Connection.LoadField(cursor : TSQLCursor;FieldDef : TfieldDef;b var st1: TStorageType; fnum: integer; - i: integer; - i64: int64; - int1,int2: integer; str1: string; + int1 : integer; bcd: tBCD; bcdstr: FmtBCDStringtype; - ar1,ar2: TStringArray; st : psqlite3_stmt; begin @@ -534,6 +562,7 @@ begin end else Pdatetime(buffer)^:= sqlite3_column_double(st,fnum); + ftFixedChar, ftString: begin int1:= sqlite3_column_bytes(st,fnum); if int1>FieldDef.Size then @@ -557,6 +586,16 @@ begin bcd := 0; pBCD(buffer)^:= bcd; end; + ftFixedWideChar, + ftWideString: + begin + int1 := sqlite3_column_bytes16(st,fnum)+2; //The value returned does not include the zero terminator at the end of the string + if int1>(FieldDef.Size+1)*2 then + int1:=(FieldDef.Size+1)*2; + if int1 > 0 then + move(sqlite3_column_text16(st,fnum)^, buffer^, int1); //Strings returned by sqlite3_column_text() and sqlite3_column_text16(), even empty strings, are always zero terminated. + end; + ftWideMemo, ftMemo, ftBlob: CreateBlob:=True; else { Case }