From b4f4ac1d996a11ede33b9ebfabfe4dcabe72d31f Mon Sep 17 00:00:00 2001 From: Mario de Frutos Date: Wed, 20 Apr 2016 11:17:30 +0200 Subject: [PATCH 1/6] Removed the old versioning system --- client/.gitignore | 1 + client/Makefile | 8 +- .../interface_0.3.0.yaml => interface.yaml} | 0 .../renderer/interfaces/interface_0.0.1.yaml | 52 -------- .../renderer/interfaces/interface_0.1.0.yaml | 60 --------- .../renderer/interfaces/interface_0.2.0.yaml | 79 ------------ client/sql/0.0.1/10_geocoder_server_conn.sql | 16 --- client/sql/0.0.1/15_config_management.sql | 37 ------ client/sql/0.1.0/00_header.sql | 3 - client/sql/0.1.0/10_geocoder_server_conn.sql | 16 --- client/sql/0.1.0/15_config_management.sql | 37 ------ client/sql/0.1.0/80_permissions.sql | 9 -- client/sql/0.2.0/00_header.sql | 3 - client/sql/0.2.0/16_custom_types.sql | 5 - client/sql/0.2.0/80_permissions.sql | 9 -- client/sql/0.3.0/00_header.sql | 1 - client/sql/0.3.0/10_geocoder_server_conn.sql | 1 - client/sql/0.3.0/15_config_management.sql | 1 - client/sql/0.3.0/80_permissions.sql | 1 - client/sql/{0.0.1 => }/00_header.sql | 0 .../{0.2.0 => }/10_geocoder_server_conn.sql | 2 +- .../sql/{0.2.0 => }/15_config_management.sql | 2 +- client/sql/{0.3.0 => }/16_custom_types.sql | 0 client/sql/{0.0.1 => }/80_permissions.sql | 2 +- client/test/0.0.1/expected/10_admin0_test.out | 20 --- client/test/0.0.1/expected/20_admin1_test.out | 36 ------ .../0.0.1/expected/30_namedplaces_test.out | 52 -------- .../0.0.1/expected/40_postalcodes_test.out | 36 ------ .../0.0.1/expected/50_ipaddresses_test.out | 20 --- .../0.0.1/expected/90_permissions_test.out | 106 ---------------- client/test/0.0.1/sql/90_permissions_test.sql | 28 ----- .../0.1.0/expected/00_installation_test.out | 29 ----- client/test/0.1.0/expected/10_admin0_test.out | 20 --- client/test/0.1.0/expected/20_admin1_test.out | 36 ------ .../0.1.0/expected/30_namedplaces_test.out | 52 -------- .../0.1.0/expected/40_postalcodes_test.out | 36 ------ .../0.1.0/expected/50_ipaddresses_test.out | 20 --- client/test/0.1.0/expected/60_street_test.out | 101 --------------- .../0.1.0/expected/90_permissions_test.out | 117 ------------------ .../test/0.1.0/sql/00_installation_test.sql | 23 ---- client/test/0.1.0/sql/10_admin0_test.sql | 15 --- client/test/0.1.0/sql/20_admin1_test.sql | 24 ---- client/test/0.1.0/sql/30_namedplaces_test.sql | 33 ----- client/test/0.1.0/sql/40_postalcodes_test.sql | 23 ---- client/test/0.1.0/sql/50_ipaddresses_test.sql | 15 --- client/test/0.1.0/sql/90_permissions_test.sql | 30 ----- .../0.2.0/expected/00_installation_test.out | 29 ----- .../0.2.0/expected/90_permissions_test.out | 117 ------------------ .../test/0.2.0/sql/00_installation_test.sql | 23 ---- client/test/0.2.0/sql/10_admin0_test.sql | 15 --- client/test/0.2.0/sql/20_admin1_test.sql | 24 ---- client/test/0.2.0/sql/30_namedplaces_test.sql | 33 ----- client/test/0.2.0/sql/40_postalcodes_test.sql | 23 ---- client/test/0.2.0/sql/50_ipaddresses_test.sql | 15 --- client/test/0.2.0/sql/60_street_test.sql | 24 ---- client/test/0.2.0/sql/90_permissions_test.sql | 30 ----- .../0.3.0/expected/00_installation_test.out | 1 - client/test/0.3.0/expected/10_admin0_test.out | 1 - client/test/0.3.0/expected/20_admin1_test.out | 1 - .../0.3.0/expected/30_namedplaces_test.out | 1 - .../0.3.0/expected/40_postalcodes_test.out | 1 - .../0.3.0/expected/50_ipaddresses_test.out | 1 - client/test/0.3.0/expected/60_street_test.out | 1 - .../test/0.3.0/sql/00_installation_test.sql | 1 - client/test/0.3.0/sql/10_admin0_test.sql | 1 - client/test/0.3.0/sql/20_admin1_test.sql | 1 - client/test/0.3.0/sql/30_namedplaces_test.sql | 1 - client/test/0.3.0/sql/40_postalcodes_test.sql | 1 - client/test/0.3.0/sql/50_ipaddresses_test.sql | 1 - client/test/0.3.0/sql/60_street_test.sql | 1 - .../expected/00_installation_test.out | 0 .../{0.2.0 => }/expected/10_admin0_test.out | 0 .../{0.2.0 => }/expected/20_admin1_test.out | 0 .../expected/30_namedplaces_test.out | 0 .../expected/40_postalcodes_test.out | 0 .../expected/50_ipaddresses_test.out | 0 .../{0.2.0 => }/expected/60_street_test.out | 0 .../expected/80_route_point_to_point_test.out | 0 .../expected/90_permissions_test.out | 0 .../{0.0.1 => }/sql/00_installation_test.sql | 0 .../test/{0.0.1 => }/sql/10_admin0_test.sql | 0 .../test/{0.0.1 => }/sql/20_admin1_test.sql | 0 .../{0.0.1 => }/sql/30_namedplaces_test.sql | 0 .../{0.0.1 => }/sql/40_postalcodes_test.sql | 0 .../{0.0.1 => }/sql/50_ipaddresses_test.sql | 0 .../test/{0.1.0 => }/sql/60_street_test.sql | 0 .../sql/80_route_point_to_point_test.sql | 0 .../{0.3.0 => }/sql/90_permissions_test.sql | 0 88 files changed, 8 insertions(+), 1556 deletions(-) rename client/renderer/{interfaces/interface_0.3.0.yaml => interface.yaml} (100%) delete mode 100644 client/renderer/interfaces/interface_0.0.1.yaml delete mode 100644 client/renderer/interfaces/interface_0.1.0.yaml delete mode 100644 client/renderer/interfaces/interface_0.2.0.yaml delete mode 100644 client/sql/0.0.1/10_geocoder_server_conn.sql delete mode 100644 client/sql/0.0.1/15_config_management.sql delete mode 100644 client/sql/0.1.0/00_header.sql delete mode 100644 client/sql/0.1.0/10_geocoder_server_conn.sql delete mode 100644 client/sql/0.1.0/15_config_management.sql delete mode 100644 client/sql/0.1.0/80_permissions.sql delete mode 100644 client/sql/0.2.0/00_header.sql delete mode 100644 client/sql/0.2.0/16_custom_types.sql delete mode 100644 client/sql/0.2.0/80_permissions.sql delete mode 120000 client/sql/0.3.0/00_header.sql delete mode 120000 client/sql/0.3.0/10_geocoder_server_conn.sql delete mode 120000 client/sql/0.3.0/15_config_management.sql delete mode 120000 client/sql/0.3.0/80_permissions.sql rename client/sql/{0.0.1 => }/00_header.sql (100%) rename client/sql/{0.2.0 => }/10_geocoder_server_conn.sql (95%) rename client/sql/{0.2.0 => }/15_config_management.sql (97%) rename client/sql/{0.3.0 => }/16_custom_types.sql (100%) rename client/sql/{0.0.1 => }/80_permissions.sql (94%) delete mode 100644 client/test/0.0.1/expected/10_admin0_test.out delete mode 100644 client/test/0.0.1/expected/20_admin1_test.out delete mode 100644 client/test/0.0.1/expected/30_namedplaces_test.out delete mode 100644 client/test/0.0.1/expected/40_postalcodes_test.out delete mode 100644 client/test/0.0.1/expected/50_ipaddresses_test.out delete mode 100644 client/test/0.0.1/expected/90_permissions_test.out delete mode 100644 client/test/0.0.1/sql/90_permissions_test.sql delete mode 100644 client/test/0.1.0/expected/00_installation_test.out delete mode 100644 client/test/0.1.0/expected/10_admin0_test.out delete mode 100644 client/test/0.1.0/expected/20_admin1_test.out delete mode 100644 client/test/0.1.0/expected/30_namedplaces_test.out delete mode 100644 client/test/0.1.0/expected/40_postalcodes_test.out delete mode 100644 client/test/0.1.0/expected/50_ipaddresses_test.out delete mode 100644 client/test/0.1.0/expected/60_street_test.out delete mode 100644 client/test/0.1.0/expected/90_permissions_test.out delete mode 100644 client/test/0.1.0/sql/00_installation_test.sql delete mode 100644 client/test/0.1.0/sql/10_admin0_test.sql delete mode 100644 client/test/0.1.0/sql/20_admin1_test.sql delete mode 100644 client/test/0.1.0/sql/30_namedplaces_test.sql delete mode 100644 client/test/0.1.0/sql/40_postalcodes_test.sql delete mode 100644 client/test/0.1.0/sql/50_ipaddresses_test.sql delete mode 100644 client/test/0.1.0/sql/90_permissions_test.sql delete mode 100644 client/test/0.2.0/expected/00_installation_test.out delete mode 100644 client/test/0.2.0/expected/90_permissions_test.out delete mode 100644 client/test/0.2.0/sql/00_installation_test.sql delete mode 100644 client/test/0.2.0/sql/10_admin0_test.sql delete mode 100644 client/test/0.2.0/sql/20_admin1_test.sql delete mode 100644 client/test/0.2.0/sql/30_namedplaces_test.sql delete mode 100644 client/test/0.2.0/sql/40_postalcodes_test.sql delete mode 100644 client/test/0.2.0/sql/50_ipaddresses_test.sql delete mode 100644 client/test/0.2.0/sql/60_street_test.sql delete mode 100644 client/test/0.2.0/sql/90_permissions_test.sql delete mode 120000 client/test/0.3.0/expected/00_installation_test.out delete mode 120000 client/test/0.3.0/expected/10_admin0_test.out delete mode 120000 client/test/0.3.0/expected/20_admin1_test.out delete mode 120000 client/test/0.3.0/expected/30_namedplaces_test.out delete mode 120000 client/test/0.3.0/expected/40_postalcodes_test.out delete mode 120000 client/test/0.3.0/expected/50_ipaddresses_test.out delete mode 120000 client/test/0.3.0/expected/60_street_test.out delete mode 120000 client/test/0.3.0/sql/00_installation_test.sql delete mode 120000 client/test/0.3.0/sql/10_admin0_test.sql delete mode 120000 client/test/0.3.0/sql/20_admin1_test.sql delete mode 120000 client/test/0.3.0/sql/30_namedplaces_test.sql delete mode 120000 client/test/0.3.0/sql/40_postalcodes_test.sql delete mode 120000 client/test/0.3.0/sql/50_ipaddresses_test.sql delete mode 120000 client/test/0.3.0/sql/60_street_test.sql rename client/test/{0.0.1 => }/expected/00_installation_test.out (100%) rename client/test/{0.2.0 => }/expected/10_admin0_test.out (100%) rename client/test/{0.2.0 => }/expected/20_admin1_test.out (100%) rename client/test/{0.2.0 => }/expected/30_namedplaces_test.out (100%) rename client/test/{0.2.0 => }/expected/40_postalcodes_test.out (100%) rename client/test/{0.2.0 => }/expected/50_ipaddresses_test.out (100%) rename client/test/{0.2.0 => }/expected/60_street_test.out (100%) rename client/test/{0.3.0 => }/expected/80_route_point_to_point_test.out (100%) rename client/test/{0.3.0 => }/expected/90_permissions_test.out (100%) rename client/test/{0.0.1 => }/sql/00_installation_test.sql (100%) rename client/test/{0.0.1 => }/sql/10_admin0_test.sql (100%) rename client/test/{0.0.1 => }/sql/20_admin1_test.sql (100%) rename client/test/{0.0.1 => }/sql/30_namedplaces_test.sql (100%) rename client/test/{0.0.1 => }/sql/40_postalcodes_test.sql (100%) rename client/test/{0.0.1 => }/sql/50_ipaddresses_test.sql (100%) rename client/test/{0.1.0 => }/sql/60_street_test.sql (100%) rename client/test/{0.3.0 => }/sql/80_route_point_to_point_test.sql (100%) rename client/test/{0.3.0 => }/sql/90_permissions_test.sql (100%) diff --git a/client/.gitignore b/client/.gitignore index dece5cc..dff332e 100644 --- a/client/.gitignore +++ b/client/.gitignore @@ -7,3 +7,4 @@ regression.out cdb_geocoder_client--0.0.1.sql cdb_geocoder_client--0.1.0.sql cdb_geocoder_client--0.2.0.sql +cdb_geocoder_client--0.3.0.sql \ No newline at end of file diff --git a/client/Makefile b/client/Makefile index 074cd73..409c101 100644 --- a/client/Makefile +++ b/client/Makefile @@ -17,8 +17,8 @@ DATA = $(NEW_EXTENSION_ARTIFACT) \ cdb_dataservices_client--0.3.0--0.2.0.sql -REGRESS = $(notdir $(basename $(wildcard test/$(EXTVERSION)/sql/*test.sql))) -TEST_DIR = test/$(EXTVERSION) +REGRESS = $(notdir $(basename $(wildcard test/sql/*test.sql))) +TEST_DIR = test/ REGRESS_OPTS = --inputdir='$(TEST_DIR)' --outputdir='$(TEST_DIR)' # postgres build stuff @@ -26,11 +26,11 @@ PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) -SOURCES_DATA_DIR = sql/$(EXTVERSION) +SOURCES_DATA_DIR = sql/ # The interface definition is used along with some templates to automatically generate code RENDERER = renderer/sql-template-renderer -INTERFACE_FILE = renderer/interfaces/interface_$(EXTVERSION).yaml +INTERFACE_FILE = renderer/interface.yaml TEMPLATE_DIR = renderer/templates TEMPLATE_FILES = $(wildcard $(TEMPLATE_DIR)/*.erb) GENERATED_SQL_FILES = $(patsubst $(TEMPLATE_DIR)/%.erb, $(SOURCES_DATA_DIR)/%.sql, $(TEMPLATE_FILES)) diff --git a/client/renderer/interfaces/interface_0.3.0.yaml b/client/renderer/interface.yaml similarity index 100% rename from client/renderer/interfaces/interface_0.3.0.yaml rename to client/renderer/interface.yaml diff --git a/client/renderer/interfaces/interface_0.0.1.yaml b/client/renderer/interfaces/interface_0.0.1.yaml deleted file mode 100644 index 9f219fb..0000000 --- a/client/renderer/interfaces/interface_0.0.1.yaml +++ /dev/null @@ -1,52 +0,0 @@ ---- -- name: cdb_geocode_admin0_polygon - return_type: Geometry - params: - - { name: country_name, type: text } - -- name: cdb_geocode_admin1_polygon - return_type: Geometry - params: - - { name: admin1_name, type: text } - -- name: cdb_geocode_admin1_polygon - return_type: Geometry - params: - - { name: admin1_name, type: text } - - { name: country_name, type: text } - -- name: cdb_geocode_namedplace_point - return_type: Geometry - params: - - { name: city_name, type: text} - -- name: cdb_geocode_namedplace_point - return_type: Geometry - params: - - { name: city_name, type: text} - - { name: country_name, type: text} - -- name: cdb_geocode_namedplace_point - return_type: Geometry - params: - - { name: city_name, type: text} - - { name: admin1_name, type: text} - - { name: country_name, type: text} - - -- name: cdb_geocode_postalcode_polygon - return_type: Geometry - params: - - { name: postal_code, type: text} - - { name: country_name, type: text} - -- name: cdb_geocode_postalcode_point - return_type: Geometry - params: - - { name: postal_code, type: text} - - { name: country_name, type: text} - -- name: cdb_geocode_ipaddress_point - return_type: Geometry - params: - - { name: ip_address, type: text} \ No newline at end of file diff --git a/client/renderer/interfaces/interface_0.1.0.yaml b/client/renderer/interfaces/interface_0.1.0.yaml deleted file mode 100644 index e64c504..0000000 --- a/client/renderer/interfaces/interface_0.1.0.yaml +++ /dev/null @@ -1,60 +0,0 @@ ---- -- name: cdb_geocode_admin0_polygon - return_type: Geometry - params: - - { name: country_name, type: text } - -- name: cdb_geocode_admin1_polygon - return_type: Geometry - params: - - { name: admin1_name, type: text } - -- name: cdb_geocode_admin1_polygon - return_type: Geometry - params: - - { name: admin1_name, type: text } - - { name: country_name, type: text } - -- name: cdb_geocode_namedplace_point - return_type: Geometry - params: - - { name: city_name, type: text} - -- name: cdb_geocode_namedplace_point - return_type: Geometry - params: - - { name: city_name, type: text} - - { name: country_name, type: text} - -- name: cdb_geocode_namedplace_point - return_type: Geometry - params: - - { name: city_name, type: text} - - { name: admin1_name, type: text} - - { name: country_name, type: text} - - -- name: cdb_geocode_postalcode_polygon - return_type: Geometry - params: - - { name: postal_code, type: text} - - { name: country_name, type: text} - -- name: cdb_geocode_postalcode_point - return_type: Geometry - params: - - { name: postal_code, type: text} - - { name: country_name, type: text} - -- name: cdb_geocode_ipaddress_point - return_type: Geometry - params: - - { name: ip_address, type: text} - -- name: cdb_geocode_street_point - return_type: Geometry - params: - - { name: searchtext, type: text} - - { name: city, type: text, default: 'NULL'} - - { name: state_province, type: text, default: 'NULL'} - - { name: country, type: text, default: 'NULL'} diff --git a/client/renderer/interfaces/interface_0.2.0.yaml b/client/renderer/interfaces/interface_0.2.0.yaml deleted file mode 100644 index 71fe731..0000000 --- a/client/renderer/interfaces/interface_0.2.0.yaml +++ /dev/null @@ -1,79 +0,0 @@ ---- -- name: cdb_geocode_admin0_polygon - return_type: Geometry - params: - - { name: country_name, type: text } - -- name: cdb_geocode_admin1_polygon - return_type: Geometry - params: - - { name: admin1_name, type: text } - -- name: cdb_geocode_admin1_polygon - return_type: Geometry - params: - - { name: admin1_name, type: text } - - { name: country_name, type: text } - -- name: cdb_geocode_namedplace_point - return_type: Geometry - params: - - { name: city_name, type: text} - -- name: cdb_geocode_namedplace_point - return_type: Geometry - params: - - { name: city_name, type: text} - - { name: country_name, type: text} - -- name: cdb_geocode_namedplace_point - return_type: Geometry - params: - - { name: city_name, type: text} - - { name: admin1_name, type: text} - - { name: country_name, type: text} - - -- name: cdb_geocode_postalcode_polygon - return_type: Geometry - params: - - { name: postal_code, type: text} - - { name: country_name, type: text} - -- name: cdb_geocode_postalcode_point - return_type: Geometry - params: - - { name: postal_code, type: text} - - { name: country_name, type: text} - -- name: cdb_geocode_ipaddress_point - return_type: Geometry - params: - - { name: ip_address, type: text} - -- name: cdb_geocode_street_point - return_type: Geometry - params: - - { name: searchtext, type: text} - - { name: city, type: text, default: 'NULL'} - - { name: state_province, type: text, default: 'NULL'} - - { name: country, type: text, default: 'NULL'} - -- name: cdb_isodistance - return_type: SETOF cdb_dataservices_client.isoline - multi_row: true - params: - - { name: source, type: "geometry(Geometry, 4326)" } - - { name: mode, type: text } - - { name: range, type: "integer[]" } - - { name: options, type: "text[]", default: 'ARRAY[]::text[]' } - -- name: cdb_isochrone - return_type: SETOF cdb_dataservices_client.isoline - multi_row: true - params: - - { name: source, type: "geometry(Geometry, 4326)" } - - { name: mode, type: text } - - { name: range, type: "integer[]" } - - { name: options, type: "text[]", default: 'ARRAY[]::text[]' } - diff --git a/client/sql/0.0.1/10_geocoder_server_conn.sql b/client/sql/0.0.1/10_geocoder_server_conn.sql deleted file mode 100644 index 89cbcbd..0000000 --- a/client/sql/0.0.1/10_geocoder_server_conn.sql +++ /dev/null @@ -1,16 +0,0 @@ --- --- Geocoder server connection config --- --- The purpose of this function is provide to the PL/Proxy functions --- the connection string needed to connect with the server - -CREATE OR REPLACE FUNCTION cdb_dataservices_client._server_conn_str() -RETURNS text AS $$ -DECLARE - db_connection_str text; -BEGIN - SELECT cartodb.cdb_conf_getconf('geocoder_server_config')->'connection_str' INTO db_connection_str; - SELECT trim(both '"' FROM db_connection_str) INTO db_connection_str; - RETURN db_connection_str; -END; -$$ LANGUAGE 'plpgsql'; diff --git a/client/sql/0.0.1/15_config_management.sql b/client/sql/0.0.1/15_config_management.sql deleted file mode 100644 index 4d4187b..0000000 --- a/client/sql/0.0.1/15_config_management.sql +++ /dev/null @@ -1,37 +0,0 @@ -CREATE TYPE cdb_dataservices_client._entity_config AS ( - username text, - organization_name text -); - --- --- Get entity config function --- --- The purpose of this function is to retrieve the username and organization name from --- a) schema where he/her is the owner in case is an organization user --- b) entity_name from the cdb_conf database in case is a non organization user -CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_entity_config() -RETURNS record AS $$ -DECLARE - result cdb_dataservices_client._entity_config; - is_organization boolean; - username text; - organization_name text; -BEGIN - SELECT cartodb.cdb_conf_getconf('user_config')->'is_organization' INTO is_organization; - IF is_organization IS NULL THEN - RAISE EXCEPTION 'User must have user configuration in the config table'; - ELSIF is_organization = TRUE THEN - SELECT nspname - FROM pg_namespace s - LEFT JOIN pg_roles r ON s.nspowner = r.oid - WHERE r.rolname = session_user INTO username; - SELECT cartodb.cdb_conf_getconf('user_config')->'entity_name' INTO organization_name; - ELSE - SELECT cartodb.cdb_conf_getconf('user_config')->'entity_name' INTO username; - organization_name = NULL; - END IF; - result.username = username; - result.organization_name = organization_name; - RETURN result; -END; -$$ LANGUAGE 'plpgsql' SECURITY DEFINER; diff --git a/client/sql/0.1.0/00_header.sql b/client/sql/0.1.0/00_header.sql deleted file mode 100644 index 65eb4bf..0000000 --- a/client/sql/0.1.0/00_header.sql +++ /dev/null @@ -1,3 +0,0 @@ ---DO NOT MODIFY THIS FILE, IT IS GENERATED AUTOMATICALLY FROM SOURCES --- Complain if script is sourced in psql, rather than via CREATE EXTENSION -\echo Use "CREATE EXTENSION cdb_dataservices_client" to load this file. \quit diff --git a/client/sql/0.1.0/10_geocoder_server_conn.sql b/client/sql/0.1.0/10_geocoder_server_conn.sql deleted file mode 100644 index 89cbcbd..0000000 --- a/client/sql/0.1.0/10_geocoder_server_conn.sql +++ /dev/null @@ -1,16 +0,0 @@ --- --- Geocoder server connection config --- --- The purpose of this function is provide to the PL/Proxy functions --- the connection string needed to connect with the server - -CREATE OR REPLACE FUNCTION cdb_dataservices_client._server_conn_str() -RETURNS text AS $$ -DECLARE - db_connection_str text; -BEGIN - SELECT cartodb.cdb_conf_getconf('geocoder_server_config')->'connection_str' INTO db_connection_str; - SELECT trim(both '"' FROM db_connection_str) INTO db_connection_str; - RETURN db_connection_str; -END; -$$ LANGUAGE 'plpgsql'; diff --git a/client/sql/0.1.0/15_config_management.sql b/client/sql/0.1.0/15_config_management.sql deleted file mode 100644 index 7680cfd..0000000 --- a/client/sql/0.1.0/15_config_management.sql +++ /dev/null @@ -1,37 +0,0 @@ -CREATE TYPE cdb_dataservices_client._entity_config AS ( - username text, - organization_name text -); - --- --- Get entity config function --- --- The purpose of this function is to retrieve the username and organization name from --- a) schema where he/her is the owner in case is an organization user --- b) entity_name from the cdb_conf database in case is a non organization user -CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_entity_config() -RETURNS record AS $$ -DECLARE - result cdb_dataservices_client._entity_config; - is_organization boolean; - username text; - organization_name text; -BEGIN - SELECT cartodb.cdb_conf_getconf('user_config')->'is_organization' INTO is_organization; - IF is_organization IS NULL THEN - RAISE EXCEPTION 'User must have user configuration in the config table'; - ELSIF is_organization = TRUE THEN - SELECT nspname - FROM pg_namespace s - LEFT JOIN pg_roles r ON s.nspowner = r.oid - WHERE r.rolname = session_user INTO username; - SELECT cartodb.cdb_conf_getconf('user_config')->>'entity_name' INTO organization_name; - ELSE - SELECT cartodb.cdb_conf_getconf('user_config')->>'entity_name' INTO username; - organization_name = NULL; - END IF; - result.username = username; - result.organization_name = organization_name; - RETURN result; -END; -$$ LANGUAGE 'plpgsql' SECURITY DEFINER; diff --git a/client/sql/0.1.0/80_permissions.sql b/client/sql/0.1.0/80_permissions.sql deleted file mode 100644 index 4af1393..0000000 --- a/client/sql/0.1.0/80_permissions.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Make sure by default there are no permissions for publicuser --- NOTE: this happens at extension creation time, as part of an implicit transaction. -REVOKE ALL PRIVILEGES ON SCHEMA cdb_dataservices_client FROM PUBLIC, publicuser CASCADE; - --- Grant permissions on the schema to publicuser (but just the schema) -GRANT USAGE ON SCHEMA cdb_dataservices_client TO publicuser; - --- Revoke execute permissions on all functions in the schema by default -REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA cdb_dataservices_client FROM PUBLIC, publicuser; diff --git a/client/sql/0.2.0/00_header.sql b/client/sql/0.2.0/00_header.sql deleted file mode 100644 index 65eb4bf..0000000 --- a/client/sql/0.2.0/00_header.sql +++ /dev/null @@ -1,3 +0,0 @@ ---DO NOT MODIFY THIS FILE, IT IS GENERATED AUTOMATICALLY FROM SOURCES --- Complain if script is sourced in psql, rather than via CREATE EXTENSION -\echo Use "CREATE EXTENSION cdb_dataservices_client" to load this file. \quit diff --git a/client/sql/0.2.0/16_custom_types.sql b/client/sql/0.2.0/16_custom_types.sql deleted file mode 100644 index 5b37dde..0000000 --- a/client/sql/0.2.0/16_custom_types.sql +++ /dev/null @@ -1,5 +0,0 @@ -CREATE TYPE cdb_dataservices_client.isoline AS ( - center geometry(Geometry,4326), - data_range integer, - the_geom geometry(Multipolygon,4326) -); \ No newline at end of file diff --git a/client/sql/0.2.0/80_permissions.sql b/client/sql/0.2.0/80_permissions.sql deleted file mode 100644 index 4af1393..0000000 --- a/client/sql/0.2.0/80_permissions.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Make sure by default there are no permissions for publicuser --- NOTE: this happens at extension creation time, as part of an implicit transaction. -REVOKE ALL PRIVILEGES ON SCHEMA cdb_dataservices_client FROM PUBLIC, publicuser CASCADE; - --- Grant permissions on the schema to publicuser (but just the schema) -GRANT USAGE ON SCHEMA cdb_dataservices_client TO publicuser; - --- Revoke execute permissions on all functions in the schema by default -REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA cdb_dataservices_client FROM PUBLIC, publicuser; diff --git a/client/sql/0.3.0/00_header.sql b/client/sql/0.3.0/00_header.sql deleted file mode 120000 index 2277a52..0000000 --- a/client/sql/0.3.0/00_header.sql +++ /dev/null @@ -1 +0,0 @@ -../0.2.0/00_header.sql \ No newline at end of file diff --git a/client/sql/0.3.0/10_geocoder_server_conn.sql b/client/sql/0.3.0/10_geocoder_server_conn.sql deleted file mode 120000 index dcd6ff0..0000000 --- a/client/sql/0.3.0/10_geocoder_server_conn.sql +++ /dev/null @@ -1 +0,0 @@ -../0.2.0/10_geocoder_server_conn.sql \ No newline at end of file diff --git a/client/sql/0.3.0/15_config_management.sql b/client/sql/0.3.0/15_config_management.sql deleted file mode 120000 index c517070..0000000 --- a/client/sql/0.3.0/15_config_management.sql +++ /dev/null @@ -1 +0,0 @@ -../0.2.0/15_config_management.sql \ No newline at end of file diff --git a/client/sql/0.3.0/80_permissions.sql b/client/sql/0.3.0/80_permissions.sql deleted file mode 120000 index 359eb6a..0000000 --- a/client/sql/0.3.0/80_permissions.sql +++ /dev/null @@ -1 +0,0 @@ -../0.2.0/80_permissions.sql \ No newline at end of file diff --git a/client/sql/0.0.1/00_header.sql b/client/sql/00_header.sql similarity index 100% rename from client/sql/0.0.1/00_header.sql rename to client/sql/00_header.sql diff --git a/client/sql/0.2.0/10_geocoder_server_conn.sql b/client/sql/10_geocoder_server_conn.sql similarity index 95% rename from client/sql/0.2.0/10_geocoder_server_conn.sql rename to client/sql/10_geocoder_server_conn.sql index 89cbcbd..d180ab6 100644 --- a/client/sql/0.2.0/10_geocoder_server_conn.sql +++ b/client/sql/10_geocoder_server_conn.sql @@ -13,4 +13,4 @@ BEGIN SELECT trim(both '"' FROM db_connection_str) INTO db_connection_str; RETURN db_connection_str; END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql'; \ No newline at end of file diff --git a/client/sql/0.2.0/15_config_management.sql b/client/sql/15_config_management.sql similarity index 97% rename from client/sql/0.2.0/15_config_management.sql rename to client/sql/15_config_management.sql index 7680cfd..6a27cf6 100644 --- a/client/sql/0.2.0/15_config_management.sql +++ b/client/sql/15_config_management.sql @@ -34,4 +34,4 @@ BEGIN result.organization_name = organization_name; RETURN result; END; -$$ LANGUAGE 'plpgsql' SECURITY DEFINER; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; \ No newline at end of file diff --git a/client/sql/0.3.0/16_custom_types.sql b/client/sql/16_custom_types.sql similarity index 100% rename from client/sql/0.3.0/16_custom_types.sql rename to client/sql/16_custom_types.sql diff --git a/client/sql/0.0.1/80_permissions.sql b/client/sql/80_permissions.sql similarity index 94% rename from client/sql/0.0.1/80_permissions.sql rename to client/sql/80_permissions.sql index 4af1393..0020ad0 100644 --- a/client/sql/0.0.1/80_permissions.sql +++ b/client/sql/80_permissions.sql @@ -6,4 +6,4 @@ REVOKE ALL PRIVILEGES ON SCHEMA cdb_dataservices_client FROM PUBLIC, publicuser GRANT USAGE ON SCHEMA cdb_dataservices_client TO publicuser; -- Revoke execute permissions on all functions in the schema by default -REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA cdb_dataservices_client FROM PUBLIC, publicuser; +REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA cdb_dataservices_client FROM PUBLIC, publicuser; \ No newline at end of file diff --git a/client/test/0.0.1/expected/10_admin0_test.out b/client/test/0.0.1/expected/10_admin0_test.out deleted file mode 100644 index 178584c..0000000 --- a/client/test/0.0.1/expected/10_admin0_test.out +++ /dev/null @@ -1,20 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; --- Mock the server function -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_admin0_polygon(username text, orgname text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_admin0_polygon invoked with params (%, %, %)', username, orgname, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; --- Exercise the public and the proxied function -SELECT cdb_geocode_admin0_polygon('Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_admin0_polygon(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_admin0_polygon invoked with params ("test_user", , Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_admin0_polygon(username, orgname, country_name)" -PL/pgSQL function cdb_geocode_admin0_polygon(text) line 15 at SQL statement - cdb_geocode_admin0_polygon ----------------------------- - -(1 row) - diff --git a/client/test/0.0.1/expected/20_admin1_test.out b/client/test/0.0.1/expected/20_admin1_test.out deleted file mode 100644 index 647643b..0000000 --- a/client/test/0.0.1/expected/20_admin1_test.out +++ /dev/null @@ -1,36 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_admin1_polygon(username text, orgname text, admin1_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params (%, %, %)', username, orgname, admin1_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_admin1_polygon(username text, orgname text, admin1_name text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params (%, %, %, %)', username, orgname, admin1_name, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; --- Exercise the public and the proxied function -SELECT cdb_geocode_admin1_polygon('California'); -NOTICE: cdb_dataservices_client._cdb_geocode_admin1_polygon(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params ("test_user", , California) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_admin1_polygon(username, orgname, admin1_name)" -PL/pgSQL function cdb_geocode_admin1_polygon(text) line 15 at SQL statement - cdb_geocode_admin1_polygon ----------------------------- - -(1 row) - -SELECT cdb_geocode_admin1_polygon('California', 'United States'); -NOTICE: cdb_dataservices_client._cdb_geocode_admin1_polygon(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params ("test_user", , California, United States) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_admin1_polygon(username, orgname, admin1_name, country_name)" -PL/pgSQL function cdb_geocode_admin1_polygon(text,text) line 15 at SQL statement - cdb_geocode_admin1_polygon ----------------------------- - -(1 row) - diff --git a/client/test/0.0.1/expected/30_namedplaces_test.out b/client/test/0.0.1/expected/30_namedplaces_test.out deleted file mode 100644 index b04faf2..0000000 --- a/client/test/0.0.1/expected/30_namedplaces_test.out +++ /dev/null @@ -1,52 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_namedplace_point(username text, orgname text, city_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (%, %, %)', username, orgname, city_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_namedplace_point(username text, orgname text, city_name text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (%, %, %, %)', username, orgname, city_name, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_namedplace_point(username text, orgname text, city_name text, admin1_name text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (%, %, %, %, %)', username, orgname, city_name, admin1_name, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; --- Exercise the public and the proxied function -SELECT cdb_geocode_namedplace_point('Elx'); -NOTICE: cdb_dataservices_client._cdb_geocode_namedplace_point(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params ("test_user", , Elx) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name)" -PL/pgSQL function cdb_geocode_namedplace_point(text) line 15 at SQL statement - cdb_geocode_namedplace_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_namedplace_point('Elx', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_namedplace_point(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params ("test_user", , Elx, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name, country_name)" -PL/pgSQL function cdb_geocode_namedplace_point(text,text) line 15 at SQL statement - cdb_geocode_namedplace_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_namedplace_point(5): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params ("test_user", , Elx, Valencia, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name, admin1_name, country_name)" -PL/pgSQL function cdb_geocode_namedplace_point(text,text,text) line 15 at SQL statement - cdb_geocode_namedplace_point ------------------------------- - -(1 row) - diff --git a/client/test/0.0.1/expected/40_postalcodes_test.out b/client/test/0.0.1/expected/40_postalcodes_test.out deleted file mode 100644 index a5a1d73..0000000 --- a/client/test/0.0.1/expected/40_postalcodes_test.out +++ /dev/null @@ -1,36 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_postalcode_polygon(username text, orgname text, postal_code text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_postalcode_polygon invoked with params (%, %, %, %)', username, orgname, postal_code, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_postalcode_point(username text, orgname text, postal_code text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_postalcode_point invoked with params (%, %, %, %)', username, orgname, postal_code, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; --- Exercise the public and the proxied function -SELECT cdb_geocode_postalcode_polygon('03204', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_postalcode_polygon(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_postalcode_polygon invoked with params ("test_user", , 03204, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_postalcode_polygon(username, orgname, postal_code, country_name)" -PL/pgSQL function cdb_geocode_postalcode_polygon(text,text) line 15 at SQL statement - cdb_geocode_postalcode_polygon --------------------------------- - -(1 row) - -SELECT cdb_geocode_postalcode_point('03204', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_postalcode_point(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_postalcode_point invoked with params ("test_user", , 03204, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_postalcode_point(username, orgname, postal_code, country_name)" -PL/pgSQL function cdb_geocode_postalcode_point(text,text) line 15 at SQL statement - cdb_geocode_postalcode_point ------------------------------- - -(1 row) - diff --git a/client/test/0.0.1/expected/50_ipaddresses_test.out b/client/test/0.0.1/expected/50_ipaddresses_test.out deleted file mode 100644 index ad8cb8a..0000000 --- a/client/test/0.0.1/expected/50_ipaddresses_test.out +++ /dev/null @@ -1,20 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_ipaddress_point(username text, orgname text, ip_address text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_ipaddress_point invoked with params (%, %, %)', username, orgname, ip_address; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; --- Exercise the public and the proxied function -SELECT cdb_geocode_ipaddress_point('8.8.8.8'); -NOTICE: cdb_dataservices_client._cdb_geocode_ipaddress_point(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_ipaddress_point invoked with params ("test_user", , 8.8.8.8) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_ipaddress_point(username, orgname, ip_address)" -PL/pgSQL function cdb_geocode_ipaddress_point(text) line 15 at SQL statement - cdb_geocode_ipaddress_point ------------------------------ - -(1 row) - diff --git a/client/test/0.0.1/expected/90_permissions_test.out b/client/test/0.0.1/expected/90_permissions_test.out deleted file mode 100644 index 3ed5347..0000000 --- a/client/test/0.0.1/expected/90_permissions_test.out +++ /dev/null @@ -1,106 +0,0 @@ --- Use regular user role -SET ROLE test_regular_user; --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; --- Exercise the public function --- it is public, it shall work -SELECT cdb_geocode_admin0_polygon('Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_admin0_polygon(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_admin0_polygon invoked with params ("test_user", , Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_admin0_polygon(username, orgname, country_name)" -PL/pgSQL function cdb_geocode_admin0_polygon(text) line 15 at SQL statement - cdb_geocode_admin0_polygon ----------------------------- - -(1 row) - -SELECT cdb_geocode_admin1_polygon('California'); -NOTICE: cdb_dataservices_client._cdb_geocode_admin1_polygon(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params ("test_user", , California) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_admin1_polygon(username, orgname, admin1_name)" -PL/pgSQL function cdb_geocode_admin1_polygon(text) line 15 at SQL statement - cdb_geocode_admin1_polygon ----------------------------- - -(1 row) - -SELECT cdb_geocode_admin1_polygon('California', 'United States'); -NOTICE: cdb_dataservices_client._cdb_geocode_admin1_polygon(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params ("test_user", , California, United States) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_admin1_polygon(username, orgname, admin1_name, country_name)" -PL/pgSQL function cdb_geocode_admin1_polygon(text,text) line 15 at SQL statement - cdb_geocode_admin1_polygon ----------------------------- - -(1 row) - -SELECT cdb_geocode_namedplace_point('Elx'); -NOTICE: cdb_dataservices_client._cdb_geocode_namedplace_point(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params ("test_user", , Elx) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name)" -PL/pgSQL function cdb_geocode_namedplace_point(text) line 15 at SQL statement - cdb_geocode_namedplace_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia'); -NOTICE: cdb_dataservices_client._cdb_geocode_namedplace_point(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params ("test_user", , Elx, Valencia) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name, country_name)" -PL/pgSQL function cdb_geocode_namedplace_point(text,text) line 15 at SQL statement - cdb_geocode_namedplace_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_namedplace_point(5): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params ("test_user", , Elx, Valencia, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name, admin1_name, country_name)" -PL/pgSQL function cdb_geocode_namedplace_point(text,text,text) line 15 at SQL statement - cdb_geocode_namedplace_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_postalcode_polygon('03204', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_postalcode_polygon(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_postalcode_polygon invoked with params ("test_user", , 03204, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_postalcode_polygon(username, orgname, postal_code, country_name)" -PL/pgSQL function cdb_geocode_postalcode_polygon(text,text) line 15 at SQL statement - cdb_geocode_postalcode_polygon --------------------------------- - -(1 row) - -SELECT cdb_geocode_postalcode_point('03204', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_postalcode_point(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_postalcode_point invoked with params ("test_user", , 03204, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_postalcode_point(username, orgname, postal_code, country_name)" -PL/pgSQL function cdb_geocode_postalcode_point(text,text) line 15 at SQL statement - cdb_geocode_postalcode_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_ipaddress_point('8.8.8.8'); -NOTICE: cdb_dataservices_client._cdb_geocode_ipaddress_point(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_ipaddress_point invoked with params ("test_user", , 8.8.8.8) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_ipaddress_point(username, orgname, ip_address)" -PL/pgSQL function cdb_geocode_ipaddress_point(text) line 15 at SQL statement - cdb_geocode_ipaddress_point ------------------------------ - -(1 row) - --- Check the regular user has no permissions on private functions -SELECT _cdb_geocode_admin0_polygon('evil_user', 'evil_orgname', 'Hell'); -ERROR: permission denied for function _cdb_geocode_admin0_polygon -SELECT _cdb_geocode_admin1_polygon('evil_user', 'evil_orgname', 'Hell'); -ERROR: permission denied for function _cdb_geocode_admin1_polygon -SELECT _cdb_geocode_admin1_polygon('evil_user', 'evil_orgname', 'Sheol', 'Hell'); -ERROR: permission denied for function _cdb_geocode_admin1_polygon -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol'); -ERROR: permission denied for function _cdb_geocode_namedplace_point -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol', 'Hell'); -ERROR: permission denied for function _cdb_geocode_namedplace_point -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol', 'Hell', 'Ugly world'); -ERROR: permission denied for function _cdb_geocode_namedplace_point -SELECT _cdb_geocode_postalcode_polygon('evil_user', 'evil_orgname', '66666', 'Hell'); -ERROR: permission denied for function _cdb_geocode_postalcode_polygon -SELECT _cdb_geocode_postalcode_point('evil_user', 'evil_orgname', '66666', 'Hell'); -ERROR: permission denied for function _cdb_geocode_postalcode_point -SELECT _cdb_geocode_ipaddress_point('evil_user', 'evil_orgname', '8.8.8.8'); -ERROR: permission denied for function _cdb_geocode_ipaddress_point diff --git a/client/test/0.0.1/sql/90_permissions_test.sql b/client/test/0.0.1/sql/90_permissions_test.sql deleted file mode 100644 index 7fbd2a0..0000000 --- a/client/test/0.0.1/sql/90_permissions_test.sql +++ /dev/null @@ -1,28 +0,0 @@ --- Use regular user role -SET ROLE test_regular_user; - --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; - --- Exercise the public function --- it is public, it shall work -SELECT cdb_geocode_admin0_polygon('Spain'); -SELECT cdb_geocode_admin1_polygon('California'); -SELECT cdb_geocode_admin1_polygon('California', 'United States'); -SELECT cdb_geocode_namedplace_point('Elx'); -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia'); -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia', 'Spain'); -SELECT cdb_geocode_postalcode_polygon('03204', 'Spain'); -SELECT cdb_geocode_postalcode_point('03204', 'Spain'); -SELECT cdb_geocode_ipaddress_point('8.8.8.8'); - --- Check the regular user has no permissions on private functions -SELECT _cdb_geocode_admin0_polygon('evil_user', 'evil_orgname', 'Hell'); -SELECT _cdb_geocode_admin1_polygon('evil_user', 'evil_orgname', 'Hell'); -SELECT _cdb_geocode_admin1_polygon('evil_user', 'evil_orgname', 'Sheol', 'Hell'); -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol'); -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol', 'Hell'); -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol', 'Hell', 'Ugly world'); -SELECT _cdb_geocode_postalcode_polygon('evil_user', 'evil_orgname', '66666', 'Hell'); -SELECT _cdb_geocode_postalcode_point('evil_user', 'evil_orgname', '66666', 'Hell'); -SELECT _cdb_geocode_ipaddress_point('evil_user', 'evil_orgname', '8.8.8.8'); diff --git a/client/test/0.1.0/expected/00_installation_test.out b/client/test/0.1.0/expected/00_installation_test.out deleted file mode 100644 index 8c6f98d..0000000 --- a/client/test/0.1.0/expected/00_installation_test.out +++ /dev/null @@ -1,29 +0,0 @@ --- Install dependencies -CREATE EXTENSION postgis; -CREATE EXTENSION schema_triggers; -CREATE EXTENSION plpythonu; -CREATE EXTENSION cartodb; -CREATE EXTENSION plproxy; --- Install the extension -CREATE EXTENSION cdb_dataservices_client; --- Mock the server connection to point to this very test db -SELECT cartodb.cdb_conf_setconf('geocoder_server_config', '{"connection_str": "dbname=contrib_regression host=127.0.0.1 user=postgres"}'); - cdb_conf_setconf ------------------- - -(1 row) - --- Mock the user configuration -SELECT cartodb.cdb_conf_setconf('user_config', '{"is_organization": false, "entity_name": "test_user"}'); - cdb_conf_setconf ------------------- - -(1 row) - --- Mock the server schema -CREATE SCHEMA cdb_dataservices_server; --- Create a test user to check permissions -DROP ROLE IF EXISTS test_regular_user; -CREATE ROLE test_regular_user; -GRANT publicuser TO test_regular_user; -ALTER ROLE test_regular_user SET search_path TO public,cartodb,cdb_dataservices_client; diff --git a/client/test/0.1.0/expected/10_admin0_test.out b/client/test/0.1.0/expected/10_admin0_test.out deleted file mode 100644 index 98fa0db..0000000 --- a/client/test/0.1.0/expected/10_admin0_test.out +++ /dev/null @@ -1,20 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; --- Mock the server function -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_admin0_polygon(username text, orgname text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_admin0_polygon invoked with params (%, %, %)', username, orgname, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; --- Exercise the public and the proxied function -SELECT cdb_geocode_admin0_polygon('Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_admin0_polygon(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_admin0_polygon invoked with params (test_user, , Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_admin0_polygon(username, orgname, country_name)" -PL/pgSQL function cdb_geocode_admin0_polygon(text) line 15 at SQL statement - cdb_geocode_admin0_polygon ----------------------------- - -(1 row) - diff --git a/client/test/0.1.0/expected/20_admin1_test.out b/client/test/0.1.0/expected/20_admin1_test.out deleted file mode 100644 index 36486b5..0000000 --- a/client/test/0.1.0/expected/20_admin1_test.out +++ /dev/null @@ -1,36 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_admin1_polygon(username text, orgname text, admin1_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params (%, %, %)', username, orgname, admin1_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_admin1_polygon(username text, orgname text, admin1_name text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params (%, %, %, %)', username, orgname, admin1_name, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; --- Exercise the public and the proxied function -SELECT cdb_geocode_admin1_polygon('California'); -NOTICE: cdb_dataservices_client._cdb_geocode_admin1_polygon(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params (test_user, , California) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_admin1_polygon(username, orgname, admin1_name)" -PL/pgSQL function cdb_geocode_admin1_polygon(text) line 15 at SQL statement - cdb_geocode_admin1_polygon ----------------------------- - -(1 row) - -SELECT cdb_geocode_admin1_polygon('California', 'United States'); -NOTICE: cdb_dataservices_client._cdb_geocode_admin1_polygon(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params (test_user, , California, United States) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_admin1_polygon(username, orgname, admin1_name, country_name)" -PL/pgSQL function cdb_geocode_admin1_polygon(text,text) line 15 at SQL statement - cdb_geocode_admin1_polygon ----------------------------- - -(1 row) - diff --git a/client/test/0.1.0/expected/30_namedplaces_test.out b/client/test/0.1.0/expected/30_namedplaces_test.out deleted file mode 100644 index c5db519..0000000 --- a/client/test/0.1.0/expected/30_namedplaces_test.out +++ /dev/null @@ -1,52 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_namedplace_point(username text, orgname text, city_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (%, %, %)', username, orgname, city_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_namedplace_point(username text, orgname text, city_name text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (%, %, %, %)', username, orgname, city_name, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_namedplace_point(username text, orgname text, city_name text, admin1_name text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (%, %, %, %, %)', username, orgname, city_name, admin1_name, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; --- Exercise the public and the proxied function -SELECT cdb_geocode_namedplace_point('Elx'); -NOTICE: cdb_dataservices_client._cdb_geocode_namedplace_point(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (test_user, , Elx) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name)" -PL/pgSQL function cdb_geocode_namedplace_point(text) line 15 at SQL statement - cdb_geocode_namedplace_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_namedplace_point('Elx', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_namedplace_point(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (test_user, , Elx, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name, country_name)" -PL/pgSQL function cdb_geocode_namedplace_point(text,text) line 15 at SQL statement - cdb_geocode_namedplace_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_namedplace_point(5): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (test_user, , Elx, Valencia, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name, admin1_name, country_name)" -PL/pgSQL function cdb_geocode_namedplace_point(text,text,text) line 15 at SQL statement - cdb_geocode_namedplace_point ------------------------------- - -(1 row) - diff --git a/client/test/0.1.0/expected/40_postalcodes_test.out b/client/test/0.1.0/expected/40_postalcodes_test.out deleted file mode 100644 index fae53ec..0000000 --- a/client/test/0.1.0/expected/40_postalcodes_test.out +++ /dev/null @@ -1,36 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_postalcode_polygon(username text, orgname text, postal_code text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_postalcode_polygon invoked with params (%, %, %, %)', username, orgname, postal_code, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_postalcode_point(username text, orgname text, postal_code text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_postalcode_point invoked with params (%, %, %, %)', username, orgname, postal_code, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; --- Exercise the public and the proxied function -SELECT cdb_geocode_postalcode_polygon('03204', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_postalcode_polygon(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_postalcode_polygon invoked with params (test_user, , 03204, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_postalcode_polygon(username, orgname, postal_code, country_name)" -PL/pgSQL function cdb_geocode_postalcode_polygon(text,text) line 15 at SQL statement - cdb_geocode_postalcode_polygon --------------------------------- - -(1 row) - -SELECT cdb_geocode_postalcode_point('03204', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_postalcode_point(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_postalcode_point invoked with params (test_user, , 03204, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_postalcode_point(username, orgname, postal_code, country_name)" -PL/pgSQL function cdb_geocode_postalcode_point(text,text) line 15 at SQL statement - cdb_geocode_postalcode_point ------------------------------- - -(1 row) - diff --git a/client/test/0.1.0/expected/50_ipaddresses_test.out b/client/test/0.1.0/expected/50_ipaddresses_test.out deleted file mode 100644 index 18a18db..0000000 --- a/client/test/0.1.0/expected/50_ipaddresses_test.out +++ /dev/null @@ -1,20 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_ipaddress_point(username text, orgname text, ip_address text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_ipaddress_point invoked with params (%, %, %)', username, orgname, ip_address; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; --- Exercise the public and the proxied function -SELECT cdb_geocode_ipaddress_point('8.8.8.8'); -NOTICE: cdb_dataservices_client._cdb_geocode_ipaddress_point(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_ipaddress_point invoked with params (test_user, , 8.8.8.8) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_ipaddress_point(username, orgname, ip_address)" -PL/pgSQL function cdb_geocode_ipaddress_point(text) line 15 at SQL statement - cdb_geocode_ipaddress_point ------------------------------ - -(1 row) - diff --git a/client/test/0.1.0/expected/60_street_test.out b/client/test/0.1.0/expected/60_street_test.out deleted file mode 100644 index 72a11f4..0000000 --- a/client/test/0.1.0/expected/60_street_test.out +++ /dev/null @@ -1,101 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_street_point (username text, orgname text, searchtext text, city text DEFAULT NULL, state_province text DEFAULT NULL, country text DEFAULT NULL) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_geocoder_street_point invoked with params (%, %, %, %, %, %)', username, orgname, searchtext, city, state_province, country; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; --- Exercise the public and the proxied function -SELECT cdb_geocode_street_point('One street, 1'); -NOTICE: cdb_dataservices_client._cdb_geocode_street_point(6): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_geocoder_street_point invoked with params (test_user, , One street, 1, , , ) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_street_point(username, orgname, searchtext, city, state_province, country)" -PL/pgSQL function cdb_geocode_street_point(text,text,text,text) line 15 at SQL statement - cdb_geocode_street_point --------------------------- - -(1 row) - -SELECT cdb_geocode_street_point('One street', 'city'); -NOTICE: cdb_dataservices_client._cdb_geocode_street_point(6): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_geocoder_street_point invoked with params (test_user, , One street, city, , ) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_street_point(username, orgname, searchtext, city, state_province, country)" -PL/pgSQL function cdb_geocode_street_point(text,text,text,text) line 15 at SQL statement - cdb_geocode_street_point --------------------------- - -(1 row) - -SELECT cdb_geocode_street_point('One street', 'city', 'state'); -NOTICE: cdb_dataservices_client._cdb_geocode_street_point(6): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_geocoder_street_point invoked with params (test_user, , One street, city, state, ) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_street_point(username, orgname, searchtext, city, state_province, country)" -PL/pgSQL function cdb_geocode_street_point(text,text,text,text) line 15 at SQL statement - cdb_geocode_street_point --------------------------- - -(1 row) - -SELECT cdb_geocode_street_point('One street', 'city', 'state', 'country'); -NOTICE: cdb_dataservices_client._cdb_geocode_street_point(6): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_geocoder_street_point invoked with params (test_user, , One street, city, state, country) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_street_point(username, orgname, searchtext, city, state_province, country)" -PL/pgSQL function cdb_geocode_street_point(text,text,text,text) line 15 at SQL statement - cdb_geocode_street_point --------------------------- - -(1 row) - -SELECT cdb_geocode_street_point('One street', 'city', NULL, 'country'); -NOTICE: cdb_dataservices_client._cdb_geocode_street_point(6): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_geocoder_street_point invoked with params (test_user, , One street, city, , country) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_street_point(username, orgname, searchtext, city, state_province, country)" -PL/pgSQL function cdb_geocode_street_point(text,text,text,text) line 15 at SQL statement - cdb_geocode_street_point --------------------------- - -(1 row) - -SELECT cdb_geocode_street_point('One street, 1'); -NOTICE: cdb_dataservices_client._cdb_geocode_street_point(6): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_geocoder_street_point invoked with params (test_user, , One street, 1, , , ) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_street_point(username, orgname, searchtext, city, state_province, country)" -PL/pgSQL function cdb_geocode_street_point(text,text,text,text) line 15 at SQL statement - cdb_geocode_street_point --------------------------- - -(1 row) - -SELECT cdb_geocode_street_point('One street', 'city'); -NOTICE: cdb_dataservices_client._cdb_geocode_street_point(6): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_geocoder_street_point invoked with params (test_user, , One street, city, , ) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_street_point(username, orgname, searchtext, city, state_province, country)" -PL/pgSQL function cdb_geocode_street_point(text,text,text,text) line 15 at SQL statement - cdb_geocode_street_point --------------------------- - -(1 row) - -SELECT cdb_geocode_street_point('One street', 'city', 'state'); -NOTICE: cdb_dataservices_client._cdb_geocode_street_point(6): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_geocoder_street_point invoked with params (test_user, , One street, city, state, ) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_street_point(username, orgname, searchtext, city, state_province, country)" -PL/pgSQL function cdb_geocode_street_point(text,text,text,text) line 15 at SQL statement - cdb_geocode_street_point --------------------------- - -(1 row) - -SELECT cdb_geocode_street_point('One street', 'city', 'state', 'country'); -NOTICE: cdb_dataservices_client._cdb_geocode_street_point(6): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_geocoder_street_point invoked with params (test_user, , One street, city, state, country) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_street_point(username, orgname, searchtext, city, state_province, country)" -PL/pgSQL function cdb_geocode_street_point(text,text,text,text) line 15 at SQL statement - cdb_geocode_street_point --------------------------- - -(1 row) - -SELECT cdb_geocode_street_point('One street', 'city', NULL, 'country'); -NOTICE: cdb_dataservices_client._cdb_geocode_street_point(6): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_geocoder_street_point invoked with params (test_user, , One street, city, , country) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_street_point(username, orgname, searchtext, city, state_province, country)" -PL/pgSQL function cdb_geocode_street_point(text,text,text,text) line 15 at SQL statement - cdb_geocode_street_point --------------------------- - -(1 row) - diff --git a/client/test/0.1.0/expected/90_permissions_test.out b/client/test/0.1.0/expected/90_permissions_test.out deleted file mode 100644 index cea19cc..0000000 --- a/client/test/0.1.0/expected/90_permissions_test.out +++ /dev/null @@ -1,117 +0,0 @@ --- Use regular user role -SET ROLE test_regular_user; --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; --- Exercise the public function --- it is public, it shall work -SELECT cdb_geocode_admin0_polygon('Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_admin0_polygon(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_admin0_polygon invoked with params (test_user, , Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_admin0_polygon(username, orgname, country_name)" -PL/pgSQL function cdb_geocode_admin0_polygon(text) line 15 at SQL statement - cdb_geocode_admin0_polygon ----------------------------- - -(1 row) - -SELECT cdb_geocode_admin1_polygon('California'); -NOTICE: cdb_dataservices_client._cdb_geocode_admin1_polygon(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params (test_user, , California) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_admin1_polygon(username, orgname, admin1_name)" -PL/pgSQL function cdb_geocode_admin1_polygon(text) line 15 at SQL statement - cdb_geocode_admin1_polygon ----------------------------- - -(1 row) - -SELECT cdb_geocode_admin1_polygon('California', 'United States'); -NOTICE: cdb_dataservices_client._cdb_geocode_admin1_polygon(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params (test_user, , California, United States) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_admin1_polygon(username, orgname, admin1_name, country_name)" -PL/pgSQL function cdb_geocode_admin1_polygon(text,text) line 15 at SQL statement - cdb_geocode_admin1_polygon ----------------------------- - -(1 row) - -SELECT cdb_geocode_namedplace_point('Elx'); -NOTICE: cdb_dataservices_client._cdb_geocode_namedplace_point(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (test_user, , Elx) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name)" -PL/pgSQL function cdb_geocode_namedplace_point(text) line 15 at SQL statement - cdb_geocode_namedplace_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia'); -NOTICE: cdb_dataservices_client._cdb_geocode_namedplace_point(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (test_user, , Elx, Valencia) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name, country_name)" -PL/pgSQL function cdb_geocode_namedplace_point(text,text) line 15 at SQL statement - cdb_geocode_namedplace_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_namedplace_point(5): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (test_user, , Elx, Valencia, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name, admin1_name, country_name)" -PL/pgSQL function cdb_geocode_namedplace_point(text,text,text) line 15 at SQL statement - cdb_geocode_namedplace_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_postalcode_polygon('03204', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_postalcode_polygon(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_postalcode_polygon invoked with params (test_user, , 03204, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_postalcode_polygon(username, orgname, postal_code, country_name)" -PL/pgSQL function cdb_geocode_postalcode_polygon(text,text) line 15 at SQL statement - cdb_geocode_postalcode_polygon --------------------------------- - -(1 row) - -SELECT cdb_geocode_postalcode_point('03204', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_postalcode_point(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_postalcode_point invoked with params (test_user, , 03204, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_postalcode_point(username, orgname, postal_code, country_name)" -PL/pgSQL function cdb_geocode_postalcode_point(text,text) line 15 at SQL statement - cdb_geocode_postalcode_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_ipaddress_point('8.8.8.8'); -NOTICE: cdb_dataservices_client._cdb_geocode_ipaddress_point(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_ipaddress_point invoked with params (test_user, , 8.8.8.8) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_ipaddress_point(username, orgname, ip_address)" -PL/pgSQL function cdb_geocode_ipaddress_point(text) line 15 at SQL statement - cdb_geocode_ipaddress_point ------------------------------ - -(1 row) - -SELECT cdb_geocode_street_point('one street, 1'); -NOTICE: cdb_dataservices_client._cdb_geocode_street_point(6): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_geocoder_street_point invoked with params (test_user, , one street, 1, , , ) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_street_point(username, orgname, searchtext, city, state_province, country)" -PL/pgSQL function cdb_geocode_street_point(text,text,text,text) line 15 at SQL statement - cdb_geocode_street_point --------------------------- - -(1 row) - --- Check the regular user has no permissions on private functions -SELECT _cdb_geocode_admin0_polygon('evil_user', 'evil_orgname', 'Hell'); -ERROR: permission denied for function _cdb_geocode_admin0_polygon -SELECT _cdb_geocode_admin1_polygon('evil_user', 'evil_orgname', 'Hell'); -ERROR: permission denied for function _cdb_geocode_admin1_polygon -SELECT _cdb_geocode_admin1_polygon('evil_user', 'evil_orgname', 'Sheol', 'Hell'); -ERROR: permission denied for function _cdb_geocode_admin1_polygon -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol'); -ERROR: permission denied for function _cdb_geocode_namedplace_point -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol', 'Hell'); -ERROR: permission denied for function _cdb_geocode_namedplace_point -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol', 'Hell', 'Ugly world'); -ERROR: permission denied for function _cdb_geocode_namedplace_point -SELECT _cdb_geocode_postalcode_polygon('evil_user', 'evil_orgname', '66666', 'Hell'); -ERROR: permission denied for function _cdb_geocode_postalcode_polygon -SELECT _cdb_geocode_postalcode_point('evil_user', 'evil_orgname', '66666', 'Hell'); -ERROR: permission denied for function _cdb_geocode_postalcode_point -SELECT _cdb_geocode_ipaddress_point('evil_user', 'evil_orgname', '8.8.8.8'); -ERROR: permission denied for function _cdb_geocode_ipaddress_point -SELECT _cdb_geocode_street_point('evil_user', 'evil_orgname', 'one street, 1'); -ERROR: permission denied for function _cdb_geocode_street_point diff --git a/client/test/0.1.0/sql/00_installation_test.sql b/client/test/0.1.0/sql/00_installation_test.sql deleted file mode 100644 index fc3395f..0000000 --- a/client/test/0.1.0/sql/00_installation_test.sql +++ /dev/null @@ -1,23 +0,0 @@ --- Install dependencies -CREATE EXTENSION postgis; -CREATE EXTENSION schema_triggers; -CREATE EXTENSION plpythonu; -CREATE EXTENSION cartodb; -CREATE EXTENSION plproxy; - --- Install the extension -CREATE EXTENSION cdb_dataservices_client; - --- Mock the server connection to point to this very test db -SELECT cartodb.cdb_conf_setconf('geocoder_server_config', '{"connection_str": "dbname=contrib_regression host=127.0.0.1 user=postgres"}'); --- Mock the user configuration -SELECT cartodb.cdb_conf_setconf('user_config', '{"is_organization": false, "entity_name": "test_user"}'); - --- Mock the server schema -CREATE SCHEMA cdb_dataservices_server; - --- Create a test user to check permissions -DROP ROLE IF EXISTS test_regular_user; -CREATE ROLE test_regular_user; -GRANT publicuser TO test_regular_user; -ALTER ROLE test_regular_user SET search_path TO public,cartodb,cdb_dataservices_client; diff --git a/client/test/0.1.0/sql/10_admin0_test.sql b/client/test/0.1.0/sql/10_admin0_test.sql deleted file mode 100644 index e6750f1..0000000 --- a/client/test/0.1.0/sql/10_admin0_test.sql +++ /dev/null @@ -1,15 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; - --- Mock the server function -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_admin0_polygon(username text, orgname text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_admin0_polygon invoked with params (%, %, %)', username, orgname, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - - --- Exercise the public and the proxied function -SELECT cdb_geocode_admin0_polygon('Spain'); diff --git a/client/test/0.1.0/sql/20_admin1_test.sql b/client/test/0.1.0/sql/20_admin1_test.sql deleted file mode 100644 index ecd2275..0000000 --- a/client/test/0.1.0/sql/20_admin1_test.sql +++ /dev/null @@ -1,24 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; - --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_admin1_polygon(username text, orgname text, admin1_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params (%, %, %)', username, orgname, admin1_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_admin1_polygon(username text, orgname text, admin1_name text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params (%, %, %, %)', username, orgname, admin1_name, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - - --- Exercise the public and the proxied function -SELECT cdb_geocode_admin1_polygon('California'); -SELECT cdb_geocode_admin1_polygon('California', 'United States'); diff --git a/client/test/0.1.0/sql/30_namedplaces_test.sql b/client/test/0.1.0/sql/30_namedplaces_test.sql deleted file mode 100644 index bdfba65..0000000 --- a/client/test/0.1.0/sql/30_namedplaces_test.sql +++ /dev/null @@ -1,33 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; - --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_namedplace_point(username text, orgname text, city_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (%, %, %)', username, orgname, city_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_namedplace_point(username text, orgname text, city_name text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (%, %, %, %)', username, orgname, city_name, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_namedplace_point(username text, orgname text, city_name text, admin1_name text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (%, %, %, %, %)', username, orgname, city_name, admin1_name, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - --- Exercise the public and the proxied function -SELECT cdb_geocode_namedplace_point('Elx'); -SELECT cdb_geocode_namedplace_point('Elx', 'Spain'); -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia', 'Spain'); - diff --git a/client/test/0.1.0/sql/40_postalcodes_test.sql b/client/test/0.1.0/sql/40_postalcodes_test.sql deleted file mode 100644 index c1c2191..0000000 --- a/client/test/0.1.0/sql/40_postalcodes_test.sql +++ /dev/null @@ -1,23 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; - --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_postalcode_polygon(username text, orgname text, postal_code text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_postalcode_polygon invoked with params (%, %, %, %)', username, orgname, postal_code, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_postalcode_point(username text, orgname text, postal_code text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_postalcode_point invoked with params (%, %, %, %)', username, orgname, postal_code, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - --- Exercise the public and the proxied function -SELECT cdb_geocode_postalcode_polygon('03204', 'Spain'); -SELECT cdb_geocode_postalcode_point('03204', 'Spain'); diff --git a/client/test/0.1.0/sql/50_ipaddresses_test.sql b/client/test/0.1.0/sql/50_ipaddresses_test.sql deleted file mode 100644 index c1fd8f7..0000000 --- a/client/test/0.1.0/sql/50_ipaddresses_test.sql +++ /dev/null @@ -1,15 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; - --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_ipaddress_point(username text, orgname text, ip_address text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_ipaddress_point invoked with params (%, %, %)', username, orgname, ip_address; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - - --- Exercise the public and the proxied function -SELECT cdb_geocode_ipaddress_point('8.8.8.8'); diff --git a/client/test/0.1.0/sql/90_permissions_test.sql b/client/test/0.1.0/sql/90_permissions_test.sql deleted file mode 100644 index 88ec14c..0000000 --- a/client/test/0.1.0/sql/90_permissions_test.sql +++ /dev/null @@ -1,30 +0,0 @@ --- Use regular user role -SET ROLE test_regular_user; - --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; - --- Exercise the public function --- it is public, it shall work -SELECT cdb_geocode_admin0_polygon('Spain'); -SELECT cdb_geocode_admin1_polygon('California'); -SELECT cdb_geocode_admin1_polygon('California', 'United States'); -SELECT cdb_geocode_namedplace_point('Elx'); -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia'); -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia', 'Spain'); -SELECT cdb_geocode_postalcode_polygon('03204', 'Spain'); -SELECT cdb_geocode_postalcode_point('03204', 'Spain'); -SELECT cdb_geocode_ipaddress_point('8.8.8.8'); -SELECT cdb_geocode_street_point('one street, 1'); - --- Check the regular user has no permissions on private functions -SELECT _cdb_geocode_admin0_polygon('evil_user', 'evil_orgname', 'Hell'); -SELECT _cdb_geocode_admin1_polygon('evil_user', 'evil_orgname', 'Hell'); -SELECT _cdb_geocode_admin1_polygon('evil_user', 'evil_orgname', 'Sheol', 'Hell'); -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol'); -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol', 'Hell'); -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol', 'Hell', 'Ugly world'); -SELECT _cdb_geocode_postalcode_polygon('evil_user', 'evil_orgname', '66666', 'Hell'); -SELECT _cdb_geocode_postalcode_point('evil_user', 'evil_orgname', '66666', 'Hell'); -SELECT _cdb_geocode_ipaddress_point('evil_user', 'evil_orgname', '8.8.8.8'); -SELECT _cdb_geocode_street_point('evil_user', 'evil_orgname', 'one street, 1'); diff --git a/client/test/0.2.0/expected/00_installation_test.out b/client/test/0.2.0/expected/00_installation_test.out deleted file mode 100644 index 8c6f98d..0000000 --- a/client/test/0.2.0/expected/00_installation_test.out +++ /dev/null @@ -1,29 +0,0 @@ --- Install dependencies -CREATE EXTENSION postgis; -CREATE EXTENSION schema_triggers; -CREATE EXTENSION plpythonu; -CREATE EXTENSION cartodb; -CREATE EXTENSION plproxy; --- Install the extension -CREATE EXTENSION cdb_dataservices_client; --- Mock the server connection to point to this very test db -SELECT cartodb.cdb_conf_setconf('geocoder_server_config', '{"connection_str": "dbname=contrib_regression host=127.0.0.1 user=postgres"}'); - cdb_conf_setconf ------------------- - -(1 row) - --- Mock the user configuration -SELECT cartodb.cdb_conf_setconf('user_config', '{"is_organization": false, "entity_name": "test_user"}'); - cdb_conf_setconf ------------------- - -(1 row) - --- Mock the server schema -CREATE SCHEMA cdb_dataservices_server; --- Create a test user to check permissions -DROP ROLE IF EXISTS test_regular_user; -CREATE ROLE test_regular_user; -GRANT publicuser TO test_regular_user; -ALTER ROLE test_regular_user SET search_path TO public,cartodb,cdb_dataservices_client; diff --git a/client/test/0.2.0/expected/90_permissions_test.out b/client/test/0.2.0/expected/90_permissions_test.out deleted file mode 100644 index 3c12c06..0000000 --- a/client/test/0.2.0/expected/90_permissions_test.out +++ /dev/null @@ -1,117 +0,0 @@ --- Use regular user role -SET ROLE test_regular_user; --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; --- Exercise the public function --- it is public, it shall work -SELECT cdb_geocode_admin0_polygon('Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_admin0_polygon(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_admin0_polygon invoked with params (test_user, , Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_admin0_polygon(username, orgname, country_name)" -PL/pgSQL function cdb_geocode_admin0_polygon(text) line 16 at SQL statement - cdb_geocode_admin0_polygon ----------------------------- - -(1 row) - -SELECT cdb_geocode_admin1_polygon('California'); -NOTICE: cdb_dataservices_client._cdb_geocode_admin1_polygon(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params (test_user, , California) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_admin1_polygon(username, orgname, admin1_name)" -PL/pgSQL function cdb_geocode_admin1_polygon(text) line 16 at SQL statement - cdb_geocode_admin1_polygon ----------------------------- - -(1 row) - -SELECT cdb_geocode_admin1_polygon('California', 'United States'); -NOTICE: cdb_dataservices_client._cdb_geocode_admin1_polygon(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params (test_user, , California, United States) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_admin1_polygon(username, orgname, admin1_name, country_name)" -PL/pgSQL function cdb_geocode_admin1_polygon(text,text) line 16 at SQL statement - cdb_geocode_admin1_polygon ----------------------------- - -(1 row) - -SELECT cdb_geocode_namedplace_point('Elx'); -NOTICE: cdb_dataservices_client._cdb_geocode_namedplace_point(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (test_user, , Elx) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name)" -PL/pgSQL function cdb_geocode_namedplace_point(text) line 16 at SQL statement - cdb_geocode_namedplace_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia'); -NOTICE: cdb_dataservices_client._cdb_geocode_namedplace_point(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (test_user, , Elx, Valencia) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name, country_name)" -PL/pgSQL function cdb_geocode_namedplace_point(text,text) line 16 at SQL statement - cdb_geocode_namedplace_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_namedplace_point(5): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (test_user, , Elx, Valencia, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name, admin1_name, country_name)" -PL/pgSQL function cdb_geocode_namedplace_point(text,text,text) line 16 at SQL statement - cdb_geocode_namedplace_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_postalcode_polygon('03204', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_postalcode_polygon(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_postalcode_polygon invoked with params (test_user, , 03204, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_postalcode_polygon(username, orgname, postal_code, country_name)" -PL/pgSQL function cdb_geocode_postalcode_polygon(text,text) line 16 at SQL statement - cdb_geocode_postalcode_polygon --------------------------------- - -(1 row) - -SELECT cdb_geocode_postalcode_point('03204', 'Spain'); -NOTICE: cdb_dataservices_client._cdb_geocode_postalcode_point(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_postalcode_point invoked with params (test_user, , 03204, Spain) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_postalcode_point(username, orgname, postal_code, country_name)" -PL/pgSQL function cdb_geocode_postalcode_point(text,text) line 16 at SQL statement - cdb_geocode_postalcode_point ------------------------------- - -(1 row) - -SELECT cdb_geocode_ipaddress_point('8.8.8.8'); -NOTICE: cdb_dataservices_client._cdb_geocode_ipaddress_point(3): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_ipaddress_point invoked with params (test_user, , 8.8.8.8) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_ipaddress_point(username, orgname, ip_address)" -PL/pgSQL function cdb_geocode_ipaddress_point(text) line 16 at SQL statement - cdb_geocode_ipaddress_point ------------------------------ - -(1 row) - -SELECT cdb_geocode_street_point('one street, 1'); -NOTICE: cdb_dataservices_client._cdb_geocode_street_point(6): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.cdb_geocode_geocoder_street_point invoked with params (test_user, , one street, 1, , , ) -CONTEXT: SQL statement "SELECT cdb_dataservices_client._cdb_geocode_street_point(username, orgname, searchtext, city, state_province, country)" -PL/pgSQL function cdb_geocode_street_point(text,text,text,text) line 16 at SQL statement - cdb_geocode_street_point --------------------------- - -(1 row) - --- Check the regular user has no permissions on private functions -SELECT _cdb_geocode_admin0_polygon('evil_user', 'evil_orgname', 'Hell'); -ERROR: permission denied for function _cdb_geocode_admin0_polygon -SELECT _cdb_geocode_admin1_polygon('evil_user', 'evil_orgname', 'Hell'); -ERROR: permission denied for function _cdb_geocode_admin1_polygon -SELECT _cdb_geocode_admin1_polygon('evil_user', 'evil_orgname', 'Sheol', 'Hell'); -ERROR: permission denied for function _cdb_geocode_admin1_polygon -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol'); -ERROR: permission denied for function _cdb_geocode_namedplace_point -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol', 'Hell'); -ERROR: permission denied for function _cdb_geocode_namedplace_point -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol', 'Hell', 'Ugly world'); -ERROR: permission denied for function _cdb_geocode_namedplace_point -SELECT _cdb_geocode_postalcode_polygon('evil_user', 'evil_orgname', '66666', 'Hell'); -ERROR: permission denied for function _cdb_geocode_postalcode_polygon -SELECT _cdb_geocode_postalcode_point('evil_user', 'evil_orgname', '66666', 'Hell'); -ERROR: permission denied for function _cdb_geocode_postalcode_point -SELECT _cdb_geocode_ipaddress_point('evil_user', 'evil_orgname', '8.8.8.8'); -ERROR: permission denied for function _cdb_geocode_ipaddress_point -SELECT _cdb_geocode_street_point('evil_user', 'evil_orgname', 'one street, 1'); -ERROR: permission denied for function _cdb_geocode_street_point diff --git a/client/test/0.2.0/sql/00_installation_test.sql b/client/test/0.2.0/sql/00_installation_test.sql deleted file mode 100644 index fc3395f..0000000 --- a/client/test/0.2.0/sql/00_installation_test.sql +++ /dev/null @@ -1,23 +0,0 @@ --- Install dependencies -CREATE EXTENSION postgis; -CREATE EXTENSION schema_triggers; -CREATE EXTENSION plpythonu; -CREATE EXTENSION cartodb; -CREATE EXTENSION plproxy; - --- Install the extension -CREATE EXTENSION cdb_dataservices_client; - --- Mock the server connection to point to this very test db -SELECT cartodb.cdb_conf_setconf('geocoder_server_config', '{"connection_str": "dbname=contrib_regression host=127.0.0.1 user=postgres"}'); --- Mock the user configuration -SELECT cartodb.cdb_conf_setconf('user_config', '{"is_organization": false, "entity_name": "test_user"}'); - --- Mock the server schema -CREATE SCHEMA cdb_dataservices_server; - --- Create a test user to check permissions -DROP ROLE IF EXISTS test_regular_user; -CREATE ROLE test_regular_user; -GRANT publicuser TO test_regular_user; -ALTER ROLE test_regular_user SET search_path TO public,cartodb,cdb_dataservices_client; diff --git a/client/test/0.2.0/sql/10_admin0_test.sql b/client/test/0.2.0/sql/10_admin0_test.sql deleted file mode 100644 index e6750f1..0000000 --- a/client/test/0.2.0/sql/10_admin0_test.sql +++ /dev/null @@ -1,15 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; - --- Mock the server function -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_admin0_polygon(username text, orgname text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_admin0_polygon invoked with params (%, %, %)', username, orgname, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - - --- Exercise the public and the proxied function -SELECT cdb_geocode_admin0_polygon('Spain'); diff --git a/client/test/0.2.0/sql/20_admin1_test.sql b/client/test/0.2.0/sql/20_admin1_test.sql deleted file mode 100644 index ecd2275..0000000 --- a/client/test/0.2.0/sql/20_admin1_test.sql +++ /dev/null @@ -1,24 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; - --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_admin1_polygon(username text, orgname text, admin1_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params (%, %, %)', username, orgname, admin1_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_admin1_polygon(username text, orgname text, admin1_name text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_admin1_polygon invoked with params (%, %, %, %)', username, orgname, admin1_name, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - - --- Exercise the public and the proxied function -SELECT cdb_geocode_admin1_polygon('California'); -SELECT cdb_geocode_admin1_polygon('California', 'United States'); diff --git a/client/test/0.2.0/sql/30_namedplaces_test.sql b/client/test/0.2.0/sql/30_namedplaces_test.sql deleted file mode 100644 index bdfba65..0000000 --- a/client/test/0.2.0/sql/30_namedplaces_test.sql +++ /dev/null @@ -1,33 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; - --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_namedplace_point(username text, orgname text, city_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (%, %, %)', username, orgname, city_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_namedplace_point(username text, orgname text, city_name text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (%, %, %, %)', username, orgname, city_name, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_namedplace_point(username text, orgname text, city_name text, admin1_name text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_namedplace_point invoked with params (%, %, %, %, %)', username, orgname, city_name, admin1_name, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - --- Exercise the public and the proxied function -SELECT cdb_geocode_namedplace_point('Elx'); -SELECT cdb_geocode_namedplace_point('Elx', 'Spain'); -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia', 'Spain'); - diff --git a/client/test/0.2.0/sql/40_postalcodes_test.sql b/client/test/0.2.0/sql/40_postalcodes_test.sql deleted file mode 100644 index c1c2191..0000000 --- a/client/test/0.2.0/sql/40_postalcodes_test.sql +++ /dev/null @@ -1,23 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; - --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_postalcode_polygon(username text, orgname text, postal_code text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_postalcode_polygon invoked with params (%, %, %, %)', username, orgname, postal_code, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_postalcode_point(username text, orgname text, postal_code text, country_name text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_postalcode_point invoked with params (%, %, %, %)', username, orgname, postal_code, country_name; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - --- Exercise the public and the proxied function -SELECT cdb_geocode_postalcode_polygon('03204', 'Spain'); -SELECT cdb_geocode_postalcode_point('03204', 'Spain'); diff --git a/client/test/0.2.0/sql/50_ipaddresses_test.sql b/client/test/0.2.0/sql/50_ipaddresses_test.sql deleted file mode 100644 index c1fd8f7..0000000 --- a/client/test/0.2.0/sql/50_ipaddresses_test.sql +++ /dev/null @@ -1,15 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; - --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_ipaddress_point(username text, orgname text, ip_address text) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_ipaddress_point invoked with params (%, %, %)', username, orgname, ip_address; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - - --- Exercise the public and the proxied function -SELECT cdb_geocode_ipaddress_point('8.8.8.8'); diff --git a/client/test/0.2.0/sql/60_street_test.sql b/client/test/0.2.0/sql/60_street_test.sql deleted file mode 100644 index cd22b5e..0000000 --- a/client/test/0.2.0/sql/60_street_test.sql +++ /dev/null @@ -1,24 +0,0 @@ --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; - --- Mock the server functions -CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_street_point (username text, orgname text, searchtext text, city text DEFAULT NULL, state_province text DEFAULT NULL, country text DEFAULT NULL) -RETURNS Geometry AS $$ -BEGIN - RAISE NOTICE 'cdb_dataservices_server.cdb_geocode_geocoder_street_point invoked with params (%, %, %, %, %, %)', username, orgname, searchtext, city, state_province, country; - RETURN NULL; -END; -$$ LANGUAGE 'plpgsql'; - - --- Exercise the public and the proxied function -SELECT cdb_geocode_street_point('One street, 1'); -SELECT cdb_geocode_street_point('One street', 'city'); -SELECT cdb_geocode_street_point('One street', 'city', 'state'); -SELECT cdb_geocode_street_point('One street', 'city', 'state', 'country'); -SELECT cdb_geocode_street_point('One street', 'city', NULL, 'country'); -SELECT cdb_geocode_street_point('One street, 1'); -SELECT cdb_geocode_street_point('One street', 'city'); -SELECT cdb_geocode_street_point('One street', 'city', 'state'); -SELECT cdb_geocode_street_point('One street', 'city', 'state', 'country'); -SELECT cdb_geocode_street_point('One street', 'city', NULL, 'country'); diff --git a/client/test/0.2.0/sql/90_permissions_test.sql b/client/test/0.2.0/sql/90_permissions_test.sql deleted file mode 100644 index 88ec14c..0000000 --- a/client/test/0.2.0/sql/90_permissions_test.sql +++ /dev/null @@ -1,30 +0,0 @@ --- Use regular user role -SET ROLE test_regular_user; - --- Add to the search path the schema -SET search_path TO public,cartodb,cdb_dataservices_client; - --- Exercise the public function --- it is public, it shall work -SELECT cdb_geocode_admin0_polygon('Spain'); -SELECT cdb_geocode_admin1_polygon('California'); -SELECT cdb_geocode_admin1_polygon('California', 'United States'); -SELECT cdb_geocode_namedplace_point('Elx'); -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia'); -SELECT cdb_geocode_namedplace_point('Elx', 'Valencia', 'Spain'); -SELECT cdb_geocode_postalcode_polygon('03204', 'Spain'); -SELECT cdb_geocode_postalcode_point('03204', 'Spain'); -SELECT cdb_geocode_ipaddress_point('8.8.8.8'); -SELECT cdb_geocode_street_point('one street, 1'); - --- Check the regular user has no permissions on private functions -SELECT _cdb_geocode_admin0_polygon('evil_user', 'evil_orgname', 'Hell'); -SELECT _cdb_geocode_admin1_polygon('evil_user', 'evil_orgname', 'Hell'); -SELECT _cdb_geocode_admin1_polygon('evil_user', 'evil_orgname', 'Sheol', 'Hell'); -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol'); -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol', 'Hell'); -SELECT _cdb_geocode_namedplace_point('evil_user', 'evil_orgname', 'Sheol', 'Hell', 'Ugly world'); -SELECT _cdb_geocode_postalcode_polygon('evil_user', 'evil_orgname', '66666', 'Hell'); -SELECT _cdb_geocode_postalcode_point('evil_user', 'evil_orgname', '66666', 'Hell'); -SELECT _cdb_geocode_ipaddress_point('evil_user', 'evil_orgname', '8.8.8.8'); -SELECT _cdb_geocode_street_point('evil_user', 'evil_orgname', 'one street, 1'); diff --git a/client/test/0.3.0/expected/00_installation_test.out b/client/test/0.3.0/expected/00_installation_test.out deleted file mode 120000 index c971a1a..0000000 --- a/client/test/0.3.0/expected/00_installation_test.out +++ /dev/null @@ -1 +0,0 @@ -../../0.2.0/expected/00_installation_test.out \ No newline at end of file diff --git a/client/test/0.3.0/expected/10_admin0_test.out b/client/test/0.3.0/expected/10_admin0_test.out deleted file mode 120000 index f4d8bb4..0000000 --- a/client/test/0.3.0/expected/10_admin0_test.out +++ /dev/null @@ -1 +0,0 @@ -../../0.2.0/expected/10_admin0_test.out \ No newline at end of file diff --git a/client/test/0.3.0/expected/20_admin1_test.out b/client/test/0.3.0/expected/20_admin1_test.out deleted file mode 120000 index 9e2dc41..0000000 --- a/client/test/0.3.0/expected/20_admin1_test.out +++ /dev/null @@ -1 +0,0 @@ -../../0.2.0/expected/20_admin1_test.out \ No newline at end of file diff --git a/client/test/0.3.0/expected/30_namedplaces_test.out b/client/test/0.3.0/expected/30_namedplaces_test.out deleted file mode 120000 index 1cc8e82..0000000 --- a/client/test/0.3.0/expected/30_namedplaces_test.out +++ /dev/null @@ -1 +0,0 @@ -../../0.2.0/expected/30_namedplaces_test.out \ No newline at end of file diff --git a/client/test/0.3.0/expected/40_postalcodes_test.out b/client/test/0.3.0/expected/40_postalcodes_test.out deleted file mode 120000 index b5eca98..0000000 --- a/client/test/0.3.0/expected/40_postalcodes_test.out +++ /dev/null @@ -1 +0,0 @@ -../../0.2.0/expected/40_postalcodes_test.out \ No newline at end of file diff --git a/client/test/0.3.0/expected/50_ipaddresses_test.out b/client/test/0.3.0/expected/50_ipaddresses_test.out deleted file mode 120000 index 4e6cf45..0000000 --- a/client/test/0.3.0/expected/50_ipaddresses_test.out +++ /dev/null @@ -1 +0,0 @@ -../../0.2.0/expected/50_ipaddresses_test.out \ No newline at end of file diff --git a/client/test/0.3.0/expected/60_street_test.out b/client/test/0.3.0/expected/60_street_test.out deleted file mode 120000 index a89a234..0000000 --- a/client/test/0.3.0/expected/60_street_test.out +++ /dev/null @@ -1 +0,0 @@ -../../0.2.0/expected/60_street_test.out \ No newline at end of file diff --git a/client/test/0.3.0/sql/00_installation_test.sql b/client/test/0.3.0/sql/00_installation_test.sql deleted file mode 120000 index 57b2753..0000000 --- a/client/test/0.3.0/sql/00_installation_test.sql +++ /dev/null @@ -1 +0,0 @@ -../../0.2.0/sql/00_installation_test.sql \ No newline at end of file diff --git a/client/test/0.3.0/sql/10_admin0_test.sql b/client/test/0.3.0/sql/10_admin0_test.sql deleted file mode 120000 index 42ea0af..0000000 --- a/client/test/0.3.0/sql/10_admin0_test.sql +++ /dev/null @@ -1 +0,0 @@ -../../0.2.0/sql/10_admin0_test.sql \ No newline at end of file diff --git a/client/test/0.3.0/sql/20_admin1_test.sql b/client/test/0.3.0/sql/20_admin1_test.sql deleted file mode 120000 index eff33be..0000000 --- a/client/test/0.3.0/sql/20_admin1_test.sql +++ /dev/null @@ -1 +0,0 @@ -../../0.2.0/sql/20_admin1_test.sql \ No newline at end of file diff --git a/client/test/0.3.0/sql/30_namedplaces_test.sql b/client/test/0.3.0/sql/30_namedplaces_test.sql deleted file mode 120000 index efcb31a..0000000 --- a/client/test/0.3.0/sql/30_namedplaces_test.sql +++ /dev/null @@ -1 +0,0 @@ -../../0.2.0/sql/30_namedplaces_test.sql \ No newline at end of file diff --git a/client/test/0.3.0/sql/40_postalcodes_test.sql b/client/test/0.3.0/sql/40_postalcodes_test.sql deleted file mode 120000 index fc5a4c7..0000000 --- a/client/test/0.3.0/sql/40_postalcodes_test.sql +++ /dev/null @@ -1 +0,0 @@ -../../0.2.0/sql/40_postalcodes_test.sql \ No newline at end of file diff --git a/client/test/0.3.0/sql/50_ipaddresses_test.sql b/client/test/0.3.0/sql/50_ipaddresses_test.sql deleted file mode 120000 index f94e6ad..0000000 --- a/client/test/0.3.0/sql/50_ipaddresses_test.sql +++ /dev/null @@ -1 +0,0 @@ -../../0.2.0/sql/50_ipaddresses_test.sql \ No newline at end of file diff --git a/client/test/0.3.0/sql/60_street_test.sql b/client/test/0.3.0/sql/60_street_test.sql deleted file mode 120000 index 643e51d..0000000 --- a/client/test/0.3.0/sql/60_street_test.sql +++ /dev/null @@ -1 +0,0 @@ -../../0.2.0/sql/60_street_test.sql \ No newline at end of file diff --git a/client/test/0.0.1/expected/00_installation_test.out b/client/test/expected/00_installation_test.out similarity index 100% rename from client/test/0.0.1/expected/00_installation_test.out rename to client/test/expected/00_installation_test.out diff --git a/client/test/0.2.0/expected/10_admin0_test.out b/client/test/expected/10_admin0_test.out similarity index 100% rename from client/test/0.2.0/expected/10_admin0_test.out rename to client/test/expected/10_admin0_test.out diff --git a/client/test/0.2.0/expected/20_admin1_test.out b/client/test/expected/20_admin1_test.out similarity index 100% rename from client/test/0.2.0/expected/20_admin1_test.out rename to client/test/expected/20_admin1_test.out diff --git a/client/test/0.2.0/expected/30_namedplaces_test.out b/client/test/expected/30_namedplaces_test.out similarity index 100% rename from client/test/0.2.0/expected/30_namedplaces_test.out rename to client/test/expected/30_namedplaces_test.out diff --git a/client/test/0.2.0/expected/40_postalcodes_test.out b/client/test/expected/40_postalcodes_test.out similarity index 100% rename from client/test/0.2.0/expected/40_postalcodes_test.out rename to client/test/expected/40_postalcodes_test.out diff --git a/client/test/0.2.0/expected/50_ipaddresses_test.out b/client/test/expected/50_ipaddresses_test.out similarity index 100% rename from client/test/0.2.0/expected/50_ipaddresses_test.out rename to client/test/expected/50_ipaddresses_test.out diff --git a/client/test/0.2.0/expected/60_street_test.out b/client/test/expected/60_street_test.out similarity index 100% rename from client/test/0.2.0/expected/60_street_test.out rename to client/test/expected/60_street_test.out diff --git a/client/test/0.3.0/expected/80_route_point_to_point_test.out b/client/test/expected/80_route_point_to_point_test.out similarity index 100% rename from client/test/0.3.0/expected/80_route_point_to_point_test.out rename to client/test/expected/80_route_point_to_point_test.out diff --git a/client/test/0.3.0/expected/90_permissions_test.out b/client/test/expected/90_permissions_test.out similarity index 100% rename from client/test/0.3.0/expected/90_permissions_test.out rename to client/test/expected/90_permissions_test.out diff --git a/client/test/0.0.1/sql/00_installation_test.sql b/client/test/sql/00_installation_test.sql similarity index 100% rename from client/test/0.0.1/sql/00_installation_test.sql rename to client/test/sql/00_installation_test.sql diff --git a/client/test/0.0.1/sql/10_admin0_test.sql b/client/test/sql/10_admin0_test.sql similarity index 100% rename from client/test/0.0.1/sql/10_admin0_test.sql rename to client/test/sql/10_admin0_test.sql diff --git a/client/test/0.0.1/sql/20_admin1_test.sql b/client/test/sql/20_admin1_test.sql similarity index 100% rename from client/test/0.0.1/sql/20_admin1_test.sql rename to client/test/sql/20_admin1_test.sql diff --git a/client/test/0.0.1/sql/30_namedplaces_test.sql b/client/test/sql/30_namedplaces_test.sql similarity index 100% rename from client/test/0.0.1/sql/30_namedplaces_test.sql rename to client/test/sql/30_namedplaces_test.sql diff --git a/client/test/0.0.1/sql/40_postalcodes_test.sql b/client/test/sql/40_postalcodes_test.sql similarity index 100% rename from client/test/0.0.1/sql/40_postalcodes_test.sql rename to client/test/sql/40_postalcodes_test.sql diff --git a/client/test/0.0.1/sql/50_ipaddresses_test.sql b/client/test/sql/50_ipaddresses_test.sql similarity index 100% rename from client/test/0.0.1/sql/50_ipaddresses_test.sql rename to client/test/sql/50_ipaddresses_test.sql diff --git a/client/test/0.1.0/sql/60_street_test.sql b/client/test/sql/60_street_test.sql similarity index 100% rename from client/test/0.1.0/sql/60_street_test.sql rename to client/test/sql/60_street_test.sql diff --git a/client/test/0.3.0/sql/80_route_point_to_point_test.sql b/client/test/sql/80_route_point_to_point_test.sql similarity index 100% rename from client/test/0.3.0/sql/80_route_point_to_point_test.sql rename to client/test/sql/80_route_point_to_point_test.sql diff --git a/client/test/0.3.0/sql/90_permissions_test.sql b/client/test/sql/90_permissions_test.sql similarity index 100% rename from client/test/0.3.0/sql/90_permissions_test.sql rename to client/test/sql/90_permissions_test.sql From dda13033b05e050ca2ec885424b060f48a951500 Mon Sep 17 00:00:00 2001 From: Mario de Frutos Date: Tue, 19 Apr 2016 15:16:10 +0200 Subject: [PATCH 2/6] Client data observatory functions --- client/renderer/interface.yaml | 12 ++++++ .../templates/20_public_functions.erb | 2 +- .../expected/90_data_observatory_test.out | 42 +++++++++++++++++++ ...ions_test.out => 999_permissions_test.out} | 0 client/test/sql/90_data_observatory_test.sql | 31 ++++++++++++++ ...ions_test.sql => 999_permissions_test.sql} | 0 6 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 client/test/expected/90_data_observatory_test.out rename client/test/expected/{90_permissions_test.out => 999_permissions_test.out} (100%) create mode 100644 client/test/sql/90_data_observatory_test.sql rename client/test/sql/{90_permissions_test.sql => 999_permissions_test.sql} (100%) diff --git a/client/renderer/interface.yaml b/client/renderer/interface.yaml index 5fcf26b..6496b5b 100644 --- a/client/renderer/interface.yaml +++ b/client/renderer/interface.yaml @@ -89,3 +89,15 @@ - { name: options, type: "text[]", default: 'ARRAY[]::text[]' } - { name: units, type: "text", default: "'kilometers'"} +- name: obs_get_demographic_snapshot + return_type: json + params: + - { name: geom, type: "geometry(Geometry, 4326)" } + - { name: time_span, type: "text", default: "'2009 - 2013'::text" } + - { name: geometry_level, type: text, default: "'\"us.census.tiger\".block_group'::text" } + +- name: obs_get_segment_snapshot + return_type: json + params: + - { name: geom, type: "geometry(Geometry, 4326)" } + - { name: geometry_level, type: text, default: "'\"us.census.tiger\".census_tract'::text" } \ No newline at end of file diff --git a/client/renderer/templates/20_public_functions.erb b/client/renderer/templates/20_public_functions.erb index 5832e3f..cc79dd8 100644 --- a/client/renderer/templates/20_public_functions.erb +++ b/client/renderer/templates/20_public_functions.erb @@ -1,5 +1,5 @@ -- --- Public geocoder API function +-- Public dataservices API function -- -- These are the only ones with permissions to publicuser role -- and should also be the only ones with SECURITY DEFINER diff --git a/client/test/expected/90_data_observatory_test.out b/client/test/expected/90_data_observatory_test.out new file mode 100644 index 0000000..44aac0e --- /dev/null +++ b/client/test/expected/90_data_observatory_test.out @@ -0,0 +1,42 @@ +-- Add to the search path the schema +SET search_path TO public,cartodb,cdb_dataservices_client; +-- Mock the server functions +CREATE OR REPLACE FUNCTION cdb_dataservices_server.obs_get_demographic_snapshot (username text, orgname text, geom geometry(Geometry, 4326), time_span text DEFAULT '2009 - 2013', geometry_level text DEFAULT '"us.census.tiger".block_group') +RETURNS json AS $$ +DECLARE + ret json; +BEGIN + RAISE NOTICE 'cdb_dataservices_server.obs_get_demographic_snapshot invoked with params (%, %, %, %, %)', username, orgname, geom, time_span, geometry_level; + SELECT '{"total_pop":9516.27915900609,"male_pop":6152.51885204623,"female_pop":3363.76030695986,"median_age":28.8,"white_pop":5301.51624447348,"black_pop":149.500458087105,"asian_pop":230.000704749392,"hispanic_pop":3835.26175169611,"amerindian_pop":0,"other_race_pop":0,"two_or_more_races_pop":0,"not_hispanic_pop":5681.01740730998,"households":3323.51018362871,"pop_25_years_over":7107.02177675621,"high_school_diploma":1040.753188991,"less_one_year_college":69.0002114248176,"one_year_more_college":793.502431385402,"associates_degree":327.751004267883,"bachelors_degree":2742.7584041365,"masters_degree":931.502854235037,"median_income":66304,"gini_index":0.3494,"income_per_capita":28291,"housing_units":3662.76122313407,"vacant_housing_units":339.251039505353,"vacant_housing_units_for_rent":120.750369993431,"vacant_housing_units_for_sale":0,"median_rent":1764,"percent_income_spent_on_rent":35.3,"owner_occupied_housing_units":339.251039505353,"million_dollar_housing_units":0,"mortgaged_housing_units":224.250687130657,"commuters_16_over":6549.27006773893,"commute_less_10_mins":327.751004267883,"commute_10_14_mins":28.750088093674,"commute_15_19_mins":201.250616655718,"commute_20_24_mins":621.001902823358,"commute_25_29_mins":373.751145217762,"commute_30_34_mins":1851.5056732326,"commute_35_44_mins":1414.50433420876,"commute_45_59_mins":1115.50341803455,"commute_60_more_mins":615.251885204623,"aggregate_travel_time_to_work":null,"income_less_10000":57.500176187348,"income_10000_14999":0,"income_15000_19999":212.750651893187,"income_20000_24999":408.251250930171,"income_25000_29999":0,"income_30000_34999":155.25047570584,"income_35000_39999":109.250334755961,"income_40000_44999":92.0002818997568,"income_45000_49999":63.2501938060828,"income_50000_59999":184.000563799514,"income_60000_74999":621.001902823358,"income_75000_99999":552.001691398541,"income_100000_124999":327.751004267883,"income_125000_149999":333.501021886618,"income_150000_199999":126.500387612166,"income_200000_or_more":null,"land_area":null}'::json INTO ret; + RETURN ret; +END; +$$ LANGUAGE 'plpgsql'; +CREATE OR REPLACE FUNCTION cdb_dataservices_server.obs_get_segment_snapshot (username text, orgname text, geom geometry(Geometry, 4326), geometry_level text DEFAULT '"us.census.tiger".census_tract') +RETURNS json AS $$ +DECLARE + ret json; +BEGIN + RAISE NOTICE 'cdb_dataservices_server.obs_get_segment_snapshot invoked with params (%, %, %, %)', username, orgname, geom, geometry_level; + SELECT '{"total_pop":9516.27915900609,"male_pop":6152.51885204623,"female_pop":3363.76030695986,"median_age":28.8,"white_pop":5301.51624447348,"black_pop":149.500458087105,"asian_pop":230.000704749392,"hispanic_pop":3835.26175169611,"amerindian_pop":0,"other_race_pop":0,"two_or_more_races_pop":0,"not_hispanic_pop":5681.01740730998,"households":3323.51018362871,"pop_25_years_over":7107.02177675621,"high_school_diploma":1040.753188991,"less_one_year_college":69.0002114248176,"one_year_more_college":793.502431385402,"associates_degree":327.751004267883,"bachelors_degree":2742.7584041365,"masters_degree":931.502854235037,"median_income":66304,"gini_index":0.3494,"income_per_capita":28291,"housing_units":3662.76122313407,"vacant_housing_units":339.251039505353,"vacant_housing_units_for_rent":120.750369993431,"vacant_housing_units_for_sale":0,"median_rent":1764,"percent_income_spent_on_rent":35.3,"owner_occupied_housing_units":339.251039505353,"million_dollar_housing_units":0,"mortgaged_housing_units":224.250687130657,"commuters_16_over":6549.27006773893,"commute_less_10_mins":327.751004267883,"commute_10_14_mins":28.750088093674,"commute_15_19_mins":201.250616655718,"commute_20_24_mins":621.001902823358,"commute_25_29_mins":373.751145217762,"commute_30_34_mins":1851.5056732326,"commute_35_44_mins":1414.50433420876,"commute_45_59_mins":1115.50341803455,"commute_60_more_mins":615.251885204623,"aggregate_travel_time_to_work":null,"income_less_10000":57.500176187348,"income_10000_14999":0,"income_15000_19999":212.750651893187,"income_20000_24999":408.251250930171,"income_25000_29999":0,"income_30000_34999":155.25047570584,"income_35000_39999":109.250334755961,"income_40000_44999":92.0002818997568,"income_45000_49999":63.2501938060828,"income_50000_59999":184.000563799514,"income_60000_74999":621.001902823358,"income_75000_99999":552.001691398541,"income_100000_124999":327.751004267883,"income_125000_149999":333.501021886618,"income_150000_199999":126.500387612166,"income_200000_or_more":null,"land_area":null}'::json INTO ret; + RETURN ret; +END; +$$ LANGUAGE 'plpgsql'; +-- Exercise the public and the proxied function +SELECT obs_get_demographic_snapshot('POINT(-87.81406 41.89308)'::geometry); +NOTICE: cdb_dataservices_client._obs_get_demographic_snapshot(5): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.obs_get_demographic_snapshot invoked with params (test_user, , 0101000000D53E1D8F19F455C0185B087250F24440, 2009 - 2013, "us.census.tiger".block_group) +CONTEXT: SQL statement "SELECT cdb_dataservices_client._obs_get_demographic_snapshot(username, orgname, geom, time_span, geometry_level)" +PL/pgSQL function obs_get_demographic_snapshot(geometry,text,text) line 16 at SQL statement + obs_get_demographic_snapshot +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"total_pop":9516.27915900609,"male_pop":6152.51885204623,"female_pop":3363.76030695986,"median_age":28.8,"white_pop":5301.51624447348,"black_pop":149.500458087105,"asian_pop":230.000704749392,"hispanic_pop":3835.26175169611,"amerindian_pop":0,"other_race_pop":0,"two_or_more_races_pop":0,"not_hispanic_pop":5681.01740730998,"households":3323.51018362871,"pop_25_years_over":7107.02177675621,"high_school_diploma":1040.753188991,"less_one_year_college":69.0002114248176,"one_year_more_college":793.502431385402,"associates_degree":327.751004267883,"bachelors_degree":2742.7584041365,"masters_degree":931.502854235037,"median_income":66304,"gini_index":0.3494,"income_per_capita":28291,"housing_units":3662.76122313407,"vacant_housing_units":339.251039505353,"vacant_housing_units_for_rent":120.750369993431,"vacant_housing_units_for_sale":0,"median_rent":1764,"percent_income_spent_on_rent":35.3,"owner_occupied_housing_units":339.251039505353,"million_dollar_housing_units":0,"mortgaged_housing_units":224.250687130657,"commuters_16_over":6549.27006773893,"commute_less_10_mins":327.751004267883,"commute_10_14_mins":28.750088093674,"commute_15_19_mins":201.250616655718,"commute_20_24_mins":621.001902823358,"commute_25_29_mins":373.751145217762,"commute_30_34_mins":1851.5056732326,"commute_35_44_mins":1414.50433420876,"commute_45_59_mins":1115.50341803455,"commute_60_more_mins":615.251885204623,"aggregate_travel_time_to_work":null,"income_less_10000":57.500176187348,"income_10000_14999":0,"income_15000_19999":212.750651893187,"income_20000_24999":408.251250930171,"income_25000_29999":0,"income_30000_34999":155.25047570584,"income_35000_39999":109.250334755961,"income_40000_44999":92.0002818997568,"income_45000_49999":63.2501938060828,"income_50000_59999":184.000563799514,"income_60000_74999":621.001902823358,"income_75000_99999":552.001691398541,"income_100000_124999":327.751004267883,"income_125000_149999":333.501021886618,"income_150000_199999":126.500387612166,"income_200000_or_more":null,"land_area":null} +(1 row) + +SELECT obs_get_segment_snapshot('POINT(-87.81406 41.89308)'::geometry); +NOTICE: cdb_dataservices_client._obs_get_segment_snapshot(4): [contrib_regression] REMOTE NOTICE: cdb_dataservices_server.obs_get_segment_snapshot invoked with params (test_user, , 0101000000D53E1D8F19F455C0185B087250F24440, "us.census.tiger".census_tract) +CONTEXT: SQL statement "SELECT cdb_dataservices_client._obs_get_segment_snapshot(username, orgname, geom, geometry_level)" +PL/pgSQL function obs_get_segment_snapshot(geometry,text) line 16 at SQL statement + obs_get_segment_snapshot +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"total_pop":9516.27915900609,"male_pop":6152.51885204623,"female_pop":3363.76030695986,"median_age":28.8,"white_pop":5301.51624447348,"black_pop":149.500458087105,"asian_pop":230.000704749392,"hispanic_pop":3835.26175169611,"amerindian_pop":0,"other_race_pop":0,"two_or_more_races_pop":0,"not_hispanic_pop":5681.01740730998,"households":3323.51018362871,"pop_25_years_over":7107.02177675621,"high_school_diploma":1040.753188991,"less_one_year_college":69.0002114248176,"one_year_more_college":793.502431385402,"associates_degree":327.751004267883,"bachelors_degree":2742.7584041365,"masters_degree":931.502854235037,"median_income":66304,"gini_index":0.3494,"income_per_capita":28291,"housing_units":3662.76122313407,"vacant_housing_units":339.251039505353,"vacant_housing_units_for_rent":120.750369993431,"vacant_housing_units_for_sale":0,"median_rent":1764,"percent_income_spent_on_rent":35.3,"owner_occupied_housing_units":339.251039505353,"million_dollar_housing_units":0,"mortgaged_housing_units":224.250687130657,"commuters_16_over":6549.27006773893,"commute_less_10_mins":327.751004267883,"commute_10_14_mins":28.750088093674,"commute_15_19_mins":201.250616655718,"commute_20_24_mins":621.001902823358,"commute_25_29_mins":373.751145217762,"commute_30_34_mins":1851.5056732326,"commute_35_44_mins":1414.50433420876,"commute_45_59_mins":1115.50341803455,"commute_60_more_mins":615.251885204623,"aggregate_travel_time_to_work":null,"income_less_10000":57.500176187348,"income_10000_14999":0,"income_15000_19999":212.750651893187,"income_20000_24999":408.251250930171,"income_25000_29999":0,"income_30000_34999":155.25047570584,"income_35000_39999":109.250334755961,"income_40000_44999":92.0002818997568,"income_45000_49999":63.2501938060828,"income_50000_59999":184.000563799514,"income_60000_74999":621.001902823358,"income_75000_99999":552.001691398541,"income_100000_124999":327.751004267883,"income_125000_149999":333.501021886618,"income_150000_199999":126.500387612166,"income_200000_or_more":null,"land_area":null} +(1 row) + diff --git a/client/test/expected/90_permissions_test.out b/client/test/expected/999_permissions_test.out similarity index 100% rename from client/test/expected/90_permissions_test.out rename to client/test/expected/999_permissions_test.out diff --git a/client/test/sql/90_data_observatory_test.sql b/client/test/sql/90_data_observatory_test.sql new file mode 100644 index 0000000..dd03800 --- /dev/null +++ b/client/test/sql/90_data_observatory_test.sql @@ -0,0 +1,31 @@ +-- Add to the search path the schema +SET search_path TO public,cartodb,cdb_dataservices_client; + +-- Mock the server functions + +CREATE OR REPLACE FUNCTION cdb_dataservices_server.obs_get_demographic_snapshot (username text, orgname text, geom geometry(Geometry, 4326), time_span text DEFAULT '2009 - 2013', geometry_level text DEFAULT '"us.census.tiger".block_group') +RETURNS json AS $$ +DECLARE + ret json; +BEGIN + RAISE NOTICE 'cdb_dataservices_server.obs_get_demographic_snapshot invoked with params (%, %, %, %, %)', username, orgname, geom, time_span, geometry_level; + SELECT '{"total_pop":9516.27915900609,"male_pop":6152.51885204623,"female_pop":3363.76030695986,"median_age":28.8,"white_pop":5301.51624447348,"black_pop":149.500458087105,"asian_pop":230.000704749392,"hispanic_pop":3835.26175169611,"amerindian_pop":0,"other_race_pop":0,"two_or_more_races_pop":0,"not_hispanic_pop":5681.01740730998,"households":3323.51018362871,"pop_25_years_over":7107.02177675621,"high_school_diploma":1040.753188991,"less_one_year_college":69.0002114248176,"one_year_more_college":793.502431385402,"associates_degree":327.751004267883,"bachelors_degree":2742.7584041365,"masters_degree":931.502854235037,"median_income":66304,"gini_index":0.3494,"income_per_capita":28291,"housing_units":3662.76122313407,"vacant_housing_units":339.251039505353,"vacant_housing_units_for_rent":120.750369993431,"vacant_housing_units_for_sale":0,"median_rent":1764,"percent_income_spent_on_rent":35.3,"owner_occupied_housing_units":339.251039505353,"million_dollar_housing_units":0,"mortgaged_housing_units":224.250687130657,"commuters_16_over":6549.27006773893,"commute_less_10_mins":327.751004267883,"commute_10_14_mins":28.750088093674,"commute_15_19_mins":201.250616655718,"commute_20_24_mins":621.001902823358,"commute_25_29_mins":373.751145217762,"commute_30_34_mins":1851.5056732326,"commute_35_44_mins":1414.50433420876,"commute_45_59_mins":1115.50341803455,"commute_60_more_mins":615.251885204623,"aggregate_travel_time_to_work":null,"income_less_10000":57.500176187348,"income_10000_14999":0,"income_15000_19999":212.750651893187,"income_20000_24999":408.251250930171,"income_25000_29999":0,"income_30000_34999":155.25047570584,"income_35000_39999":109.250334755961,"income_40000_44999":92.0002818997568,"income_45000_49999":63.2501938060828,"income_50000_59999":184.000563799514,"income_60000_74999":621.001902823358,"income_75000_99999":552.001691398541,"income_100000_124999":327.751004267883,"income_125000_149999":333.501021886618,"income_150000_199999":126.500387612166,"income_200000_or_more":null,"land_area":null}'::json INTO ret; + RETURN ret; +END; +$$ LANGUAGE 'plpgsql'; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server.obs_get_segment_snapshot (username text, orgname text, geom geometry(Geometry, 4326), geometry_level text DEFAULT '"us.census.tiger".census_tract') +RETURNS json AS $$ +DECLARE + ret json; +BEGIN + RAISE NOTICE 'cdb_dataservices_server.obs_get_segment_snapshot invoked with params (%, %, %, %)', username, orgname, geom, geometry_level; + SELECT '{"total_pop":9516.27915900609,"male_pop":6152.51885204623,"female_pop":3363.76030695986,"median_age":28.8,"white_pop":5301.51624447348,"black_pop":149.500458087105,"asian_pop":230.000704749392,"hispanic_pop":3835.26175169611,"amerindian_pop":0,"other_race_pop":0,"two_or_more_races_pop":0,"not_hispanic_pop":5681.01740730998,"households":3323.51018362871,"pop_25_years_over":7107.02177675621,"high_school_diploma":1040.753188991,"less_one_year_college":69.0002114248176,"one_year_more_college":793.502431385402,"associates_degree":327.751004267883,"bachelors_degree":2742.7584041365,"masters_degree":931.502854235037,"median_income":66304,"gini_index":0.3494,"income_per_capita":28291,"housing_units":3662.76122313407,"vacant_housing_units":339.251039505353,"vacant_housing_units_for_rent":120.750369993431,"vacant_housing_units_for_sale":0,"median_rent":1764,"percent_income_spent_on_rent":35.3,"owner_occupied_housing_units":339.251039505353,"million_dollar_housing_units":0,"mortgaged_housing_units":224.250687130657,"commuters_16_over":6549.27006773893,"commute_less_10_mins":327.751004267883,"commute_10_14_mins":28.750088093674,"commute_15_19_mins":201.250616655718,"commute_20_24_mins":621.001902823358,"commute_25_29_mins":373.751145217762,"commute_30_34_mins":1851.5056732326,"commute_35_44_mins":1414.50433420876,"commute_45_59_mins":1115.50341803455,"commute_60_more_mins":615.251885204623,"aggregate_travel_time_to_work":null,"income_less_10000":57.500176187348,"income_10000_14999":0,"income_15000_19999":212.750651893187,"income_20000_24999":408.251250930171,"income_25000_29999":0,"income_30000_34999":155.25047570584,"income_35000_39999":109.250334755961,"income_40000_44999":92.0002818997568,"income_45000_49999":63.2501938060828,"income_50000_59999":184.000563799514,"income_60000_74999":621.001902823358,"income_75000_99999":552.001691398541,"income_100000_124999":327.751004267883,"income_125000_149999":333.501021886618,"income_150000_199999":126.500387612166,"income_200000_or_more":null,"land_area":null}'::json INTO ret; + RETURN ret; +END; +$$ LANGUAGE 'plpgsql'; + + +-- Exercise the public and the proxied function +SELECT obs_get_demographic_snapshot('POINT(-87.81406 41.89308)'::geometry); +SELECT obs_get_segment_snapshot('POINT(-87.81406 41.89308)'::geometry); \ No newline at end of file diff --git a/client/test/sql/90_permissions_test.sql b/client/test/sql/999_permissions_test.sql similarity index 100% rename from client/test/sql/90_permissions_test.sql rename to client/test/sql/999_permissions_test.sql From 3c5325c1d7714b50aa058ccb144ac1650fa2898d Mon Sep 17 00:00:00 2001 From: Mario de Frutos Date: Tue, 19 Apr 2016 18:45:45 +0200 Subject: [PATCH 3/6] Server data observatory functions --- server/extension/sql/110_data_observatory.sql | 76 +++++++++++++++++++ server/extension/sql/15_config_helper.sql | 18 ++++- .../test/expected/00_install_test.out | 7 ++ .../expected/100_data_observatory_test.out | 22 ++++++ server/extension/test/sql/00_install_test.sql | 2 + .../test/sql/100_data_observatory_test.sql | 13 ++++ .../cartodb_services/metrics/__init__.py | 2 +- .../cartodb_services/metrics/config.py | 35 +++++++++ .../cartodb_services/metrics/quota.py | 14 ++++ server/lib/python/cartodb_services/setup.py | 2 +- .../cartodb_services/test/test_helper.py | 2 + .../test/test_quota_service.py | 26 ++++++- 12 files changed, 212 insertions(+), 7 deletions(-) create mode 100644 server/extension/sql/110_data_observatory.sql create mode 100644 server/extension/test/expected/100_data_observatory_test.out create mode 100644 server/extension/test/sql/100_data_observatory_test.sql diff --git a/server/extension/sql/110_data_observatory.sql b/server/extension/sql/110_data_observatory.sql new file mode 100644 index 0000000..b4394a1 --- /dev/null +++ b/server/extension/sql/110_data_observatory.sql @@ -0,0 +1,76 @@ +CREATE OR REPLACE FUNCTION cdb_dataservices_server.obs_get_demographic_snapshot( + username TEXT, + orgname TEXT, + geom geometry(Geometry, 4326), + time_span TEXT DEFAULT '2009 - 2013', + geometry_level TEXT DEFAULT '"us.census.tiger".block_group') +RETURNS json AS $$ + from cartodb_services.metrics import QuotaService + import json + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_data_observatory_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_data_observatory_config = GD["user_data_observatory_config_{0}".format(username)] + + quota_service = QuotaService(user_data_observatory_config, redis_conn) + if not quota_service.check_user_quota(): + plpy.error('You have reach the limit of your quota') + + try: + obs_plan = plpy.prepare("SELECT cdb_observatory.OBS_GetDemographicSnapshot($1, $2, $3) as snapshot;", ["geometry(Geometry, 4326)", "text", "text"]) + result = plpy.execute(obs_plan, [geom, time_span, geometry_level]) + if result: + quota_service.increment_success_service_use() + return result[0]['snapshot'] + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to use get_geographic_snapshot: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server.obs_get_segment_snapshot( + username TEXT, + orgname TEXT, + geom geometry(Geometry, 4326), + geometry_level TEXT DEFAULT '"us.census.tiger".block_group') +RETURNS json AS $$ + from cartodb_services.metrics import QuotaService + import json + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_data_observatory_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_data_observatory_config = GD["user_data_observatory_config_{0}".format(username)] + + quota_service = QuotaService(user_data_observatory_config, redis_conn) + if not quota_service.check_user_quota(): + plpy.error('You have reach the limit of your quota') + + try: + obs_plan = plpy.prepare("SELECT cdb_observatory.OBS_GetSegmentSnapshot($1, $2) as snapshot;", ["geometry(Geometry, 4326)", "text"]) + result = plpy.execute(obs_plan, [geom, geometry_level]) + if result: + quota_service.increment_success_service_use() + return result[0]['snapshot'] + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to use get_segment_snapshot: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; \ No newline at end of file diff --git a/server/extension/sql/15_config_helper.sql b/server/extension/sql/15_config_helper.sql index b521767..88b43c1 100644 --- a/server/extension/sql/15_config_helper.sql +++ b/server/extension/sql/15_config_helper.sql @@ -1,4 +1,3 @@ --- Get the Redis configuration from the _conf table -- CREATE OR REPLACE FUNCTION cdb_dataservices_server._get_geocoder_config(username text, orgname text) RETURNS boolean AS $$ cache_key = "user_geocoder_config_{0}".format(username) @@ -13,7 +12,6 @@ RETURNS boolean AS $$ return True $$ LANGUAGE plpythonu SECURITY DEFINER; --- Get the Redis configuration from the _conf table -- CREATE OR REPLACE FUNCTION cdb_dataservices_server._get_internal_geocoder_config(username text, orgname text) RETURNS boolean AS $$ cache_key = "user_internal_geocoder_config_{0}".format(username) @@ -28,7 +26,6 @@ RETURNS boolean AS $$ return True $$ LANGUAGE plpythonu SECURITY DEFINER; --- Get the Redis configuration from the _conf table -- CREATE OR REPLACE FUNCTION cdb_dataservices_server._get_isolines_routing_config(username text, orgname text) RETURNS boolean AS $$ cache_key = "user_isolines_routing_config_{0}".format(username) @@ -43,7 +40,6 @@ RETURNS boolean AS $$ return True $$ LANGUAGE plpythonu SECURITY DEFINER; --- Get the Redis configuration from the _conf table -- CREATE OR REPLACE FUNCTION cdb_dataservices_server._get_routing_config(username text, orgname text) RETURNS boolean AS $$ cache_key = "user_routing_config_{0}".format(username) @@ -57,3 +53,17 @@ RETURNS boolean AS $$ GD[cache_key] = routing_config return True $$ LANGUAGE plpythonu SECURITY DEFINER; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server._get_data_observatory_config(username text, orgname text) +RETURNS boolean AS $$ + cache_key = "user_data_observatory_config_{0}".format(username) + if cache_key in GD: + return False + else: + from cartodb_services.metrics import DataObservatoryConfig + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metadata_connection'] + data_observatory_config = DataObservatoryConfig(redis_conn, plpy, username, orgname) + GD[cache_key] = data_observatory_config + return True +$$ LANGUAGE plpythonu SECURITY DEFINER; diff --git a/server/extension/test/expected/00_install_test.out b/server/extension/test/expected/00_install_test.out index 9c217f6..6e7916d 100644 --- a/server/extension/test/expected/00_install_test.out +++ b/server/extension/test/expected/00_install_test.out @@ -4,6 +4,7 @@ CREATE EXTENSION schema_triggers; CREATE EXTENSION plpythonu; CREATE EXTENSION cartodb; CREATE EXTENSION cdb_geocoder; +CREATE EXTENSION observatory VERSION 'dev'; -- Install the extension CREATE EXTENSION cdb_dataservices_server; -- Mock the redis server connection to point to this very test db @@ -37,6 +38,12 @@ SELECT cartodb.cdb_conf_setconf('logger_conf', '{"geocoder_log_path": "/dev/null (1 row) +SELECT cartodb.cdb_conf_setconf('data_observatory_conf', '{"monthly_quota": 10000}'); + cdb_conf_setconf +------------------ + +(1 row) + -- Mock the varnish invalidation function -- (used by cdb_geocoder tests) CREATE OR REPLACE FUNCTION public.cdb_invalidate_varnish(table_name text) RETURNS void AS $$ diff --git a/server/extension/test/expected/100_data_observatory_test.out b/server/extension/test/expected/100_data_observatory_test.out new file mode 100644 index 0000000..225382d --- /dev/null +++ b/server/extension/test/expected/100_data_observatory_test.out @@ -0,0 +1,22 @@ +SELECT exists(SELECT * + FROM pg_proc p + INNER JOIN pg_namespace ns ON (p.pronamespace = ns.oid) + WHERE ns.nspname = 'cdb_dataservices_server' + AND proname = 'obs_get_demographic_snapshot' + AND oidvectortypes(p.proargtypes) = 'text, text, geometry, text, text'); + exists +-------- + t +(1 row) + +SELECT exists(SELECT * + FROM pg_proc p + INNER JOIN pg_namespace ns ON (p.pronamespace = ns.oid) + WHERE ns.nspname = 'cdb_dataservices_server' + AND proname = 'obs_get_segment_snapshot' + AND oidvectortypes(p.proargtypes) = 'text, text, geometry, text'); + exists +-------- + t +(1 row) + diff --git a/server/extension/test/sql/00_install_test.sql b/server/extension/test/sql/00_install_test.sql index efd55f5..da9c8af 100644 --- a/server/extension/test/sql/00_install_test.sql +++ b/server/extension/test/sql/00_install_test.sql @@ -4,6 +4,7 @@ CREATE EXTENSION schema_triggers; CREATE EXTENSION plpythonu; CREATE EXTENSION cartodb; CREATE EXTENSION cdb_geocoder; +CREATE EXTENSION observatory VERSION 'dev'; -- Install the extension CREATE EXTENSION cdb_dataservices_server; @@ -14,6 +15,7 @@ SELECT cartodb.cdb_conf_setconf('redis_metadata_config', '{"redis_host": "localh SELECT cartodb.cdb_conf_setconf('heremaps_conf', '{"geocoder": {"app_id": "dummy_id", "app_code": "dummy_code", "geocoder_cost_per_hit": 1}, "isolines": {"app_id": "dummy_id", "app_code": "dummy_code"}}'); SELECT cartodb.cdb_conf_setconf('mapzen_conf', '{"routing": {"api_key": "routing_dummy_api_key", "monthly_quota": 1500000}, "geocoder": {"api_key": "geocoder_dummy_api_key", "monthly_quota": 1500000}}'); SELECT cartodb.cdb_conf_setconf('logger_conf', '{"geocoder_log_path": "/dev/null"}'); +SELECT cartodb.cdb_conf_setconf('data_observatory_conf', '{"monthly_quota": 10000}'); -- Mock the varnish invalidation function -- (used by cdb_geocoder tests) diff --git a/server/extension/test/sql/100_data_observatory_test.sql b/server/extension/test/sql/100_data_observatory_test.sql new file mode 100644 index 0000000..7621cb2 --- /dev/null +++ b/server/extension/test/sql/100_data_observatory_test.sql @@ -0,0 +1,13 @@ +SELECT exists(SELECT * + FROM pg_proc p + INNER JOIN pg_namespace ns ON (p.pronamespace = ns.oid) + WHERE ns.nspname = 'cdb_dataservices_server' + AND proname = 'obs_get_demographic_snapshot' + AND oidvectortypes(p.proargtypes) = 'text, text, geometry, text, text'); + +SELECT exists(SELECT * + FROM pg_proc p + INNER JOIN pg_namespace ns ON (p.pronamespace = ns.oid) + WHERE ns.nspname = 'cdb_dataservices_server' + AND proname = 'obs_get_segment_snapshot' + AND oidvectortypes(p.proargtypes) = 'text, text, geometry, text'); \ No newline at end of file diff --git a/server/lib/python/cartodb_services/cartodb_services/metrics/__init__.py b/server/lib/python/cartodb_services/cartodb_services/metrics/__init__.py index af7bed5..c357ade 100644 --- a/server/lib/python/cartodb_services/cartodb_services/metrics/__init__.py +++ b/server/lib/python/cartodb_services/cartodb_services/metrics/__init__.py @@ -1,3 +1,3 @@ -from config import GeocoderConfig, IsolinesRoutingConfig, InternalGeocoderConfig, RoutingConfig, ConfigException +from config import GeocoderConfig, IsolinesRoutingConfig, InternalGeocoderConfig, RoutingConfig, ConfigException, DataObservatoryConfig from quota import QuotaService from user import UserMetricsService diff --git a/server/lib/python/cartodb_services/cartodb_services/metrics/config.py b/server/lib/python/cartodb_services/cartodb_services/metrics/config.py index 784de75..9b1b332 100644 --- a/server/lib/python/cartodb_services/cartodb_services/metrics/config.py +++ b/server/lib/python/cartodb_services/cartodb_services/metrics/config.py @@ -32,6 +32,28 @@ class ServiceConfig(object): def organization(self): return self._orgname +class DataObservatoryConfig(ServiceConfig): + + PERIOD_END_DATE = 'period_end_date' + + def __init__(self, redis_connection, db_conn, username, orgname=None): + super(DataObservatoryConfig, self).__init__(redis_connection, db_conn, + username, orgname) + self._monthly_quota = self._db_config.data_observatory_monthly_quota + self._period_end_date = date_parse(self._redis_config[self.PERIOD_END_DATE]) + + @property + def service_type(self): + return 'data_observatory' + + @property + def monthly_quota(self): + return self._monthly_quota + + @property + def period_end_date(self): + return self._period_end_date + class RoutingConfig(ServiceConfig): @@ -315,6 +337,7 @@ class ServicesDBConfig: self._get_here_config() self._get_mapzen_config() self._get_logger_config() + self._get_data_observatory_config() def _get_here_config(self): heremaps_conf_json = self._get_conf('heremaps_conf') @@ -340,6 +363,14 @@ class ServicesDBConfig: self._mapzen_geocoder_api_key = mapzen_conf['geocoder']['api_key'] self._mapzen_geocoder_quota = mapzen_conf['geocoder']['monthly_quota'] + def _get_data_observatory_config(self): + do_conf_json = self._get_conf('data_observatory_conf') + if not do_conf_json: + raise ConfigException('Data Observatory configuration missing') + else: + do_conf = json.loads(do_conf_json) + self._data_observatory_monthly_quota = do_conf['monthly_quota'] + def _get_logger_config(self): logger_conf_json = self._get_conf('logger_conf') if not logger_conf_json: @@ -396,6 +427,10 @@ class ServicesDBConfig: def geocoder_log_path(self): return self._geocoder_log_path + @property + def data_observatory_monthly_quota(self): + return self._data_observatory_monthly_quota + class ServicesRedisConfig: diff --git a/server/lib/python/cartodb_services/cartodb_services/metrics/quota.py b/server/lib/python/cartodb_services/cartodb_services/metrics/quota.py index 238fb4e..b1d1137 100644 --- a/server/lib/python/cartodb_services/cartodb_services/metrics/quota.py +++ b/server/lib/python/cartodb_services/cartodb_services/metrics/quota.py @@ -73,6 +73,9 @@ class QuotaChecker: elif re.match('routing_mapzen', self._user_service_config.service_type) is not None: return self.__check_routing_quota() + elif re.match('data_observatory', + self._user_service_config.service_type) is not None: + return self.__check_data_observatory_quota() else: return False @@ -114,3 +117,14 @@ class QuotaChecker: return True else: return False + + def __check_data_observatory_quota(self): + user_quota = self._user_service_config.monthly_quota + today = date.today() + service_type = self._user_service_config.service_type + current_used = self._user_service.used_quota(service_type, today) + + if (user_quota > 0 and current_used <= user_quota): + return True + else: + return False diff --git a/server/lib/python/cartodb_services/setup.py b/server/lib/python/cartodb_services/setup.py index 562de35..6e218e8 100644 --- a/server/lib/python/cartodb_services/setup.py +++ b/server/lib/python/cartodb_services/setup.py @@ -10,7 +10,7 @@ from setuptools import setup, find_packages setup( name='cartodb_services', - version='0.4.5', + version='0.5.0', description='CartoDB Services API Python Library', diff --git a/server/lib/python/cartodb_services/test/test_helper.py b/server/lib/python/cartodb_services/test/test_helper.py index 0fd2fd3..000d260 100644 --- a/server/lib/python/cartodb_services/test/test_helper.py +++ b/server/lib/python/cartodb_services/test/test_helper.py @@ -51,3 +51,5 @@ def _plpy_execute_side_effect(*args, **kwargs): return [{'conf': '{"routing": {"api_key": "valhalla-Z61FWEs", "monthly_quota": 1500000}, "geocoder": {"api_key": "search-d744tp0", "monthly_quota": 1500000}}'}] elif args[0] == "SELECT cartodb.CDB_Conf_GetConf('logger_conf') as conf": return [{'conf': '{"geocoder_log_path": "/dev/null"}'}] + elif args[0] == "SELECT cartodb.CDB_Conf_GetConf('data_observatory_conf') as conf": + return [{'conf': '{"monthly_quota": 100000}'}] diff --git a/server/lib/python/cartodb_services/test/test_quota_service.py b/server/lib/python/cartodb_services/test/test_quota_service.py index 8f4414b..bcdacf8 100644 --- a/server/lib/python/cartodb_services/test/test_quota_service.py +++ b/server/lib/python/cartodb_services/test/test_quota_service.py @@ -1,7 +1,7 @@ import test_helper from mockredis import MockRedis from cartodb_services.metrics import QuotaService -from cartodb_services.metrics import GeocoderConfig, RoutingConfig +from cartodb_services.metrics import GeocoderConfig, RoutingConfig, DataObservatoryConfig from unittest import TestCase from nose.tools import assert_raises from datetime import datetime, date @@ -109,6 +109,20 @@ class TestQuotaService(TestCase): qs.increment_success_service_use(amount=1500000) assert qs.check_user_quota() is False + def test_should_check_user_data_observatory_quota_correctly(self): + qs = self.__build_data_observatory_quota_service('test_user') + qs.increment_success_service_use() + assert qs.check_user_quota() is True + qs.increment_success_service_use(amount=100000) + assert qs.check_user_quota() is False + + def test_should_check_org_data_observatory_quota_correctly(self): + qs = self.__build_data_observatory_quota_service('test_user', orgname='testorg') + qs.increment_success_service_use() + assert qs.check_user_quota() is True + qs.increment_success_service_use(amount=100000) + assert qs.check_user_quota() is False + def __prepare_quota_service(self, username, quota, service, orgname, soft_limit, end_date): test_helper.build_redis_user_config(self.redis_conn, username, @@ -139,3 +153,13 @@ class TestQuotaService(TestCase): routing_config = RoutingConfig(self.redis_conn, self._plpy_mock, username, orgname) return QuotaService(routing_config, redis_connection=self.redis_conn) + + def __build_data_observatory_quota_service(self, username, quota=100, + service='data_observatory', orgname=None, + soft_limit=False, + end_date=datetime.today()): + self.__prepare_quota_service(username, quota, service, orgname, + soft_limit, end_date) + do_config = DataObservatoryConfig(self.redis_conn, self._plpy_mock, + username, orgname) + return QuotaService(do_config, redis_connection=self.redis_conn) From 1daf78e41abdf6d1034031e461cd8a6d86a55d7b Mon Sep 17 00:00:00 2001 From: Mario de Frutos Date: Wed, 20 Apr 2016 12:47:29 +0200 Subject: [PATCH 4/6] Integration tests for the data observatory --- server/extension/sql/100_routing_helper.sql | 2 +- server/extension/sql/110_data_observatory.sql | 4 +- server/extension/sql/20_geocode_street.sql | 4 +- server/extension/sql/80_isolines_helper.sql | 2 +- test/integration/test_admin0_functions.py | 2 +- test/integration/test_admin1_functions.py | 2 +- .../test_data_observatory_functions.py | 45 +++++++++++++++++++ test/integration/test_ipaddress_functions.py | 2 +- test/integration/test_isolines_functions.py | 2 +- test/integration/test_namedplace_functions.py | 2 +- test/integration/test_postalcode_functions.py | 2 +- test/integration/test_routing_functions.py | 2 +- test/integration/test_street_functions.py | 2 +- 13 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 test/integration/test_data_observatory_functions.py diff --git a/server/extension/sql/100_routing_helper.sql b/server/extension/sql/100_routing_helper.sql index 603753f..7ef9916 100644 --- a/server/extension/sql/100_routing_helper.sql +++ b/server/extension/sql/100_routing_helper.sql @@ -25,7 +25,7 @@ RETURNS cdb_dataservices_server.simple_route AS $$ quota_service = QuotaService(user_routing_config, redis_conn) if not quota_service.check_user_quota(): - plpy.error('You have reach the limit of your quota') + plpy.error('You have reached the limit of your quota') try: client = MapzenRouting(user_routing_config.mapzen_api_key) diff --git a/server/extension/sql/110_data_observatory.sql b/server/extension/sql/110_data_observatory.sql index b4394a1..b77b101 100644 --- a/server/extension/sql/110_data_observatory.sql +++ b/server/extension/sql/110_data_observatory.sql @@ -15,7 +15,7 @@ RETURNS json AS $$ quota_service = QuotaService(user_data_observatory_config, redis_conn) if not quota_service.check_user_quota(): - plpy.error('You have reach the limit of your quota') + plpy.error('You have reached the limit of your quota') try: obs_plan = plpy.prepare("SELECT cdb_observatory.OBS_GetDemographicSnapshot($1, $2, $3) as snapshot;", ["geometry(Geometry, 4326)", "text", "text"]) @@ -53,7 +53,7 @@ RETURNS json AS $$ quota_service = QuotaService(user_data_observatory_config, redis_conn) if not quota_service.check_user_quota(): - plpy.error('You have reach the limit of your quota') + plpy.error('You have reached the limit of your quota') try: obs_plan = plpy.prepare("SELECT cdb_observatory.OBS_GetSegmentSnapshot($1, $2) as snapshot;", ["geometry(Geometry, 4326)", "text"]) diff --git a/server/extension/sql/20_geocode_street.sql b/server/extension/sql/20_geocode_street.sql index 035aeef..a955f78 100644 --- a/server/extension/sql/20_geocode_street.sql +++ b/server/extension/sql/20_geocode_street.sql @@ -31,7 +31,7 @@ RETURNS Geometry AS $$ # -- Check the quota quota_service = QuotaService(user_geocoder_config, redis_conn) if not quota_service.check_user_quota(): - plpy.error('You have reach the limit of your quota') + plpy.error('You have reached the limit of your quota') try: geocoder = HereMapsGeocoder(user_geocoder_config.heremaps_app_id, user_geocoder_config.heremaps_app_code) @@ -96,7 +96,7 @@ RETURNS Geometry AS $$ user_geocoder_config = GD["user_geocoder_config_{0}".format(username)] quota_service = QuotaService(user_geocoder_config, redis_conn) if not quota_service.check_user_quota(): - plpy.error('You have reach the limit of your quota') + plpy.error('You have reached the limit of your quota') try: geocoder = MapzenGeocoder(user_geocoder_config.mapzen_api_key) diff --git a/server/extension/sql/80_isolines_helper.sql b/server/extension/sql/80_isolines_helper.sql index 7eb7cdc..eaa84a1 100644 --- a/server/extension/sql/80_isolines_helper.sql +++ b/server/extension/sql/80_isolines_helper.sql @@ -13,7 +13,7 @@ RETURNS SETOF cdb_dataservices_server.isoline AS $$ # -- Check the quota quota_service = QuotaService(user_isolines_routing_config, redis_conn) if not quota_service.check_user_quota(): - plpy.error('You have reach the limit of your quota') + plpy.error('You have reached the limit of your quota') try: client = HereMapsRoutingIsoline(user_isolines_routing_config.heremaps_app_id, user_isolines_routing_config.heremaps_app_code, base_url = HereMapsRoutingIsoline.PRODUCTION_ROUTING_BASE_URL) diff --git a/test/integration/test_admin0_functions.py b/test/integration/test_admin0_functions.py index 8958502..4393ee3 100644 --- a/test/integration/test_admin0_functions.py +++ b/test/integration/test_admin0_functions.py @@ -8,7 +8,7 @@ class TestAdmin0Functions(TestCase): def setUp(self): self.env_variables = IntegrationTestHelper.get_environment_variables() - self.sql_api_url = "https://{0}.{1}/api/v2/sql".format( + self.sql_api_url = "https://{0}.{1}/api/v1/sql".format( self.env_variables['username'], self.env_variables['host'], self.env_variables['api_key'] diff --git a/test/integration/test_admin1_functions.py b/test/integration/test_admin1_functions.py index 8e09d70..703b071 100644 --- a/test/integration/test_admin1_functions.py +++ b/test/integration/test_admin1_functions.py @@ -8,7 +8,7 @@ class TestAdmin1Functions(TestCase): def setUp(self): self.env_variables = IntegrationTestHelper.get_environment_variables() - self.sql_api_url = "https://{0}.{1}/api/v2/sql".format( + self.sql_api_url = "https://{0}.{1}/api/v1/sql".format( self.env_variables['username'], self.env_variables['host'], self.env_variables['api_key'] diff --git a/test/integration/test_data_observatory_functions.py b/test/integration/test_data_observatory_functions.py new file mode 100644 index 0000000..8e247a3 --- /dev/null +++ b/test/integration/test_data_observatory_functions.py @@ -0,0 +1,45 @@ +from unittest import TestCase +from nose.tools import assert_raises +from nose.tools import assert_not_equal, assert_equal +from ..helpers.integration_test_helper import IntegrationTestHelper + + +class TestDataObservatoryFunctions(TestCase): + + def setUp(self): + self.env_variables = IntegrationTestHelper.get_environment_variables() + self.sql_api_url = "https://{0}.{1}/api/v1/sql".format( + self.env_variables['username'], + self.env_variables['host'], + self.env_variables['api_key'] + ) + + def test_if_get_demographic_snapshot_is_ok(self): + query = "SELECT duration, length, shape as the_geom " \ + "FROM cdb_do_get_demographic_snapshot(CDB_LatLng(40.704512, -73.936669))".format( + self.env_variables['api_key']) + routing = IntegrationTestHelper.execute_query(self.sql_api_url, query) + assert_not_equal(routing['the_geom'], None) + + def test_if_get_demographic_snapshot_without_api_key_raise_error(self): + query = "SELECT duration, length, shape as the_geom " \ + "FROM cdb_do_get_demographic_snapshot(CDB_LatLng(40.704512, -73.936669))" + try: + IntegrationTestHelper.execute_query(self.sql_api_url, query) + except Exception as e: + assert_equal(e.message[0], "The api_key must be provided") + + def test_if_get_segment_snapshot_is_ok(self): + query = "SELECT duration, length, shape as the_geom " \ + "FROM cdb_do_get_segment_snapshot(CDB_LatLng(40.704512, -73.936669))".format( + self.env_variables['api_key']) + routing = IntegrationTestHelper.execute_query(self.sql_api_url, query) + assert_not_equal(routing['the_geom'], None) + + def test_if_get_segment_snapshot_without_api_key_raise_error(self): + query = "SELECT duration, length, shape as the_geom " \ + "FROM cdb_do_get_segment_snapshot(CDB_LatLng(40.704512, -73.936669))" + try: + IntegrationTestHelper.execute_query(self.sql_api_url, query) + except Exception as e: + assert_equal(e.message[0], "The api_key must be provided") diff --git a/test/integration/test_ipaddress_functions.py b/test/integration/test_ipaddress_functions.py index 69056b6..29011a6 100644 --- a/test/integration/test_ipaddress_functions.py +++ b/test/integration/test_ipaddress_functions.py @@ -8,7 +8,7 @@ class TestPostalcodeFunctions(TestCase): def setUp(self): self.env_variables = IntegrationTestHelper.get_environment_variables() - self.sql_api_url = "https://{0}.{1}/api/v2/sql".format( + self.sql_api_url = "https://{0}.{1}/api/v1/sql".format( self.env_variables['username'], self.env_variables['host'], self.env_variables['api_key'] diff --git a/test/integration/test_isolines_functions.py b/test/integration/test_isolines_functions.py index 936699c..0949867 100644 --- a/test/integration/test_isolines_functions.py +++ b/test/integration/test_isolines_functions.py @@ -8,7 +8,7 @@ class TestIsolinesFunctions(TestCase): def setUp(self): self.env_variables = IntegrationTestHelper.get_environment_variables() - self.sql_api_url = "https://{0}.{1}/api/v2/sql".format( + self.sql_api_url = "https://{0}.{1}/api/v1/sql".format( self.env_variables['username'], self.env_variables['host'], self.env_variables['api_key'] diff --git a/test/integration/test_namedplace_functions.py b/test/integration/test_namedplace_functions.py index 6b7abf5..a091422 100644 --- a/test/integration/test_namedplace_functions.py +++ b/test/integration/test_namedplace_functions.py @@ -8,7 +8,7 @@ class TestNameplaceFunctions(TestCase): def setUp(self): self.env_variables = IntegrationTestHelper.get_environment_variables() - self.sql_api_url = "https://{0}.{1}/api/v2/sql".format( + self.sql_api_url = "https://{0}.{1}/api/v1/sql".format( self.env_variables['username'], self.env_variables['host'], self.env_variables['api_key'] diff --git a/test/integration/test_postalcode_functions.py b/test/integration/test_postalcode_functions.py index 07055f9..6e50c5c 100644 --- a/test/integration/test_postalcode_functions.py +++ b/test/integration/test_postalcode_functions.py @@ -8,7 +8,7 @@ class TestPostalcodeFunctions(TestCase): def setUp(self): self.env_variables = IntegrationTestHelper.get_environment_variables() - self.sql_api_url = "https://{0}.{1}/api/v2/sql".format( + self.sql_api_url = "https://{0}.{1}/api/v1/sql".format( self.env_variables['username'], self.env_variables['host'], self.env_variables['api_key'] diff --git a/test/integration/test_routing_functions.py b/test/integration/test_routing_functions.py index 3f02f01..61dd7ec 100644 --- a/test/integration/test_routing_functions.py +++ b/test/integration/test_routing_functions.py @@ -8,7 +8,7 @@ class TestRoutingFunctions(TestCase): def setUp(self): self.env_variables = IntegrationTestHelper.get_environment_variables() - self.sql_api_url = "https://{0}.{1}/api/v2/sql".format( + self.sql_api_url = "https://{0}.{1}/api/v1/sql".format( self.env_variables['username'], self.env_variables['host'], self.env_variables['api_key'] diff --git a/test/integration/test_street_functions.py b/test/integration/test_street_functions.py index 8b82f68..c9647ff 100644 --- a/test/integration/test_street_functions.py +++ b/test/integration/test_street_functions.py @@ -8,7 +8,7 @@ class TestStreetFunctions(TestCase): def setUp(self): self.env_variables = IntegrationTestHelper.get_environment_variables() - self.sql_api_url = "https://{0}.{1}/api/v2/sql".format( + self.sql_api_url = "https://{0}.{1}/api/v1/sql".format( self.env_variables['username'], self.env_variables['host'], self.env_variables['api_key'] From c3b695d1e755e730a95bc5b9d15dd2175b90b831 Mon Sep 17 00:00:00 2001 From: Mario de Frutos Date: Wed, 20 Apr 2016 16:04:32 +0200 Subject: [PATCH 5/6] Client version 0.4.0 --- client/Makefile | 4 +- .../cdb_dataservices_client--0.3.0--0.4.0.sql | 77 +++ .../cdb_dataservices_client--0.4.0--0.3.0.sql | 7 + client/cdb_dataservices_client--0.4.0.sql | 627 ++++++++++++++++++ client/cdb_dataservices_client.control | 2 +- .../cdb_dataservices_client--0.2.0--0.3.0.sql | 0 .../cdb_dataservices_client--0.3.0--0.2.0.sql | 0 .../cdb_dataservices_client--0.3.0.sql | 0 8 files changed, 714 insertions(+), 3 deletions(-) create mode 100644 client/cdb_dataservices_client--0.3.0--0.4.0.sql create mode 100644 client/cdb_dataservices_client--0.4.0--0.3.0.sql create mode 100644 client/cdb_dataservices_client--0.4.0.sql rename client/{ => old_versions}/cdb_dataservices_client--0.2.0--0.3.0.sql (100%) rename client/{ => old_versions}/cdb_dataservices_client--0.3.0--0.2.0.sql (100%) rename client/{ => old_versions}/cdb_dataservices_client--0.3.0.sql (100%) diff --git a/client/Makefile b/client/Makefile index 409c101..6049479 100644 --- a/client/Makefile +++ b/client/Makefile @@ -13,8 +13,8 @@ OLD_VERSIONS = $(wildcard old_versions/*.sql) # @see http://www.postgresql.org/docs/current/static/extend-pgxs.html DATA = $(NEW_EXTENSION_ARTIFACT) \ $(OLD_VERSIONS) \ - cdb_dataservices_client--0.2.0--0.3.0.sql \ - cdb_dataservices_client--0.3.0--0.2.0.sql + cdb_dataservices_client--0.3.0--0.4.0.sql \ + cdb_dataservices_client--0.4.0--0.3.0.sql REGRESS = $(notdir $(basename $(wildcard test/sql/*test.sql))) diff --git a/client/cdb_dataservices_client--0.3.0--0.4.0.sql b/client/cdb_dataservices_client--0.3.0--0.4.0.sql new file mode 100644 index 0000000..c821cab --- /dev/null +++ b/client/cdb_dataservices_client--0.3.0--0.4.0.sql @@ -0,0 +1,77 @@ +--DO NOT MODIFY THIS FILE, IT IS GENERATED AUTOMATICALLY FROM SOURCES +-- Complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "ALTER EXTENSION cdb_dataservices_client UPDATE TO '0.4.0'" to load this file. \quit +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.obs_get_demographic_snapshot (geom geometry(Geometry, 4326), time_span text DEFAULT '2009 - 2013'::text, geometry_level text DEFAULT '"us.census.tiger".block_group'::text) +RETURNS json AS $$ +DECLARE + ret json; + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + SELECT cdb_dataservices_client._obs_get_demographic_snapshot(username, orgname, geom, time_span, geometry_level) INTO ret; + RETURN ret; + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.obs_get_segment_snapshot (geom geometry(Geometry, 4326), geometry_level text DEFAULT '"us.census.tiger".census_tract'::text) +RETURNS json AS $$ +DECLARE + ret json; + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + SELECT cdb_dataservices_client._obs_get_segment_snapshot(username, orgname, geom, geometry_level) INTO ret; + RETURN ret; + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._obs_get_demographic_snapshot (username text, organization_name text, geom geometry(Geometry, 4326), time_span text DEFAULT '2009 - 2013'::text, geometry_level text DEFAULT '"us.census.tiger".block_group'::text) +RETURNS json AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT cdb_dataservices_server.obs_get_demographic_snapshot (username, organization_name, geom, time_span, geometry_level); + +$$ LANGUAGE plproxy; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._obs_get_segment_snapshot (username text, organization_name text, geom geometry(Geometry, 4326), geometry_level text DEFAULT '"us.census.tiger".census_tract'::text) +RETURNS json AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT cdb_dataservices_server.obs_get_segment_snapshot (username, organization_name, geom, geometry_level); + +$$ LANGUAGE plproxy; + +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.obs_get_demographic_snapshot(geom geometry(Geometry, 4326), time_span text, geometry_level text) TO publicuser; +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.obs_get_segment_snapshot(geom geometry(Geometry, 4326), geometry_level text) TO publicuser; \ No newline at end of file diff --git a/client/cdb_dataservices_client--0.4.0--0.3.0.sql b/client/cdb_dataservices_client--0.4.0--0.3.0.sql new file mode 100644 index 0000000..0d59e53 --- /dev/null +++ b/client/cdb_dataservices_client--0.4.0--0.3.0.sql @@ -0,0 +1,7 @@ +--DO NOT MODIFY THIS FILE, IT IS GENERATED AUTOMATICALLY FROM SOURCES +-- Complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "ALTER EXTENSION cdb_dataservices_client UPDATE TO '0.3.0'" to load this file. \quit +DROP FUNCTION IF EXISTS cdb_dataservices_client._obs_get_demographic_snapshot (text, text, geometry(Geometry, 4326), text, text) +DROP FUNCTION IF EXISTS cdb_dataservices_client._obs_get_segment_snapshot (text, text, geometry(Geometry, 4326), text) +DROP FUNCTION IF EXISTS cdb_dataservices_client.obs_get_demographic_snapshot (geometry(Geometry, 4326), text, text) +DROP FUNCTION IF EXISTS cdb_dataservices_client.obs_get_segment_snapshot (geometry(Geometry, 4326), text) \ No newline at end of file diff --git a/client/cdb_dataservices_client--0.4.0.sql b/client/cdb_dataservices_client--0.4.0.sql new file mode 100644 index 0000000..659abfd --- /dev/null +++ b/client/cdb_dataservices_client--0.4.0.sql @@ -0,0 +1,627 @@ +--DO NOT MODIFY THIS FILE, IT IS GENERATED AUTOMATICALLY FROM SOURCES +-- Complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION cdb_dataservices_client" to load this file. \quit +-- +-- Geocoder server connection config +-- +-- The purpose of this function is provide to the PL/Proxy functions +-- the connection string needed to connect with the server + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._server_conn_str() +RETURNS text AS $$ +DECLARE + db_connection_str text; +BEGIN + SELECT cartodb.cdb_conf_getconf('geocoder_server_config')->'connection_str' INTO db_connection_str; + SELECT trim(both '"' FROM db_connection_str) INTO db_connection_str; + RETURN db_connection_str; +END; +$$ LANGUAGE 'plpgsql';CREATE TYPE cdb_dataservices_client._entity_config AS ( + username text, + organization_name text +); + +-- +-- Get entity config function +-- +-- The purpose of this function is to retrieve the username and organization name from +-- a) schema where he/her is the owner in case is an organization user +-- b) entity_name from the cdb_conf database in case is a non organization user +CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_entity_config() +RETURNS record AS $$ +DECLARE + result cdb_dataservices_client._entity_config; + is_organization boolean; + username text; + organization_name text; +BEGIN + SELECT cartodb.cdb_conf_getconf('user_config')->'is_organization' INTO is_organization; + IF is_organization IS NULL THEN + RAISE EXCEPTION 'User must have user configuration in the config table'; + ELSIF is_organization = TRUE THEN + SELECT nspname + FROM pg_namespace s + LEFT JOIN pg_roles r ON s.nspowner = r.oid + WHERE r.rolname = session_user INTO username; + SELECT cartodb.cdb_conf_getconf('user_config')->>'entity_name' INTO organization_name; + ELSE + SELECT cartodb.cdb_conf_getconf('user_config')->>'entity_name' INTO username; + organization_name = NULL; + END IF; + result.username = username; + result.organization_name = organization_name; + RETURN result; +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER;CREATE TYPE cdb_dataservices_client.isoline AS ( + center geometry(Geometry,4326), + data_range integer, + the_geom geometry(Multipolygon,4326) +); + +CREATE TYPE cdb_dataservices_client.simple_route AS ( + shape geometry(LineString,4326), + length real, + duration integer +);-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.cdb_geocode_admin0_polygon (country_name text) +RETURNS Geometry AS $$ +DECLARE + ret Geometry; + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + SELECT cdb_dataservices_client._cdb_geocode_admin0_polygon(username, orgname, country_name) INTO ret; + RETURN ret; + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.cdb_geocode_admin1_polygon (admin1_name text) +RETURNS Geometry AS $$ +DECLARE + ret Geometry; + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + SELECT cdb_dataservices_client._cdb_geocode_admin1_polygon(username, orgname, admin1_name) INTO ret; + RETURN ret; + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.cdb_geocode_admin1_polygon (admin1_name text, country_name text) +RETURNS Geometry AS $$ +DECLARE + ret Geometry; + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + SELECT cdb_dataservices_client._cdb_geocode_admin1_polygon(username, orgname, admin1_name, country_name) INTO ret; + RETURN ret; + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.cdb_geocode_namedplace_point (city_name text) +RETURNS Geometry AS $$ +DECLARE + ret Geometry; + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name) INTO ret; + RETURN ret; + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.cdb_geocode_namedplace_point (city_name text, country_name text) +RETURNS Geometry AS $$ +DECLARE + ret Geometry; + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name, country_name) INTO ret; + RETURN ret; + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.cdb_geocode_namedplace_point (city_name text, admin1_name text, country_name text) +RETURNS Geometry AS $$ +DECLARE + ret Geometry; + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + SELECT cdb_dataservices_client._cdb_geocode_namedplace_point(username, orgname, city_name, admin1_name, country_name) INTO ret; + RETURN ret; + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.cdb_geocode_postalcode_polygon (postal_code text, country_name text) +RETURNS Geometry AS $$ +DECLARE + ret Geometry; + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + SELECT cdb_dataservices_client._cdb_geocode_postalcode_polygon(username, orgname, postal_code, country_name) INTO ret; + RETURN ret; + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.cdb_geocode_postalcode_point (postal_code text, country_name text) +RETURNS Geometry AS $$ +DECLARE + ret Geometry; + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + SELECT cdb_dataservices_client._cdb_geocode_postalcode_point(username, orgname, postal_code, country_name) INTO ret; + RETURN ret; + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.cdb_geocode_ipaddress_point (ip_address text) +RETURNS Geometry AS $$ +DECLARE + ret Geometry; + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + SELECT cdb_dataservices_client._cdb_geocode_ipaddress_point(username, orgname, ip_address) INTO ret; + RETURN ret; + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.cdb_geocode_street_point (searchtext text, city text DEFAULT NULL, state_province text DEFAULT NULL, country text DEFAULT NULL) +RETURNS Geometry AS $$ +DECLARE + ret Geometry; + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + SELECT cdb_dataservices_client._cdb_geocode_street_point(username, orgname, searchtext, city, state_province, country) INTO ret; + RETURN ret; + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.cdb_isodistance (source geometry(Geometry, 4326), mode text, range integer[], options text[] DEFAULT ARRAY[]::text[]) +RETURNS SETOF cdb_dataservices_client.isoline AS $$ +DECLARE + + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + RETURN QUERY + SELECT * FROM cdb_dataservices_client._cdb_isodistance(username, orgname, source, mode, range, options); + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.cdb_isochrone (source geometry(Geometry, 4326), mode text, range integer[], options text[] DEFAULT ARRAY[]::text[]) +RETURNS SETOF cdb_dataservices_client.isoline AS $$ +DECLARE + + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + RETURN QUERY + SELECT * FROM cdb_dataservices_client._cdb_isochrone(username, orgname, source, mode, range, options); + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.cdb_route_point_to_point (origin geometry(Point, 4326), destination geometry(Point, 4326), mode text, options text[] DEFAULT ARRAY[]::text[], units text DEFAULT 'kilometers') +RETURNS cdb_dataservices_client.simple_route AS $$ +DECLARE + ret cdb_dataservices_client.simple_route; + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + SELECT * FROM cdb_dataservices_client._cdb_route_point_to_point(username, orgname, origin, destination, mode, options, units) INTO ret; + RETURN ret; + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.obs_get_demographic_snapshot (geom geometry(Geometry, 4326), time_span text DEFAULT '2009 - 2013'::text, geometry_level text DEFAULT '"us.census.tiger".block_group'::text) +RETURNS json AS $$ +DECLARE + ret json; + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + SELECT cdb_dataservices_client._obs_get_demographic_snapshot(username, orgname, geom, time_span, geometry_level) INTO ret; + RETURN ret; + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +-- +-- Public dataservices API function +-- +-- These are the only ones with permissions to publicuser role +-- and should also be the only ones with SECURITY DEFINER + +CREATE OR REPLACE FUNCTION cdb_dataservices_client.obs_get_segment_snapshot (geom geometry(Geometry, 4326), geometry_level text DEFAULT '"us.census.tiger".census_tract'::text) +RETURNS json AS $$ +DECLARE + ret json; + username text; + orgname text; +BEGIN + IF session_user = 'publicuser' OR session_user ~ 'cartodb_publicuser_*' THEN + RAISE EXCEPTION 'The api_key must be provided'; + END IF; + SELECT u, o INTO username, orgname FROM cdb_dataservices_client._cdb_entity_config() AS (u text, o text); + -- JSON value stored "" is taken as literal + IF username IS NULL OR username = '' OR username = '""' THEN + RAISE EXCEPTION 'Username is a mandatory argument, check it out'; + END IF; + + SELECT cdb_dataservices_client._obs_get_segment_snapshot(username, orgname, geom, geometry_level) INTO ret; + RETURN ret; + +END; +$$ LANGUAGE 'plpgsql' SECURITY DEFINER; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_geocode_admin0_polygon (username text, organization_name text, country_name text) +RETURNS Geometry AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT cdb_dataservices_server.cdb_geocode_admin0_polygon (username, organization_name, country_name); + +$$ LANGUAGE plproxy; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_geocode_admin1_polygon (username text, organization_name text, admin1_name text) +RETURNS Geometry AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT cdb_dataservices_server.cdb_geocode_admin1_polygon (username, organization_name, admin1_name); + +$$ LANGUAGE plproxy; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_geocode_admin1_polygon (username text, organization_name text, admin1_name text, country_name text) +RETURNS Geometry AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT cdb_dataservices_server.cdb_geocode_admin1_polygon (username, organization_name, admin1_name, country_name); + +$$ LANGUAGE plproxy; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_geocode_namedplace_point (username text, organization_name text, city_name text) +RETURNS Geometry AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT cdb_dataservices_server.cdb_geocode_namedplace_point (username, organization_name, city_name); + +$$ LANGUAGE plproxy; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_geocode_namedplace_point (username text, organization_name text, city_name text, country_name text) +RETURNS Geometry AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT cdb_dataservices_server.cdb_geocode_namedplace_point (username, organization_name, city_name, country_name); + +$$ LANGUAGE plproxy; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_geocode_namedplace_point (username text, organization_name text, city_name text, admin1_name text, country_name text) +RETURNS Geometry AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT cdb_dataservices_server.cdb_geocode_namedplace_point (username, organization_name, city_name, admin1_name, country_name); + +$$ LANGUAGE plproxy; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_geocode_postalcode_polygon (username text, organization_name text, postal_code text, country_name text) +RETURNS Geometry AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT cdb_dataservices_server.cdb_geocode_postalcode_polygon (username, organization_name, postal_code, country_name); + +$$ LANGUAGE plproxy; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_geocode_postalcode_point (username text, organization_name text, postal_code text, country_name text) +RETURNS Geometry AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT cdb_dataservices_server.cdb_geocode_postalcode_point (username, organization_name, postal_code, country_name); + +$$ LANGUAGE plproxy; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_geocode_ipaddress_point (username text, organization_name text, ip_address text) +RETURNS Geometry AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT cdb_dataservices_server.cdb_geocode_ipaddress_point (username, organization_name, ip_address); + +$$ LANGUAGE plproxy; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_geocode_street_point (username text, organization_name text, searchtext text, city text DEFAULT NULL, state_province text DEFAULT NULL, country text DEFAULT NULL) +RETURNS Geometry AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT cdb_dataservices_server.cdb_geocode_street_point (username, organization_name, searchtext, city, state_province, country); + +$$ LANGUAGE plproxy; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_isodistance (username text, organization_name text, source geometry(Geometry, 4326), mode text, range integer[], options text[] DEFAULT ARRAY[]::text[]) +RETURNS SETOF cdb_dataservices_client.isoline AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT * FROM cdb_dataservices_server.cdb_isodistance (username, organization_name, source, mode, range, options); + +$$ LANGUAGE plproxy; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_isochrone (username text, organization_name text, source geometry(Geometry, 4326), mode text, range integer[], options text[] DEFAULT ARRAY[]::text[]) +RETURNS SETOF cdb_dataservices_client.isoline AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT * FROM cdb_dataservices_server.cdb_isochrone (username, organization_name, source, mode, range, options); + +$$ LANGUAGE plproxy; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._cdb_route_point_to_point (username text, organization_name text, origin geometry(Point, 4326), destination geometry(Point, 4326), mode text, options text[] DEFAULT ARRAY[]::text[], units text DEFAULT 'kilometers') +RETURNS cdb_dataservices_client.simple_route AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT * FROM cdb_dataservices_server.cdb_route_point_to_point (username, organization_name, origin, destination, mode, options, units); + +$$ LANGUAGE plproxy; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._obs_get_demographic_snapshot (username text, organization_name text, geom geometry(Geometry, 4326), time_span text DEFAULT '2009 - 2013'::text, geometry_level text DEFAULT '"us.census.tiger".block_group'::text) +RETURNS json AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT cdb_dataservices_server.obs_get_demographic_snapshot (username, organization_name, geom, time_span, geometry_level); + +$$ LANGUAGE plproxy; + +CREATE OR REPLACE FUNCTION cdb_dataservices_client._obs_get_segment_snapshot (username text, organization_name text, geom geometry(Geometry, 4326), geometry_level text DEFAULT '"us.census.tiger".census_tract'::text) +RETURNS json AS $$ + CONNECT cdb_dataservices_client._server_conn_str(); + + SELECT cdb_dataservices_server.obs_get_segment_snapshot (username, organization_name, geom, geometry_level); + +$$ LANGUAGE plproxy; + +-- Make sure by default there are no permissions for publicuser +-- NOTE: this happens at extension creation time, as part of an implicit transaction. +REVOKE ALL PRIVILEGES ON SCHEMA cdb_dataservices_client FROM PUBLIC, publicuser CASCADE; + +-- Grant permissions on the schema to publicuser (but just the schema) +GRANT USAGE ON SCHEMA cdb_dataservices_client TO publicuser; + +-- Revoke execute permissions on all functions in the schema by default +REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA cdb_dataservices_client FROM PUBLIC, publicuser;GRANT EXECUTE ON FUNCTION cdb_dataservices_client.cdb_geocode_admin0_polygon(country_name text) TO publicuser; +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.cdb_geocode_admin1_polygon(admin1_name text) TO publicuser; +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.cdb_geocode_admin1_polygon(admin1_name text, country_name text) TO publicuser; +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.cdb_geocode_namedplace_point(city_name text) TO publicuser; +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.cdb_geocode_namedplace_point(city_name text, country_name text) TO publicuser; +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.cdb_geocode_namedplace_point(city_name text, admin1_name text, country_name text) TO publicuser; +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.cdb_geocode_postalcode_polygon(postal_code text, country_name text) TO publicuser; +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.cdb_geocode_postalcode_point(postal_code text, country_name text) TO publicuser; +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.cdb_geocode_ipaddress_point(ip_address text) TO publicuser; +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.cdb_geocode_street_point(searchtext text, city text, state_province text, country text) TO publicuser; +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.cdb_isodistance(source geometry(Geometry, 4326), mode text, range integer[], options text[]) TO publicuser; +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.cdb_isochrone(source geometry(Geometry, 4326), mode text, range integer[], options text[]) TO publicuser; +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.cdb_route_point_to_point(origin geometry(Point, 4326), destination geometry(Point, 4326), mode text, options text[], units text) TO publicuser; +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.obs_get_demographic_snapshot(geom geometry(Geometry, 4326), time_span text, geometry_level text) TO publicuser; +GRANT EXECUTE ON FUNCTION cdb_dataservices_client.obs_get_segment_snapshot(geom geometry(Geometry, 4326), geometry_level text) TO publicuser; diff --git a/client/cdb_dataservices_client.control b/client/cdb_dataservices_client.control index 805f145..e8811fd 100644 --- a/client/cdb_dataservices_client.control +++ b/client/cdb_dataservices_client.control @@ -1,5 +1,5 @@ comment = 'CartoDB dataservices client API extension' -default_version = '0.3.0' +default_version = '0.4.0' requires = 'plproxy, cartodb' superuser = true schema = cdb_dataservices_client diff --git a/client/cdb_dataservices_client--0.2.0--0.3.0.sql b/client/old_versions/cdb_dataservices_client--0.2.0--0.3.0.sql similarity index 100% rename from client/cdb_dataservices_client--0.2.0--0.3.0.sql rename to client/old_versions/cdb_dataservices_client--0.2.0--0.3.0.sql diff --git a/client/cdb_dataservices_client--0.3.0--0.2.0.sql b/client/old_versions/cdb_dataservices_client--0.3.0--0.2.0.sql similarity index 100% rename from client/cdb_dataservices_client--0.3.0--0.2.0.sql rename to client/old_versions/cdb_dataservices_client--0.3.0--0.2.0.sql diff --git a/client/cdb_dataservices_client--0.3.0.sql b/client/old_versions/cdb_dataservices_client--0.3.0.sql similarity index 100% rename from client/cdb_dataservices_client--0.3.0.sql rename to client/old_versions/cdb_dataservices_client--0.3.0.sql From 06e8752c332a98e0bebac3449a26c0b281957ae6 Mon Sep 17 00:00:00 2001 From: Mario de Frutos Date: Wed, 20 Apr 2016 16:04:40 +0200 Subject: [PATCH 6/6] Server version 0.7.0 --- server/extension/Makefile | 4 +- .../cdb_dataservices_server--0.6.2--0.7.0.sql | 93 ++ .../cdb_dataservices_server--0.7.0--0.6.2.sql | 6 + .../cdb_dataservices_server--0.7.0.sql | 1109 +++++++++++++++++ .../extension/cdb_dataservices_server.control | 2 +- .../cdb_dataservices_server--0.6.1--0.6.2.sql | 0 .../cdb_dataservices_server--0.6.2--0.6.1.sql | 0 .../cdb_dataservices_server--0.6.2.sql | 0 8 files changed, 1211 insertions(+), 3 deletions(-) create mode 100644 server/extension/cdb_dataservices_server--0.6.2--0.7.0.sql create mode 100644 server/extension/cdb_dataservices_server--0.7.0--0.6.2.sql create mode 100644 server/extension/cdb_dataservices_server--0.7.0.sql rename server/extension/{ => old_versions}/cdb_dataservices_server--0.6.1--0.6.2.sql (100%) rename server/extension/{ => old_versions}/cdb_dataservices_server--0.6.2--0.6.1.sql (100%) rename server/extension/{ => old_versions}/cdb_dataservices_server--0.6.2.sql (100%) diff --git a/server/extension/Makefile b/server/extension/Makefile index 9e00c53..ca57d6e 100644 --- a/server/extension/Makefile +++ b/server/extension/Makefile @@ -13,8 +13,8 @@ OLD_VERSIONS = $(wildcard old_versions/*.sql) # @see http://www.postgresql.org/docs/current/static/extend-pgxs.html DATA = $(NEW_EXTENSION_ARTIFACT) \ $(OLD_VERSIONS) \ - cdb_dataservices_server--0.6.2--0.6.1.sql \ - cdb_dataservices_server--0.6.1--0.6.2.sql + cdb_dataservices_server--0.6.2--0.7.0.sql \ + cdb_dataservices_server--0.7.0--0.6.2.sql REGRESS = $(notdir $(basename $(wildcard test/sql/*test.sql))) TEST_DIR = test/ diff --git a/server/extension/cdb_dataservices_server--0.6.2--0.7.0.sql b/server/extension/cdb_dataservices_server--0.6.2--0.7.0.sql new file mode 100644 index 0000000..7edf6f4 --- /dev/null +++ b/server/extension/cdb_dataservices_server--0.6.2--0.7.0.sql @@ -0,0 +1,93 @@ +--DO NOT MODIFY THIS FILE, IT IS GENERATED AUTOMATICALLY FROM SOURCES +-- Complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "ALTER EXTENSION cdb_dataservices_server UPDATE TO '0.7.0'" to load this file. \quit +CREATE OR REPLACE FUNCTION cdb_dataservices_server._get_data_observatory_config(username text, orgname text) +RETURNS boolean AS $$ + cache_key = "user_data_observatory_config_{0}".format(username) + if cache_key in GD: + return False + else: + from cartodb_services.metrics import DataObservatoryConfig + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metadata_connection'] + data_observatory_config = DataObservatoryConfig(redis_conn, plpy, username, orgname) + GD[cache_key] = data_observatory_config + return True +$$ LANGUAGE plpythonu SECURITY DEFINER; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server.obs_get_demographic_snapshot( + username TEXT, + orgname TEXT, + geom geometry(Geometry, 4326), + time_span TEXT DEFAULT '2009 - 2013', + geometry_level TEXT DEFAULT '"us.census.tiger".block_group') +RETURNS json AS $$ + from cartodb_services.metrics import QuotaService + import json + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_data_observatory_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_data_observatory_config = GD["user_data_observatory_config_{0}".format(username)] + + quota_service = QuotaService(user_data_observatory_config, redis_conn) + if not quota_service.check_user_quota(): + plpy.error('You have reached the limit of your quota') + + try: + obs_plan = plpy.prepare("SELECT cdb_observatory.OBS_GetDemographicSnapshot($1, $2, $3) as snapshot;", ["geometry(Geometry, 4326)", "text", "text"]) + result = plpy.execute(obs_plan, [geom, time_span, geometry_level]) + if result: + quota_service.increment_success_service_use() + return result[0]['snapshot'] + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to use get_geographic_snapshot: {0}'.format(e) + plpy.notice(traceback.format_exception(type_, value_, traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server.obs_get_segment_snapshot( + username TEXT, + orgname TEXT, + geom geometry(Geometry, 4326), + geometry_level TEXT DEFAULT '"us.census.tiger".block_group') +RETURNS json AS $$ + from cartodb_services.metrics import QuotaService + import json + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_data_observatory_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_data_observatory_config = GD["user_data_observatory_config_{0}".format(username)] + + quota_service = QuotaService(user_data_observatory_config, redis_conn) + if not quota_service.check_user_quota(): + plpy.error('You have reached the limit of your quota') + + try: + obs_plan = plpy.prepare("SELECT cdb_observatory.OBS_GetSegmentSnapshot($1, $2) as snapshot;", ["geometry(Geometry, 4326)", "text"]) + result = plpy.execute(obs_plan, [geom, geometry_level]) + if result: + quota_service.increment_success_service_use() + return result[0]['snapshot'] + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to use get_segment_snapshot: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; \ No newline at end of file diff --git a/server/extension/cdb_dataservices_server--0.7.0--0.6.2.sql b/server/extension/cdb_dataservices_server--0.7.0--0.6.2.sql new file mode 100644 index 0000000..ce9e7ac --- /dev/null +++ b/server/extension/cdb_dataservices_server--0.7.0--0.6.2.sql @@ -0,0 +1,6 @@ +--DO NOT MODIFY THIS FILE, IT IS GENERATED AUTOMATICALLY FROM SOURCES +-- Complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "ALTER EXTENSION cdb_dataservices_server UPDATE TO '0.6.2'" to load this file. \quit +DROP FUNCTION IF EXISTS cdb_dataservices_server._get_data_observatory_config(text, text); +DROP FUNCTION IF EXISTS cdb_dataservices_server.cdb_do_get_demographic_snapshot(TEXT, TEXT, geometry(Geometry, 4326), TEXT, TEXT); +DROP FUNCTION IF EXISTS cdb_dataservices_server.cdb_do_get_segment_snapshot(TEXT, TEXT, geometry(Geometry, 4326), TEXT); \ No newline at end of file diff --git a/server/extension/cdb_dataservices_server--0.7.0.sql b/server/extension/cdb_dataservices_server--0.7.0.sql new file mode 100644 index 0000000..31a4230 --- /dev/null +++ b/server/extension/cdb_dataservices_server--0.7.0.sql @@ -0,0 +1,1109 @@ +--DO NOT MODIFY THIS FILE, IT IS GENERATED AUTOMATICALLY FROM SOURCES +-- Complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION cdb_dataservices_server" to load this file. \quit +CREATE TYPE cdb_dataservices_server.simple_route AS ( + shape geometry(LineString,4326), + length real, + duration integer +); + + +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_mapzen_route_point_to_point( + username TEXT, + orgname TEXT, + origin geometry(Point, 4326), + destination geometry(Point, 4326), + mode TEXT, + options text[] DEFAULT ARRAY[]::text[], + units text DEFAULT 'kilometers') +RETURNS cdb_dataservices_server.simple_route AS $$ + import json + from cartodb_services.mapzen import MapzenRouting, MapzenRoutingResponse + from cartodb_services.mapzen.types import polyline_to_linestring + from cartodb_services.metrics import QuotaService + from cartodb_services.tools import Coordinate + + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + user_routing_config = GD["user_routing_config_{0}".format(username)] + + quota_service = QuotaService(user_routing_config, redis_conn) + if not quota_service.check_user_quota(): + plpy.error('You have reached the limit of your quota') + + try: + client = MapzenRouting(user_routing_config.mapzen_api_key) + + if not origin or not destination: + plpy.notice("Empty origin or destination") + quota_service.increment_empty_service_use() + return [None, None, None] + + orig_lat = plpy.execute("SELECT ST_Y('%s') AS lat" % origin)[0]['lat'] + orig_lon = plpy.execute("SELECT ST_X('%s') AS lon" % origin)[0]['lon'] + origin_coordinates = Coordinate(orig_lon, orig_lat) + dest_lat = plpy.execute("SELECT ST_Y('%s') AS lat" % destination)[0]['lat'] + dest_lon = plpy.execute("SELECT ST_X('%s') AS lon" % destination)[0]['lon'] + dest_coordinates = Coordinate(dest_lon, dest_lat) + + resp = client.calculate_route_point_to_point(origin_coordinates, dest_coordinates, mode, options, units) + + if resp and resp.shape: + shape_linestring = polyline_to_linestring(resp.shape) + if shape_linestring: + quota_service.increment_success_service_use() + return [shape_linestring, resp.length, resp.duration] + else: + quota_service.increment_empty_service_use() + return [None, None, None] + else: + quota_service.increment_empty_service_use() + return [None, None, None] + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to obtain route using mapzen provider: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu SECURITY DEFINER; +CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_route_point_to_point( + username TEXT, + orgname TEXT, + origin geometry(Point, 4326), + destination geometry(Point, 4326), + mode TEXT, + options text[] DEFAULT ARRAY[]::text[], + units text DEFAULT 'kilometers') +RETURNS cdb_dataservices_server.simple_route AS $$ + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_routing_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_routing_config = GD["user_routing_config_{0}".format(username)] + + mapzen_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapzen_route_point_to_point($1, $2, $3, $4, $5, $6, $7) as route;", ["text", "text", "geometry(Point, 4326)", "geometry(Point, 4326)", "text", "text[]", "text"]) + result = plpy.execute(mapzen_plan, [username, orgname, origin, destination, mode, options, units]) + return [result[0]['shape'],result[0]['length'], result[0]['duration']] +$$ LANGUAGE plpythonu; +-- Get the connection to redis from cache or create a new one +CREATE OR REPLACE FUNCTION cdb_dataservices_server._connect_to_redis(user_id text) +RETURNS boolean AS $$ + cache_key = "redis_connection_{0}".format(user_id) + if cache_key in GD: + return False + else: + from cartodb_services.tools import RedisConnection, RedisDBConfig + metadata_config = RedisDBConfig('redis_metadata_config', plpy) + metrics_config = RedisDBConfig('redis_metrics_config', plpy) + redis_metadata_connection = RedisConnection(metadata_config).redis_connection() + redis_metrics_connection = RedisConnection(metrics_config).redis_connection() + GD[cache_key] = { + 'redis_metadata_connection': redis_metadata_connection, + 'redis_metrics_connection': redis_metrics_connection, + } + return True +$$ LANGUAGE plpythonu SECURITY DEFINER; +CREATE OR REPLACE FUNCTION cdb_dataservices_server.obs_get_demographic_snapshot( + username TEXT, + orgname TEXT, + geom geometry(Geometry, 4326), + time_span TEXT DEFAULT '2009 - 2013', + geometry_level TEXT DEFAULT '"us.census.tiger".block_group') +RETURNS json AS $$ + from cartodb_services.metrics import QuotaService + import json + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_data_observatory_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_data_observatory_config = GD["user_data_observatory_config_{0}".format(username)] + + quota_service = QuotaService(user_data_observatory_config, redis_conn) + if not quota_service.check_user_quota(): + plpy.error('You have reached the limit of your quota') + + try: + obs_plan = plpy.prepare("SELECT cdb_observatory.OBS_GetDemographicSnapshot($1, $2, $3) as snapshot;", ["geometry(Geometry, 4326)", "text", "text"]) + result = plpy.execute(obs_plan, [geom, time_span, geometry_level]) + if result: + quota_service.increment_success_service_use() + return result[0]['snapshot'] + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to use get_geographic_snapshot: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server.obs_get_segment_snapshot( + username TEXT, + orgname TEXT, + geom geometry(Geometry, 4326), + geometry_level TEXT DEFAULT '"us.census.tiger".block_group') +RETURNS json AS $$ + from cartodb_services.metrics import QuotaService + import json + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_data_observatory_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_data_observatory_config = GD["user_data_observatory_config_{0}".format(username)] + + quota_service = QuotaService(user_data_observatory_config, redis_conn) + if not quota_service.check_user_quota(): + plpy.error('You have reached the limit of your quota') + + try: + obs_plan = plpy.prepare("SELECT cdb_observatory.OBS_GetSegmentSnapshot($1, $2) as snapshot;", ["geometry(Geometry, 4326)", "text"]) + result = plpy.execute(obs_plan, [geom, geometry_level]) + if result: + quota_service.increment_success_service_use() + return result[0]['snapshot'] + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to use get_segment_snapshot: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu;CREATE OR REPLACE FUNCTION cdb_dataservices_server._get_geocoder_config(username text, orgname text) +RETURNS boolean AS $$ + cache_key = "user_geocoder_config_{0}".format(username) + if cache_key in GD: + return False + else: + from cartodb_services.metrics import GeocoderConfig + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metadata_connection'] + geocoder_config = GeocoderConfig(redis_conn, plpy, username, orgname) + GD[cache_key] = geocoder_config + return True +$$ LANGUAGE plpythonu SECURITY DEFINER; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server._get_internal_geocoder_config(username text, orgname text) +RETURNS boolean AS $$ + cache_key = "user_internal_geocoder_config_{0}".format(username) + if cache_key in GD: + return False + else: + from cartodb_services.metrics import InternalGeocoderConfig + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metadata_connection'] + geocoder_config = InternalGeocoderConfig(redis_conn, plpy, username, orgname) + GD[cache_key] = geocoder_config + return True +$$ LANGUAGE plpythonu SECURITY DEFINER; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server._get_isolines_routing_config(username text, orgname text) +RETURNS boolean AS $$ + cache_key = "user_isolines_routing_config_{0}".format(username) + if cache_key in GD: + return False + else: + from cartodb_services.metrics import IsolinesRoutingConfig + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metadata_connection'] + isolines_routing_config = IsolinesRoutingConfig(redis_conn, plpy, username, orgname) + GD[cache_key] = isolines_routing_config + return True +$$ LANGUAGE plpythonu SECURITY DEFINER; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server._get_routing_config(username text, orgname text) +RETURNS boolean AS $$ + cache_key = "user_routing_config_{0}".format(username) + if cache_key in GD: + return False + else: + from cartodb_services.metrics import RoutingConfig + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metadata_connection'] + routing_config = RoutingConfig(redis_conn, plpy, username, orgname) + GD[cache_key] = routing_config + return True +$$ LANGUAGE plpythonu SECURITY DEFINER; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server._get_data_observatory_config(username text, orgname text) +RETURNS boolean AS $$ + cache_key = "user_data_observatory_config_{0}".format(username) + if cache_key in GD: + return False + else: + from cartodb_services.metrics import DataObservatoryConfig + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metadata_connection'] + data_observatory_config = DataObservatoryConfig(redis_conn, plpy, username, orgname) + GD[cache_key] = data_observatory_config + return True +$$ LANGUAGE plpythonu SECURITY DEFINER; +-- Geocodes a street address given a searchtext and a state and/or country +CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_street_point(username TEXT, orgname TEXT, searchtext TEXT, city TEXT DEFAULT NULL, state_province TEXT DEFAULT NULL, country TEXT DEFAULT NULL) +RETURNS Geometry AS $$ + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_geocoder_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_geocoder_config = GD["user_geocoder_config_{0}".format(username)] + + if user_geocoder_config.heremaps_geocoder: + here_plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_here_geocode_street_point($1, $2, $3, $4, $5, $6) as point; ", ["text", "text", "text", "text", "text", "text"]) + return plpy.execute(here_plan, [username, orgname, searchtext, city, state_province, country], 1)[0]['point'] + elif user_geocoder_config.google_geocoder: + google_plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_google_geocode_street_point($1, $2, $3, $4, $5, $6) as point; ", ["text", "text", "text", "text", "text", "text"]) + return plpy.execute(google_plan, [username, orgname, searchtext, city, state_province, country], 1)[0]['point'] + elif user_geocoder_config.mapzen_geocoder: + mapzen_plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_mapzen_geocode_street_point($1, $2, $3, $4, $5, $6) as point; ", ["text", "text", "text", "text", "text", "text"]) + return plpy.execute(mapzen_plan, [username, orgname, searchtext, city, state_province, country], 1)[0]['point'] + else: + plpy.error('Requested geocoder is not available') + +$$ LANGUAGE plpythonu; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_here_geocode_street_point(username TEXT, orgname TEXT, searchtext TEXT, city TEXT DEFAULT NULL, state_province TEXT DEFAULT NULL, country TEXT DEFAULT NULL) +RETURNS Geometry AS $$ + from cartodb_services.here import HereMapsGeocoder + from cartodb_services.metrics import QuotaService + + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + user_geocoder_config = GD["user_geocoder_config_{0}".format(username)] + + # -- Check the quota + quota_service = QuotaService(user_geocoder_config, redis_conn) + if not quota_service.check_user_quota(): + plpy.error('You have reached the limit of your quota') + + try: + geocoder = HereMapsGeocoder(user_geocoder_config.heremaps_app_id, user_geocoder_config.heremaps_app_code) + coordinates = geocoder.geocode(searchtext=searchtext, city=city, state=state_province, country=country) + if coordinates: + quota_service.increment_success_service_use() + plan = plpy.prepare("SELECT ST_SetSRID(ST_MakePoint($1, $2), 4326); ", ["double precision", "double precision"]) + point = plpy.execute(plan, [coordinates[0], coordinates[1]], 1)[0] + return point['st_setsrid'] + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to geocode using here maps geocoder: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_google_geocode_street_point(username TEXT, orgname TEXT, searchtext TEXT, city TEXT DEFAULT NULL, state_province TEXT DEFAULT NULL, country TEXT DEFAULT NULL) +RETURNS Geometry AS $$ + from cartodb_services.google import GoogleMapsGeocoder + from cartodb_services.metrics import QuotaService + + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + user_geocoder_config = GD["user_geocoder_config_{0}".format(username)] + quota_service = QuotaService(user_geocoder_config, redis_conn) + + try: + geocoder = GoogleMapsGeocoder(user_geocoder_config.google_client_id, user_geocoder_config.google_api_key) + coordinates = geocoder.geocode(searchtext=searchtext, city=city, state=state_province, country=country) + if coordinates: + quota_service.increment_success_service_use() + plan = plpy.prepare("SELECT ST_SetSRID(ST_MakePoint($1, $2), 4326); ", ["double precision", "double precision"]) + point = plpy.execute(plan, [coordinates[0], coordinates[1]], 1)[0] + return point['st_setsrid'] + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to geocode using google maps geocoder: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_mapzen_geocode_street_point(username TEXT, orgname TEXT, searchtext TEXT, city TEXT DEFAULT NULL, state_province TEXT DEFAULT NULL, country TEXT DEFAULT NULL) +RETURNS Geometry AS $$ + from cartodb_services.mapzen import MapzenGeocoder + from cartodb_services.mapzen.types import country_to_iso3 + from cartodb_services.metrics import QuotaService + + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + user_geocoder_config = GD["user_geocoder_config_{0}".format(username)] + quota_service = QuotaService(user_geocoder_config, redis_conn) + if not quota_service.check_user_quota(): + plpy.error('You have reached the limit of your quota') + + try: + geocoder = MapzenGeocoder(user_geocoder_config.mapzen_api_key) + country_iso3 = None + if country: + country_iso3 = country_to_iso3(country) + coordinates = geocoder.geocode(searchtext=searchtext, city=city, + state_province=state_province, + country=country_iso3) + if coordinates: + quota_service.increment_success_service_use() + plan = plpy.prepare("SELECT ST_SetSRID(ST_MakePoint($1, $2), 4326); ", ["double precision", "double precision"]) + point = plpy.execute(plan, [coordinates[0], coordinates[1]], 1)[0] + return point['st_setsrid'] + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to geocode using mapzen geocoder: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; +CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_admin0_polygon(username text, orgname text, country_name text) +RETURNS Geometry AS $$ + from cartodb_services.metrics import QuotaService + from cartodb_services.metrics import InternalGeocoderConfig + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_internal_geocoder_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_geocoder_config = GD["user_internal_geocoder_config_{0}".format(username)] + + quota_service = QuotaService(user_geocoder_config, redis_conn) + try: + plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_geocode_admin0_polygon(trim($1)) AS mypolygon", ["text"]) + rv = plpy.execute(plan, [country_name], 1) + result = rv[0]["mypolygon"] + if result: + quota_service.increment_success_service_use() + return result + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to geocode using admin0 geocoder: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + + +-------------------------------------------------------------------------------- + +-- Implementation of the server extension +-- Note: these functions depend on the cdb_geocoder extension +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_geocode_admin0_polygon(country_name text) +RETURNS Geometry AS $$ + DECLARE + ret Geometry; + BEGIN + SELECT n.the_geom as geom INTO ret + FROM (SELECT q, lower(regexp_replace(q, '[^a-zA-Z\u00C0-\u00ff]+', '', 'g'))::text x + FROM (SELECT country_name q) g) d + LEFT OUTER JOIN admin0_synonyms s ON name_ = d.x + LEFT OUTER JOIN ne_admin0_v3 n ON s.adm0_a3 = n.adm0_a3 GROUP BY d.q, n.the_geom, s.adm0_a3; + + RETURN ret; + END +$$ LANGUAGE plpgsql; +---- cdb_geocode_admin1_polygon(admin1_name text) +CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_admin1_polygon(username text, orgname text, admin1_name text) +RETURNS Geometry AS $$ + from cartodb_services.metrics import QuotaService + from cartodb_services.metrics import InternalGeocoderConfig + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_internal_geocoder_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_geocoder_config = GD["user_internal_geocoder_config_{0}".format(username)] + + quota_service = QuotaService(user_geocoder_config, redis_conn) + try: + plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_geocode_admin1_polygon(trim($1)) AS mypolygon", ["text"]) + rv = plpy.execute(plan, [admin1_name], 1) + result = rv[0]["mypolygon"] + if result: + quota_service.increment_success_service_use() + return result + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to geocode using admin0 geocoder: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + +---- cdb_geocode_admin1_polygon(admin1_name text, country_name text) +CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_admin1_polygon(username text, orgname text, admin1_name text, country_name text) +RETURNS Geometry AS $$ + from cartodb_services.metrics import QuotaService + from cartodb_services.metrics import InternalGeocoderConfig + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_internal_geocoder_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_geocoder_config = GD["user_internal_geocoder_config_{0}".format(username)] + + quota_service = QuotaService(user_geocoder_config, redis_conn) + try: + plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_geocode_admin1_polygon(trim($1), trim($2)) AS mypolygon", ["text", "text"]) + rv = plpy.execute(plan, [admin1_name, country_name], 1) + result = rv[0]["mypolygon"] + if result: + quota_service.increment_success_service_use() + return result + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to geocode using admin0 geocoder: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + +-------------------------------------------------------------------------------- + +-- Implementation of the server extension +-- Note: these functions depend on the cdb_geocoder extension + +---- cdb_geocode_admin1_polygon(admin1_name text) +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_geocode_admin1_polygon(admin1_name text) +RETURNS Geometry AS $$ + DECLARE + ret Geometry; + BEGIN + SELECT geom INTO ret + FROM ( + SELECT q, ( + SELECT the_geom + FROM global_province_polygons + WHERE d.c = ANY (synonyms) + ORDER BY frequency DESC LIMIT 1 + ) geom + FROM ( + SELECT + trim(replace(lower(admin1_name),'.',' ')) c, admin1_name q + ) d + ) v; + + RETURN ret; + END +$$ LANGUAGE plpgsql; + +---- cdb_geocode_admin1_polygon(admin1_name text, country_name text) +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_geocode_admin1_polygon(admin1_name text, country_name text) +RETURNS Geometry AS $$ + DECLARE + ret Geometry; + BEGIN + WITH p AS (SELECT r.c, r.q, (SELECT iso3 FROM country_decoder WHERE lower(country_name) = ANY (synonyms)) i FROM (SELECT trim(replace(lower(admin1_name),'.',' ')) c, country_name q) r) + SELECT + geom INTO ret + FROM ( + SELECT + q, ( + SELECT the_geom + FROM global_province_polygons + WHERE p.c = ANY (synonyms) + AND iso3 = p.i + ORDER BY frequency DESC LIMIT 1 + ) geom + FROM p) n; + + RETURN ret; + END +$$ LANGUAGE plpgsql; + +---- cdb_geocode_namedplace_point(city_name text) +CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_namedplace_point(username text, orgname text, city_name text) +RETURNS Geometry AS $$ + from cartodb_services.metrics import QuotaService + from cartodb_services.metrics import InternalGeocoderConfig + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_internal_geocoder_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_geocoder_config = GD["user_internal_geocoder_config_{0}".format(username)] + + quota_service = QuotaService(user_geocoder_config, redis_conn) + try: + plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_geocode_namedplace_point(trim($1)) AS mypoint", ["text"]) + rv = plpy.execute(plan, [city_name], 1) + result = rv[0]["mypoint"] + if result: + quota_service.increment_success_service_use() + return result + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to geocode using admin0 geocoder: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + +---- cdb_geocode_namedplace_point(city_name text, country_name text) +CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_namedplace_point(username text, orgname text, city_name text, country_name text) +RETURNS Geometry AS $$ + from cartodb_services.metrics import QuotaService + from cartodb_services.metrics import InternalGeocoderConfig + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_internal_geocoder_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_geocoder_config = GD["user_internal_geocoder_config_{0}".format(username)] + + quota_service = QuotaService(user_geocoder_config, redis_conn) + try: + plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_geocode_namedplace_point(trim($1), trim($2)) AS mypoint", ["text", "text"]) + rv = plpy.execute(plan, [city_name, country_name], 1) + result = rv[0]["mypoint"] + if result: + quota_service.increment_success_service_use() + return result + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to geocode using admin0 geocoder: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + +---- cdb_geocode_namedplace_point(city_name text, admin1_name text, country_name text) +CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_namedplace_point(username text, orgname text, city_name text, admin1_name text, country_name text) +RETURNS Geometry AS $$ + from cartodb_services.metrics import QuotaService + from cartodb_services.metrics import InternalGeocoderConfig + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_internal_geocoder_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_geocoder_config = GD["user_internal_geocoder_config_{0}".format(username)] + + quota_service = QuotaService(user_geocoder_config, redis_conn) + try: + plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_geocode_namedplace_point(trim($1), trim($2), trim($3)) AS mypoint", ["text", "text", "text"]) + rv = plpy.execute(plan, [city_name, admin1_name, country_name], 1) + result = rv[0]["mypoint"] + if result: + quota_service.increment_success_service_use() + return result + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to geocode using admin0 geocoder: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + +-------------------------------------------------------------------------------- + +-- Implementation of the server extension +-- Note: these functions depend on the cdb_geocoder extension + +---- cdb_geocode_namedplace_point(city_name text) +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_geocode_namedplace_point(city_name text) +RETURNS Geometry AS $$ + DECLARE + ret Geometry; + BEGIN + SELECT geom INTO ret + FROM ( + WITH best AS (SELECT s AS q, (SELECT the_geom FROM global_cities_points_limited gp WHERE gp.lowername = lower(p.s) ORDER BY population DESC LIMIT 1) AS geom FROM (SELECT city_name as s) p), + next AS (SELECT p.s AS q, (SELECT gp.the_geom FROM global_cities_points_limited gp, global_cities_alternates_limited ga WHERE lower(p.s) = ga.lowername AND ga.geoname_id = gp.geoname_id ORDER BY preferred DESC LIMIT 1) geom FROM (SELECT city_name as s) p WHERE p.s NOT IN (SELECT q FROM best WHERE geom IS NOT NULL)) + SELECT q, geom, TRUE AS success FROM best WHERE geom IS NOT NULL + UNION ALL + SELECT q, geom, CASE WHEN geom IS NULL THEN FALSE ELSE TRUE END AS success FROM next + ) v; + + RETURN ret; + END +$$ LANGUAGE plpgsql; + +---- cdb_geocode_namedplace_point(city_name text, country_name text) +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_geocode_namedplace_point(city_name text, country_name text) +RETURNS Geometry AS $$ + DECLARE + ret Geometry; + BEGIN + SELECT geom INTO ret + FROM ( + WITH p AS (SELECT r.s, r.c, (SELECT iso2 FROM country_decoder WHERE lower(r.c) = ANY (synonyms)) i FROM (SELECT city_name AS s, country_name::text AS c) r), + best AS (SELECT p.s AS q, p.c AS c, (SELECT gp.the_geom AS geom FROM global_cities_points_limited gp WHERE gp.lowername = lower(p.s) AND gp.iso2 = p.i ORDER BY population DESC LIMIT 1) AS geom FROM p), + next AS (SELECT p.s AS q, p.c AS c, (SELECT gp.the_geom FROM global_cities_points_limited gp, global_cities_alternates_limited ga WHERE lower(p.s) = ga.lowername AND gp.iso2 = p.i AND ga.geoname_id = gp.geoname_id ORDER BY preferred DESC LIMIT 1) geom FROM p WHERE p.s NOT IN (SELECT q FROM best WHERE c = p.c AND geom IS NOT NULL)) + SELECT geom FROM best WHERE geom IS NOT NULL + UNION ALL + SELECT geom FROM next + ) v; + + RETURN ret; + END +$$ LANGUAGE plpgsql; + +---- cdb_geocode_namedplace_point(city_name text, admin1_name text, country_name text) +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_geocode_namedplace_point(city_name text, admin1_name text, country_name text) +RETURNS Geometry AS $$ + DECLARE + ret Geometry; + BEGIN + SELECT geom INTO ret + FROM ( + WITH inputcountry AS ( + SELECT iso2 as isoTwo FROM country_decoder WHERE lower(country_name) = ANY (synonyms) LIMIT 1 + ), + p AS ( + SELECT r.s, r.a1, (SELECT admin1 FROM admin1_decoder, inputcountry WHERE lower(r.a1) = ANY (synonyms) AND admin1_decoder.iso2 = inputcountry.isoTwo LIMIT 1) i FROM (SELECT city_name AS s, admin1_name::text AS a1) r), + best AS (SELECT p.s AS q, p.a1 as a1, (SELECT gp.the_geom AS geom FROM global_cities_points_limited gp WHERE gp.lowername = lower(p.s) AND gp.admin1 = p.i ORDER BY population DESC LIMIT 1) AS geom FROM p), + next AS (SELECT p.s AS q, p.a1 AS a1, (SELECT gp.the_geom FROM global_cities_points_limited gp, global_cities_alternates_limited ga WHERE lower(p.s) = ga.lowername AND ga.admin1 = p.i AND ga.geoname_id = gp.geoname_id ORDER BY preferred DESC LIMIT 1) geom FROM p WHERE p.s NOT IN (SELECT q FROM best WHERE geom IS NOT NULL)) + SELECT geom FROM best WHERE geom IS NOT NULL + UNION ALL + SELECT geom FROM next + ) v; + + RETURN ret; + END +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_postalcode_point(username text, orgname text, code text) +RETURNS Geometry AS $$ + from cartodb_services.metrics import QuotaService + from cartodb_services.metrics import InternalGeocoderConfig + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_internal_geocoder_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_geocoder_config = GD["user_internal_geocoder_config_{0}".format(username)] + + quota_service = QuotaService(user_geocoder_config, redis_conn) + try: + plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_geocode_postalcode_point(trim($1)) AS mypoint", ["text"]) + rv = plpy.execute(plan, [code], 1) + result = rv[0]["mypoint"] + if result: + quota_service.increment_success_service_use() + return result + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to geocode using admin0 geocoder: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_postalcode_point(username text, orgname text, code text, country text) +RETURNS Geometry AS $$ + from cartodb_services.metrics import QuotaService + from cartodb_services.metrics import InternalGeocoderConfig + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_internal_geocoder_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_geocoder_config = GD["user_internal_geocoder_config_{0}".format(username)] + + quota_service = QuotaService(user_geocoder_config, redis_conn) + try: + plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_geocode_postalcode_point(trim($1), trim($2)) AS mypoint", ["TEXT", "TEXT"]) + rv = plpy.execute(plan, [code, country], 1) + result = rv[0]["mypoint"] + if result: + quota_service.increment_success_service_use() + return result + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to geocode using admin0 geocoder: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_postalcode_polygon(username text, orgname text, code text) +RETURNS Geometry AS $$ + from cartodb_services.metrics import QuotaService + from cartodb_services.metrics import InternalGeocoderConfig + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_internal_geocoder_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_geocoder_config = GD["user_internal_geocoder_config_{0}".format(username)] + + quota_service = QuotaService(user_geocoder_config, redis_conn) + try: + plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_geocode_postalcode_polygon(trim($1)) AS mypolygon", ["text"]) + rv = plpy.execute(plan, [code], 1) + result = rv[0]["mypolygon"] + if result: + quota_service.increment_success_service_use() + return result + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to geocode using admin0 geocoder: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_postalcode_polygon(username text, orgname text, code text, country text) +RETURNS Geometry AS $$ + from cartodb_services.metrics import QuotaService + from cartodb_services.metrics import InternalGeocoderConfig + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_internal_geocoder_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_geocoder_config = GD["user_internal_geocoder_config_{0}".format(username)] + + quota_service = QuotaService(user_geocoder_config, redis_conn) + try: + plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_geocode_postalcode_polygon(trim($1), trim($2)) AS mypolygon", ["TEXT", "TEXT"]) + rv = plpy.execute(plan, [code, country], 1) + result = rv[0]["mypolygon"] + if result: + quota_service.increment_success_service_use() + return result + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to geocode using admin0 geocoder: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + +-------------------------------------------------------------------------------- + +-- Implementation of the server extension +-- Note: these functions depend on the cdb_geocoder extension +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_geocode_postalcode_point(code text) +RETURNS Geometry AS $$ + DECLARE + ret Geometry; + BEGIN + SELECT geom INTO ret + FROM ( + SELECT + q, ( + SELECT the_geom + FROM global_postal_code_points + WHERE postal_code = upper(d.q) + LIMIT 1 + ) geom + FROM (SELECT code q) d + ) v; + + RETURN ret; +END +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_geocode_postalcode_point(code text, country text) +RETURNS Geometry AS $$ + DECLARE + ret Geometry; + BEGIN + SELECT geom INTO ret + FROM ( + SELECT + q, ( + SELECT the_geom + FROM global_postal_code_points + WHERE postal_code = upper(d.q) + AND iso3 = ( + SELECT iso3 FROM country_decoder WHERE + lower(country) = ANY (synonyms) LIMIT 1 + ) + LIMIT 1 + ) geom + FROM (SELECT code q) d + ) v; + + RETURN ret; +END +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_geocode_postalcode_polygon(code text) +RETURNS Geometry AS $$ + DECLARE + ret Geometry; + BEGIN + SELECT geom INTO ret + FROM ( + SELECT + q, ( + SELECT the_geom + FROM global_postal_code_polygons + WHERE postal_code = upper(d.q) + LIMIT 1 + ) geom + FROM (SELECT code q) d + ) v; + + RETURN ret; +END +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_geocode_postalcode_polygon(code text, country text) +RETURNS Geometry AS $$ + DECLARE + ret Geometry; + BEGIN + SELECT geom INTO ret + FROM ( + SELECT + q, ( + SELECT the_geom + FROM global_postal_code_polygons + WHERE postal_code = upper(d.q) + AND iso3 = ( + SELECT iso3 FROM country_decoder WHERE + lower(country) = ANY (synonyms) LIMIT 1 + ) + LIMIT 1 + ) geom + FROM (SELECT code q) d + ) v; + + RETURN ret; +END +$$ LANGUAGE plpgsql; +CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_geocode_ipaddress_point(username text, orgname text, ip text) +RETURNS Geometry AS $$ + from cartodb_services.metrics import QuotaService + from cartodb_services.metrics import InternalGeocoderConfig + + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_internal_geocoder_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_geocoder_config = GD["user_internal_geocoder_config_{0}".format(username)] + + quota_service = QuotaService(user_geocoder_config, redis_conn) + try: + plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_geocode_ipaddress_point(trim($1)) AS mypoint", ["TEXT"]) + rv = plpy.execute(plan, [ip], 1) + result = rv[0]["mypoint"] + if result: + quota_service.increment_success_service_use() + return result + else: + quota_service.increment_empty_service_use() + return None + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to geocode using admin0 geocoder: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu; + +-------------------------------------------------------------------------------- + +-- Implementation of the server extension +-- Note: these functions depend on the cdb_geocoder extension +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_geocode_ipaddress_point(ip text) +RETURNS Geometry AS $$ + DECLARE + ret Geometry; + + new_ip INET; + BEGIN + BEGIN + IF family(ip::inet) = 6 THEN + new_ip := ip::inet; + ELSE + new_ip := ('::ffff:' || ip)::inet; + END IF; + EXCEPTION WHEN OTHERS THEN + SELECT NULL as geom INTO ret; + RETURN ret; + END; + + WITH + ips AS (SELECT ip s, new_ip net), + matches AS (SELECT s, (SELECT the_geom FROM ip_address_locations WHERE network_start_ip <= ips.net ORDER BY network_start_ip DESC LIMIT 1) geom FROM ips) + SELECT geom INTO ret + FROM matches; + RETURN ret; +END +$$ LANGUAGE plpgsql; +CREATE TYPE cdb_dataservices_server.isoline AS (center geometry(Geometry,4326), data_range integer, the_geom geometry(Multipolygon,4326)); + +CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_here_routing_isolines(username TEXT, orgname TEXT, type TEXT, source geometry(Geometry, 4326), mode TEXT, data_range integer[], options text[]) +RETURNS SETOF cdb_dataservices_server.isoline AS $$ + import json + from cartodb_services.here import HereMapsRoutingIsoline + from cartodb_services.metrics import QuotaService + from cartodb_services.here.types import geo_polyline_to_multipolygon + + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + user_isolines_routing_config = GD["user_isolines_routing_config_{0}".format(username)] + + # -- Check the quota + quota_service = QuotaService(user_isolines_routing_config, redis_conn) + if not quota_service.check_user_quota(): + plpy.error('You have reached the limit of your quota') + + try: + client = HereMapsRoutingIsoline(user_isolines_routing_config.heremaps_app_id, user_isolines_routing_config.heremaps_app_code, base_url = HereMapsRoutingIsoline.PRODUCTION_ROUTING_BASE_URL) + + if source: + lat = plpy.execute("SELECT ST_Y('%s') AS lat" % source)[0]['lat'] + lon = plpy.execute("SELECT ST_X('%s') AS lon" % source)[0]['lon'] + source_str = 'geo!%f,%f' % (lat, lon) + else: + source_str = None + + if type == 'isodistance': + resp = client.calculate_isodistance(source_str, mode, data_range, options) + elif type == 'isochrone': + resp = client.calculate_isochrone(source_str, mode, data_range, options) + + if resp: + result = [] + for isoline in resp: + data_range_n = isoline['range'] + polyline = isoline['geom'] + multipolygon = geo_polyline_to_multipolygon(polyline) + result.append([source, data_range_n, multipolygon]) + quota_service.increment_success_service_use() + quota_service.increment_isolines_service_use(len(resp)) + return result + else: + quota_service.increment_empty_service_use() + except BaseException as e: + import sys, traceback + type_, value_, traceback_ = sys.exc_info() + quota_service.increment_failed_service_use() + error_msg = 'There was an error trying to obtain isodistances using here maps geocoder: {0}'.format(e) + plpy.notice(traceback.format_tb(traceback_)) + plpy.error(error_msg) + finally: + quota_service.increment_total_service_use() +$$ LANGUAGE plpythonu SECURITY DEFINER; +CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_isodistance(username TEXT, orgname TEXT, source geometry(Geometry, 4326), mode TEXT, range integer[], options text[] DEFAULT array[]::text[]) +RETURNS SETOF cdb_dataservices_server.isoline AS $$ + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_isolines_routing_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_isolines_config = GD["user_isolines_routing_config_{0}".format(username)] + type = 'isodistance' + + if user_isolines_config.google_services_user: + plpy.error('This service is not available for google service users.') + + here_plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_here_routing_isolines($1, $2, $3, $4, $5, $6, $7) as isoline; ", ["text", "text", "text", "geometry(Geometry, 4326)", "text", "integer[]", "text[]"]) + result = plpy.execute(here_plan, [username, orgname, type, source, mode, range, options]) + isolines = [] + for element in result: + isoline = element['isoline'] + isoline = isoline.translate(None, "()").split(',') + isolines.append(isoline) + + return isolines +$$ LANGUAGE plpythonu; +CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_isochrone(username TEXT, orgname TEXT, source geometry(Geometry, 4326), mode TEXT, range integer[], options text[] DEFAULT array[]::text[]) +RETURNS SETOF cdb_dataservices_server.isoline AS $$ + plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_dataservices_server._get_isolines_routing_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname))) + user_isolines_config = GD["user_isolines_routing_config_{0}".format(username)] + type = 'isochrone' + + if user_isolines_config.google_services_user: + plpy.error('This service is not available for google service users.') + + here_plan = plpy.prepare("SELECT cdb_dataservices_server._cdb_here_routing_isolines($1, $2, $3, $4, $5, $6, $7) as isoline; ", ["text", "text", "text", "geometry(Geometry, 4326)", "text", "integer[]", "text[]"]) + result = plpy.execute(here_plan, [username, orgname, type, source, mode, range, options]) + isolines = [] + for element in result: + isoline = element['isoline'] + isoline = isoline.translate(None, "()").split(',') + isolines.append(isoline) + + return isolines +$$ LANGUAGE plpythonu; +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT * + FROM pg_catalog.pg_user + WHERE usename = 'geocoder_api') THEN + + CREATE USER geocoder_api; + END IF; + GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA cdb_dataservices_server TO geocoder_api; + GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO geocoder_api; + GRANT USAGE ON SCHEMA cdb_dataservices_server TO geocoder_api; + GRANT USAGE ON SCHEMA public TO geocoder_api; + GRANT SELECT ON ALL TABLES IN SCHEMA public TO geocoder_api; +END$$; diff --git a/server/extension/cdb_dataservices_server.control b/server/extension/cdb_dataservices_server.control index a276382..23be467 100644 --- a/server/extension/cdb_dataservices_server.control +++ b/server/extension/cdb_dataservices_server.control @@ -1,5 +1,5 @@ comment = 'CartoDB dataservices server extension' -default_version = '0.6.2' +default_version = '0.7.0' requires = 'plpythonu, postgis, cdb_geocoder' superuser = true schema = cdb_dataservices_server diff --git a/server/extension/cdb_dataservices_server--0.6.1--0.6.2.sql b/server/extension/old_versions/cdb_dataservices_server--0.6.1--0.6.2.sql similarity index 100% rename from server/extension/cdb_dataservices_server--0.6.1--0.6.2.sql rename to server/extension/old_versions/cdb_dataservices_server--0.6.1--0.6.2.sql diff --git a/server/extension/cdb_dataservices_server--0.6.2--0.6.1.sql b/server/extension/old_versions/cdb_dataservices_server--0.6.2--0.6.1.sql similarity index 100% rename from server/extension/cdb_dataservices_server--0.6.2--0.6.1.sql rename to server/extension/old_versions/cdb_dataservices_server--0.6.2--0.6.1.sql diff --git a/server/extension/cdb_dataservices_server--0.6.2.sql b/server/extension/old_versions/cdb_dataservices_server--0.6.2.sql similarity index 100% rename from server/extension/cdb_dataservices_server--0.6.2.sql rename to server/extension/old_versions/cdb_dataservices_server--0.6.2.sql