The best SQL library ever written for C with support for python, just for fun and testing.
Go to file
retoor 0f919964b5
Some checks failed
SORM build / build (push) Failing after 29s
SORM tests / Compile (push) Successful in 5s
Update build configuration
2024-11-22 16:30:38 +01:00
.gitea/workflows Update build configuration 2024-11-22 16:30:38 +01:00
.clang-format Initial commit 2024-11-22 14:45:03 +01:00
.gitignore Initial commit 2024-11-22 14:45:03 +01:00
cli.h Formatted 2024-11-22 15:51:47 +01:00
main.c Formatted 2024-11-22 15:51:47 +01:00
Makefile Initial commit 2024-11-22 14:45:03 +01:00
README.md Update readme 2024-11-22 14:57:47 +01:00
sorm Initial commit 2024-11-22 14:45:03 +01:00
sorm.h Formatted 2024-11-22 15:51:47 +01:00
sorm.py Formatted 2024-11-22 15:51:47 +01:00
sorm.so Initial commit 2024-11-22 14:45:03 +01:00
str.h Formatted 2024-11-22 15:51:47 +01:00

SORM

Description

SORM stands for SQL ORM. I made this because I have a love/hate relationship with both. I combined them together to have the best of both worlds!

The naming of my functions and variables are something to get used to. They are all abbreviations, kinda like C stdlib style. It looks weird, but you get used to it quickly and in reality, you just use a few of them.

Examples of common used functions are:

  • sormc(char *path) connect to database. Returns int.
  • sormq(int conn, char *sql, ...) execute query. Variadic arguments. Works like printf. Returns result in CSV format in case of SELECT.
  • sorm_csvd(char *csv_data) dumps your CSV result data to a nice fixed content width table in the terminal.

Design choices

I use mainly native types and not custom structs. For example, the db parameter is an int. This is so it can easily communicate with other languages using a shared object file. Same argument is for the result set of sormq (the query function) resulting in a char * containing CSV data. While the performance is nice, it's not written with performance in mind at all.

Thread safety

I wonder if I have configured sqlite3 the right way for thread safety. It maybe requires a manual compilation of the shared object file. Will look into that. SORM is written with thread safety in mind.

Building

It has only one build command for the shared object file and the REPL/CLI. It has not been compiled with optimizations / warnings enabled. Don't recommend for now.

make build

Requirements

This project has the following dependencies:

  • sqlite3-dev (apt install sqlite3-dev)
  • readline(-dev?) (no idea how to install)
  • gcc
  • make

The project probably works from C99 to C2X.

Caution

This project won't compile on your local PC because rlib.h is missing. This is my bundle of libraries that I regularely use. I will add this later as 3rd party lib. Maybe I will cherry pick only the functions that SORM uses out of it to keep the source clean, else I will have thousands of lines nothing to do with this project in the source.

Python support

The Python library is low quality. I made it just for fun and test. This is not a defitive version. But it show very well how to communicate with a shared object file. I'm sure someone will be happy with examples how to use variadic functions trough Python to C. See sorm.py

C API examples:

Connecting

int db = sormc("db.sqlite3");

Create table

This one should return true if executed.

sormq(db, "CREATE TABLE IF NOT EXISTS pony (id INTEGER  PRIMARY KEY AUTOINCREMENT,name,age);",NULL);

Inserting

sorm_pk iid = sormq(db, "INSERT INTO pony (id, name, age) VALUES (NULL, %s, %d);",
    "Retoorded retoor",
    42
);

Using ? is also possible for arguments like this (comfy for Python usage):

sorm_pk iid = sormq(db, "INSERT INTO pony (id, name, age) VALUES (NULL, ?s, ?d);",
    "Retoorded retoor",
    42
);

Selecting

IN query

sorm_str csv = sormq(db, "SELECT * FROM pony WHERE id in (?d,?d,?d)",1,2,3);
free(sorm_str);

LIKE query

sorm_str csv2 = sormq(db, "SELECT * FROM pony WHERE id > %d and age = %d AND name LIKE ?s", 1, 34, "%toor%"));
free(sorm_str);

Yes, you did see that right, you can use the default native free!

Disconnecting

sormd(db);