postgres-framework 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitmodules +3 -0
- data/LICENSE +26 -0
- data/README.md +50 -0
- data/bin/sem-add-framework +21 -0
- data/bin/sem-add-safe +32 -0
- data/plpgunit/frontend/readme.txt +1 -0
- data/plpgunit/install/0.uninstall-unit-test.sql +26 -0
- data/plpgunit/install/1.install-unit-test.sql +972 -0
- data/plpgunit/license.txt +19 -0
- data/plpgunit/readme.md +174 -0
- data/scripts/20170608-212033.sql +972 -0
- data/scripts/20170608-212040.sql +1 -0
- data/scripts/20170608-212341.sql +10 -0
- data/scripts/20170608-212348.sql +23 -0
- data/scripts/20170608-212359.sql +9 -0
- data/scripts/20170608-212413.sql +9 -0
- data/scripts/20170608-212430.sql +34 -0
- data/scripts/20170608-212759.sql +24 -0
- data/scripts/20170608-212803.sql +23 -0
- data/scripts/20170608-212813.sql +75 -0
- data/scripts/20170608-212819.sql +81 -0
- data/scripts/20170608-212825.sql +59 -0
- data/scripts/20170609-183531.sql +12 -0
- data/src/functions/array_distinct.sql +10 -0
- data/src/functions/array_from_json.sql +23 -0
- data/src/functions/check_http_url.sql +9 -0
- data/src/functions/check_url.sql +9 -0
- data/src/functions/create_unique_name.sql +34 -0
- data/src/functions/trf_created_at_and_updated_at.sql +12 -0
- data/src/schema_create.sql +1 -0
- data/tests/functions/array_distinct.sql +24 -0
- data/tests/functions/array_from_json.sql +23 -0
- data/tests/functions/check_http_url.sql +75 -0
- data/tests/functions/check_url.sql +81 -0
- data/tests/functions/create_unique_name.sql +59 -0
- metadata +94 -0
@@ -0,0 +1 @@
|
|
1
|
+
CREATE SCHEMA IF NOT EXISTS framework;
|
@@ -0,0 +1,10 @@
|
|
1
|
+
-- Eliminate duplicate array values
|
2
|
+
CREATE OR REPLACE FUNCTION framework.array_distinct(
|
3
|
+
in arr anyarray, -- input array
|
4
|
+
in ignore_nulls boolean DEFAULT false, -- flag to ignore nulls
|
5
|
+
in default_value anyarray DEFAULT ARRAY[]::TEXT[] -- default value if empty
|
6
|
+
) RETURNS anyarray AS $f$
|
7
|
+
SELECT COALESCE((SELECT array_agg(DISTINCT x)
|
8
|
+
FROM unnest(arr) t(x)
|
9
|
+
WHERE CASE WHEN ignore_nulls THEN x IS NOT NULL ELSE true END), default_value);
|
10
|
+
$f$ LANGUAGE SQL IMMUTABLE;
|
@@ -0,0 +1,23 @@
|
|
1
|
+
-- Convert json array to TEXT[]
|
2
|
+
CREATE OR REPLACE FUNCTION
|
3
|
+
framework.array_from_json(in json_arr json)
|
4
|
+
RETURNS text[] AS $$
|
5
|
+
DECLARE arr text[];
|
6
|
+
DECLARE item json;
|
7
|
+
DECLARE item_value text;
|
8
|
+
BEGIN
|
9
|
+
arr := ARRAY[]::TEXT[];
|
10
|
+
FOR item IN SELECT * FROM json_array_elements(json_arr)
|
11
|
+
LOOP
|
12
|
+
item_value := item::text;
|
13
|
+
IF substring(item_value, 1, 1) <> '"' THEN
|
14
|
+
RAISE EXCEPTION 'Element is not string'
|
15
|
+
USING HINT = 'Acceptable only array of string. Found element value: ' || item_value;
|
16
|
+
END IF;
|
17
|
+
|
18
|
+
arr := array_append(arr, substring(item_value, 2, char_length(item_value) - 2));
|
19
|
+
END LOOP;
|
20
|
+
|
21
|
+
RETURN arr;
|
22
|
+
END
|
23
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1,9 @@
|
|
1
|
+
-- http://stackoverflow.com/questions/2568842/jquery-url-validator
|
2
|
+
-- http://blog.mattheworiordan.com/post/13174566389/url-regular-expression-for-links-with-or-without
|
3
|
+
CREATE OR REPLACE FUNCTION
|
4
|
+
framework.check_http_url(email text)
|
5
|
+
RETURNS bool AS $$
|
6
|
+
BEGIN
|
7
|
+
RETURN email ~* '((((http|https)+:(?:\/\/)+)(?:[\-;:&=\+\$,\w]+@)?)(.)+)';
|
8
|
+
END
|
9
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1,9 @@
|
|
1
|
+
-- http://stackoverflow.com/questions/2568842/jquery-url-validator
|
2
|
+
-- http://blog.mattheworiordan.com/post/13174566389/url-regular-expression-for-links-with-or-without
|
3
|
+
CREATE OR REPLACE FUNCTION
|
4
|
+
framework.check_url(email text)
|
5
|
+
RETURNS bool AS $$
|
6
|
+
BEGIN
|
7
|
+
RETURN email ~* '((([A-Za-z]+:(?:\/\/)+)(?:[\-;:&=\+\$,\w]+@)?)(.)+)';
|
8
|
+
END
|
9
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1,34 @@
|
|
1
|
+
-- Create unique string based first argument.
|
2
|
+
CREATE OR REPLACE FUNCTION
|
3
|
+
framework.create_unique_name(
|
4
|
+
value text, -- slug value
|
5
|
+
table_name text, -- name of table
|
6
|
+
col_name text, -- name of column with name
|
7
|
+
col_unique_name text -- name of column with unique name
|
8
|
+
)
|
9
|
+
RETURNS text AS $$
|
10
|
+
DECLARE
|
11
|
+
occurs int;
|
12
|
+
new_value text;
|
13
|
+
BEGIN
|
14
|
+
EXECUTE format('SELECT COUNT(*) FROM %s WHERE %s=$1 OR %s=$1', table_name, col_name, col_unique_name)
|
15
|
+
INTO occurs
|
16
|
+
USING value;
|
17
|
+
|
18
|
+
IF occurs = 0
|
19
|
+
THEN
|
20
|
+
new_value = value;
|
21
|
+
ELSE
|
22
|
+
new_value = value;
|
23
|
+
WHILE occurs > 0 LOOP
|
24
|
+
new_value = new_value || '-' || cast((occurs + 1) as character varying);
|
25
|
+
|
26
|
+
EXECUTE format('SELECT COUNT(*) FROM %s WHERE %s=$1 OR %s=$1', table_name, col_name, col_unique_name)
|
27
|
+
INTO occurs
|
28
|
+
USING new_value;
|
29
|
+
END LOOP;
|
30
|
+
END IF;
|
31
|
+
|
32
|
+
RETURN new_value;
|
33
|
+
END;
|
34
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1,24 @@
|
|
1
|
+
CREATE OR REPLACE FUNCTION unit_tests.array_distinct_test()
|
2
|
+
RETURNS test_result AS $$
|
3
|
+
DECLARE arr text[];
|
4
|
+
DECLARE message test_result;
|
5
|
+
BEGIN
|
6
|
+
SELECT framework.array_distinct(ARRAY['foo', NULL, 'bar', 'foo', 'ok', 'bar'], TRUE) INTO arr;
|
7
|
+
|
8
|
+
IF arr <> ARRAY['bar', 'foo', 'ok'] THEN
|
9
|
+
SELECT assert.fail('Unexpected array value') INTO message;
|
10
|
+
RETURN message;
|
11
|
+
END IF;
|
12
|
+
|
13
|
+
SELECT framework.array_distinct(ARRAY[]::TEXT[], TRUE) INTO arr;
|
14
|
+
SELECT framework.array_distinct(ARRAY[]::INTEGER[], TRUE, ARRAY[]::INTEGER[]) INTO arr;
|
15
|
+
|
16
|
+
IF arr IS NULL THEN
|
17
|
+
SELECT assert.fail('Expected empty array, got null') INTO message;
|
18
|
+
RETURN message;
|
19
|
+
END IF;
|
20
|
+
|
21
|
+
SELECT assert.ok('framework.array_distinct is OK') INTO message;
|
22
|
+
RETURN message;
|
23
|
+
END;
|
24
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1,23 @@
|
|
1
|
+
CREATE OR REPLACE FUNCTION unit_tests.array_from_json_test()
|
2
|
+
RETURNS test_result AS $$
|
3
|
+
DECLARE arr text[];
|
4
|
+
DECLARE message test_result;
|
5
|
+
BEGIN
|
6
|
+
SELECT framework.array_from_json('["foo", "bar"]') INTO arr;
|
7
|
+
|
8
|
+
IF arr <> ARRAY['foo', 'bar'] THEN
|
9
|
+
SELECT assert.fail('Expected array: ["foo", "bar"]') INTO message;
|
10
|
+
RETURN message;
|
11
|
+
END IF;
|
12
|
+
|
13
|
+
SELECT framework.array_from_json('[]') INTO arr;
|
14
|
+
|
15
|
+
IF arr <> ARRAY[]::TEXT[] THEN
|
16
|
+
SELECT assert.fail('Expected empty array, got null') INTO message;
|
17
|
+
RETURN message;
|
18
|
+
END IF;
|
19
|
+
|
20
|
+
SELECT assert.ok('framework.array_distinct is OK') INTO message;
|
21
|
+
RETURN message;
|
22
|
+
END;
|
23
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1,75 @@
|
|
1
|
+
CREATE OR REPLACE FUNCTION unit_tests.check_http_url_test()
|
2
|
+
RETURNS test_result AS $$
|
3
|
+
DECLARE message test_result;
|
4
|
+
DECLARE result boolean;
|
5
|
+
BEGIN
|
6
|
+
SELECT check_http_url INTO result FROM framework.check_http_url('localhost');
|
7
|
+
IF result = TRUE THEN
|
8
|
+
SELECT assert.fail('Value "localhost" is invalid url.') INTO message;
|
9
|
+
RETURN message;
|
10
|
+
END IF;
|
11
|
+
|
12
|
+
SELECT check_http_url INTO result FROM framework.check_http_url('http://');
|
13
|
+
IF result = TRUE THEN
|
14
|
+
SELECT assert.fail('Value "http://" is invalid url.') INTO message;
|
15
|
+
RETURN message;
|
16
|
+
END IF;
|
17
|
+
|
18
|
+
SELECT check_http_url INTO result FROM framework.check_http_url('google.pl');
|
19
|
+
IF result = TRUE THEN
|
20
|
+
SELECT assert.fail('Value "google.pl" is invalid url.') INTO message;
|
21
|
+
RETURN message;
|
22
|
+
END IF;
|
23
|
+
|
24
|
+
SELECT check_http_url INTO result FROM framework.check_http_url('www.google.pl');
|
25
|
+
IF result = TRUE THEN
|
26
|
+
SELECT assert.fail('Value "www.google.pl" is invalid url.') INTO message;
|
27
|
+
RETURN message;
|
28
|
+
END IF;
|
29
|
+
|
30
|
+
SELECT check_http_url INTO result FROM framework.check_http_url('//google.pl');
|
31
|
+
IF result = TRUE THEN
|
32
|
+
SELECT assert.fail('Value "//google.pl" is invalid url.') INTO message;
|
33
|
+
RETURN message;
|
34
|
+
END IF;
|
35
|
+
|
36
|
+
SELECT check_http_url INTO result FROM framework.check_http_url('http//google.pl');
|
37
|
+
IF result = TRUE THEN
|
38
|
+
SELECT assert.fail('Value "http//google.pl" is invalid url.') INTO message;
|
39
|
+
RETURN message;
|
40
|
+
END IF;
|
41
|
+
|
42
|
+
SELECT check_http_url INTO result FROM framework.check_http_url('https://google.pl');
|
43
|
+
IF result = FALSE THEN
|
44
|
+
SELECT assert.fail('Value "https://google.pl" is valid url.') INTO message;
|
45
|
+
RETURN message;
|
46
|
+
END IF;
|
47
|
+
|
48
|
+
SELECT check_http_url INTO result FROM framework.check_http_url('http://www.google.pl');
|
49
|
+
IF result = FALSE THEN
|
50
|
+
SELECT assert.fail('Value "http://www.google.pl" is valid url.') INTO message;
|
51
|
+
RETURN message;
|
52
|
+
END IF;
|
53
|
+
|
54
|
+
SELECT check_http_url INTO result FROM framework.check_http_url('abcdefg://www.google.pl');
|
55
|
+
IF result = TRUE THEN
|
56
|
+
SELECT assert.fail('Value "abcdefg://www.google.pl" is invalid url.') INTO message;
|
57
|
+
RETURN message;
|
58
|
+
END IF;
|
59
|
+
|
60
|
+
SELECT check_http_url INTO result FROM framework.check_http_url('abcdefg://google.pl');
|
61
|
+
IF result = TRUE THEN
|
62
|
+
SELECT assert.fail('Value "abcdefg://google.pl" is invalid url.') INTO message;
|
63
|
+
RETURN message;
|
64
|
+
END IF;
|
65
|
+
|
66
|
+
SELECT check_http_url INTO result FROM framework.check_http_url('http://localhost/test/test?gfdgfdg#ok');
|
67
|
+
IF result = FALSE THEN
|
68
|
+
SELECT assert.fail('Value "http://localhost/test/test?gfdgfdg#ok" is valid url.') INTO message;
|
69
|
+
RETURN message;
|
70
|
+
END IF;
|
71
|
+
|
72
|
+
SELECT assert.ok('framework.check_http_url is OK') INTO message;
|
73
|
+
RETURN message;
|
74
|
+
END;
|
75
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1,81 @@
|
|
1
|
+
CREATE OR REPLACE FUNCTION unit_tests.check_url_test()
|
2
|
+
RETURNS test_result AS $$
|
3
|
+
DECLARE message test_result;
|
4
|
+
DECLARE result boolean;
|
5
|
+
BEGIN
|
6
|
+
SELECT check_url INTO result FROM framework.check_url('localhost');
|
7
|
+
IF result = TRUE THEN
|
8
|
+
SELECT assert.fail('Value "localhost" is invalid url.') INTO message;
|
9
|
+
RETURN message;
|
10
|
+
END IF;
|
11
|
+
|
12
|
+
SELECT check_url INTO result FROM framework.check_url('http://');
|
13
|
+
IF result = TRUE THEN
|
14
|
+
SELECT assert.fail('Value "http://" is invalid url.') INTO message;
|
15
|
+
RETURN message;
|
16
|
+
END IF;
|
17
|
+
|
18
|
+
SELECT check_url INTO result FROM framework.check_url('google.pl');
|
19
|
+
IF result = TRUE THEN
|
20
|
+
SELECT assert.fail('Value "google.pl" is invalid url.') INTO message;
|
21
|
+
RETURN message;
|
22
|
+
END IF;
|
23
|
+
|
24
|
+
SELECT check_url INTO result FROM framework.check_url('www.google.pl');
|
25
|
+
IF result = TRUE THEN
|
26
|
+
SELECT assert.fail('Value "www.google.pl" is invalid url.') INTO message;
|
27
|
+
RETURN message;
|
28
|
+
END IF;
|
29
|
+
|
30
|
+
SELECT check_url INTO result FROM framework.check_url('//google.pl');
|
31
|
+
IF result = TRUE THEN
|
32
|
+
SELECT assert.fail('Value "//google.pl" is invalid url.') INTO message;
|
33
|
+
RETURN message;
|
34
|
+
END IF;
|
35
|
+
|
36
|
+
SELECT check_url INTO result FROM framework.check_url('http//google.pl');
|
37
|
+
IF result = TRUE THEN
|
38
|
+
SELECT assert.fail('Value "http//google.pl" is invalid url.') INTO message;
|
39
|
+
RETURN message;
|
40
|
+
END IF;
|
41
|
+
|
42
|
+
SELECT check_url INTO result FROM framework.check_url('https://google.pl');
|
43
|
+
IF result = FALSE THEN
|
44
|
+
SELECT assert.fail('Value "https://google.pl" is valid url.') INTO message;
|
45
|
+
RETURN message;
|
46
|
+
END IF;
|
47
|
+
|
48
|
+
SELECT check_url INTO result FROM framework.check_url('http://www.google.pl');
|
49
|
+
IF result = FALSE THEN
|
50
|
+
SELECT assert.fail('Value "http://www.google.pl" is valid url.') INTO message;
|
51
|
+
RETURN message;
|
52
|
+
END IF;
|
53
|
+
|
54
|
+
SELECT check_url INTO result FROM framework.check_url('abcdefg://www.google.pl');
|
55
|
+
IF result = FALSE THEN
|
56
|
+
SELECT assert.fail('Value "abcdefg://www.google.pl" is valid url.') INTO message;
|
57
|
+
RETURN message;
|
58
|
+
END IF;
|
59
|
+
|
60
|
+
SELECT check_url INTO result FROM framework.check_url('abcdefg://google.pl');
|
61
|
+
IF result = FALSE THEN
|
62
|
+
SELECT assert.fail('Value "abcdefg://google.pl" is valid url.') INTO message;
|
63
|
+
RETURN message;
|
64
|
+
END IF;
|
65
|
+
|
66
|
+
SELECT check_url INTO result FROM framework.check_url('aąbcćdeęfg://aaałśóŋŋŋ.ąę');
|
67
|
+
IF result = FALSE THEN
|
68
|
+
SELECT assert.fail('Value "aąbcćdeęfg://aaałśóŋŋŋ.ąę" is valid url.') INTO message;
|
69
|
+
RETURN message;
|
70
|
+
END IF;
|
71
|
+
|
72
|
+
SELECT check_url INTO result FROM framework.check_url('http://localhost/test/test?gfdgfdg#ok');
|
73
|
+
IF result = FALSE THEN
|
74
|
+
SELECT assert.fail('Value "http://localhost/test/test?gfdgfdg#ok" is valid url.') INTO message;
|
75
|
+
RETURN message;
|
76
|
+
END IF;
|
77
|
+
|
78
|
+
SELECT assert.ok('framework.check_url is OK') INTO message;
|
79
|
+
RETURN message;
|
80
|
+
END;
|
81
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1,59 @@
|
|
1
|
+
CREATE OR REPLACE FUNCTION unit_tests.create_unique_name_test()
|
2
|
+
RETURNS test_result AS $$
|
3
|
+
DECLARE message test_result;
|
4
|
+
DECLARE result TEXT;
|
5
|
+
DECLARE table_name TEXT = 'unit_tests.temp_create_unique_name';
|
6
|
+
DECLARE col_name TEXT = 'name';
|
7
|
+
DECLARE col_unique_name TEXT = 'unique_name';
|
8
|
+
BEGIN
|
9
|
+
EXECUTE format('DROP TABLE IF EXISTS %s', table_name);
|
10
|
+
EXECUTE format('CREATE TABLE IF NOT EXISTS %s (%s TEXT, %s TEXT)', table_name, col_name, col_unique_name);
|
11
|
+
|
12
|
+
SELECT create_unique_name INTO result FROM framework.create_unique_name('test', table_name, col_name, col_unique_name);
|
13
|
+
IF result <> 'test' THEN
|
14
|
+
SELECT assert.fail('Expected "test" value is "' || result || '"') INTO message;
|
15
|
+
EXECUTE format('DROP TABLE IF EXISTS %s', table_name);
|
16
|
+
RETURN message;
|
17
|
+
END IF;
|
18
|
+
|
19
|
+
EXECUTE format('INSERT INTO %s (%s, %s) VALUES ($1, $2);', table_name, col_name, col_unique_name)
|
20
|
+
USING 'test', 'test';
|
21
|
+
SELECT create_unique_name INTO result FROM framework.create_unique_name('test', table_name, col_name, col_unique_name);
|
22
|
+
IF result <> 'test-2' THEN
|
23
|
+
SELECT assert.fail('Expected "test-2" value is "' || result || '"') INTO message;
|
24
|
+
EXECUTE format('DROP TABLE IF EXISTS %s', table_name);
|
25
|
+
RETURN message;
|
26
|
+
END IF;
|
27
|
+
|
28
|
+
EXECUTE format('INSERT INTO %s (%s, %s) VALUES ($1, $2);', table_name, col_name, col_unique_name)
|
29
|
+
USING 'test', 'test-2';
|
30
|
+
SELECT create_unique_name INTO result FROM framework.create_unique_name('test', table_name, col_name, col_unique_name);
|
31
|
+
IF result <> 'test-3' THEN
|
32
|
+
SELECT assert.fail('Expected "test-3" value is "' || result || '"') INTO message;
|
33
|
+
EXECUTE format('DROP TABLE IF EXISTS %s', table_name);
|
34
|
+
RETURN message;
|
35
|
+
END IF;
|
36
|
+
|
37
|
+
EXECUTE format('INSERT INTO %s (%s, %s) VALUES ($1, $2);', table_name, col_name, col_unique_name)
|
38
|
+
USING 'test', 'test-3';
|
39
|
+
SELECT create_unique_name INTO result FROM framework.create_unique_name('test', table_name, col_name, col_unique_name);
|
40
|
+
IF result <> 'test-4' THEN
|
41
|
+
SELECT assert.fail('Expected "test-4" value is "' || result || '"') INTO message;
|
42
|
+
EXECUTE format('DROP TABLE IF EXISTS %s', table_name);
|
43
|
+
RETURN message;
|
44
|
+
END IF;
|
45
|
+
|
46
|
+
EXECUTE format('INSERT INTO %s (%s, %s) VALUES ($1, $2);', table_name, col_name, col_unique_name)
|
47
|
+
USING 'test-2', 'test-2';
|
48
|
+
SELECT create_unique_name INTO result FROM framework.create_unique_name('test-2', table_name, col_name, col_unique_name);
|
49
|
+
IF result <> 'test-2-3' THEN
|
50
|
+
SELECT assert.fail('Expected "test-2-3" value is "' || result || '"') INTO message;
|
51
|
+
EXECUTE format('DROP TABLE IF EXISTS %s', table_name);
|
52
|
+
RETURN message;
|
53
|
+
END IF;
|
54
|
+
|
55
|
+
EXECUTE format('DROP TABLE IF EXISTS %s', table_name);
|
56
|
+
SELECT assert.ok('framework.create_unique_name is OK') INTO message;
|
57
|
+
RETURN message;
|
58
|
+
END;
|
59
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1,12 @@
|
|
1
|
+
-- Automatically update date columns
|
2
|
+
CREATE OR REPLACE FUNCTION framework.trf_created_at_and_updated_at() RETURNS TRIGGER AS $$
|
3
|
+
BEGIN
|
4
|
+
IF (TG_OP = 'INSERT') THEN
|
5
|
+
NEW.created_at = now();
|
6
|
+
END IF;
|
7
|
+
|
8
|
+
NEW.updated_at = now();
|
9
|
+
|
10
|
+
RETURN NEW;
|
11
|
+
END;
|
12
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1,10 @@
|
|
1
|
+
-- Eliminate duplicate array values
|
2
|
+
CREATE OR REPLACE FUNCTION framework.array_distinct(
|
3
|
+
in arr anyarray, -- input array
|
4
|
+
in ignore_nulls boolean DEFAULT false, -- flag to ignore nulls
|
5
|
+
in default_value anyarray DEFAULT ARRAY[]::TEXT[] -- default value if empty
|
6
|
+
) RETURNS anyarray AS $f$
|
7
|
+
SELECT COALESCE((SELECT array_agg(DISTINCT x)
|
8
|
+
FROM unnest(arr) t(x)
|
9
|
+
WHERE CASE WHEN ignore_nulls THEN x IS NOT NULL ELSE true END), default_value);
|
10
|
+
$f$ LANGUAGE SQL IMMUTABLE;
|
@@ -0,0 +1,23 @@
|
|
1
|
+
-- Convert json array to TEXT[]
|
2
|
+
CREATE OR REPLACE FUNCTION
|
3
|
+
framework.array_from_json(in json_arr json)
|
4
|
+
RETURNS text[] AS $$
|
5
|
+
DECLARE arr text[];
|
6
|
+
DECLARE item json;
|
7
|
+
DECLARE item_value text;
|
8
|
+
BEGIN
|
9
|
+
arr := ARRAY[]::TEXT[];
|
10
|
+
FOR item IN SELECT * FROM json_array_elements(json_arr)
|
11
|
+
LOOP
|
12
|
+
item_value := item::text;
|
13
|
+
IF substring(item_value, 1, 1) <> '"' THEN
|
14
|
+
RAISE EXCEPTION 'Element is not string'
|
15
|
+
USING HINT = 'Acceptable only array of string. Found element value: ' || item_value;
|
16
|
+
END IF;
|
17
|
+
|
18
|
+
arr := array_append(arr, substring(item_value, 2, char_length(item_value) - 2));
|
19
|
+
END LOOP;
|
20
|
+
|
21
|
+
RETURN arr;
|
22
|
+
END
|
23
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1,9 @@
|
|
1
|
+
-- http://stackoverflow.com/questions/2568842/jquery-url-validator
|
2
|
+
-- http://blog.mattheworiordan.com/post/13174566389/url-regular-expression-for-links-with-or-without
|
3
|
+
CREATE OR REPLACE FUNCTION
|
4
|
+
framework.check_http_url(email text)
|
5
|
+
RETURNS bool AS $$
|
6
|
+
BEGIN
|
7
|
+
RETURN email ~* '((((http|https)+:(?:\/\/)+)(?:[\-;:&=\+\$,\w]+@)?)(.)+)';
|
8
|
+
END
|
9
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1,9 @@
|
|
1
|
+
-- http://stackoverflow.com/questions/2568842/jquery-url-validator
|
2
|
+
-- http://blog.mattheworiordan.com/post/13174566389/url-regular-expression-for-links-with-or-without
|
3
|
+
CREATE OR REPLACE FUNCTION
|
4
|
+
framework.check_url(email text)
|
5
|
+
RETURNS bool AS $$
|
6
|
+
BEGIN
|
7
|
+
RETURN email ~* '((([A-Za-z]+:(?:\/\/)+)(?:[\-;:&=\+\$,\w]+@)?)(.)+)';
|
8
|
+
END
|
9
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1,34 @@
|
|
1
|
+
-- Create unique string based first argument.
|
2
|
+
CREATE OR REPLACE FUNCTION
|
3
|
+
framework.create_unique_name(
|
4
|
+
value text, -- slug value
|
5
|
+
table_name text, -- name of table
|
6
|
+
col_name text, -- name of column with name
|
7
|
+
col_unique_name text -- name of column with unique name
|
8
|
+
)
|
9
|
+
RETURNS text AS $$
|
10
|
+
DECLARE
|
11
|
+
occurs int;
|
12
|
+
new_value text;
|
13
|
+
BEGIN
|
14
|
+
EXECUTE format('SELECT COUNT(*) FROM %s WHERE %s=$1 OR %s=$1', table_name, col_name, col_unique_name)
|
15
|
+
INTO occurs
|
16
|
+
USING value;
|
17
|
+
|
18
|
+
IF occurs = 0
|
19
|
+
THEN
|
20
|
+
new_value = value;
|
21
|
+
ELSE
|
22
|
+
new_value = value;
|
23
|
+
WHILE occurs > 0 LOOP
|
24
|
+
new_value = new_value || '-' || cast((occurs + 1) as character varying);
|
25
|
+
|
26
|
+
EXECUTE format('SELECT COUNT(*) FROM %s WHERE %s=$1 OR %s=$1', table_name, col_name, col_unique_name)
|
27
|
+
INTO occurs
|
28
|
+
USING new_value;
|
29
|
+
END LOOP;
|
30
|
+
END IF;
|
31
|
+
|
32
|
+
RETURN new_value;
|
33
|
+
END;
|
34
|
+
$$ LANGUAGE plpgsql;
|