cwist
Modern C web framework with libttak runtime
Loading...
Searching...
No Matches
orm.h
Go to the documentation of this file.
1
21#ifndef __CWIST_ORM_H__
22#define __CWIST_ORM_H__
23
24#include <stdbool.h>
25#include <stdint.h>
27#include <cjson/cJSON.h>
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33/* Forward declaration ----------------------------------------------------- */
34
36typedef struct cwist_orm cwist_orm_t;
37
45
46/* Lifecycle --------------------------------------------------------------- */
47
60
70
71/* Transaction control ----------------------------------------------------- */
72
86void cwist_orm_immediate_commit(bool enable);
87
99
110
121
122/* Low-level SQL ----------------------------------------------------------- */
123
140cwist_error_t cwist_orm_exec(cwist_orm_t *orm, const char *sql);
141
159cwist_error_t cwist_orm_query(cwist_orm_t *orm, const char *sql, cJSON **result);
160
161/* High-level helpers ------------------------------------------------------ */
162
182cwist_error_t cwist_orm_insert(cwist_orm_t *orm, const char *table, const cJSON *data);
183
197cwist_error_t cwist_orm_update(cwist_orm_t *orm, const char *table, const cJSON *data,
198 const char *where_clause);
199
209cwist_error_t cwist_orm_delete(cwist_orm_t *orm, const char *table, const char *where_clause);
210
224cwist_error_t cwist_orm_select(cwist_orm_t *orm, const char *table, const char *columns,
225 const char *where_clause, cJSON **result);
226
227/* ------------------------------------------------------------------ */
228/* _Generic type-dispatched RETURNING INSERT */
229/* ------------------------------------------------------------------ */
230
232 const cJSON *data, const char *returning_col,
233 cJSON **out);
234
235cwist_error_t cwist_orm_insert_returning_int(cwist_orm_t *orm, const char *table, const cJSON *data,
236 const char *returning_col, int *out);
237
239 const cJSON *data, const char *returning_col,
240 long *out);
241
243 const cJSON *data, const char *returning_col,
244 long long *out);
245
260#define cwist_orm_insert_r(orm, table, data, returning_col, out) \
261 _Generic((out), \
262 int *: cwist_orm_insert_returning_int, \
263 long *: cwist_orm_insert_returning_long, \
264 long long *: cwist_orm_insert_returning_llong, \
265 cJSON **: cwist_orm_insert_returning_json)((orm), (table), (data), (returning_col), (out))
266
267/* ------------------------------------------------------------------ */
268/* Column-typed result sets (#354) */
269/* ------------------------------------------------------------------ */
270
286
297typedef struct cwist_orm_value {
299 int64_t i64;
300 double real;
301 char *text;
302 unsigned char *blob;
303 size_t blob_len;
305
320
342 cwist_orm_result_t **result);
343
352
362 const char *column);
363
375 size_t row, size_t column);
376
377/* ------------------------------------------------------------------ */
378/* _Generic type-dispatched SELECT single scalar */
379/* ------------------------------------------------------------------ */
380
381cwist_error_t cwist_orm_select_one_json(cwist_orm_t *orm, const char *table, const char *column,
382 const char *where_clause, cJSON **out);
383
384cwist_error_t cwist_orm_select_one_int(cwist_orm_t *orm, const char *table, const char *column,
385 const char *where_clause, int *out);
386
387cwist_error_t cwist_orm_select_one_long(cwist_orm_t *orm, const char *table, const char *column,
388 const char *where_clause, long *out);
389
390cwist_error_t cwist_orm_select_one_llong(cwist_orm_t *orm, const char *table, const char *column,
391 const char *where_clause, long long *out);
392
393cwist_error_t cwist_orm_select_one_double(cwist_orm_t *orm, const char *table, const char *column,
394 const char *where_clause, double *out);
395
396cwist_error_t cwist_orm_select_one_string(cwist_orm_t *orm, const char *table, const char *column,
397 const char *where_clause, char **out);
398
399/* ------------------------------------------------------------------ */
400/* Exact 64-bit integers */
401/* ------------------------------------------------------------------ */
402
423cwist_error_t cwist_orm_select_one_i64(cwist_orm_t *orm, const char *table, const char *column,
424 const char *where_clause, int64_t *out);
425
436 const cJSON *data, const char *returning_col,
437 int64_t *out);
438
453#define cwist_orm_select_one(orm, table, column, where, out) \
454 _Generic((out), \
455 int *: cwist_orm_select_one_int, \
456 long *: cwist_orm_select_one_long, \
457 long long *: cwist_orm_select_one_llong, \
458 double *: cwist_orm_select_one_double, \
459 char **: cwist_orm_select_one_string, \
460 cJSON **: cwist_orm_select_one_json)((orm), (table), (column), (where), (out))
461
462#ifdef __cplusplus
463}
464#endif
465
466#endif /* __CWIST_ORM_H__ */
cwist_error_t cwist_orm_select_one_int(cwist_orm_t *orm, const char *table, const char *column, const char *where_clause, int *out)
Select a single column value from the first matching row as an int.
Definition orm.c:1112
cwist_error_t cwist_orm_query(cwist_orm_t *orm, const char *sql, cJSON **result)
Execute a SELECT query and return the result set.
Definition orm.c:291
const cwist_orm_value_t * cwist_orm_result_cell(const cwist_orm_result_t *result, size_t row, size_t column)
Read one cell of a typed result set.
Definition orm.c:1688
cwist_error_t cwist_orm_select_one_json(cwist_orm_t *orm, const char *table, const char *column, const char *where_clause, cJSON **out)
Select a single column value from the first matching row as JSON.
Definition orm.c:1053
cwist_error_t cwist_orm_insert_returning_i64(cwist_orm_t *orm, const char *table, const cJSON *data, const char *returning_col, int64_t *out)
Insert a row and return an integer column exactly as an int64_t.
Definition orm.c:1404
enum cwist_orm_value_type cwist_orm_value_type_t
Storage class of a typed result cell.
cwist_error_t cwist_orm_select_one_double(cwist_orm_t *orm, const char *table, const char *column, const char *where_clause, double *out)
Select a single column value from the first matching row as a double.
Definition orm.c:1190
struct cwist_orm_result cwist_orm_result_t
Column-typed result set produced by cwist_orm_query_typed().
struct cwist_orm_value cwist_orm_value_t
One cell of a column-typed result set.
cwist_error_t cwist_orm_select(cwist_orm_t *orm, const char *table, const char *columns, const char *where_clause, cJSON **result)
Convenience SELECT helper.
Definition orm.c:773
cwist_error_t cwist_orm_insert_returning_json(cwist_orm_t *orm, const char *table, const cJSON *data, const char *returning_col, cJSON **out)
Insert a row and return a JSON value from the new row.
Definition orm.c:872
cwist_error_t cwist_orm_delete(cwist_orm_t *orm, const char *table, const char *where_clause)
Delete rows from a table.
Definition orm.c:727
void cwist_orm_use_dialect(cwist_orm_t *orm, cwist_orm_dialect_t dialect)
Select the SQL dialect used for query generation.
Definition orm.c:201
cwist_error_t cwist_orm_insert_returning_int(cwist_orm_t *orm, const char *table, const cJSON *data, const char *returning_col, int *out)
Insert a row and return a column value as an int.
Definition orm.c:932
cwist_error_t cwist_orm_insert_returning_llong(cwist_orm_t *orm, const char *table, const cJSON *data, const char *returning_col, long long *out)
Insert a row and return a column value as a long long.
Definition orm.c:985
cwist_orm_value_type
Storage class of a typed result cell.
Definition orm.h:279
@ CWIST_ORM_TYPE_BLOB
Definition orm.h:284
@ CWIST_ORM_TYPE_INTEGER
Definition orm.h:281
@ CWIST_ORM_TYPE_NULL
Definition orm.h:280
@ CWIST_ORM_TYPE_TEXT
Definition orm.h:283
@ CWIST_ORM_TYPE_REAL
Definition orm.h:282
cwist_orm_dialect
Supported SQL dialects for query generation.
Definition orm.h:39
@ CWIST_ORM_SQLITE
Definition orm.h:40
@ CWIST_ORM_MYSQL
Definition orm.h:42
@ CWIST_ORM_POSTGRES
Definition orm.h:41
@ CWIST_ORM_MARIADB
Definition orm.h:43
cwist_orm_t * cwist_orm_open_socket(int socket_fd)
Create an ORM session from an existing SQL socket.
Definition orm.c:145
enum cwist_orm_dialect cwist_orm_dialect_t
Supported SQL dialects for query generation.
cwist_error_t cwist_orm_select_one_llong(cwist_orm_t *orm, const char *table, const char *column, const char *where_clause, long long *out)
Select a single column value from the first matching row as a long long.
Definition orm.c:1164
cwist_error_t cwist_orm_select_one_i64(cwist_orm_t *orm, const char *table, const char *column, const char *where_clause, int64_t *out)
Select a single integer cell exactly as an int64_t.
Definition orm.c:1387
void cwist_orm_immediate_commit(bool enable)
Toggle automatic commit mode.
Definition orm.c:188
cwist_error_t cwist_orm_select_one_string(cwist_orm_t *orm, const char *table, const char *column, const char *where_clause, char **out)
Select a single column value from the first matching row as a string.
Definition orm.c:1218
cwist_error_t cwist_orm_exec(cwist_orm_t *orm, const char *sql)
Execute a non-query SQL statement.
Definition orm.c:241
void cwist_orm_close_socket(cwist_orm_t *orm)
Destroy an ORM session and close its underlying socket.
Definition orm.c:163
cwist_error_t cwist_orm_insert(cwist_orm_t *orm, const char *table, const cJSON *data)
Insert a JSON object into a table.
Definition orm.c:586
void cwist_orm_result_free(cwist_orm_result_t *result)
Release a result set from cwist_orm_query_typed().
Definition orm.c:1663
cwist_error_t cwist_orm_commit(cwist_orm_t *orm)
Commit the current transaction.
Definition orm.c:211
cwist_error_t cwist_orm_update(cwist_orm_t *orm, const char *table, const cJSON *data, const char *where_clause)
Update rows in a table.
Definition orm.c:629
struct cwist_orm cwist_orm_t
Opaque ORM session handle.
Definition orm.h:36
cwist_error_t cwist_orm_rollback(cwist_orm_t *orm)
Roll back the current transaction.
Definition orm.c:221
cwist_error_t cwist_orm_insert_returning_long(cwist_orm_t *orm, const char *table, const cJSON *data, const char *returning_col, long *out)
Insert a row and return a column value as a long.
Definition orm.c:958
cwist_error_t cwist_orm_query_typed(cwist_orm_t *orm, const char *sql, cwist_orm_result_t **result)
Execute a SELECT-style query and return column-typed rows.
Definition orm.c:1564
size_t cwist_orm_result_column_index(const cwist_orm_result_t *result, const char *column)
Find a column index by name in a typed result set.
Definition orm.c:1680
cwist_error_t cwist_orm_select_one_long(cwist_orm_t *orm, const char *table, const char *column, const char *where_clause, long *out)
Select a single column value from the first matching row as a long.
Definition orm.c:1138
Integrated error structure used throughout the system.
Definition cwist_err.h:72
Column-typed result set produced by cwist_orm_query_typed().
Definition orm.h:314
cwist_orm_value_t * cells
Definition orm.h:318
char ** columns
Definition orm.h:317
size_t row_count
Definition orm.h:316
size_t column_count
Definition orm.h:315
One cell of a column-typed result set.
Definition orm.h:297
size_t blob_len
Definition orm.h:303
cwist_orm_value_type_t type
Definition orm.h:298
double real
Definition orm.h:300
char * text
Definition orm.h:301
unsigned char * blob
Definition orm.h:302
int64_t i64
Definition orm.h:299
Unified error code and type definitions for the CWIST system layer.