Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

symisc/unqlite

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

166 Commits
166 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

UnQLite

UnQLite

UnQLite is a self-contained, serverless, transactional database engine for C and C++ applications.

It runs in-process, stores data in a single portable file, and ships as a small embed-friendly codebase with no external runtime dependency. UnQLite exposes two layers:

  • a raw key/value store for binary-safe records
  • a document store powered by the Jx9 embedded scripting language

Official website: https://unqlite.symisc.net/

Current public release: 1.2.1

Why UnQLite

  • Embedded: no separate daemon, no socket protocol, no service to deploy
  • Transactional: ACID semantics for local storage workloads
  • Simple distribution: a database is typically one file on disk
  • Portable: the file format is cross-platform
  • Flexible: use key/value APIs directly, or use the document store and Jx9 layer
  • Small integration surface: the recommended embed path is the amalgamation
  • Optional threading support: enable it at compile time with UNQLITE_ENABLE_THREADS

Recommended Integration Path

If you want the simplest and most stable embed story, use the amalgamation files at the repository root:

  • unqlite.c
  • unqlite.h

That is the intended drop-in path for production embedding.

The src/ directory contains the split source tree used to build and maintain the amalgamation.

Repository Layout

  • unqlite.c: amalgamated implementation
  • unqlite.h: public header for the amalgamation build
  • src/: split source tree and internal headers
  • samples/: small example programs
  • CHANGELOG.md: release notes
  • LICENSE: 2-Clause BSD license

Quick Start

The fastest way to embed UnQLite is to compile your application together with unqlite.c.

GCC or Clang

cc -O2 -std=c99 -I. your_app.c unqlite.c -o your_app

Compile the bundled key/value intro sample:

cc -O2 -std=c99 -I. samples/1.c unqlite.c -o unqlite_kv_intro

MSVC

cl /nologo /TC /I. your_app.c unqlite.c

Compile the bundled key/value intro sample:

cl /nologo /TC /I. samples\1.c unqlite.c /link /OUT:unqlite_kv_intro.exe

Threading Support

If your application needs UnQLite compiled with thread support, define UNQLITE_ENABLE_THREADS when building:

cc -O2 -std=c99 -DUNQLITE_ENABLE_THREADS -I. your_app.c unqlite.c -o your_app
cl /nologo /TC /DUNQLITE_ENABLE_THREADS /I. your_app.c unqlite.c

Minimal Example

#include "unqlite.h"
#include <stdio.h>

static int print_value(const void *data, unsigned int len, void *user_data) {
    (void)user_data;
    fwrite(data, 1, len, stdout);
    return UNQLITE_OK;
}

int main(void) {
    unqlite *db = 0;

    if (unqlite_open(&db, ":mem:", UNQLITE_OPEN_CREATE) != UNQLITE_OK) {
        return 1;
    }

    if (unqlite_kv_store(db, "hello", -1, "world", 5) != UNQLITE_OK) {
        unqlite_close(db);
        return 1;
    }

    if (unqlite_kv_fetch_callback(db, "hello", -1, print_value, 0) != UNQLITE_OK) {
        unqlite_close(db);
        return 1;
    }

    putchar('\n');
    return unqlite_close(db) == UNQLITE_OK ? 0 : 1;
}

If you only need embedded key/value storage, you can stay entirely within the unqlite_kv_* API family and ignore the document-store layer.

What UnQLite Includes

  • On-disk and in-memory databases
  • Key/value CRUD APIs
  • Cursor APIs for linear traversal
  • A pluggable storage engine model
  • A document store built on Jx9
  • Foreign function and constant binding for Jx9 code
  • A virtual file system abstraction for portability

Samples

The samples/ directory contains small, focused examples for common integration paths.

Useful starting points:

  • samples/1.c: key/value introduction
  • samples/2.c through samples/6.c: broader API usage
  • samples/unqlite_huge.c: large-value handling
  • samples/unqlite_tar.c: archive-oriented example
  • samples/unqlite_mp3.c: metadata-oriented example

Documentation

The official documentation lives on the new site:

Notes

  • UnQLite is not a client/server database.
  • The amalgamation is the easiest way to consume the library.
  • If you are evaluating the engine for a KV-only use case, start with samples/1.c.
  • If you need document-oriented scripting, move next to the Jx9 documentation and samples.

License

UnQLite is distributed under the 2-Clause BSD license.

Releases

Packages

Used by

Contributors

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.