From 6c3555f21a20b4ca2c24d94a3fa3de5b5f6c31e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Ignacio=20S=C3=A1nchez=20Lara?= Date: Mon, 17 Aug 2015 11:49:31 +0200 Subject: [PATCH] Configuration parameters refactor --- scripts-available/CDB_Groups_API.sql | 65 +++++++++++++++++++++------- 1 file changed, 49 insertions(+), 16 deletions(-) diff --git a/scripts-available/CDB_Groups_API.sql b/scripts-available/CDB_Groups_API.sql index 4aa4880..74a2a41 100644 --- a/scripts-available/CDB_Groups_API.sql +++ b/scripts-available/CDB_Groups_API.sql @@ -6,21 +6,18 @@ FUNCTION cartodb._CDB_Group_CreateGroup_API(database_name text, group_name text, RETURNS VOID AS $$ import httplib - import base64 import string - import json try: - conf = plpy.execute("SELECT cartodb.CDB_Conf_GetConf('groups_api') conf")[0]['conf'] - if conf is None: + params = plpy.execute("select c.host, c.port, c.timeout, c.username, c.password from cartodb._CDB_Group_API_Conf() c;")[0] + if params['host'] is None: return - params = json.loads(conf) + client = httplib.HTTPConnection(params['host'], params['port'], False, params['timeout']) - url = '/api/v1/databases/%s/groups' % database_name body = '{ "name": "%s", "database_role": "%s" }' % (group_name, group_role) - auth = base64.encodestring('%s:%s' % (params['username'], params['password'])).replace('\n', '') + auth = plpy.execute("SELECT cartodb._CDB_Group_API_Auth('%s', '%s') as auth" % (params['username'], params['password']))[0]['auth'] headers = { 'Authorization': ('Basic %s' % auth), 'Content-Type': 'application/json' } - client.request('POST', url, body, headers) + client.request('POST', '/api/v1/databases/%s/groups' % database_name, body, headers) response = client.getresponse() assert response.status == 200 except Exception as err: @@ -34,20 +31,17 @@ FUNCTION cartodb._CDB_Group_DropGroup_API(database_name text, group_name text) RETURNS VOID AS $$ import httplib - import base64 import string - import json try: - conf = plpy.execute("SELECT cartodb.CDB_Conf_GetConf('groups_api') conf")[0]['conf'] - if conf is None: + params = plpy.execute("select c.host, c.port, c.timeout, c.username, c.password from cartodb._CDB_Group_API_Conf() c;")[0] + if params['host'] is None: return - params = json.loads(conf) + client = httplib.HTTPConnection(params['host'], params['port'], False, params['timeout']) - url = '/api/v1/databases/%s/groups/%s' % (database_name, group_name) - auth = base64.encodestring('%s:%s' % (params['username'], params['password'])).replace('\n', '') + auth = plpy.execute("SELECT cartodb._CDB_Group_API_Auth('%s', '%s') as auth" % (params['username'], params['password']))[0]['auth'] headers = { 'Authorization': ('Basic %s' % auth), 'Content-Type': 'application/json' } - client.request('DELETE', url, '', headers) + client.request('DELETE', '/api/v1/databases/%s/groups/%s' % (database_name, group_name), '', headers) response = client.getresponse() assert response.status == 200 except Exception as err: @@ -55,3 +49,42 @@ $$ raise err $$ LANGUAGE 'plpythonu' VOLATILE; + +DO LANGUAGE 'plpgsql' $$ +BEGIN + DROP FUNCTION IF EXISTS cartodb._CDB_Group_API_Conf(); + DROP TYPE IF EXISTS _CDB_Group_API_Params; +END +$$; + +CREATE TYPE _CDB_Group_API_Params AS ( + host text, + port int, + timeout int, + username text, + password text +); + +-- This must be explicitally extracted because "composite types are currently not supported". +-- See http://www.postgresql.org/docs/9.3/static/plpython-database.html. +CREATE OR REPLACE +FUNCTION cartodb._CDB_Group_API_Conf() + RETURNS _CDB_Group_API_Params AS +$$ + conf = plpy.execute("SELECT cartodb.CDB_Conf_GetConf('groups_api') conf")[0]['conf'] + if conf is None: + return None + else: + import json + params = json.loads(conf) + return { "host": params['host'], "port": params['port'], 'timeout': params['timeout'], 'username': params['username'], 'password': params['password'] } + # return params +$$ LANGUAGE 'plpythonu' VOLATILE; + +CREATE OR REPLACE +FUNCTION cartodb._CDB_Group_API_Auth(username text, password text) + RETURNS TEXT AS +$$ + import base64 + base64.encodestring('%s:%s' % (username, password)).replace('\n', '') +$$ LANGUAGE 'plpythonu' IMMUTABLE;