Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];

Вниз

Ошибка в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.028 c
1-1204373042
Дмитрий
2008-03-01 15:04
2008.12.14
Отлов записей в ListView


15-1223635424
{RASkov}
2008-10-10 14:43
2008.12.14
Поиск в Висте


2-1225795373
Iriss
2008-11-04 13:42
2008.12.14
TTreeView активизировать элемент


15-1223661982
Kerk
2008-10-10 22:06
2008.12.14
Рабочие переговоры с космической станцией


15-1223364033
Vlad Oshin
2008-10-07 11:20
2008.12.14
Предложение по оформлению.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский