forked from sqliteai/sqlite-sync
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdatabase.h
More file actions
163 lines (140 loc) · 7.54 KB
/
database.h
File metadata and controls
163 lines (140 loc) · 7.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
//
// database.h
// cloudsync
//
// Created by Marco Bambini on 03/12/25.
//
#ifndef __CLOUDSYNC_DATABASE__
#define __CLOUDSYNC_DATABASE__
#include <stdarg.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
typedef void dbvm_t;
typedef void dbvalue_t;
typedef enum {
DBRES_OK = 0,
DBRES_ERROR = 1,
DBRES_ABORT = 4,
DBRES_NOMEM = 7,
DBRES_IOERR = 10,
DBRES_CONSTRAINT = 19,
DBRES_MISUSE = 21,
DBRES_ROW = 100,
DBRES_DONE = 101
} DBRES;
typedef enum {
DBTYPE_INTEGER = 1,
DBTYPE_FLOAT = 2,
DBTYPE_TEXT = 3,
DBTYPE_BLOB = 4,
DBTYPE_NULL = 5
} DBTYPE;
typedef enum {
DBFLAG_PERSISTENT = 0x01
} DBFLAG;
// The type of CRDT chosen for a table controls what rows are included or excluded when merging tables together from different databases
typedef enum {
table_algo_none = 0,
table_algo_crdt_cls = 100, // CausalLengthSet
table_algo_crdt_gos, // GrowOnlySet
table_algo_crdt_dws, // DeleteWinsSet
table_algo_crdt_aws // AddWinsSet
} table_algo;
#ifndef UNUSED_PARAMETER
#define UNUSED_PARAMETER(X) (void)(X)
#endif
// OPAQUE STRUCT
typedef struct cloudsync_context cloudsync_context;
// CALLBACK
typedef int (*database_exec_cb) (void *xdata, int argc, char **values, char **names);
int database_exec (cloudsync_context *data, const char *sql);
int database_exec_callback (cloudsync_context *data, const char *sql, database_exec_cb, void *xdata);
int database_select_int (cloudsync_context *data, const char *sql, int64_t *value);
int database_select_text (cloudsync_context *data, const char *sql, char **value);
int database_select_blob (cloudsync_context *data, const char *sql, char **value, int64_t *value_len);
int database_select_blob_2int (cloudsync_context *data, const char *sql, char **value, int64_t *value_len, int64_t *value2, int64_t *value3);
int database_write (cloudsync_context *data, const char *sql, const char **values, DBTYPE types[], int lens[], int count);
bool database_table_exists (cloudsync_context *data, const char *table_name, const char *schema);
bool database_internal_table_exists (cloudsync_context *data, const char *name);
bool database_trigger_exists (cloudsync_context *data, const char *table_name);
int database_create_metatable (cloudsync_context *data, const char *table_name);
int database_create_triggers (cloudsync_context *data, const char *table_name, table_algo algo, const char *filter);
int database_delete_triggers (cloudsync_context *data, const char *table_name);
int database_pk_names (cloudsync_context *data, const char *table_name, char ***names, int *count);
int database_cleanup (cloudsync_context *data);
int database_count_pk (cloudsync_context *data, const char *table_name, bool not_null, const char *schema);
int database_count_nonpk (cloudsync_context *data, const char *table_name, const char *schema);
int database_count_int_pk (cloudsync_context *data, const char *table_name, const char *schema);
int database_count_notnull_without_default (cloudsync_context *data, const char *table_name, const char *schema);
int64_t database_schema_version (cloudsync_context *data);
uint64_t database_schema_hash (cloudsync_context *data);
bool database_check_schema_hash (cloudsync_context *data, uint64_t hash);
int database_update_schema_hash (cloudsync_context *data, uint64_t *hash);
int database_begin_savepoint (cloudsync_context *data, const char *savepoint_name);
int database_commit_savepoint (cloudsync_context *data, const char *savepoint_name);
int database_rollback_savepoint (cloudsync_context *data, const char *savepoint_name);
bool database_in_transaction (cloudsync_context *data);
int database_errcode (cloudsync_context *data);
const char *database_errmsg (cloudsync_context *data);
// VM
int databasevm_prepare (cloudsync_context *data, const char *sql, dbvm_t **vm, int flags);
int databasevm_step (dbvm_t *vm);
void databasevm_finalize (dbvm_t *vm);
void databasevm_reset (dbvm_t *vm);
void databasevm_clear_bindings (dbvm_t *vm);
const char *databasevm_sql (dbvm_t *vm);
// BINDING
int databasevm_bind_blob (dbvm_t *vm, int index, const void *value, uint64_t size);
int databasevm_bind_double (dbvm_t *vm, int index, double value);
int databasevm_bind_int (dbvm_t *vm, int index, int64_t value);
int databasevm_bind_null (dbvm_t *vm, int index);
int databasevm_bind_text (dbvm_t *vm, int index, const char *value, int size);
int databasevm_bind_value (dbvm_t *vm, int index, dbvalue_t *value);
// VALUE
const void *database_value_blob (dbvalue_t *value);
double database_value_double (dbvalue_t *value);
int64_t database_value_int (dbvalue_t *value);
const char *database_value_text (dbvalue_t *value);
int database_value_bytes (dbvalue_t *value);
int database_value_type (dbvalue_t *value);
void database_value_free (dbvalue_t *value);
void *database_value_dup (dbvalue_t *value);
// COLUMN
const void *database_column_blob (dbvm_t *vm, int index);
double database_column_double (dbvm_t *vm, int index);
int64_t database_column_int (dbvm_t *vm, int index);
const char *database_column_text (dbvm_t *vm, int index);
dbvalue_t *database_column_value (dbvm_t *vm, int index);
int database_column_bytes (dbvm_t *vm, int index);
int database_column_type (dbvm_t *vm, int index);
// MEMORY
void *dbmem_alloc (uint64_t size);
void *dbmem_zeroalloc (uint64_t size);
void *dbmem_realloc (void *ptr, uint64_t new_size);
char *dbmem_mprintf(const char *format, ...);
char *dbmem_vmprintf (const char *format, va_list list);
void dbmem_free (void *ptr);
uint64_t dbmem_size (void *ptr);
// SQL
char *sql_build_drop_table (const char *table_name, char *buffer, int bsize, bool is_meta);
char *sql_build_select_nonpk_by_pk (cloudsync_context *data, const char *table_name, const char *schema);
char *sql_build_delete_by_pk (cloudsync_context *data, const char *table_name, const char *schema);
char *sql_build_insert_pk_ignore (cloudsync_context *data, const char *table_name, const char *schema);
char *sql_build_upsert_pk_and_col (cloudsync_context *data, const char *table_name, const char *colname, const char *schema);
char *sql_build_select_cols_by_pk (cloudsync_context *data, const char *table_name, const char *colname, const char *schema);
char *sql_build_rekey_pk_and_reset_version_except_col (cloudsync_context *data, const char *table_name, const char *except_col);
char *sql_build_delete_cols_not_in_schema_query(const char *schema, const char *table_name, const char *meta_ref, const char *pkcol);
char *sql_build_pk_collist_query(const char *schema, const char *table_name);
char *sql_build_pk_decode_selectlist_query(const char *schema, const char *table_name);
char *sql_build_pk_qualified_collist_query(const char *schema, const char *table_name);
char *sql_build_insert_missing_pks_query(const char *schema, const char *table_name, const char *pkvalues_identifiers, const char *base_ref, const char *meta_ref, const char *filter);
char *database_table_schema(const char *table_name);
char *database_build_meta_ref(const char *schema, const char *table_name);
char *database_build_base_ref(const char *schema, const char *table_name);
// USED ONLY by SQLite Cloud to implement RLS
typedef struct cloudsync_pk_decode_bind_context cloudsync_pk_decode_bind_context;
typedef bool (*cloudsync_payload_apply_callback_t)(void **xdata, cloudsync_pk_decode_bind_context *decoded_change, void *db, void *data, int step, int rc);
void cloudsync_set_payload_apply_callback(void *db, cloudsync_payload_apply_callback_t callback);
cloudsync_payload_apply_callback_t cloudsync_get_payload_apply_callback(void *db);
#endif