diff --git a/lib/import/import-sqlite.mk b/lib/import/import-sqlite.mk deleted file mode 100644 index 5a7895d..0000000 --- a/lib/import/import-sqlite.mk +++ /dev/null @@ -1 +0,0 @@ -INC_DIR += $(call select_from_ports,sqlite)/include/sqlite diff --git a/lib/mk/sqlite.mk b/lib/mk/sqlite.mk deleted file mode 100644 index 570cdc5..0000000 --- a/lib/mk/sqlite.mk +++ /dev/null @@ -1,20 +0,0 @@ -SQLITE_DIR = $(call select_from_ports,sqlite)/src/lib/sqlite - -INC_DIR += $(SQLITE_DIR) - -LIBS += pthread jitterentropy vfs libc - -SRC_C = sqlite3.c -SRC_CC = genode_sqlite.cc - -# https://github.com/genodelabs/genode/issues/754 -CC_OPT += -DSQLITE_4_BYTE_ALIGNED_MALLOC - -# Defenestrate the Unix and Windows OS layers and use our own. -CC_OPT += -DSQLITE_OS_OTHER=1 -CC_OPT_sqlite3 += -Wno-unused - -vpath %.c $(SQLITE_DIR) -vpath %.cc $(REP_DIR)/src/lib/sqlite - -CC_CXX_WARN_STRICT = diff --git a/ports/sqlite.hash b/ports/sqlite.hash deleted file mode 100644 index c79dda2..0000000 --- a/ports/sqlite.hash +++ /dev/null @@ -1 +0,0 @@ -5462da13fc98c0ec1c76b6cb619b4d407e680b11 diff --git a/ports/sqlite.port b/ports/sqlite.port deleted file mode 100644 index 86de492..0000000 --- a/ports/sqlite.port +++ /dev/null @@ -1,17 +0,0 @@ -LICENSE := PublicDomain -VERSION := 3100200 -DOWNLOADS := sqlite.archive speedtest.file - -# don't forget to bump the year in the url! -URL(sqlite) := http://sqlite.org/2016/sqlite-amalgamation-$(VERSION).zip -SHA(sqlite) := 097e71e284d720fe22aad5199875f38f2ed2c43e -DIR(sqlite) := src/lib/sqlite - -URL(speedtest) := https://www.sqlite.org/src/raw/test/speedtest1.c?name=f8bf04214e7b5f745feea99f7bde68b1c4870666 -SHA(speedtest) := f8bf04214e7b5f745feea99f7bde68b1c4870666 -NAME(speedtest) := src/lib/sqlite/speedtest1.c - -UNZIP_OPT(sqlite) := -j - -DIRS := include/sqlite -DIR_CONTENT(include/sqlite) := src/lib/sqlite/sqlite3.h src/lib/sqlite/sqlite3ext.h diff --git a/run/sqlite_speedtest.run b/run/sqlite_speedtest.run deleted file mode 100644 index 7314088..0000000 --- a/run/sqlite_speedtest.run +++ /dev/null @@ -1,52 +0,0 @@ -# -# SQLite performance regression test -# - -build "core init drivers/timer server/ram_fs test/sqlite_speedtest" - -create_boot_directory - -install_config { - - - - - - - - - - - - - - - - - - - - - - - - - - - - -} - -build_boot_image { - core init ld.lib.so - libc.lib.so - pthread.lib.so - test-sqlite_speedtest - timer -} - -append qemu_args " -nographic " - -run_genode_until {.*child "test-sqlite_speedtest" exited with exit value 0.*} 600 - -puts "Test succeeded" diff --git a/src/lib/sqlite/genode_sqlite.cc b/src/lib/sqlite/genode_sqlite.cc deleted file mode 100644 index 9b52ea7..0000000 --- a/src/lib/sqlite/genode_sqlite.cc +++ /dev/null @@ -1,588 +0,0 @@ -/* - * \brief SQLite VFS layer for Genode - * \author Emery Hemingway - * \date 2015-01-31 - * - * In this file VFS can refer to both the SQLite VFS and Genode VFS. - * See http://sqlite.org/vfs.html for more information. - * - * This implementation of sqlite3_io_methods only meets the first - * version of that interface. Implementing the shared memory I/O - * methods of the second version should increase performance. - * https://www.sqlite.org/c3ref/io_methods.html - */ - - /* - * Copyright (C) 2016 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU General Public License version 2. - */ - -/* Genode includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* jitterentropy includes */ -namespace Jitter { -extern "C" { -#include -} -} - -/* Use string operations without qualifier. */ -using namespace Genode; - -namespace Sqlite { - -/* Sqlite includes */ -extern "C" { -#include -} - -#define NOT_IMPLEMENTED PWRN("Sqlite::%s not implemented", __func__); - -/******************* - ** Time and date ** - *******************/ - -static Timer::Connection _timer; - -/* - * Sleep for at least nMicro microseconds. Return the (approximate) number - * of microseconds slept for. - */ -static int genode_sleep(sqlite3_vfs *pVfs, int nMicro) -{ - unsigned long then, now; - - then = _timer.elapsed_ms(); - _timer.usleep(nMicro); - now = _timer.elapsed_ms(); - - return (now - then) / 1000; -} - -/** - * Convert an Rtc::Timestamp to a Julian Day Number. - * - * \param ts Timestamp to convert. - * - * \return Julian Day Number, rounded down. - * - * The Julian Day starts at noon and this function rounds down, - * so the return value is effectively 12 hours behind. - * - * https://en.wikipedia.org/wiki/Julian_day#Calculation - */ -static unsigned julian_day(Rtc::Timestamp ts) -{ - unsigned a = (14 - ts.month) / 12; - unsigned y = ts.year + 4800 - a; - unsigned m = ts.month + 12*a - 3; - - return ts.day + (153*m + 2)/5 + 365*y + y/4 - y/100 + y/400 - 32046; -} - -/* - * Write into *pTime the current time and date as a Julian Day - * number times 86400000. In other words, write into *piTime - * the number of milliseconds since the Julian epoch of noon in - * Greenwich on November 24, 4714 B.C according to the proleptic - * Gregorian calendar. - * - * JULIAN DATE IS NOT THE SAME AS THE JULIAN CALENDAR, - * NOR WAS IT DEVISED BY SOMEONE NAMED JULIAN. - * THIS MIGHT BE CONFUSING. - */ -static int genode_current_time(sqlite3_vfs *pVfs, double *pTime) -{ - try { - Rtc::Connection rtc; - Rtc::Timestamp ts = rtc.current_time(); - - *pTime = julian_day(ts) * 86400000.0; - *pTime += (ts.hour + 12) * 360000.0; - *pTime += ts.minute * 60000.0; - *pTime += ts.second * 1000.0; - *pTime += ts.microsecond / 1000.0; - } catch (...) { - *pTime = _timer.elapsed_ms(); - } - - return SQLITE_OK; -} - -/* See above. */ -static int genode_current_time_int64(sqlite3_vfs *pVfs, sqlite3_int64 *pTime) -{ - try { - Rtc::Connection rtc; - Rtc::Timestamp ts = rtc.current_time(); - - *pTime = julian_day(ts) * 86400000; - *pTime += (ts.hour + 12) * 360000; - *pTime += ts.minute * 60000; - *pTime += ts.second * 1000; - *pTime += ts.microsecond / 1000; - } catch (...) { - *pTime = _timer.elapsed_ms(); - } - - return SQLITE_OK; -} - - -/********************** - ** Shared libraries ** - **********************/ - -/* - * The following four VFS methods: - * - * xDlOpen - * xDlError - * xDlSym - * xDlClose - * - * are supposed to implement the functionality needed by SQLite to load - * extensions compiled as shared objects. This simple VFS does not support - * this functionality, so the following functions are no-ops. - */ -static void *genode_dl_open(sqlite3_vfs *pVfs, const char *zPath) -{ - NOT_IMPLEMENTED - return 0; -} -static void genode_dl_error(sqlite3_vfs *pVfs, int nByte, char *zErrMsg) -{ - NOT_IMPLEMENTED - sqlite3_snprintf(nByte, zErrMsg, "Loadable extensions are not implemented"); - zErrMsg[nByte-1] = '\0'; -} -static void (*genode_dl_sym(sqlite3_vfs *pVfs, void *pH, const char *z))(void) -{ - NOT_IMPLEMENTED - return 0; -} -static void genode_dl_close(sqlite3_vfs *pVfs, void *pHandle) -{ - NOT_IMPLEMENTED - return; -} - - -/************ - ** Random ** - ************/ - -static Jitter::rand_data *_jitter; - -static int genode_randomness(sqlite3_vfs *pVfs, int len, char *buf) -{ - static Genode::Lock jitter_lock; - Genode::Lock::Guard guard(jitter_lock); - - return Jitter::jent_read_entropy(_jitter, buf, len); -} - -static int random_string(char *buf, int len) -{ - const unsigned char chars[] = - "abcdefghijklmnopqrstuvwxyz" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "0123456789"; - - if (genode_randomness(0, len, buf) != (len)) - return -1; - - for(int i=0; i pAppData; - - typedef Vfs::Directory_service::Unlink_result Result; - switch (vfs->unlink(path)) { - case Result::UNLINK_ERR_NO_ENTRY: return SQLITE_IOERR_DELETE_NOENT; - case Result::UNLINK_ERR_NO_PERM: return SQLITE_IOERR_ACCESS; - case Result::UNLINK_ERR_NOT_EMPTY: return SQLITE_IOERR_DELETE; - case Result::UNLINK_OK: break; - } - - if (dirSync) { - Path dir_path(path); - dir_path.strip_last_element(); - dir_path.remove_trailing('/'); - vfs->sync(dir_path.base()); - } - - return SQLITE_OK; -} - - -static int genode_close(sqlite3_file *pFile) -{ - Genode_file *p = (Genode_file*)pFile; - { Vfs::Vfs_handle::Guard guard(p->handle); } - - typedef Vfs::Directory_service::Unlink_result Result; - if (p->delete_on_close) switch(p->vfs->unlink(p->path)) { - case Result::UNLINK_ERR_NO_ENTRY: return SQLITE_IOERR_DELETE_NOENT; - case Result::UNLINK_ERR_NO_PERM: return SQLITE_IOERR_ACCESS; - case Result::UNLINK_ERR_NOT_EMPTY: return SQLITE_IOERR_DELETE; - case Result::UNLINK_OK: break; - } - return SQLITE_OK; -} - - -/* - * Reads and writes assume that SQLite will not operate - * over more than 4096 bytes at a time, and likely only 512. - * https://www.sqlite.org/atomiccommit.html#hardware - * - * These next two methods are not thread safe. - */ - - -static int genode_write(sqlite3_file *pFile, const void *buf, int count, sqlite_int64 offset) -{ - Vfs::file_size n; - Genode_file *p = (Genode_file*)pFile; - - p->handle->seek(offset); - - typedef Vfs::File_io_service::Write_result Result; - switch (p->handle->fs().write(p->handle, (char const *)buf, count, n)) { - case Result::WRITE_ERR_AGAIN: - case Result::WRITE_ERR_WOULD_BLOCK: - case Result::WRITE_ERR_INVALID: - case Result::WRITE_ERR_IO: - case Result::WRITE_ERR_INTERRUPT: - return SQLITE_IOERR_WRITE; - case Result::WRITE_OK: break; - } - return (n < Vfs::file_size(count)) ? SQLITE_IOERR_WRITE : SQLITE_OK; -} - - -static int genode_read(sqlite3_file *pFile, void *buf, int count, sqlite_int64 offset) -{ - Vfs::file_size n; - Genode_file *p = (Genode_file*)pFile; - - p->handle->seek(offset); - - typedef Vfs::File_io_service::Read_result Result; - switch (p->handle->fs().read(p->handle, (char *)buf, count, n)) { - case Result::READ_ERR_AGAIN: - case Result::READ_ERR_WOULD_BLOCK: - case Result::READ_ERR_INVALID: - case Result::READ_ERR_IO: - case Result::READ_ERR_INTERRUPT: - return SQLITE_IOERR_READ; - case Result::READ_OK: break; - } - return (n < Vfs::file_size(count)) ? SQLITE_IOERR_SHORT_READ : SQLITE_OK; -}; - - -static int genode_truncate(sqlite3_file *pFile, sqlite_int64 size) -{ - Genode_file *p = (Genode_file*)pFile; - - typedef Vfs::File_io_service::Ftruncate_result Result; - switch (p->handle->fs().ftruncate(p->handle, size)) { - case Result::FTRUNCATE_ERR_NO_PERM: - case Result::FTRUNCATE_ERR_INTERRUPT: return SQLITE_IOERR_TRUNCATE; - case Result::FTRUNCATE_ERR_NO_SPACE: return SQLITE_FULL; - case Result::FTRUNCATE_OK: break; - } - return SQLITE_OK; -} - - -static int genode_sync(sqlite3_file *pFile, int flags) -{ - Genode_file *p = (Genode_file*)pFile; - - p->vfs->sync(p->path); - return SQLITE_OK; -} - - -static int genode_file_size(sqlite3_file *pFile, sqlite_int64 *pSize) -{ - Genode_file *p = (Genode_file*)pFile; - - Vfs::Directory_service::Stat stat; - - typedef Vfs::Directory_service::Stat_result Result; - switch(p->vfs->stat(p->path, stat)) { - case Result::STAT_ERR_NO_ENTRY: return SQLITE_IOERR_FSTAT; - case Result::STAT_ERR_NO_PERM: return SQLITE_IOERR_ACCESS; - case Result::STAT_OK: break; - } - *pSize = stat.size; - return SQLITE_OK; -} - - -static int genode_lock(sqlite3_file *pFile, int eLock) -{ - NOT_IMPLEMENTED - return SQLITE_OK; -} -static int genode_unlock(sqlite3_file *pFile, int eLock) -{ - NOT_IMPLEMENTED - return SQLITE_OK; -} -static int genode_check_reserved_lock(sqlite3_file *pFile, int *pResOut) -{ - NOT_IMPLEMENTED - *pResOut = 0; - return SQLITE_OK; -} - - -/* - * No xFileControl() verbs are implemented by this VFS. - * Without greater control over writing, there isn't utility in processing this. - * See https://www.sqlite.org/c3ref/c_fcntl_busyhandler.html -*/ -static int genode_file_control(sqlite3_file *pFile, int op, void *pArg) { return SQLITE_OK; } - - -/* - * The xSectorSize() and xDeviceCharacteristics() methods. These two - * may return special values allowing SQLite to optimize file-system - * access to some extent. But it is also safe to simply return 0. - */ -static int genode_sector_size(sqlite3_file *pFile) { return 0; } - - -static int genode_device_characteristics(sqlite3_file *pFile) { return 0; } - - -static int genode_access(sqlite3_vfs *pVfs, const char *path, int flags, int *pResOut) -{ - Vfs::Dir_file_system *vfs = (Vfs::Dir_file_system*)pVfs->pAppData; - - unsigned mode = flags == SQLITE_ACCESS_READWRITE - ? Vfs::Directory_service::OPEN_MODE_RDWR - : Vfs::Directory_service::OPEN_MODE_RDONLY; - - Vfs::Vfs_handle *handle = nullptr; - - typedef Vfs::Directory_service::Open_result Result; - if (vfs->open(path, mode, &handle) == Result::OPEN_OK) { - *pResOut = true; - Vfs::Vfs_handle::Guard guard(handle); - } else - *pResOut = false; - - return SQLITE_OK; -} - - -static int genode_full_pathname(sqlite3_vfs *pVfs, const char *path_in, int out_len, char *path_out) -{ - /* - * No support for current working directory, work from /. - */ - Path path(path_in); - strncpy(path_out, path.base(), out_len); - return SQLITE_OK; -} - - -static int genode_open( - sqlite3_vfs *pVfs, - const char *name, /* File to open, or 0 for a temp file */ - sqlite3_file *pFile, /* Pointer to Genode_file struct to populate */ - int flags, /* Input SQLITE_OPEN_XXX flags */ - int *pOutFlags /* Output SQLITE_OPEN_XXX flags (or NULL) */ - ) -{ - static const sqlite3_io_methods genodeio = { - 1, /* iVersion */ - genode_close, /* xClose */ - genode_read, /* xRead */ - genode_write, /* xWrite */ - genode_truncate, /* xTruncate */ - genode_sync, /* xSync */ - genode_file_size, /* xFileSize */ - genode_lock, /* xLock */ - genode_unlock, /* xUnlock */ - genode_check_reserved_lock, /* xCheckReservedLock */ - genode_file_control, /* xFileControl */ - genode_sector_size, /* xSectorSize */ - genode_device_characteristics /* xDeviceCharacteristics */ - }; - - Vfs::Dir_file_system *vfs = (Vfs::Dir_file_system*)pVfs->pAppData; - Genode_file *p = (Genode_file*)pFile; - memset(p, 0x00, sizeof(Genode_file)); - - if (!name) { - #define TEMP_PREFIX "sqlite_" - #define TEMP_LEN 24 - - char *s = &p->path[0]; - strncpy(s, TEMP_PREFIX, sizeof(TEMP_PREFIX)); - - if (random_string(s + sizeof(TEMP_PREFIX)-1, TEMP_LEN-(sizeof(TEMP_PREFIX)))) - return SQLITE_ERROR; - } else - strncpy(p->path, name, sizeof(p->path)); - - unsigned mode = flags&SQLITE_OPEN_READWRITE - ? Vfs::Directory_service::OPEN_MODE_WRONLY - : Vfs::Directory_service::OPEN_MODE_WRONLY; - - if (flags&SQLITE_OPEN_CREATE) - mode |= Vfs::Directory_service::OPEN_MODE_CREATE; - - typedef Vfs::Directory_service::Open_result Result; - switch(vfs->open(p->path, mode, &p->handle)) { - case Result::OPEN_ERR_UNACCESSIBLE: - case Result::OPEN_ERR_NO_PERM: - case Result::OPEN_ERR_EXISTS: - case Result::OPEN_ERR_NAME_TOO_LONG: - case Result::OPEN_ERR_NO_SPACE: - return SQLITE_CANTOPEN; - case Result::OPEN_OK: break; - } - - p->base.pMethods = &genodeio; - p->vfs = vfs; - p->delete_on_close = flags&SQLITE_OPEN_DELETEONCLOSE; - - /* Ignore flags. */ - if (pOutFlags) - *pOutFlags = flags - & (SQLITE_OPEN_DELETEONCLOSE | - SQLITE_OPEN_READWRITE | - SQLITE_OPEN_READONLY | - SQLITE_OPEN_CREATE); - - return SQLITE_OK; -} - - - -/***************************************** - ** Library initialization and cleanup ** - ****************************************/ - -#define VFS_NAME "genode_vfs" - -int sqlite3_os_init(void) -{ - Genode::log("initializing native SQLite OS interface"); - - int ret = Jitter::jent_entropy_init(); - if(ret) { - Genode::error("Jitter entropy initialization failed with error code ", ret); - return SQLITE_ERROR; - } - - _jitter = Jitter::jent_entropy_collector_alloc(0, 0); - if (!_jitter) { - Genode::error("Jitter entropy collector initialization failed"); - return SQLITE_ERROR; - } - - Genode::Attached_rom_dataspace config("config"); - Vfs::Dir_file_system *genode_vfs = nullptr; - try { - Xml_node node = config.xml().sub_node("sqlite").sub_node("vfs"); - genode_vfs = new (Genode::env()->heap()) - Vfs::Dir_file_system(node, Vfs::global_file_system_factory()); - - } catch (Genode::Xml_node::Nonexistent_sub_node) { - try { - Xml_node node = config.xml().sub_node("vfs"); - genode_vfs = new (Genode::env()->heap()) - Vfs::Dir_file_system(node, Vfs::global_file_system_factory()); - PWRN("additional VFS created for SQLite"); - - } catch (Genode::Xml_node::Nonexistent_sub_node) { - Genode::error("no VFS defined for SQLite library"); - return SQLITE_ERROR; - } - } catch (...) { - Genode::error("error loading VFS definition for SQLite library"); - return SQLITE_ERROR; - } - - static sqlite3_vfs vfs = { - 2, /* iVersion */ - sizeof(Genode_file), /* szOsFile */ - Vfs::MAX_PATH_LEN, /* mxPathname */ - 0, /* pNext */ - VFS_NAME, /* zName */ - genode_vfs, /* pAppData */ - genode_open, /* xOpen */ - genode_delete, /* xDelete */ - genode_access, /* xAccess */ - genode_full_pathname, /* xFullPathname */ - genode_dl_open, /* xDlOpen */ - genode_dl_error, /* xDlError */ - genode_dl_sym, /* xDlSym */ - genode_dl_close, /* xDlClose */ - genode_randomness, /* xRandomness */ - genode_sleep, /* xSleep */ - genode_current_time, /* xCurrentTime */ - 0, /* xGetLastError */ - genode_current_time_int64, /* xCurrentTimeInt64 */ - }; - - sqlite3_vfs_register(&vfs, 0); - return SQLITE_OK; -} - - -int sqlite3_os_end(void) -{ - sqlite3_vfs *vfs = sqlite3_vfs_find(VFS_NAME); - sqlite3_vfs_unregister(vfs); - destroy(Genode::env()->heap(), (Vfs::Dir_file_system*)vfs->pAppData); - Jitter::jent_entropy_collector_free(_jitter); - - return SQLITE_OK; -} - -} /* namespace Sqlite */ diff --git a/src/test/sqlite_speedtest/target.mk b/src/test/sqlite_speedtest/target.mk deleted file mode 100644 index 8a06434..0000000 --- a/src/test/sqlite_speedtest/target.mk +++ /dev/null @@ -1,9 +0,0 @@ -TARGET = test-sqlite_speedtest -LIBS = sqlite pthread posix -SRC_C = speedtest1.c - -SQLITE_DIR = $(call select_from_ports,sqlite)/src/lib/sqlite - -vpath %.c $(SQLITE_DIR)/ - -CC_CXX_WARN_STRICT =