From da7b3b70801bab0f3547bbc97ab8e99c2518d7e6 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 18 Feb 2015 17:08:46 +0100 Subject: [PATCH] Adds CDB_TableMetadataTouch function to be able to upsert updated_at value in cdb_tablemetadata --- scripts-available/CDB_TableMetadata.sql | 18 +++++++++++++++ test/extension/run_at_cartodb_schema.sql | 1 + test/extension/test.sh | 29 ++++++++++++++++++++++++ 3 files changed, 48 insertions(+) mode change 100644 => 100755 test/extension/test.sh diff --git a/scripts-available/CDB_TableMetadata.sql b/scripts-available/CDB_TableMetadata.sql index 745abd9..d91f798 100644 --- a/scripts-available/CDB_TableMetadata.sql +++ b/scripts-available/CDB_TableMetadata.sql @@ -118,3 +118,21 @@ CREATE TRIGGER table_modified AFTER INSERT OR UPDATE ON CDB_TableMetadata FOR EACH ROW EXECUTE PROCEDURE _CDB_TableMetadata_Updated(); + +-- similar to TOUCH(1) in unix filesystems but for table in cdb_tablemetadata +CREATE OR REPLACE FUNCTION public.CDB_TableMetadataTouch(tablename regclass) + RETURNS void AS + $$ + BEGIN + WITH upsert AS ( + UPDATE public.cdb_tablemetadata + SET updated_at = NOW() + WHERE tabname = tablename + RETURNING * + ) + INSERT INTO public.cdb_tablemetadata (tabname, updated_at) + SELECT tablename, NOW() + WHERE NOT EXISTS (SELECT * FROM upsert); + END; + $$ +LANGUAGE 'plpgsql' VOLATILE STRICT; diff --git a/test/extension/run_at_cartodb_schema.sql b/test/extension/run_at_cartodb_schema.sql index a443aab..c3792ff 100644 --- a/test/extension/run_at_cartodb_schema.sql +++ b/test/extension/run_at_cartodb_schema.sql @@ -1,3 +1,4 @@ SET SCHEMA 'cartodb'; \i scripts-available/CDB_Quota.sql +\i scripts-available/CDB_TableMetadata.sql SET SCHEMA 'public'; \ No newline at end of file diff --git a/test/extension/test.sh b/test/extension/test.sh old mode 100644 new mode 100755 index 1cfd515..6b46a58 --- a/test/extension/test.sh +++ b/test/extension/test.sh @@ -75,6 +75,15 @@ function sql() { set_failed fi fi + + if [[ "$3" == "should-not" ]] + then + if [[ "${RESULT}" == "$4" ]] + then + log_error "QUERY '${QUERY}' did not expect '${RESULT}'" + set_failed + fi + fi } @@ -277,6 +286,26 @@ function test_quota_for_each_user() { sql cdb_testmember_2 "SELECT cartodb.CDB_UserDataSize('cdb_testmember_2'::TEXT);" should 4096 } +function test_cdb_tablemetadatatouch() { + sql "CREATE TABLE touch_example (a int)" + sql postgres "SELECT updated_at FROM CDB_TableMetadata WHERE tabname = 'touch_example'::regclass;" should '' + sql "SELECT CDB_TableMetadataTouch('touch_example');" + sql postgres "SELECT updated_at FROM CDB_TableMetadata WHERE tabname = 'touch_example'::regclass;" should-not '' + + # Another call doesn't fail + sql "SELECT CDB_TableMetadataTouch('touch_example');" + sql postgres "SELECT updated_at FROM CDB_TableMetadata WHERE tabname = 'touch_example'::regclass;" should-not '' + + + + #### test tear down + sql 'DROP TABLE touch_example;' +} + +function test_cdb_tablemetadatatouch_fails_for_unexistent_table() { + sql postgres "SELECT CDB_TableMetadataTouch('unexistent_example');" fails +} + #################################################### TESTS END HERE #################################################### run_tests $@