forked from sqliteai/sqlite-sync
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcloudsync--1.0.sql
More file actions
308 lines (257 loc) · 9.82 KB
/
cloudsync--1.0.sql
File metadata and controls
308 lines (257 loc) · 9.82 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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
-- CloudSync Extension for PostgreSQL
-- Version 1.0
-- Complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION cloudsync" to load this file. \quit
-- ============================================================================
-- Public Functions
-- ============================================================================
-- Get extension version
CREATE OR REPLACE FUNCTION cloudsync_version()
RETURNS text
AS 'MODULE_PATHNAME', 'cloudsync_version'
LANGUAGE C IMMUTABLE STRICT;
-- Get site identifier (UUID)
CREATE OR REPLACE FUNCTION cloudsync_siteid()
RETURNS bytea
AS 'MODULE_PATHNAME', 'pg_cloudsync_siteid'
LANGUAGE C STABLE;
-- Generate a new UUID
CREATE OR REPLACE FUNCTION cloudsync_uuid()
RETURNS uuid
AS 'MODULE_PATHNAME', 'cloudsync_uuid'
LANGUAGE C VOLATILE;
-- Get current database version
CREATE OR REPLACE FUNCTION cloudsync_db_version()
RETURNS bigint
AS 'MODULE_PATHNAME', 'cloudsync_db_version'
LANGUAGE C STABLE;
-- Get next database version (with optional merging version)
CREATE OR REPLACE FUNCTION cloudsync_db_version_next()
RETURNS bigint
AS 'MODULE_PATHNAME', 'cloudsync_db_version_next'
LANGUAGE C VOLATILE;
CREATE OR REPLACE FUNCTION cloudsync_db_version_next(merging_version bigint)
RETURNS bigint
AS 'MODULE_PATHNAME', 'cloudsync_db_version_next'
LANGUAGE C VOLATILE;
-- Initialize CloudSync for a table (3 variants for 1-3 arguments)
-- Returns site_id as bytea
CREATE OR REPLACE FUNCTION cloudsync_init(table_name text)
RETURNS bytea
AS 'MODULE_PATHNAME', 'cloudsync_init'
LANGUAGE C VOLATILE;
CREATE OR REPLACE FUNCTION cloudsync_init(table_name text, algo text)
RETURNS bytea
AS 'MODULE_PATHNAME', 'cloudsync_init'
LANGUAGE C VOLATILE;
CREATE OR REPLACE FUNCTION cloudsync_init(table_name text, algo text, skip_int_pk_check boolean)
RETURNS bytea
AS 'MODULE_PATHNAME', 'cloudsync_init'
LANGUAGE C VOLATILE;
-- Enable sync for a table
CREATE OR REPLACE FUNCTION cloudsync_enable(table_name text)
RETURNS boolean
AS 'MODULE_PATHNAME', 'cloudsync_enable'
LANGUAGE C VOLATILE;
-- Disable sync for a table
CREATE OR REPLACE FUNCTION cloudsync_disable(table_name text)
RETURNS boolean
AS 'MODULE_PATHNAME', 'cloudsync_disable'
LANGUAGE C VOLATILE;
-- Check if table is sync-enabled
CREATE OR REPLACE FUNCTION cloudsync_is_enabled(table_name text)
RETURNS boolean
AS 'MODULE_PATHNAME', 'cloudsync_is_enabled'
LANGUAGE C STABLE;
-- Cleanup orphaned metadata for a table
CREATE OR REPLACE FUNCTION cloudsync_cleanup(table_name text)
RETURNS boolean
AS 'MODULE_PATHNAME', 'pg_cloudsync_cleanup'
LANGUAGE C VOLATILE;
-- Terminate CloudSync
CREATE OR REPLACE FUNCTION cloudsync_terminate()
RETURNS boolean
AS 'MODULE_PATHNAME', 'pg_cloudsync_terminate'
LANGUAGE C VOLATILE;
-- Set global configuration
CREATE OR REPLACE FUNCTION cloudsync_set(key text, value text)
RETURNS boolean
AS 'MODULE_PATHNAME', 'cloudsync_set'
LANGUAGE C VOLATILE;
-- Set table-level configuration
CREATE OR REPLACE FUNCTION cloudsync_set_table(table_name text, key text, value text)
RETURNS boolean
AS 'MODULE_PATHNAME', 'cloudsync_set_table'
LANGUAGE C VOLATILE;
-- Set row-level filter for conditional sync
CREATE OR REPLACE FUNCTION cloudsync_set_filter(table_name text, filter_expr text)
RETURNS boolean
AS 'MODULE_PATHNAME', 'cloudsync_set_filter'
LANGUAGE C VOLATILE;
-- Clear row-level filter
CREATE OR REPLACE FUNCTION cloudsync_clear_filter(table_name text)
RETURNS boolean
AS 'MODULE_PATHNAME', 'cloudsync_clear_filter'
LANGUAGE C VOLATILE;
-- Set column-level configuration
CREATE OR REPLACE FUNCTION cloudsync_set_column(table_name text, column_name text, key text, value text)
RETURNS boolean
AS 'MODULE_PATHNAME', 'cloudsync_set_column'
LANGUAGE C VOLATILE;
-- Begin schema alteration
CREATE OR REPLACE FUNCTION cloudsync_begin_alter(table_name text)
RETURNS boolean
AS 'MODULE_PATHNAME', 'pg_cloudsync_begin_alter'
LANGUAGE C VOLATILE;
-- Commit schema alteration
CREATE OR REPLACE FUNCTION cloudsync_commit_alter(table_name text)
RETURNS boolean
AS 'MODULE_PATHNAME', 'pg_cloudsync_commit_alter'
LANGUAGE C VOLATILE;
-- Payload encoding (aggregate function)
CREATE OR REPLACE FUNCTION cloudsync_payload_encode_transfn(state internal, tbl text, pk bytea, col_name text, col_value bytea, col_version bigint, db_version bigint, site_id bytea, cl bigint, seq bigint)
RETURNS internal
AS 'MODULE_PATHNAME', 'cloudsync_payload_encode_transfn'
LANGUAGE C;
CREATE OR REPLACE FUNCTION cloudsync_payload_encode_finalfn(state internal)
RETURNS bytea
AS 'MODULE_PATHNAME', 'cloudsync_payload_encode_finalfn'
LANGUAGE C;
CREATE OR REPLACE AGGREGATE cloudsync_payload_encode(text, bytea, text, bytea, bigint, bigint, bytea, bigint, bigint) (
SFUNC = cloudsync_payload_encode_transfn,
STYPE = internal,
FINALFUNC = cloudsync_payload_encode_finalfn
);
-- Payload decoding and application
CREATE OR REPLACE FUNCTION cloudsync_payload_decode(payload bytea)
RETURNS integer
AS 'MODULE_PATHNAME', 'cloudsync_payload_decode'
LANGUAGE C VOLATILE;
-- Alias for payload_decode
CREATE OR REPLACE FUNCTION cloudsync_payload_apply(payload bytea)
RETURNS integer
AS 'MODULE_PATHNAME', 'pg_cloudsync_payload_apply'
LANGUAGE C VOLATILE;
-- ============================================================================
-- Private/Internal Functions
-- ============================================================================
-- Check if table has sync metadata
CREATE OR REPLACE FUNCTION cloudsync_is_sync(table_name text)
RETURNS boolean
AS 'MODULE_PATHNAME', 'cloudsync_is_sync'
LANGUAGE C STABLE;
-- Internal insert handler (variadic for multiple PK columns)
CREATE OR REPLACE FUNCTION cloudsync_insert(table_name text, VARIADIC pk_values "any")
RETURNS boolean
AS 'MODULE_PATHNAME', 'cloudsync_insert'
LANGUAGE C VOLATILE;
-- Internal delete handler (variadic for multiple PK columns)
CREATE OR REPLACE FUNCTION cloudsync_delete(table_name text, VARIADIC pk_values "any")
RETURNS boolean
AS 'MODULE_PATHNAME', 'cloudsync_delete'
LANGUAGE C VOLATILE;
-- Internal update tracking (aggregate function)
CREATE OR REPLACE FUNCTION cloudsync_update_transfn(state internal, table_name text, new_value anyelement, old_value anyelement)
RETURNS internal
AS 'MODULE_PATHNAME', 'cloudsync_update_transfn'
LANGUAGE C;
CREATE OR REPLACE FUNCTION cloudsync_update_finalfn(state internal)
RETURNS boolean
AS 'MODULE_PATHNAME', 'cloudsync_update_finalfn'
LANGUAGE C;
CREATE AGGREGATE cloudsync_update(text, anyelement, anyelement) (
SFUNC = cloudsync_update_transfn,
STYPE = internal,
FINALFUNC = cloudsync_update_finalfn
);
-- Get sequence number
CREATE OR REPLACE FUNCTION cloudsync_seq()
RETURNS integer
AS 'MODULE_PATHNAME', 'cloudsync_seq'
LANGUAGE C VOLATILE;
-- Encode primary key (variadic for multiple columns)
CREATE OR REPLACE FUNCTION cloudsync_pk_encode(VARIADIC pk_values "any")
RETURNS bytea
AS 'MODULE_PATHNAME', 'cloudsync_pk_encode'
LANGUAGE C IMMUTABLE STRICT;
-- Decode primary key component
CREATE OR REPLACE FUNCTION cloudsync_pk_decode(encoded_pk bytea, index integer)
RETURNS text
AS 'MODULE_PATHNAME', 'cloudsync_pk_decode'
LANGUAGE C IMMUTABLE STRICT;
-- ============================================================================
-- Changes Functions
-- ============================================================================
CREATE OR REPLACE FUNCTION cloudsync_encode_value(anyelement)
RETURNS bytea
AS 'MODULE_PATHNAME', 'cloudsync_encode_value'
LANGUAGE C IMMUTABLE;
-- Encoded column value helper (PG): returns cloudsync-encoded bytea
CREATE OR REPLACE FUNCTION cloudsync_col_value(
table_name text,
col_name text,
pk bytea
)
RETURNS bytea
AS 'MODULE_PATHNAME', 'cloudsync_col_value'
LANGUAGE C STABLE;
-- SetReturningFunction: To implement SELECT FROM cloudsync_changes
CREATE FUNCTION cloudsync_changes_select(
min_db_version bigint DEFAULT 0,
filter_site_id bytea DEFAULT NULL
)
RETURNS TABLE (
tbl text,
pk bytea,
col_name text,
col_value bytea, -- pk_encoded value bytes
col_version bigint,
db_version bigint,
site_id bytea,
cl bigint,
seq bigint
)
AS 'MODULE_PATHNAME', 'cloudsync_changes_select'
LANGUAGE C STABLE;
-- View con lo stesso nome della vtab SQLite
CREATE OR REPLACE VIEW cloudsync_changes AS
SELECT * FROM cloudsync_changes_select(0, NULL);
-- Trigger function to implement INSERT on the cloudsync_changes view
CREATE FUNCTION cloudsync_changes_insert_trigger()
RETURNS trigger
AS 'MODULE_PATHNAME', 'cloudsync_changes_insert_trigger'
LANGUAGE C;
CREATE OR REPLACE TRIGGER cloudsync_changes_insert
INSTEAD OF INSERT ON cloudsync_changes
FOR EACH ROW
EXECUTE FUNCTION cloudsync_changes_insert_trigger();
-- Set current schema name
CREATE OR REPLACE FUNCTION cloudsync_set_schema(schema text)
RETURNS boolean
AS 'MODULE_PATHNAME', 'pg_cloudsync_set_schema'
LANGUAGE C VOLATILE;
-- Get current schema name (if any)
CREATE OR REPLACE FUNCTION cloudsync_schema()
RETURNS text
AS 'MODULE_PATHNAME', 'pg_cloudsync_schema'
LANGUAGE C VOLATILE;
-- Get current schema name (if any)
CREATE OR REPLACE FUNCTION cloudsync_table_schema(table_name text)
RETURNS text
AS 'MODULE_PATHNAME', 'pg_cloudsync_table_schema'
LANGUAGE C VOLATILE;
-- ============================================================================
-- Type Casts
-- ============================================================================
-- Cast function: converts bigint to boolean (0 = false, non-zero = true)
-- Required because BOOLEAN values are encoded as INT8 in sync payloads,
-- but PostgreSQL has no built-in cast from bigint to boolean.
CREATE FUNCTION cloudsync_int8_to_bool(bigint) RETURNS boolean AS $$
SELECT $1 <> 0
$$ LANGUAGE SQL IMMUTABLE STRICT;
-- ASSIGNMENT cast: auto-applies in INSERT/UPDATE context only
-- This enables BOOLEAN column sync where values are encoded as INT8.
-- Using ASSIGNMENT (not IMPLICIT) to avoid unintended conversions in WHERE clauses.
CREATE CAST (bigint AS boolean)
WITH FUNCTION cloudsync_int8_to_bool(bigint)
AS ASSIGNMENT;