API de C
PetraDB proporciona una biblioteca compartida nativa (libpetradb-engine.so / .dylib) con una API C modelada segun SQLite. La biblioteca es autocontenida — no se necesita JVM ni runtime.
Descarga desde GitHub Releases o compila desde el codigo fuente con sbt engineNative/nativeLink. Consulta Primeros pasos con C para instrucciones de configuracion.
Incluye petradb.h y enlaza con -lpetradb-engine.
Inicio rapido
Sección titulada «Inicio rapido»#include "petradb.h"
int db = petradb_open();int conn = petradb_connect(db);
petradb_exec(conn, "CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT)");petradb_exec(conn, "INSERT INTO users (name) VALUES ('Alice')");
int cur = petradb_prepare(conn, "SELECT id, name FROM users");while (petradb_step(cur) == PETRADB_ROW) { int id = petradb_column_int(cur, 0); const char *name = petradb_column_text(cur, 1); printf("%d: %s\n", id, name);}petradb_finalize(cur);petradb_close(db);Ciclo de vida de la base de datos
Sección titulada «Ciclo de vida de la base de datos»int petradb_open(void); // base de datos en memoriaint petradb_open_persistent(const char *path); // base de datos persistenteint petradb_close(int db); // cerrar y liberarint petradb_connect(int db); // crear una sesionEjecutar sentencias
Sección titulada «Ejecutar sentencias»int petradb_exec(int conn, const char *sql); // retorna cantidad de filas afectadas, -1 en errorCursores (resultados de consulta)
Sección titulada «Cursores (resultados de consulta)»int petradb_prepare(int conn, const char *sql); // retorna handle de cursorint petradb_step(int cursor); // PETRADB_ROW (1), PETRADB_DONE (0), PETRADB_ERROR (-1)int petradb_finalize(int cursor); // cerrar cursorMetadatos de columna
Sección titulada «Metadatos de columna»int petradb_column_count(int cursor);const char *petradb_column_name(int cursor, int index);Valores de columna
Sección titulada «Valores de columna»int petradb_column_type(int cursor, int index); // PETRADB_INTEGER/FLOAT/TEXT/BLOB/NULLint petradb_column_int(int cursor, int index);long long petradb_column_int64(int cursor, int index);double petradb_column_double(int cursor, int index);const char *petradb_column_text(int cursor, int index); // NO liberarconst void *petradb_column_blob(int cursor, int index); // NO liberarint petradb_column_bytes(int cursor, int index); // longitud en bytes de text/blobint petradb_column_is_null(int cursor, int index);Funciones definidas por el usuario
Sección titulada «Funciones definidas por el usuario»Registra funciones C nativas invocables desde SQL, triggers y procedimientos almacenados:
void my_double(int ctx, int argc, const int* argv) { if (petradb_value_is_null(argv[0])) { petradb_result_null(ctx); return; } int x = petradb_value_int(argv[0]); petradb_result_int(ctx, x * 2);}
petradb_create_function(db, "my_double", 1, NULL, my_double);// Ahora utilizable: SELECT my_double(age) FROM users;Registro
Sección titulada «Registro»typedef void (*petradb_func_callback)(int ctx, int argc, const int* argv);int petradb_create_function(int db, const char* name, int nargs, void* user_data, petradb_func_callback fn);Lectura de argumentos
Sección titulada «Lectura de argumentos»int petradb_value_int(int value);long long petradb_value_int64(int value);double petradb_value_double(int value);const char *petradb_value_text(int value);int petradb_value_type(int value);int petradb_value_is_null(int value);Establecer resultados
Sección titulada «Establecer resultados»void petradb_result_int(int ctx, int value);void petradb_result_int64(int ctx, long long value);void petradb_result_double(int ctx, double value);void petradb_result_text(int ctx, const char* value);void petradb_result_null(int ctx);void petradb_result_error(int ctx, const char* msg); // aborta la sentencia SQLDatos de usuario
Sección titulada «Datos de usuario»Pasa contexto especifico de la aplicacion a traves de user_data:
static int call_count = 0;
void my_counter(int ctx, int argc, const int* argv) { int *p = (int*)petradb_user_data(ctx); (*p)++; petradb_result_int(ctx, *p);}
petradb_create_function(db, "call_count", 0, &call_count, my_counter);Manejo de errores
Sección titulada «Manejo de errores»const char *petradb_errmsg(void); // ultimo mensaje de error, cadena vacia si no hay ningunoTodas las funciones que retornan handles retornan 0 en caso de error. Las funciones que retornan codigos de estado retornan -1 en caso de error. Despues de cualquier error, llama a petradb_errmsg() para obtener detalles. Las operaciones exitosas limpian el error.
Constantes de tipo
Sección titulada «Constantes de tipo»| Constante | Valor | Descripcion |
|---|---|---|
PETRADB_INTEGER | 1 | Valor entero |
PETRADB_FLOAT | 2 | Valor de punto flotante |
PETRADB_TEXT | 3 | Cadena de texto |
PETRADB_BLOB | 4 | Datos binarios |
PETRADB_NULL | 5 | SQL NULL |
Gestion de memoria
Sección titulada «Gestion de memoria»- Los punteros a cadenas de
petradb_column_text,petradb_value_textypetradb_errmsgson propiedad de PetraDB. NO los liberes. Permanecen validos hasta la siguiente llamada que retorne una cadena. - La biblioteca compartida incluye el recolector de basura de Scala Native. No se necesita gestion de memoria manual para objetos de base de datos — solo llama a
petradb_finalizeypetradb_closecuando termines.
Bindings para otros lenguajes
Sección titulada «Bindings para otros lenguajes»La API C funciona con cualquier lenguaje que soporte FFI de C:
- Rust: declaraciones
unsafe extern "C"+-lpetradb-engine - Python:
ctypes.cdll.LoadLibrary("libpetradb-engine.so") - Go:
// #cgo LDFLAGS: -lpetradb-engine+import "C" - Ruby:
FFI::Librarydel gemffi