CDB-3302 CDB_CheckQuota now also accepts a schema name. Added a convenience method to check if a schema is valid or not

master
Kartones 10 years ago
parent 021d922d84
commit 3d595976f6

@ -11,3 +11,10 @@ BEGIN
EXECUTE sql; EXECUTE sql;
END; END;
$$ language 'plpgsql' VOLATILE; $$ language 'plpgsql' VOLATILE;
CREATE OR REPLACE FUNCTION cartodb.schema_exists(schema_name text)
RETURNS boolean AS
$$
SELECT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = schema_name);
$$
language sql VOLATILE;

@ -28,11 +28,10 @@ $$
LANGUAGE 'sql' VOLATILE; LANGUAGE 'sql' VOLATILE;
CREATE OR REPLACE FUNCTION CDB_CheckQuota() CREATE OR REPLACE FUNCTION CDB_CheckQuota(schema_name text)
RETURNS trigger AS RETURNS trigger AS
$$ $$
DECLARE DECLARE
pbfact float8; pbfact float8;
qmax int8; qmax int8;
dice float8; dice float8;
@ -47,7 +46,7 @@ BEGIN
IF dice < pbfact THEN IF dice < pbfact THEN
RAISE DEBUG 'Checking quota on table % (dice:%, needed:<%)', TG_RELID::text, dice, pbfact; RAISE DEBUG 'Checking quota on table % (dice:%, needed:<%)', TG_RELID::text, dice, pbfact;
BEGIN BEGIN
qmax := public._CDB_UserQuotaInBytes(); qmax := public._CDB_UserQuotaInBytes(schema_name);
EXCEPTION WHEN undefined_function THEN EXCEPTION WHEN undefined_function THEN
IF TG_NARGS > 1 THEN IF TG_NARGS > 1 THEN
RAISE NOTICE 'Using quota specified via trigger parameter'; RAISE NOTICE 'Using quota specified via trigger parameter';
@ -61,7 +60,7 @@ BEGIN
RETURN NEW; RETURN NEW;
END IF; END IF;
SELECT public.CDB_UserDataSize() INTO quota; SELECT public.CDB_UserDataSize(schema_name) INTO quota;
IF quota > qmax THEN IF quota > qmax THEN
RAISE EXCEPTION 'Quota exceeded by %KB', (quota-qmax)/1024; RAISE EXCEPTION 'Quota exceeded by %KB', (quota-qmax)/1024;
ELSE RAISE DEBUG 'User quota in bytes: % < % (max allowed)', quota, qmax; ELSE RAISE DEBUG 'User quota in bytes: % < % (max allowed)', quota, qmax;
@ -74,26 +73,47 @@ END;
$$ $$
LANGUAGE 'plpgsql' VOLATILE; LANGUAGE 'plpgsql' VOLATILE;
CREATE OR REPLACE FUNCTION CDB_SetUserQuotaInBytes(bytes int8)
CREATE OR REPLACE FUNCTION CDB_CheckQuota()
RETURNS trigger AS
$$
SELECT public.CDB_CheckQuota('public');
$$
LANGUAGE 'plpgsql' VOLATILE;
CREATE OR REPLACE FUNCTION CDB_SetUserQuotaInBytes(bytes int8, schema_name text)
RETURNS int8 AS RETURNS int8 AS
$$ $$
DECLARE DECLARE
current_quota int8; current_quota int8;
schema_ok boolean;
sql text; sql text;
BEGIN BEGIN
IF cartodb.schema_exists(schema_name) = false THEN
RAISE EXCEPTION 'Invalid schema name "%"', schema_name;
END IF;
BEGIN BEGIN
current_quota := public._CDB_UserQuotaInBytes(); EXECUTE FORMAT('current_quota := %I._CDB_UserQuotaInBytes();', schema_name);
EXCEPTION WHEN undefined_function THEN EXCEPTION WHEN undefined_function THEN
current_quota := 0; current_quota := 0;
END; END;
sql := 'CREATE OR REPLACE FUNCTION public._CDB_UserQuotaInBytes() ' sql := 'CREATE OR REPLACE FUNCTION ' || schema_name || '._CDB_UserQuotaInBytes() '
|| 'RETURNS int8 AS $X$ SELECT ' || bytes || 'RETURNS int8 AS $X$ SELECT ' || bytes
|| '::int8 $X$ LANGUAGE sql IMMUTABLE'; || '::int8 $X$ LANGUAGE sql IMMUTABLE';
EXECUTE sql; EXECUTE sql;
return current_quota; return current_quota;
END END
$$ $$
LANGUAGE 'plpgsql' VOLATILE STRICT; LANGUAGE 'plpgsql' VOLATILE STRICT;
CREATE OR REPLACE FUNCTION CDB_SetUserQuotaInBytes(bytes int8)
RETURNS int8 AS
$$
SELECT public.CDB_SetUserQuotaInBytes(bytes, 'public');
$$
LANGUAGE 'plpgsql' VOLATILE STRICT;

Loading…
Cancel
Save