[PATCH 1/4] [setup] Add debversion type
---
setup/debversion/Makefile | 17 ++
setup/debversion/debversion.cc | 246 +++++++++++++++++++++++++++++
setup/debversion/debversion.sql.in | 237 +++++++++++++++++++++++++++
setup/debversion/uninstall_debversion.sql | 35 ++++
4 files changed, 535 insertions(+), 0 deletions(-)
create mode 100644 setup/debversion/Makefile
create mode 100644 setup/debversion/debversion.cc
create mode 100644 setup/debversion/debversion.sql.in
create mode 100644 setup/debversion/uninstall_debversion.sql
diff --git a/setup/debversion/Makefile b/setup/debversion/Makefile
new file mode 100644
index 0000000..f0629d0
--- /dev/null
+++ b/setup/debversion/Makefile
@@ -0,0 +1,17 @@
+MODULES = debversion
+DATA_built = debversion.sql
+DATA = uninstall_debversion.sql
+#REGRESS = debversion
+
+PG_CONFIG = pg_config
+PGXS := $(shell $(PG_CONFIG) --pgxs)
+include $(PGXS)
+
+CXXFLAGS := $(CPPFLAGS)
+
+debversion.so: debversion.o
+ $(CXX) $(LDFLAGS) -shared -o $@ $^ -lapt-pkg
+
+debversion.o: debversion.cc
+ $(COMPILE.cc) $(CFLAGS_SL) $(OUTPUT_OPTION) $<
+
diff --git a/setup/debversion/debversion.cc b/setup/debversion/debversion.cc
new file mode 100644
index 0000000..980786e
--- /dev/null
+++ b/setup/debversion/debversion.cc
@@ -0,0 +1,246 @@
+/*
+ * debversion: PostgreSQL functions for debversion type
+ * Copyright © 2001 James Troup <james@nocrew.org>
+ * Copyright © 2008-2009 Roger Leigh <rleigh@debian.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ ***********************************************************************/
+
+#include <apt-pkg/debversion.h>
+
+extern "C"
+{
+#include <postgres.h>
+#include <fmgr.h>
+#include <access/hash.h>
+
+#ifdef PG_MODULE_MAGIC
+ PG_MODULE_MAGIC;
+#endif
+
+ extern Datum debversion_cmp (PG_FUNCTION_ARGS);
+ extern Datum debversion_hash (PG_FUNCTION_ARGS);
+ extern Datum debversion_eq (PG_FUNCTION_ARGS);
+ extern Datum debversion_ne (PG_FUNCTION_ARGS);
+ extern Datum debversion_gt (PG_FUNCTION_ARGS);
+ extern Datum debversion_ge (PG_FUNCTION_ARGS);
+ extern Datum debversion_lt (PG_FUNCTION_ARGS);
+ extern Datum debversion_le (PG_FUNCTION_ARGS);
+ extern Datum debversion_smaller (PG_FUNCTION_ARGS);
+ extern Datum debversion_larger (PG_FUNCTION_ARGS);
+}
+
+namespace
+{
+ int32
+ debversioncmp (text *left,
+ text *right)
+ {
+ int32 result;
+ int32 lsize, rsize;
+ char *lstr, *rstr;
+
+ lsize = VARSIZE_ANY_EXHDR(left);
+ lstr = (char *) palloc(lsize+1);
+ memcpy(lstr, VARDATA_ANY(left), lsize);
+ lstr[lsize] = '\0';
+
+ rsize = VARSIZE_ANY_EXHDR(right);
+ rstr = (char *) palloc(rsize+1);
+ memcpy(rstr, VARDATA_ANY(right), rsize);
+ rstr[rsize] = '\0';
+
+ result = debVS.CmpVersion (lstr, rstr);
+
+ pfree (lstr);
+ pfree (rstr);
+
+ return (result);
+ }
+}
+
+extern "C"
+{
+ PG_FUNCTION_INFO_V1(debversion_cmp);
+
+ Datum
+ debversion_cmp(PG_FUNCTION_ARGS)
+ {
+ text *left = PG_GETARG_TEXT_PP(0);
+ text *right = PG_GETARG_TEXT_PP(1);
+ int32 result;
+
+ result = debversioncmp(left, right);
+
+ PG_FREE_IF_COPY(left, 0);
+ PG_FREE_IF_COPY(right, 1);
+
+ PG_RETURN_INT32(result);
+ }
+
+ PG_FUNCTION_INFO_V1(debversion_hash);
+
+ Datum
+ debversion_hash(PG_FUNCTION_ARGS)
+ {
+ int32 txt_size;
+ text *txt = PG_GETARG_TEXT_PP(0);
+ char *str;
+ Datum result;
+
+ txt_size = VARSIZE_ANY_EXHDR(txt);
+ str = (char *) palloc(txt_size+1);
+ memcpy(str, VARDATA_ANY(txt), txt_size);
+ str[txt_size] = '\0';
+
+ result = hash_any((unsigned char *) str, txt_size);
+ pfree(str);
+
+ PG_FREE_IF_COPY(txt, 0);
+
+ PG_RETURN_DATUM(result);
+ }
+
+ PG_FUNCTION_INFO_V1(debversion_eq);
+
+ Datum
+ debversion_eq(PG_FUNCTION_ARGS)
+ {
+ text *left = PG_GETARG_TEXT_PP(0);
+ text *right = PG_GETARG_TEXT_PP(1);
+ bool result;
+
+ result = debversioncmp(left, right) == 0;
+
+ PG_FREE_IF_COPY(left, 0);
+ PG_FREE_IF_COPY(right, 1);
+
+ PG_RETURN_BOOL(result);
+ }
+
+ PG_FUNCTION_INFO_V1(debversion_ne);
+
+ Datum
+ debversion_ne(PG_FUNCTION_ARGS)
+ {
+ text *left = PG_GETARG_TEXT_PP(0);
+ text *right = PG_GETARG_TEXT_PP(1);
+ bool result;
+
+ result = debversioncmp(left, right) != 0;
+
+ PG_FREE_IF_COPY(left, 0);
+ PG_FREE_IF_COPY(right, 1);
+
+ PG_RETURN_BOOL(result);
+ }
+
+ PG_FUNCTION_INFO_V1(debversion_lt);
+
+ Datum
+ debversion_lt(PG_FUNCTION_ARGS)
+ {
+ text *left = PG_GETARG_TEXT_PP(0);
+ text *right = PG_GETARG_TEXT_PP(1);
+ bool result;
+
+ result = debversioncmp(left, right) < 0;
+
+ PG_FREE_IF_COPY(left, 0);
+ PG_FREE_IF_COPY(right, 1);
+
+ PG_RETURN_BOOL(result);
+ }
+
+ PG_FUNCTION_INFO_V1(debversion_le);
+
+ Datum
+ debversion_le(PG_FUNCTION_ARGS)
+ {
+ text *left = PG_GETARG_TEXT_PP(0);
+ text *right = PG_GETARG_TEXT_PP(1);
+ bool result;
+
+ result = debversioncmp(left, right) <= 0;
+
+ PG_FREE_IF_COPY(left, 0);
+ PG_FREE_IF_COPY(right, 1);
+
+ PG_RETURN_BOOL(result);
+ }
+
+ PG_FUNCTION_INFO_V1(debversion_gt);
+
+ Datum
+ debversion_gt(PG_FUNCTION_ARGS)
+ {
+ text *left = PG_GETARG_TEXT_PP(0);
+ text *right = PG_GETARG_TEXT_PP(1);
+ bool result;
+
+ result = debversioncmp(left, right) > 0;
+
+ PG_FREE_IF_COPY(left, 0);
+ PG_FREE_IF_COPY(right, 1);
+
+ PG_RETURN_BOOL(result);
+ }
+
+ PG_FUNCTION_INFO_V1(debversion_ge);
+
+ Datum
+ debversion_ge(PG_FUNCTION_ARGS)
+ {
+ text *left = PG_GETARG_TEXT_PP(0);
+ text *right = PG_GETARG_TEXT_PP(1);
+ bool result;
+
+ result = debversioncmp(left, right) >= 0;
+
+ PG_FREE_IF_COPY(left, 0);
+ PG_FREE_IF_COPY(right, 1);
+
+ PG_RETURN_BOOL(result);
+ }
+
+ PG_FUNCTION_INFO_V1(debversion_smaller);
+
+ Datum
+ debversion_smaller(PG_FUNCTION_ARGS)
+ {
+ text *left = PG_GETARG_TEXT_PP(0);
+ text *right = PG_GETARG_TEXT_PP(1);
+ text *result;
+
+ result = debversioncmp(left, right) < 0 ? left : right;
+
+ PG_RETURN_TEXT_P(result);
+ }
+
+ PG_FUNCTION_INFO_V1(debversion_larger);
+
+ Datum
+ debversion_larger(PG_FUNCTION_ARGS)
+ {
+ text *left = PG_GETARG_TEXT_PP(0);
+ text *right = PG_GETARG_TEXT_PP(1);
+ text *result;
+
+ result = debversioncmp(left, right) > 0 ? left : right;
+
+ PG_RETURN_TEXT_P(result);
+ }
+}
diff --git a/setup/debversion/debversion.sql.in b/setup/debversion/debversion.sql.in
new file mode 100644
index 0000000..9d8dea0
--- /dev/null
+++ b/setup/debversion/debversion.sql.in
@@ -0,0 +1,237 @@
+--- WannaBuild Database Schema for PostgreSQL -*- sql -*-
+--- Debian version type and operators
+---
+--- Code derived from Dpkg::Version:
+--- Copyright © Colin Watson <cjwatson@debian.org>
+--- Copyright © Ian Jackson <iwj@debian.org>
+--- Copyright © 2007 by Don Armstrong <don@donarmstrong.com>
+---
+--- PostgreSQL SQL, PL/pgSQL and PL/Perl:
+--- Copyright © 2008 Roger Leigh <rleigh@debian.org>
+---
+--- This program is free software: you can redistribute it and/or modify
+--- it under the terms of the GNU General Public License as published by
+--- the Free Software Foundation, either version 2 of the License, or
+--- (at your option) any later version.
+---
+--- This program is distributed in the hope that it will be useful, but
+--- WITHOUT ANY WARRANTY; without even the implied warranty of
+--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+--- General Public License for more details.
+---
+--- You should have received a copy of the GNU General Public License
+--- along with this program. If not, see
+--- <http://www.gnu.org/licenses/>.
+
+SET search_path = public;
+
+CREATE TYPE debversion;
+
+CREATE OR REPLACE FUNCTION debversionin(cstring)
+RETURNS debversion
+AS 'textin'
+LANGUAGE internal IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION debversionout(debversion)
+RETURNS cstring
+AS 'textout'
+LANGUAGE internal IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION debversionrecv(internal)
+RETURNS debversion
+AS 'textrecv'
+LANGUAGE internal STABLE STRICT;
+
+CREATE OR REPLACE FUNCTION debversionsend(debversion)
+RETURNS bytea
+AS 'textsend'
+LANGUAGE internal STABLE STRICT;
+
+CREATE TYPE debversion (
+ INPUT = debversionin,
+ OUTPUT = debversionout,
+ RECEIVE = debversionrecv,
+ SEND = debversionsend,
+ INTERNALLENGTH = VARIABLE,
+ STORAGE = extended,
+ -- make it a non-preferred member of string type category
+ CATEGORY = 'S',
+ PREFERRED = false
+);
+
+COMMENT ON TYPE debversion IS 'Debian package version number';
+
+CREATE OR REPLACE FUNCTION debversion(bpchar)
+RETURNS debversion
+AS 'rtrim1'
+LANGUAGE internal IMMUTABLE STRICT;
+
+CREATE CAST (debversion AS text) WITHOUT FUNCTION AS IMPLICIT;
+CREATE CAST (debversion AS varchar) WITHOUT FUNCTION AS IMPLICIT;
+CREATE CAST (debversion AS bpchar) WITHOUT FUNCTION AS ASSIGNMENT;
+CREATE CAST (text AS debversion) WITHOUT FUNCTION AS ASSIGNMENT;
+CREATE CAST (varchar AS debversion) WITHOUT FUNCTION AS ASSIGNMENT;
+CREATE CAST (bpchar AS debversion) WITH FUNCTION debversion(bpchar);
+
+CREATE OR REPLACE FUNCTION debversion_cmp (version1 debversion,
+ version2 debversion)
+ RETURNS integer AS 'MODULE_PATHNAME', 'debversion_cmp'
+ LANGUAGE C
+ IMMUTABLE STRICT;
+COMMENT ON FUNCTION debversion_cmp (debversion, debversion)
+ IS 'Compare Debian versions';
+
+CREATE OR REPLACE FUNCTION debversion_eq (version1 debversion,
+ version2 debversion)
+ RETURNS boolean AS 'MODULE_PATHNAME', 'debversion_eq'
+ LANGUAGE C
+ IMMUTABLE STRICT;
+COMMENT ON FUNCTION debversion_eq (debversion, debversion)
+ IS 'debversion equal';
+
+CREATE OR REPLACE FUNCTION debversion_ne (version1 debversion,
+ version2 debversion)
+ RETURNS boolean AS 'MODULE_PATHNAME', 'debversion_ne'
+ LANGUAGE C
+ IMMUTABLE STRICT;
+COMMENT ON FUNCTION debversion_ne (debversion, debversion)
+ IS 'debversion not equal';
+
+CREATE OR REPLACE FUNCTION debversion_lt (version1 debversion,
+ version2 debversion)
+ RETURNS boolean AS 'MODULE_PATHNAME', 'debversion_lt'
+ LANGUAGE C
+ IMMUTABLE STRICT;
+COMMENT ON FUNCTION debversion_lt (debversion, debversion)
+ IS 'debversion less-than';
+
+CREATE OR REPLACE FUNCTION debversion_gt (version1 debversion,
+ version2 debversion)
+ RETURNS boolean AS 'MODULE_PATHNAME', 'debversion_gt'
+ LANGUAGE C
+ IMMUTABLE STRICT;
+COMMENT ON FUNCTION debversion_gt (debversion, debversion)
+ IS 'debversion greater-than';
+
+CREATE OR REPLACE FUNCTION debversion_le (version1 debversion,
+ version2 debversion)
+ RETURNS boolean AS 'MODULE_PATHNAME', 'debversion_le'
+ LANGUAGE C
+ IMMUTABLE STRICT;
+COMMENT ON FUNCTION debversion_le (debversion, debversion)
+ IS 'debversion less-than-or-equal';
+
+CREATE OR REPLACE FUNCTION debversion_ge (version1 debversion,
+ version2 debversion)
+ RETURNS boolean AS 'MODULE_PATHNAME', 'debversion_ge'
+ LANGUAGE C
+ IMMUTABLE STRICT;
+COMMENT ON FUNCTION debversion_ge (debversion, debversion)
+ IS 'debversion greater-than-or-equal';
+
+CREATE OPERATOR = (
+ PROCEDURE = debversion_eq,
+ LEFTARG = debversion,
+ RIGHTARG = debversion,
+ COMMUTATOR = =,
+ NEGATOR = !=
+);
+COMMENT ON OPERATOR = (debversion, debversion)
+ IS 'debversion equal';
+
+CREATE OPERATOR != (
+ PROCEDURE = debversion_ne,
+ LEFTARG = debversion,
+ RIGHTARG = debversion,
+ COMMUTATOR = !=,
+ NEGATOR = =
+);
+COMMENT ON OPERATOR != (debversion, debversion)
+ IS 'debversion not equal';
+
+CREATE OPERATOR < (
+ PROCEDURE = debversion_lt,
+ LEFTARG = debversion,
+ RIGHTARG = debversion,
+ COMMUTATOR = >,
+ NEGATOR = >=
+);
+COMMENT ON OPERATOR < (debversion, debversion)
+ IS 'debversion less-than';
+
+CREATE OPERATOR > (
+ PROCEDURE = debversion_gt,
+ LEFTARG = debversion,
+ RIGHTARG = debversion,
+ COMMUTATOR = <,
+ NEGATOR = >=
+);
+COMMENT ON OPERATOR > (debversion, debversion)
+ IS 'debversion greater-than';
+
+CREATE OPERATOR <= (
+ PROCEDURE = debversion_le,
+ LEFTARG = debversion,
+ RIGHTARG = debversion,
+ COMMUTATOR = >=,
+ NEGATOR = >
+);
+COMMENT ON OPERATOR <= (debversion, debversion)
+ IS 'debversion less-than-or-equal';
+
+CREATE OPERATOR >= (
+ PROCEDURE = debversion_ge,
+ LEFTARG = debversion,
+ RIGHTARG = debversion,
+ COMMUTATOR = <=,
+ NEGATOR = <
+);
+COMMENT ON OPERATOR >= (debversion, debversion)
+ IS 'debversion greater-than-or-equal';
+
+CREATE OPERATOR CLASS debversion_ops
+DEFAULT FOR TYPE debversion USING btree AS
+ OPERATOR 1 < (debversion, debversion),
+ OPERATOR 2 <= (debversion, debversion),
+ OPERATOR 3 = (debversion, debversion),
+ OPERATOR 4 >= (debversion, debversion),
+ OPERATOR 5 > (debversion, debversion),
+ FUNCTION 1 debversion_cmp(debversion, debversion);
+
+CREATE OR REPLACE FUNCTION debversion_hash(debversion)
+ RETURNS int4
+ AS 'MODULE_PATHNAME'
+ LANGUAGE C
+ IMMUTABLE STRICT;
+
+CREATE OPERATOR CLASS debversion_ops
+DEFAULT FOR TYPE debversion USING hash AS
+ OPERATOR 1 = (debversion, debversion),
+ FUNCTION 1 debversion_hash(debversion);
+
+CREATE OR REPLACE FUNCTION debversion_smaller(version1 debversion,
+ version2 debversion)
+ RETURNS debversion
+ AS 'MODULE_PATHNAME'
+ LANGUAGE C
+ IMMUTABLE STRICT;
+
+CREATE OR REPLACE FUNCTION debversion_larger(version1 debversion,
+ version2 debversion)
+ RETURNS debversion
+ AS 'MODULE_PATHNAME'
+ LANGUAGE C
+ IMMUTABLE STRICT;
+
+CREATE AGGREGATE min(debversion) (
+ SFUNC = debversion_smaller,
+ STYPE = debversion,
+ SORTOP = <
+);
+
+CREATE AGGREGATE max(debversion) (
+ SFUNC = debversion_larger,
+ STYPE = debversion,
+ SORTOP = >
+);
+
diff --git a/setup/debversion/uninstall_debversion.sql b/setup/debversion/uninstall_debversion.sql
new file mode 100644
index 0000000..2c04df3
--- /dev/null
+++ b/setup/debversion/uninstall_debversion.sql
@@ -0,0 +1,35 @@
+SET search_path = public;
+
+DROP OPERATOR CLASS debversion_ops USING btree CASCADE;
+DROP OPERATOR CLASS debversion_ops USING hash CASCADE;
+
+DROP AGGREGATE min(debversion);
+DROP AGGREGATE max(debversion);
+
+DROP OPERATOR = (debversion, debversion);
+DROP OPERATOR <> (debversion, debversion);
+DROP OPERATOR < (debversion, debversion);
+DROP OPERATOR <= (debversion, debversion);
+DROP OPERATOR >= (debversion, debversion);
+DROP OPERATOR > (debversion, debversion);
+
+DROP CAST (debversion AS text);
+DROP CAST (debversion AS varchar);
+DROP CAST (debversion AS bpchar);
+DROP CAST (text AS debversion);
+DROP CAST (varchar AS debversion);
+DROP CAST (bpchar AS debversion);
+
+DROP FUNCTION debversion(bpchar);
+DROP FUNCTION debversion_eq(debversion, debversion);
+DROP FUNCTION debversion_ne(debversion, debversion);
+DROP FUNCTION debversion_lt(debversion, debversion);
+DROP FUNCTION debversion_le(debversion, debversion);
+DROP FUNCTION debversion_gt(debversion, debversion);
+DROP FUNCTION debversion_ge(debversion, debversion);
+DROP FUNCTION debversion_cmp(debversion, debversion);
+DROP FUNCTION debversion_hash(debversion);
+DROP FUNCTION debversion_smaller(debversion, debversion);
+DROP FUNCTION debversion_larger(debversion, debversion);
+
+DROP TYPE debversion CASCADE;
--
1.6.1.3
Reply to: