-
Notifications
You must be signed in to change notification settings - Fork 4
/
evr--0.0.2.sql
125 lines (114 loc) · 2.88 KB
/
evr--0.0.2.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
\echo Use "CREATE EXTENSION evr" to load this file. \quit
create type evr_array_item as (
n NUMERIC,
s TEXT
);
create type evr_t as (
epoch INT,
version evr_array_item[],
release evr_array_item[]
);
CREATE FUNCTION evr_trigger() RETURNS trigger AS $$
BEGIN
NEW.evr = (select ROW(coalesce(NEW.epoch::numeric,0),
rpmver_array(coalesce(NEW.version,'empty'))::evr_array_item[],
rpmver_array(coalesce(NEW.release,'empty'))::evr_array_item[])::evr_t);
RETURN NEW;
END;
$$ language 'plpgsql';
create or replace FUNCTION empty(t TEXT)
RETURNS BOOLEAN as $$
BEGIN
return t ~ '^[[:space:]]*$';
END;
$$ language 'plpgsql';
create or replace FUNCTION isalpha(ch CHAR)
RETURNS BOOLEAN as $$
BEGIN
if ascii(ch) between ascii('a') and ascii('z') or
ascii(ch) between ascii('A') and ascii('Z')
then
return TRUE;
end if;
return FALSE;
END;
$$ language 'plpgsql';
create or replace FUNCTION isalphanum(ch CHAR)
RETURNS BOOLEAN as $$
BEGIN
if ascii(ch) between ascii('a') and ascii('z') or
ascii(ch) between ascii('A') and ascii('Z') or
ascii(ch) between ascii('0') and ascii('9')
then
return TRUE;
end if;
return FALSE;
END;
$$ language 'plpgsql';
create or replace function isdigit(ch CHAR)
RETURNS BOOLEAN as $$
BEGIN
if ascii(ch) between ascii('0') and ascii('9')
then
return TRUE;
end if;
return FALSE;
END ;
$$ language 'plpgsql';
create or replace FUNCTION rpmver_array (string1 IN VARCHAR)
RETURNS evr_array_item[] as $$
declare
str1 VARCHAR := string1;
digits VARCHAR(10) := '0123456789';
lc_alpha VARCHAR(27) := 'abcdefghijklmnopqrstuvwxyz';
uc_alpha VARCHAR(27) := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
alpha VARCHAR(54) := lc_alpha || uc_alpha;
one VARCHAR;
isnum BOOLEAN;
ver_array evr_array_item[] := ARRAY[]::evr_array_item[];
BEGIN
if str1 is NULL
then
RAISE EXCEPTION 'VALUE_ERROR.';
end if;
one := str1;
<<segment_loop>>
while one <> ''
loop
declare
segm1 VARCHAR;
segm1_n NUMERIC := 0;
begin
-- Throw out all non-alphanum characters
while one <> '' and not isalphanum(one)
loop
one := substr(one, 2);
end loop;
str1 := one;
if str1 <> '' and isdigit(str1)
then
str1 := ltrim(str1, digits);
isnum := true;
else
str1 := ltrim(str1, alpha);
isnum := false;
end if;
if str1 <> ''
then segm1 := substr(one, 1, length(one) - length(str1));
else segm1 := one;
end if;
if segm1 = '' then return ver_array; end if; /* arbitrary */
if isnum
then
segm1 := ltrim(segm1, '0');
if segm1 <> '' then segm1_n := segm1::numeric; end if;
segm1 := NULL;
else
end if;
ver_array := array_append(ver_array, (segm1_n, segm1)::evr_array_item);
one := str1;
end;
end loop segment_loop;
return ver_array;
END ;
$$ language 'plpgsql';