#ifndef DB_OPS_H #define DB_OPS_H #include #include #include // Generic helpers int db_init(const char* connection_string); void db_close(void); int db_is_available(void); const char* db_last_error(void); const char* db_get_database_path(void); // Per-thread connection override (used by thread pool workers) int db_set_thread_connection(void* connection); void db_clear_thread_connection(void); // Worker/runtime SQLite connection lifecycle (kept internal to db_ops.c) int db_open_worker_connection(const char* db_path, void** out_connection); void db_close_worker_connection(void* connection); // DB result codes (backend-agnostic) #define DB_OK 0 #define DB_ERROR 1 #define DB_CONSTRAINT 19 #define DB_MISUSE 21 #define DB_ROW 100 #define DB_DONE 101 typedef struct db_stmt db_stmt_t; // Generic statement helpers (Phase 1 migration) int db_prepare(const char* sql, db_stmt_t** out_stmt); int db_bind_text_param(db_stmt_t* stmt, int index, const char* value); int db_bind_int_param(db_stmt_t* stmt, int index, int value); int db_bind_int64_param(db_stmt_t* stmt, int index, long long value); int db_step_stmt(db_stmt_t* stmt); int db_reset_stmt(db_stmt_t* stmt); const char* db_column_text_value(db_stmt_t* stmt, int col); int db_column_int_value(db_stmt_t* stmt, int col); long long db_column_int64_value(db_stmt_t* stmt, int col); double db_column_double_value(db_stmt_t* stmt, int col); void db_finalize_stmt(db_stmt_t* stmt); // Subscription logging int db_log_subscription_created(const char* sub_id, const char* wsi_ptr, const char* client_ip, const char* filter_json); int db_log_subscription_closed(const char* sub_id, const char* client_ip); int db_log_subscription_disconnected(const char* client_ip); int db_update_subscription_events_sent(const char* sub_id, int events_sent); int db_cleanup_orphaned_subscriptions(void); // NIP-09 event deletion helpers int db_get_event_pubkey(const char* event_id, char* pubkey_out, size_t pubkey_out_size); int db_delete_event_by_id(const char* event_id, const char* requester_pubkey); int db_delete_events_by_address(const char* pubkey, int kind, const char* d_tag, long before_timestamp); // Auth rule checks for request validator int db_is_pubkey_blacklisted(const char* pubkey); int db_is_hash_blacklisted(const char* resource_hash); int db_is_pubkey_whitelisted(const char* pubkey); int db_count_active_whitelist_rules(void); // Generic prepared COUNT helper int db_count_with_sql(const char* sql, const char** bind_params, int bind_param_count, int* out_count); char* db_execute_readonly_query_json(const char* query, const char* request_id, char* error_message, size_t error_size, int max_rows, int timeout_ms); // Monitoring/stat helpers (Phase 1 api.c migration) int db_get_total_event_count_ll(long long* out_count); int db_get_event_count_since(time_t cutoff, long long* out_count); cJSON* db_get_event_kind_distribution_rows(long long* out_total_events); cJSON* db_get_top_pubkeys_rows(int limit); cJSON* db_get_subscription_details_rows(void); // Config helpers cJSON* db_get_all_config_rows(void); char* db_get_config_value_dup(const char* key); int db_set_config_value_full(const char* key, const char* value, const char* data_type, const char* description, const char* category, int requires_restart); int db_update_config_value_only(const char* key, const char* value); int db_upsert_config_value(const char* key, const char* value, const char* data_type); int db_store_relay_private_key_hex(const char* relay_privkey_hex); char* db_get_relay_private_key_hex_dup(void); int db_store_config_event(const cJSON* event); // Event storage/timestamp/retrieval helpers int db_insert_event_with_json(const char* id, const char* pubkey, long long created_at, int kind, const char* event_type, const char* content, const char* sig, const char* tags_json, const char* event_json, int* out_step_rc, int* out_extended_errcode); int db_get_event_time_bounds(long long* out_min_created_at, long long* out_max_created_at); int db_event_id_exists(const char* event_id, int* out_exists); cJSON* db_retrieve_event_by_id(const char* event_id); char* db_get_latest_event_pubkey_for_kind_dup(int kind); // Config table helpers int db_get_config_row_count(int* out_count); // Event tag helpers int db_store_event_tags_cjson(const char* event_id, const cJSON* tags); int db_populate_event_tags_from_existing(void); // Auth/WoT rule helpers int db_add_auth_rule(const char* rule_type, const char* pattern_type, const char* pattern_value); int db_remove_auth_rule(const char* rule_type, const char* pattern_type, const char* pattern_value); int db_delete_wot_whitelist_rules(void); int db_count_wot_whitelist_rules(void); // Schema/DDL helpers int db_table_exists(const char* table_name, int* out_exists); char* db_get_schema_version_dup(void); int db_exec_sql(const char* sql); int db_wal_checkpoint_passive(void); int db_wal_checkpoint_truncate(void); #endif // DB_OPS_H