[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[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: