From b45aba4278249904321c521ec6cca3c9befacabb Mon Sep 17 00:00:00 2001 From: Rafa de la Torre Date: Thu, 12 Nov 2015 13:02:50 +0100 Subject: [PATCH] Config table and functions for server extension Pretty much as done in cartodb and client extensions. --- server/extension/expected/10_config_test.out | 21 +++++++++++ server/extension/expected/10_helper_test.out | 15 -------- server/extension/sql/0.0.1/10_config.sql | 38 ++++++++++++++++++++ server/extension/sql/0.0.1/10_helper.sql | 16 --------- server/extension/sql/10_config_test.sql | 8 +++++ server/extension/sql/10_helper_test.sql | 12 ------- 6 files changed, 67 insertions(+), 43 deletions(-) create mode 100644 server/extension/expected/10_config_test.out delete mode 100644 server/extension/expected/10_helper_test.out create mode 100644 server/extension/sql/0.0.1/10_config.sql delete mode 100644 server/extension/sql/0.0.1/10_helper.sql create mode 100644 server/extension/sql/10_config_test.sql delete mode 100644 server/extension/sql/10_helper_test.sql diff --git a/server/extension/expected/10_config_test.out b/server/extension/expected/10_config_test.out new file mode 100644 index 0000000..4129cbc --- /dev/null +++ b/server/extension/expected/10_config_test.out @@ -0,0 +1,21 @@ +-- Create a conf table +SELECT cdb_geocoder_server._config_set('cds', '{"Manolo Escobar": {"El Limonero":"En stock", "Viva el vino":"Sin stock"}}'); + _config_set +------------- + +(1 row) + +-- Test key retrieval +SELECT cdb_geocoder_server._config_get('cds'); + _config_get +---------------------------------------------------------------------------- + {"Manolo Escobar": {"El Limonero":"En stock", "Viva el vino":"Sin stock"}} +(1 row) + +-- Test returns NULL if key doesn't exist +SELECT cdb_geocoder_server._config_get('no existe'); + _config_get +------------- + +(1 row) + diff --git a/server/extension/expected/10_helper_test.out b/server/extension/expected/10_helper_test.out deleted file mode 100644 index 1314b51..0000000 --- a/server/extension/expected/10_helper_test.out +++ /dev/null @@ -1,15 +0,0 @@ --- Create a conf table -CREATE TABLE conf (key TEXT PRIMARY KEY, values_json TEXT NOT NULL); -INSERT INTO conf VALUES ('cds', '{"Manolo Escobar": {"El Limonero":"En stock", "Viva el vino":"Sin stock"}}'); --- Test key retrieval -SELECT cdb_geocoder_server._get_conf('cds'); - _get_conf ----------------------------------------------------------------------------- - {"Manolo Escobar": {"El Limonero":"En stock", "Viva el vino":"Sin stock"}} -(1 row) - --- Test no key exception -SELECT cdb_geocoder_server._get_conf('no existe'); -ERROR: Missing key 'no existe' in conf table --- Drop conf table -DROP TABLE conf; diff --git a/server/extension/sql/0.0.1/10_config.sql b/server/extension/sql/0.0.1/10_config.sql new file mode 100644 index 0000000..15d271b --- /dev/null +++ b/server/extension/sql/0.0.1/10_config.sql @@ -0,0 +1,38 @@ +-- +-- This extension has its own table for configurations. +-- +-- The table and the function are considered to be private and therefore +-- no permissions are granted for any other user but the creator/geocoder. + +CREATE TABLE IF NOT EXISTS cdb_geocoder_server._config ( KEY TEXT PRIMARY KEY, VALUE JSON NOT NULL ); + +-- Needed to dump config in backups +-- This can only be called from an SQL script executed by CREATE EXTENSION +SELECT pg_catalog.pg_extension_config_dump('cdb_geocoder_server._config', ''); + + +CREATE OR REPLACE FUNCTION cdb_geocoder_server._config_set(key text, value JSON) +RETURNS VOID AS $$ +BEGIN + PERFORM cdb_geocoder_server._config_remove(key); + EXECUTE 'INSERT INTO cdb_geocoder_server._config (KEY, VALUE) VALUES ($1, $2);' USING key, value; +END +$$ LANGUAGE PLPGSQL VOLATILE; + + +CREATE OR REPLACE FUNCTION cdb_geocoder_server._config_remove(key text) +RETURNS VOID AS $$ +BEGIN + EXECUTE 'DELETE FROM cdb_geocoder_server._config WHERE KEY = $1;' USING key; +END +$$ LANGUAGE PLPGSQL VOLATILE; + +CREATE OR REPLACE FUNCTION cdb_geocoder_server._config_get(key text) + RETURNS JSON AS $$ +DECLARE + value JSON; +BEGIN + EXECUTE 'SELECT VALUE FROM cdb_geocoder_server._config WHERE KEY = $1;' INTO value USING key; + RETURN value; +END +$$ LANGUAGE PLPGSQL STABLE; diff --git a/server/extension/sql/0.0.1/10_helper.sql b/server/extension/sql/0.0.1/10_helper.sql deleted file mode 100644 index 12415ff..0000000 --- a/server/extension/sql/0.0.1/10_helper.sql +++ /dev/null @@ -1,16 +0,0 @@ --- Get values_json for provided key from conf table -CREATE OR REPLACE FUNCTION cdb_geocoder_server._get_conf(_key TEXT) - RETURNS text -AS $$ -DECLARE - rec RECORD; -BEGIN - SELECT INTO rec values_json FROM conf WHERE conf.key = _key; - - IF NOT FOUND THEN - RAISE EXCEPTION 'Missing key ''%'' in conf table', _key; - END IF; - - RETURN rec.values_json; -END -$$ LANGUAGE plpgsql; diff --git a/server/extension/sql/10_config_test.sql b/server/extension/sql/10_config_test.sql new file mode 100644 index 0000000..1dd0dbc --- /dev/null +++ b/server/extension/sql/10_config_test.sql @@ -0,0 +1,8 @@ +-- Create a conf table +SELECT cdb_geocoder_server._config_set('cds', '{"Manolo Escobar": {"El Limonero":"En stock", "Viva el vino":"Sin stock"}}'); + +-- Test key retrieval +SELECT cdb_geocoder_server._config_get('cds'); + +-- Test returns NULL if key doesn't exist +SELECT cdb_geocoder_server._config_get('no existe'); diff --git a/server/extension/sql/10_helper_test.sql b/server/extension/sql/10_helper_test.sql deleted file mode 100644 index ce333f2..0000000 --- a/server/extension/sql/10_helper_test.sql +++ /dev/null @@ -1,12 +0,0 @@ --- Create a conf table -CREATE TABLE conf (key TEXT PRIMARY KEY, values_json TEXT NOT NULL); -INSERT INTO conf VALUES ('cds', '{"Manolo Escobar": {"El Limonero":"En stock", "Viva el vino":"Sin stock"}}'); - --- Test key retrieval -SELECT cdb_geocoder_server._get_conf('cds'); - --- Test no key exception -SELECT cdb_geocoder_server._get_conf('no existe'); - --- Drop conf table -DROP TABLE conf;