Page 4 of 4
Re: порт SQLite 1.0
Posted: Mon Nov 17, 2008 8:54 pm
by Serge
Я смотрю в IDA.
barsuk
Ничего не изменилось. Те же внешние ссылки.
Легко проверяется и в Колибри. Всё выводится на доску отладки в "User". Вот простой загрузчик. Только надо исправить путь к длл.
Code: Select all
include 'proc32.inc'
use32
db 'MENUET01'
dd 1
dd start
dd i_end
dd mem
dd mem
dd 0
dd 0
start:
mov eax, 68
mov ebx, 19
mov ecx, sztest
int 0x40
test eax, eax
jz .fail
mov edx, eax
mov esi, px_import
.import_loop:
lodsd
test eax, eax
jz .import_done
push edx
.import_find:
mov ebx, [edx]
test ebx, ebx
jz .fail ;import_not_found
push eax
@@:
mov cl, [eax]
cmp cl, [ebx]
jnz .import_find_next
test cl, cl
jz .import_found
inc eax
inc ebx
jmp @b
.import_find_next:
pop eax
add edx, 8
jmp .import_find
.import_found:
pop eax
mov eax, [edx+4]
mov [esi-4], eax
pop edx
jmp .import_loop
.import_done:
.fail:
mov eax, -1
ret
sztest db '/hd0/1/sqlite.obj',0
sz_sqlite_open db 'sqlite_open',0
sz_sqlite_exec db 'sqlite_exec',0
align 4
px_import:
imp_sqlite_open dd sz_sqlite_open
imp_sqlite_exec dd sz_sqlite_exec
dd 0
i_end:
align 4
rb 128 ; stack
mem:
Ещё вариант - слинковать в екзешник без страндартных библиотек. Link будет жаловаться на все внешние ссылки.
Re: порт SQLite 1.0
Posted: Tue Nov 18, 2008 12:06 pm
by tsdima
Как мы подключали эту библиотеку к HiAsm.
Код на Дельфи:
Code: Select all
{$L 'SQLiteObj\sqlite3_3_4.obj'}
{$L 'SQLiteObj\_ll.obj'}
{$L 'SQLiteObj\_ftoul.obj'}
{$L 'SQLiteObj\ftol.obj'}
// Stubs for external C RTL functions
const MSVCRT = 'msvcrt.dll';
function _malloc(size: Integer): Pointer; cdecl;
begin
GetMem(Result, size);
end;
function _realloc(P: Pointer; size: Integer): Pointer; cdecl;
begin
Result := P;
ReallocMem(Result, size);
end;
procedure _free(P: Pointer); cdecl;
begin
FreeMem(P);
end;
procedure __ltolower; cdecl; asm int 3; end; // not used
procedure __ltoupper; cdecl; asm int 3; end; // not used
procedure _localtime; external MSVCRT name 'localtime';
procedure _getenv; external MSVCRT name 'getenv';
procedure _sprintf; external MSVCRT name 'sprintf';
procedure _memcmp; external MSVCRT name 'memcmp';
procedure _memcpy; external MSVCRT name 'memcpy';
procedure _memset; external MSVCRT name 'memset';
procedure _strlen; external MSVCRT name 'strlen';
procedure _strcmp; external MSVCRT name 'strcmp';
procedure _strcpy; external MSVCRT name 'strcpy';
procedure _strncmp; external MSVCRT name 'strncmp';
procedure _strncpy; external MSVCRT name 'strncpy';
procedure _strcat; external MSVCRT name 'strcat';
procedure _isspace; external MSVCRT name 'isspace';
procedure _isalnum; external MSVCRT name 'isalnum';
procedure _isdigit; external MSVCRT name 'isdigit';
procedure _isxdigit; external MSVCRT name 'isxdigit';
procedure _atol; external MSVCRT name 'atol';
function _wsprintfA:integer; external 'user32.dll' name 'wsprintfA';
procedure RtlUnwind; external 'NtDll.dll' name 'RtlUnwind';
var
__turboFloat: LongBool = False;
__streams: Pointer = nil;
Тут нет только ОС-зависимых функций, которые описаны в соответствующем файле SQLite и которые подключались из стандартного модуля API windows.
Re: порт SQLite 1.0
Posted: Mon Nov 24, 2008 1:46 am
by barsuk
Библиотека, хотя и ругается на unresolved externals, все равно загружается. Написал клиента, использующего console.obj и sqlite.obj. Все работает (запросы ходят, файлы создаются), но одна проблема: нужно написать callback-функцию, в которую sqlite возвращает результаты запроса. На С я написал без проблем, а на ассемблере не могу достать параметры из стека (не нашел их там). Прототип callback-функции: int __cdecl callback(void *p, int num, char **val, char **col).
Re: порт SQLite 1.0
Posted: Mon Nov 24, 2008 2:41 am
by Serge
Главное чтобы не ругался на функции, а так это доп информация которую загрузчик неправильно обрабатывает.
Code: Select all
callback:
push ebp
mov ebp, esp
p equ (ebp+8)
num equ (ebp+12)
val equ (ebp+16)
col equ (ebp+20)
push ebx
push edi
push esi
mov eax, [p]
mov edx, [num]
mov esi, [val]
...
если объявлять через proc то буде проще
include 'proc32.inc'
proc callback cdecl, p:dword, num:dword, val:dword, col:dword
push ebx
push esi
push edi
mov eax, [p]
mov ebx, [num]
Re: порт SQLite 1.0
Posted: Fri Dec 05, 2008 5:02 pm
by barsuk
Наконец удалось сделать отображение результатов запроса. Исходники и kex прилагаются, библиотека используется та же.
Имхо, теперь можно говорить, что в Колибри есть СУБД
Re: порт SQLite 1.0
Posted: Sat Dec 06, 2008 11:46 am
by Leency
Ну вот теперь можно и отписаться на той страничке
Ещё бы знать как ей пользоваться)
Re: порт SQLite 1.0
Posted: Sat Dec 06, 2008 5:58 pm
by barsuk
Leency
Пользоваться так же, как любым движком SQL - отправлять запросы, получать результаты... Почитай что-нибудь по языку SQL (про MySQL тоже можно, но есть отличия).
Re: порт SQLite 1.0
Posted: Sat Dec 06, 2008 9:10 pm
by Gluk
Leency, очень удобная штука)
Re: порт SQLite 1.0
Posted: Sun Dec 07, 2008 10:07 pm
by ДедОк
что-то он у меня не запустился...
Re: порт SQLite 1.0
Posted: Sun Dec 07, 2008 11:47 pm
by barsuk
ДедОк
Нужно достаточно новое ядро.
Что-нибудь на доске отладки появляется при попытке запуска?
Желательно также наличие папки /rd/1/sqlite (иначе базы не будут сохраняться, сейчас прога сама не умеет создавать эту папку).
Re: порт SQLite 1.0
Posted: Wed Dec 10, 2008 12:01 am
by barsuk
Добавлены функции sqlite_close() - очевидного назначения, и set_path() - которая позволяет указать путь для хранения файлов sqlite (в примере стоит /hd0/1/sqlite/ - измените и перекомпилируйте, чтобы файлы сохранялись в другом месте); если функция не была вызвана, библиотека сохраняет файлы в /rd/1/ - корне рамдиска.
Небольшой ман по сборке sqlite (написан в частности для себя, поскольку после перерыва не смог вспомнить все шаманство) и руководство программиста в архиве.
Re: порт SQLite 1.0
Posted: Fri Jan 22, 2021 7:24 pm
by maxcodehack
Порт sqlite3
На gcc.
Работоспособность еще не проверял, просто выкладываю.
OLD:
Spoiler:
UPD2:
В колибри мьютексов нету (ну реализации в ньюлиб), поэтому нужно собирать с флагом -DSQLITE_THREADSAFE=0
UPD:
Собираю семпл (https://zetcode.com/db/sqlitec/), было много ероров.
Теперь их немного:
https://wtools.io/paste-code/b3ri
Фиксы:
NEW:
В архиве есть примерчик kos_sample, он собирается с таким ерор-логом:
https://paste.in/raw/254IrO
Их наверно нужно будет заглушить.
Re: порт SQLite 1.0
Posted: Fri Mar 05, 2021 10:49 am
by maxcodehack
Уже вышесказано, что я пытался собрать SQLite3. НО там нужно переписывать VFS. Я попробовал sqlite2. Собралось сразу же, только потом пару функций не хватало. Я их заглушил.
Исходники оригинала:
http://web.archive.org/web/200210041239 ... source.zip
Не компилился только файл tclsqlite.c, но он и не особо нужен.
Пускай здесь полежит:
https://github.com/maxcodehack/kolibrios-sqlite2
Бинарник (клиент) для тестов:
https://github.com/maxcodehack/kolibrio ... ent/sqlite