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:
Downloaded 213 times
UPD2:
В колибри мьютексов нету (ну реализации в ньюлиб), поэтому нужно собирать с флагом -DSQLITE_THREADSAFE=0
UPD:
Собираю семпл (https://zetcode.com/db/sqlitec/), было много ероров.
Теперь их немного:
https://wtools.io/paste-code/b3ri
Фиксы:
Makefile (2.64 KiB)
Downloaded 180 times
sqlite3.h (464.96 KiB)
Downloaded 198 times
NEW:
Downloaded 189 times
В архиве есть примерчик 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