Short: SQL database engine Author: D. Richard Hipp, Steffen Gutmann, Alexandre Balaban, Ilkka Lehtoranta, Mathias Parnaudeau Uploader: Steffen Gutmann Type: biz/dbase Version: 3.6.1-amiga Replaces: sqlite-3.5.4-amiga.lha Architecture: m68k-amigaos >= 3.0.0; ppc-amigaos; ppc-morphos Homepage: http://www.sqlite.org SQLite is a Self-contained, embeddable, zero-configuration SQL database engine. For information about SQLite, see the main README or check the site here: http://www.sqlite.org This is the Amiga version of sqlite-3.6.1 and can be considered stable. The regression tests either succeed without failure or reported errors can be explained or document limitations of this version. See below for a list of limitations in the Amiga version. There have been several attempts to port SQLite to AmigaOS. Please browse Aminet for a list. Several of the previous ports made use of the Posix/ ixemul interface that provides a Unix-like emulation of what is needed by the SQLite low level file access. This port is different in that it only uses AmigaOS 3 native functions for implementing the OS interface. The changes to the original version 3.5.4 are in writing a custom Makefile for Amiga, implementing the OS module for AmigaOS, adding some work-arounds for char to 64bit integer conversion bugs in the gcc-3.4.0 compiler, and making some other minor changes in several flies. A complete diff of all changes can be found in the file amiga-diff.txt. Note that this version fully supports 64bit integers. This, however, requires a compiler that supports 64bit integers and rules out, e.g. SAS-C. The os_amiga.c file contains an implementation of all necessary OS functions. This module was written by taking os_unix.c as a start, looking at os_win.c sometimes to get an idea on how else things can be done, by careful reading the autodocs of AmigaDOS, by testing some of the more advanced functions in AmigaDOS 3.0+ (e.g. LockRecord which seems to be unimplemented on most filesystems), and by running the regression tests and tweaking the code to ensure a correct implementation. If you are interested, you can find many comments in os_amiga.c, in particular about how to do the file locking. The library and the sqlite3 shell have been compiled for m68k-AmigaOS using gcc-3.4.0. The compiled binaries can be found in build-m68k-amigaos. The binaries also contain the 'testfixture' program for running the regression test suite. As 'testfixture' needs a tcl interpreter, I ported tcl-8.4.14 to AmigaOS using the ixemul library interface and also compiled 'testfixture' against it. Note that the sqlite3 shell and libraries are compiled with the -noixemul switch and are thus are true 'Amiga-like' binaries. Mathias Parnaudeau provides the AmigaOS 4 binaries under directory build-ppc-amigaos and Ilkka Lehtoranta the MorphOS binaries under directory build-ppc-morphos. The regression tests reported below have been run for the AmigaOS 3 version (under UAE). Test results for MorphOS are also available and are similar to the results on Amiga OS3 but haven't been fully analyzed yet. Limitations - No support for large files (LFS). To the best of my knowledge files under AmigaOS can be at most (2**31 - 1) bytes. This limitation arises from the LONG parameters in dos.library. Compile switch -DSQLITE_DISABLE_LFS (AOS4 and MorphOS introduce support for large files and implementation is in progress). - No byte-range-locking. I tried several file systems (OFS, FFS) but they do not seem to support the LockRecord/UnLockRecord calls (The RAM: disk does support it and maybe SFS also has it implemented). Therefore, the default way of locking is by using (several) .lock files. Read os_amiga.c if you want to know more about this. - Truncate file by replace. The dos.library/SetFileSize call is unsupported by most file systems (OFS, FFS) and therefore truncating a file to a target size doesn't work. My workaround to this is to write a new file of the target size and replace the files. This does not always work though if the file is still opened by another process/handle. In this case truncating fails which means that the 'VACUUM' command of sqlite fails. Use a file system that supports SetFileSize (try SFS) if you need to rely on a proper functioning of the VACUUM command. - 71 errors in 58122 tests remain. (see build-m68k-amigaos/test-stripped.log). The errors can be categorized into the following classes which explain what is happening: * rounding error on double : lack of precision in the math implementation of double precision floating point numbers. Test cases: date-*, expr-13.*, main-3.2.*, misc3-2.4, misc3-6.11, nan-*, printf-2.3.10.*, printf-10.3, printf-11.7, table-13.2.* * representation of double : NaN/Inf is differenlty represented or handled in the math libs. Test cases: expr-2.26[b], nan-*, printf-7.* * stat on exlusive open file: trying to open/access a file where a process holds an exclusive lock on. Test cases: exclusive-3.*, io-4.*, misc1-14.2, * ixemul vs AmigaDOS path : /home/a/b/c vs. home:a/b/c Test cases: pragma-9.*, shared-1.11.9, shared-2.11.9 * delete on open file error : the replace-file-when-truncating operation failed because some process still holds a handle on the file. Test cases: shared-2.3.1.*, vacuum-2.2, vacuum2-3.13 * Others: minor errors, need more investigation Test cases: tkt2854-1.5, tkt2854-1.16. You can reproduce these results by running 'testfixture ../test/quick.test'. Prior to running this test, make sure the stack is at least 500kBytes large as the tcl interpreter uses a lot of stack in recursive calls. Steffen Gutmann, 20.10.2008