Skip to content

Commit edd4805

Browse files
committed
wip: add support for custom schema and default schema for cloudsync_init
- Allow schema-qualified inputs, e.g. cloudsync_init('public.users'). - Parse schema/table and propagate through query builders. - Always generate fully-qualified table names ("schema"."table"). - Apply schema-aware filters in information_schema queries. - Removes ambiguity regardless of search_path or duplicate table names across schemas. - Note: payload compatibility requires cloudsync_changes.tbl to remain unqualified; PG apply should resolve schema via cloudsync_table_settings (not search_path) when applying payloads. The unittest runs fine with this changes, but the merge tests fail. This code need to be fixed before being adopted
1 parent 3589f15 commit edd4805

File tree

8 files changed

+1030
-206
lines changed

8 files changed

+1030
-206
lines changed

src/cloudsync.c

Lines changed: 239 additions & 76 deletions
Large diffs are not rendered by default.

src/database.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ int64_t database_schema_version (cloudsync_context *data);
8282
uint64_t database_schema_hash (cloudsync_context *data);
8383
bool database_check_schema_hash (cloudsync_context *data, uint64_t hash);
8484
int database_update_schema_hash (cloudsync_context *data, uint64_t *hash);
85+
char *database_current_schema (cloudsync_context *data);
86+
char *database_default_schema (cloudsync_context *data);
8587

8688
int database_begin_savepoint (cloudsync_context *data, const char *savepoint_name);
8789
int database_commit_savepoint (cloudsync_context *data, const char *savepoint_name);
@@ -143,6 +145,11 @@ char *sql_build_insert_pk_ignore (cloudsync_context *data, const char *table_nam
143145
char *sql_build_upsert_pk_and_col (cloudsync_context *data, const char *table_name, const char *colname);
144146
char *sql_build_select_cols_by_pk (cloudsync_context *data, const char *table_name, const char *colname);
145147
char *sql_build_rekey_pk_and_reset_version_except_col (cloudsync_context *data, const char *table_name, const char *except_col);
148+
char *sql_build_tableinfo_list_nonpk_name_cid (cloudsync_context *data, const char *table_name, const char *schema);
149+
char *sql_build_delete_cols_not_in_schema_or_pkcol (cloudsync_context *data, const char *table_name, const char *schema, const char *tombstone);
150+
char *sql_build_pk_qualified_collist (cloudsync_context *data, const char *table_name, const char *schema);
151+
char *sql_build_pk_collist (cloudsync_context *data, const char *table_name, const char *schema);
152+
char *sql_build_pk_decode_selectlist (cloudsync_context *data, const char *table_name, const char *schema);
146153

147154
// USED ONLY by SQLite Cloud to implement RLS
148155
typedef struct cloudsync_pk_decode_bind_context cloudsync_pk_decode_bind_context;

src/dbutils.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include <stdlib.h>
99
#include <inttypes.h>
10+
#include <string.h>
1011

1112
#include "sql.h"
1213
#include "utils.h"
@@ -358,8 +359,28 @@ int dbutils_settings_table_load_callback (void *xdata, int ncols, char **values,
358359
if (strcmp(key, "algo")!=0) continue;
359360

360361
table_algo algo = cloudsync_algo_from_name(value);
361-
if (database_create_triggers(data, table_name, algo) != DBRES_OK) return DBRES_MISUSE;
362-
if (table_add_to_context(data, algo, table_name) == false) return DBRES_MISUSE;
362+
char schema[512];
363+
schema[0] = '\0';
364+
int schema_rc = dbutils_table_settings_get_value(data, table_name, "*", CLOUDSYNC_KEY_SCHEMA, schema, sizeof(schema));
365+
if (schema_rc != DBRES_OK || schema[0] == '\0') {
366+
char *current_schema = database_current_schema(data);
367+
if (current_schema && current_schema[0] != '\0') {
368+
strncpy(schema, current_schema, sizeof(schema) - 1);
369+
schema[sizeof(schema) - 1] = '\0';
370+
dbutils_table_settings_set_key_value(data, table_name, "*", CLOUDSYNC_KEY_SCHEMA, schema);
371+
}
372+
if (current_schema) cloudsync_memory_free(current_schema);
373+
}
374+
375+
const char *table_ref = table_name;
376+
char qualified[1024];
377+
if (schema[0] != '\0') {
378+
snprintf(qualified, sizeof(qualified), "%s.%s", schema, table_name);
379+
table_ref = qualified;
380+
}
381+
382+
if (database_create_triggers(data, table_ref, algo) != DBRES_OK) return DBRES_MISUSE;
383+
if (table_add_to_context(data, algo, table_ref) == false) return DBRES_MISUSE;
363384

364385
DEBUG_SETTINGS("load tbl_name: %s value: %s", key, value);
365386
}

src/dbutils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#define CLOUDSYNC_KEY_SEND_SEQ "send_seq"
2525
#define CLOUDSYNC_KEY_DEBUG "debug"
2626
#define CLOUDSYNC_KEY_ALGO "algo"
27+
#define CLOUDSYNC_KEY_SCHEMA "schema"
2728

2829
// settings
2930
int dbutils_settings_init (cloudsync_context *data);

0 commit comments

Comments
 (0)