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.
@@ -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;