Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.14;
Скачать: CL | DM;

Вниз

Ошибка в SQLite   Найти похожие ветки 

 
Добежал   (2008-10-10 14:49) [0]

Судя по всему, SQLite неправильно работает с русскими символами в путях к файлу БД (или, наверное, будет точнее сказать, что работает неверно с НЕ английскими символами).

Есть такой класс:

//------------------------------------------------------------------------------
// TSQLiteDatabase
//------------------------------------------------------------------------------

constructor TSQLiteDatabase.Create(const FileName: string);
var
 Msg: pchar;
 iResult: integer;
begin
 inherited Create;

 self.fInTrans := False;

 Msg := nil;
 try
   iResult := SQLite3_Open(PChar(FileName), FHandle);

   if iResult <> SQLITE_OK then
     if Assigned(Handle) then
     begin
       Msg := Sqlite3_ErrMsg(Handle);
       raise ESqliteException.CreateFmt("Failed to open database "%s" : %s",
         [FileName, Msg]);
     end
     else
       raise ESqliteException.CreateFmt("Failed to open database "%s" : unknown error",
         [FileName]);

   //set a few configs
   self.ExecSQL("PRAGMA SYNCHRONOUS=NORMAL;");
//    self.ExecSQL("PRAGMA full_column_names = 1;");
   self.ExecSQL("PRAGMA temp_store = MEMORY;");

 finally
   if Assigned(Msg) then
     SQLite3_Free(Msg);
 end;

end;


Экспорт:

function SQLite3_Open(dbname: PChar; var db: TSqliteDB): integer; cdecl; external "sqlite3.dll" name "sqlite3_open";

Глюк очень интересный. Если, например, сделать так:

TSQLiteDatabase.Create("c:\фигня\test.db");

То он не выдает ошибку, а создает файл test.db прямо в "c:\" !
Ощущение, что он как-будто "не учитывает" директории с русскими символами.

Кто встречался, что делать?!

P.S. "sqlite3.dll" - почему то в свойствах версия не указана, но качал с оф. сайта не более месяца назад.


 
tesseract ©   (2008-10-10 14:53) [1]


> То он не выдает ошибку, а создает файл test.db прямо в "c:
> \" !


Там строка unicode. Читаем мануал.


 
Добежал   (2008-10-10 15:03) [2]

Блин, точно... Нафига так заголовочный файл составлен:

function SQLite3_Open(dbname: PChar; var db: TSqliteDB): integer; cdecl; external "sqlite3.dll" name "sqlite3_open";

гады...

Я б$% ошибку два часа искал! У меня так оказалось, что в директории были русские символы, поэтому он создавал в директории выше. А доступ в директорию выше была запрещена! В результате я вроде как указываю правильный путь (сто пятьдесят раз проверял), а он говорит что не может создать базу... Блин, блин, ненавижу ;)


 
jack128_   (2008-10-10 15:36) [3]


> Нафига так заголовочный файл составлен:

а как он по твоему должен быть составлен???


 
tesseract ©   (2008-10-10 15:36) [4]


> Нафига так заголовочный файл составлен:


Прально он составлен. Для Сей, multibyte там вроде ипользуеться, а не совсем unicode. Да и гемора с выяснением размеров строки вроде поменьше.  Delphi вроде сама догадываеться когда какая строка используеться, но не всегда.


 
jack128_   (2008-10-10 15:38) [5]


> Для Сей, multibyte там вроде ипользуеться, а не совсем unicode

UTF-8 в этой функции используется.
в прочем есть версия функции и для utf-16


 
Добежал   (2008-10-10 16:19) [6]


> а как он по твоему должен быть составлен???


Жень, по-моему, очевидно:

function SQLite3_Open(dbname: PUTF8String; var db: TSqliteDB): integer; cdecl; external "sqlite3.dll" name "sqlite3_open";


> Прально он составлен


хм... наверное, я тупой. Но все таки под PChar обычно понимают указатель на ANSI-символ / строчки.
Хотя, конечно, вы сейчас начнете доказывать обратное...


 
jack128_   (2008-10-10 16:42) [7]


> Жень, по-моему, очевидно:



int sqlite3_open(
 const char *filename,
 sqlite3 **ppDb        
);


Ты действительно думаешь, что дельфиское PUTF8String - эквивалентно сишному cosnt char *

???  Слава богу, что ты не занимаешся переводом сишных хедеров....


 
Добежал   (2008-10-10 16:56) [8]


> Ты действительно думаешь, что дельфиское PUTF8String - эквивалентно
> сишному cosnt char *


я действительно думаю, что библиотека sqlite3 принимает в качестве параметра указатель на UTF8 набор символов.
В си такого типа видимо нету.

В дельфи есть, это PUTF8String. То есть, описание на си + комментарий справа - получается вот.

Это мое мнение, если я не прав - поясните ошибку. Только не в стиле "ты дурак и слава богу что не ты что-то делаешь".


 
jack128_   (2008-10-10 17:24) [9]

 UTF8String = type string;
 PUTF8String = ^UTF8String;


то есть PUTF8String - указатель на строку. ПРичем не просто на строку, а на _длинную_ строку,  которая сама по себе является указателем на символы.

char * - это указатель на символ


 
Добежал   (2008-10-10 17:39) [10]

Черт, точно.

Действительно, должно быть что-то типа:

UTFChar = type char;
PUTFString = ^UTFChar;


или навроде того. Но такого типа судя по всему нету... Тогда самое близкое PChar, это да.
Я ступил, заголовочные файлы в порядке.

Но это не отменяет того, что функцию:


> constructor TSQLiteDatabase.Create(const FileName: string);


надо было писать как:

constructor TSQLiteDatabase.Create(const FileName: UTF8String);


 
Игорь Шевченко ©   (2008-10-10 17:43) [11]

Вообще-то символ в UTF-8 - это char, так что в заголовке все правильно написано


 
Anatoly Podgoretsky ©   (2008-10-10 19:08) [12]

> Игорь Шевченко  (10.10.2008 17:43:11)  [11]

Не согласен, для порядку надо TUTF8String, это же как TCaption/TDate/TTime - нужно для двух целей - первое подчеркнуть что это особый тип, а второе - это то что можно сделать отдельный редактор свойства для диспетчера объектов.


 
Добежал   (2008-10-10 21:03) [13]


> Вообще-то символ в UTF-8 - это char


а указатели в 32-ух битной windows все 32-ух битные. Но зачем то ведь придумали типизированные указатели.


> так что в заголовке все правильно написано


в заголовке да. Неправильно здесь:

constructor TSQLiteDatabase.Create(const FileName: string);

Надо:

constructor TSQLiteDatabase.Create(const FileName: UTF8String);


 
jack128_   (2008-10-10 21:13) [14]


> Надо:
>
> constructor TSQLiteDatabase.Create(const FileName: UTF8String);
>

да нет, сигнатуру нуно поменять на WideString, а в реализацию добавить UTF8Encode



Страницы: 1 вся ветка

Текущий архив: 2008.12.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
1-1203967029
Thor
2008-02-25 22:17
2008.12.14
Каким образом получаем exe?


4-1202219059
Olegz77
2008-02-05 16:44
2008.12.14
Получение изображения рабочего стола


15-1223400210
Nic
2008-10-07 21:23
2008.12.14
Turbo Pascal 7.1


15-1223864011
Slider007
2008-10-13 06:13
2008.12.14
С днем рождения ! 11 октября 2008 суббота


11-1196289774
Донской
2007-11-29 01:42
2008.12.14
Потоки...