CDB-3302 CDB_CheckQuota now also accepts a schema name. Added a convenience method to check if a schema is valid or not
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user