pgsql/x-dragon-expense.sql
[Pman.Xtuple] / pgsql / compareversion.sql
1 CREATE OR REPLACE FUNCTION public.compareversion(text, text DEFAULT split_part(version(), ' '::text, 2))
2 -- Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple. 
3 -- See www.xtuple.com/CPAL for the full text of the software license.
4 -- Returns 1 if the left version is greater than the right version
5 -- -1 if the right is greater than the left
6 --  0 if the versions are equal.
7 -- parameter two defaults to current server version
8   RETURNS integer AS
9 $BODY$
10 DECLARE
11   _leftVersion ALIAS FOR $1;
12   _rightVersion ALIAS FOR $2;
13   _leftMajor SMALLINT;
14   _leftMinor SMALLINT;
15   _leftPatch SMALLINT;
16   _rightMajor SMALLINT;
17   _rightMinor SMALLINT;
18   _rightPatch SMALLINT;
19   _returnCode SMALLINT;
20   DEBUG BOOLEAN := false;
21 BEGIN
22
23 -- left
24 SELECT  substring(_leftVersion FROM $$(\d+)\.\d+\.\d+$$)::SMALLINT, 
25         substring(_leftVersion FROM $$\d+\.(\d+)\.\d+$$)::SMALLINT, 
26         substring(_leftVersion FROM $$\d+\.\d+\.(\d+)$$)::SMALLINT 
27         INTO _leftMajor, _leftMinor, _leftPatch;
28
29 IF (DEBUG)
30   THEN RAISE NOTICE 'Left Version --> % Major --> % Minor --> % Patch --> % ', _leftVersion, _leftMajor, _leftMinor, _leftPatch;
31 END IF;
32
33 -- right
34 SELECT  substring(_rightVersion FROM $$(\d+)\.\d+\D+\d+$$)::SMALLINT, 
35         substring(_rightVersion FROM $$\d+\.(\d+)\D+\d+$$)::SMALLINT, 
36         substring(_rightVersion FROM $$\d+\.\d+\D+(\d+)$$)::SMALLINT 
37         INTO _rightMajor, _rightMinor, _rightPatch;
38
39 IF (DEBUG)
40  THEN RAISE NOTICE 'Right Version --> % Major --> % Minor --> % Patch --> % ', _rightVersion, _rightMajor, _rightMinor, _rightPatch;
41 END IF;
42
43 -- check major version
44 IF (_leftMajor > _rightMajor) THEN _returnCode := 1;
45 ELSIF (_leftMajor < _rightMajor) THEN _returnCode := -1;
46 ELSIF (_leftMajor = _rightMajor) THEN
47   -- if major is equal, check minor version
48   IF (_leftMinor > _rightMinor) THEN _returnCode := 1;
49   ELSIF (_leftMinor < _rightMinor) THEN _returnCode := -1;
50   ELSIF (_leftMinor = _rightMinor) THEN
51     -- if major and minor are equal, check patch version
52     IF (_leftPatch > _rightPatch) THEN _returnCode := 1;
53     ELSIF (_leftPatch < _rightPatch) THEN _returnCode := -1;
54     ELSIF (_leftPatch = _rightPatch) THEN _returnCode := 0;
55     END IF;
56   END IF;
57 -- if we somehow don't match those three operators it probably means someone passed in a version that wasn't in numerical major.minor.patch format
58 ELSE RAISE EXCEPTION 'One or more of the version parameters is invalid. Expected numerical Major.Minor.Patch version string. Left --> % Right --> %', _leftVersion, _rightVersion;
59 END IF;
60
61 RETURN _returnCode;
62
63 END;
64 $BODY$
65   LANGUAGE plpgsql STABLE;
66 ALTER FUNCTION public.compareversion(text, text)
67   OWNER TO admin;