summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDickson S. Guedes2011-10-16 01:46:09 +0000
committerDickson S. Guedes2011-10-16 01:46:09 +0000
commitce90658da5b10bf6c686da62fcbd02ae5684da31 (patch)
tree419545f5166673df88843ed1218b9ae3c37127e7
parent9cb77dd7655ba24c0212e7d6a3af965f17327c89 (diff)
added template for C extensions, #20
-rw-r--r--lib/pgxn_utils/templates/c/%extension_name%.control.tt5
-rw-r--r--lib/pgxn_utils/templates/c/.gitignore.tt8
-rw-r--r--lib/pgxn_utils/templates/c/.template1
-rw-r--r--lib/pgxn_utils/templates/c/META.json.tt37
-rw-r--r--lib/pgxn_utils/templates/c/Makefile.tt24
-rw-r--r--lib/pgxn_utils/templates/c/README.md.tt80
-rw-r--r--lib/pgxn_utils/templates/c/doc/%extension_name%.md.tt33
-rw-r--r--lib/pgxn_utils/templates/c/sql/%extension_name%.sql.tt17
-rw-r--r--lib/pgxn_utils/templates/c/sql/uninstall_%extension_name%.sql1
-rw-r--r--lib/pgxn_utils/templates/c/src/%extension_name%.c.tt26
-rw-r--r--lib/pgxn_utils/templates/c/test/expected/base.out.tt9
-rw-r--r--lib/pgxn_utils/templates/c/test/sql/base.sql.tt10
-rw-r--r--spec/cli_spec.rb44
13 files changed, 294 insertions, 1 deletions
diff --git a/lib/pgxn_utils/templates/c/%extension_name%.control.tt b/lib/pgxn_utils/templates/c/%extension_name%.control.tt
new file mode 100644
index 0000000..9bd8a53
--- /dev/null
+++ b/lib/pgxn_utils/templates/c/%extension_name%.control.tt
@@ -0,0 +1,5 @@
+# <%= extension_name %> extension
+comment = '<%= abstract %>'
+default_version = '<%= version %>'
+module_pathname = '$libdir/<%= extension_name %>'
+relocatable = true
diff --git a/lib/pgxn_utils/templates/c/.gitignore.tt b/lib/pgxn_utils/templates/c/.gitignore.tt
new file mode 100644
index 0000000..7ccbc9d
--- /dev/null
+++ b/lib/pgxn_utils/templates/c/.gitignore.tt
@@ -0,0 +1,8 @@
+results/
+*.so
+tmp/
+*.o
+regression.diffs
+regression.out
+/sql/<%= extension_name =>--*
+!/sql/<%= extension_name =>--*--*.sql
diff --git a/lib/pgxn_utils/templates/c/.template b/lib/pgxn_utils/templates/c/.template
new file mode 100644
index 0000000..f2ad6c7
--- /dev/null
+++ b/lib/pgxn_utils/templates/c/.template
@@ -0,0 +1 @@
+c
diff --git a/lib/pgxn_utils/templates/c/META.json.tt b/lib/pgxn_utils/templates/c/META.json.tt
new file mode 100644
index 0000000..8a7dd24
--- /dev/null
+++ b/lib/pgxn_utils/templates/c/META.json.tt
@@ -0,0 +1,37 @@
+{
+ "name": "<%= extension_name %>",
+ "abstract": "<%= abstract %>",
+ "description": "<%= description %>",
+ "version": "<%= version %>",
+ "maintainer": "<%= maintainer %>",
+ "license": "<%= license %>",
+ "provides": {
+ "<%= extension_name %>": {
+ "abstract": "<%= abstract %>",
+ "file": "sql/<%= extension_name %>.sql",
+ "docfile": "doc/<%= extension_name %>.md",
+ "version": "<%= version %>"
+ }
+ },
+ "release_status": "<%= release_status %>",
+ "resources": {
+ "bugtracker": {
+ "web": "http://change.me"
+ },
+ "repository": {
+ "url": "git://change.me/<%= extension_name %>.git",
+ "web": "http://change.me",
+ "type": "git"
+ }
+ },
+<% if generated_by %>
+ "generated_by": "<%= generated_by %>",
+<% end %>
+<% if tags %>
+ "tags": [ <%= tags.collect { |t| %Q|"#{t}"| }.join(",") %> ],
+<% end %>
+ "meta-spec": {
+ "version": "1.0.0",
+ "url": "http://pgxn.org/meta/spec.txt"
+ }
+}
diff --git a/lib/pgxn_utils/templates/c/Makefile.tt b/lib/pgxn_utils/templates/c/Makefile.tt
new file mode 100644
index 0000000..2cbd6c6
--- /dev/null
+++ b/lib/pgxn_utils/templates/c/Makefile.tt
@@ -0,0 +1,24 @@
+EXTENSION = <%= extension_name %>
+EXTVERSION = $(shell grep default_version $(EXTENSION).control | sed -e "s/default_version[[:space:]]*=[[:space:]]*'\([^']*\)'/\1/")
+
+DATA = $(filter-out $(wildcard sql/*--*.sql),$(wildcard sql/*.sql))
+DOCS = $(wildcard doc/*.md)
+TESTS = $(wildcard test/sql/*.sql)
+REGRESS = $(patsubst test/sql/%.sql,%,$(TESTS))
+REGRESS_OPTS = --inputdir=test --load-language=plpgsql
+MODULES = $(patsubst %.c,%,$(wildcard src/*.c))
+PG_CONFIG = pg_config
+PG91 = $(shell $(PG_CONFIG) --version | grep -qE " 8\.| 9\.0" && echo no || echo yes)
+
+ifeq ($(PG91),yes)
+all: sql/$(EXTENSION)--$(EXTVERSION).sql
+
+sql/$(EXTENSION)--$(EXTVERSION).sql: sql/$(EXTENSION).sql
+ cp $< $@
+
+DATA = $(wildcard sql/*--*.sql) sql/$(EXTENSION)--$(EXTVERSION).sql
+EXTRA_CLEAN = sql/$(EXTENSION)--$(EXTVERSION).sql
+endif
+
+PGXS := $(shell $(PG_CONFIG) --pgxs)
+include $(PGXS)
diff --git a/lib/pgxn_utils/templates/c/README.md.tt b/lib/pgxn_utils/templates/c/README.md.tt
new file mode 100644
index 0000000..dea5186
--- /dev/null
+++ b/lib/pgxn_utils/templates/c/README.md.tt
@@ -0,0 +1,80 @@
+<%= extension_name %>
+<%= extension_name.gsub(/./,"=") %>
+
+<%= description %>
+
+To build it, just do this:
+
+ make
+ make installcheck
+ make install
+
+If you encounter an error such as:
+
+ "Makefile", line 8: Need an operator
+
+You need to use GNU make, which may well be installed on your system as
+`gmake`:
+
+ gmake
+ gmake install
+ gmake installcheck
+
+If you encounter an error such as:
+
+ make: pg_config: Command not found
+
+Be sure that you have `pg_config` installed and in your path. If you used a
+package management system such as RPM to install PostgreSQL, be sure that the
+`-devel` package is also installed. If necessary tell the build process where
+to find it:
+
+ env PG_CONFIG=/path/to/pg_config make && make installcheck && make install
+
+And finally, if all that fails (and if you're on PostgreSQL 8.1 or lower, it
+likely will), copy the entire distribution directory to the `contrib/`
+subdirectory of the PostgreSQL source tree and try it there without
+`pg_config`:
+
+ env NO_PGXS=1 make && make installcheck && make install
+
+If you encounter an error such as:
+
+ ERROR: must be owner of database regression
+
+You need to run the test suite using a super user, such as the default
+"postgres" super user:
+
+ make installcheck PGUSER=postgres
+
+Once <%= extension_name %> is installed, you can add it to a database. If you're running
+PostgreSQL 9.1.0 or greater, it's a simple as connecting to a database as a
+super user and running:
+
+ CREATE EXTENSION <%= extension_name %>;
+
+If you've upgraded your cluster to PostgreSQL 9.1 and already had <%= extension_name %>
+installed, you can upgrade it to a properly packaged extension with:
+
+ CREATE EXTENSION <%= extension_name %> FROM unpackaged;
+
+For versions of PostgreSQL less than 9.1.0, you'll need to run the
+installation script:
+
+ psql -d mydb -f /path/to/pgsql/share/contrib/<%= extension_name %>.sql
+
+If you want to install <%= extension_name %> and all of its supporting objects into a specific
+schema, use the `PGOPTIONS` environment variable to specify the schema, like
+so:
+
+ PGOPTIONS=--search_path=extensions psql -d mydb -f <%= extension_name %>.sql
+
+Dependencies
+------------
+The `<%= extension_name %>` data type has no dependencies other than PostgreSQL.
+
+Copyright and License
+---------------------
+
+Copyright (c) <%= Time.now.strftime("%Y") %> <%= maintainer %>.
+
diff --git a/lib/pgxn_utils/templates/c/doc/%extension_name%.md.tt b/lib/pgxn_utils/templates/c/doc/%extension_name%.md.tt
new file mode 100644
index 0000000..4df92fe
--- /dev/null
+++ b/lib/pgxn_utils/templates/c/doc/%extension_name%.md.tt
@@ -0,0 +1,33 @@
+<%= extension_name %>
+<%= extension_name.gsub(/./,"=") %>
+
+Synopsis
+--------
+
+ Show a brief synopsis of the extension.
+
+Description
+-----------
+
+<%= description %>
+
+Usage
+-----
+
+ Show usage.
+
+Support
+-------
+
+ There is issues tracker? Github? Put this information here.
+
+Author
+------
+
+[<%= maintainer %>]
+
+Copyright and License
+---------------------
+
+Copyright (c) <%= Time.now.strftime("%Y") %> <%= maintainer %>.
+
diff --git a/lib/pgxn_utils/templates/c/sql/%extension_name%.sql.tt b/lib/pgxn_utils/templates/c/sql/%extension_name%.sql.tt
new file mode 100644
index 0000000..395d812
--- /dev/null
+++ b/lib/pgxn_utils/templates/c/sql/%extension_name%.sql.tt
@@ -0,0 +1,17 @@
+/*
+ * Author: <%= maintainer %>
+ * Created at: <%= Time.now %>
+ *
+ */
+
+--
+-- This is a example code genereted automaticaly
+-- by pgxn-utils.
+
+-- This is how you define a C function in PostgreSQL.
+CREATE OR REPLACE FUNCTION <%= extension_name %>(text)
+RETURNS text
+AS '<%= extension_name %>'
+LANGUAGE C IMMUTABLE STRICT;
+
+-- See more: http://www.postgresql.org/docs/current/static/xfunc-c.html
diff --git a/lib/pgxn_utils/templates/c/sql/uninstall_%extension_name%.sql b/lib/pgxn_utils/templates/c/sql/uninstall_%extension_name%.sql
new file mode 100644
index 0000000..6cf842b
--- /dev/null
+++ b/lib/pgxn_utils/templates/c/sql/uninstall_%extension_name%.sql
@@ -0,0 +1 @@
+DROP FUNCTION <%= extension_name %>(text);
diff --git a/lib/pgxn_utils/templates/c/src/%extension_name%.c.tt b/lib/pgxn_utils/templates/c/src/%extension_name%.c.tt
new file mode 100644
index 0000000..174331d
--- /dev/null
+++ b/lib/pgxn_utils/templates/c/src/%extension_name%.c.tt
@@ -0,0 +1,26 @@
+#include "postgres.h"
+#include "fmgr.h"
+/*
+ * You can include more files here if needed.
+ * To use some types, you must include the
+ * correct file here based on:
+ * http://www.postgresql.org/docs/current/static/xfunc-c.html#XFUNC-C-TYPE-TABLE
+ */
+
+PG_MODULE_MAGIC;
+
+PG_FUNCTION_INFO_V1(<%= extension_name %>);
+Datum <%= extension_name %>(PG_FUNCTION_ARGS);
+
+Datum
+<%= extension_name %>(PG_FUNCTION_ARGS)
+{
+ /*
+ * This is an empty body and will return NULL
+ *
+ * You should remove this comment and type
+ * cool code here!
+ */
+
+ PG_RETURN_NULL();
+}
diff --git a/lib/pgxn_utils/templates/c/test/expected/base.out.tt b/lib/pgxn_utils/templates/c/test/expected/base.out.tt
new file mode 100644
index 0000000..62b00a3
--- /dev/null
+++ b/lib/pgxn_utils/templates/c/test/expected/base.out.tt
@@ -0,0 +1,9 @@
+\set ECHO 0
+-- You should write your tests
+SELECT <%= extension_name %>('test');
+ <%= extension_name %>
+<%= '-' * (extension_name.length + 2) %>
+
+(1 row)
+
+ROLLBACK;
diff --git a/lib/pgxn_utils/templates/c/test/sql/base.sql.tt b/lib/pgxn_utils/templates/c/test/sql/base.sql.tt
new file mode 100644
index 0000000..44776cb
--- /dev/null
+++ b/lib/pgxn_utils/templates/c/test/sql/base.sql.tt
@@ -0,0 +1,10 @@
+\set ECHO 0
+BEGIN;
+\i sql/<%= extension_name %>.sql
+\set ECHO all
+
+-- You should write your tests
+
+SELECT <%= extension_name %>('test');
+
+ROLLBACK;
diff --git a/spec/cli_spec.rb b/spec/cli_spec.rb
index 2df7880..26029be 100644
--- a/spec/cli_spec.rb
+++ b/spec/cli_spec.rb
@@ -59,7 +59,7 @@ describe PgxnUtils::CLI do
makefile.should match(/EXTENSION = #{expected_extension}/)
control = File.read("/tmp/#{expected_extension}/#{expected_extension}.control")
- control.should match(/module_pathname = '\$libdir\/#{expected_extension}'/)
+ #control.should match(/module_pathname = '\$libdir\/#{expected_extension}'/)
control.should match(/default_version = '#{expected_version}'/)
end
@@ -90,6 +90,48 @@ describe PgxnUtils::CLI do
template.should == "sql"
end
+ it "should generates a skeleton for C extensions" do
+ extension = next_extension
+ skeleton extension, %w|--template c|
+
+ Dir["#{extension}/**/{*,.gitignore,.template}"].sort.should == [
+ "#{extension}/.gitignore",
+ "#{extension}/.template",
+ "#{extension}/META.json",
+ "#{extension}/Makefile",
+ "#{extension}/README.md",
+ "#{extension}/doc",
+ "#{extension}/doc/#{extension}.md",
+ "#{extension}/sql",
+ "#{extension}/sql/#{extension}.sql",
+ "#{extension}/sql/uninstall_#{extension}.sql",
+ "#{extension}/src",
+ "#{extension}/src/#{extension}.c",
+ "#{extension}/test",
+ "#{extension}/test/expected",
+ "#{extension}/test/expected/base.out",
+ "#{extension}/test/sql",
+ "#{extension}/test/sql/base.sql",
+ "#{extension}/#{extension}.control"
+ ].sort
+
+ makefile = File.read("#{extension}/Makefile")
+ makefile.should match(/EXTENSION = #{extension}/)
+
+ control = File.read("#{extension}/#{extension}.control")
+ control.should match(/module_pathname = '\$libdir\/#{extension}'/)
+
+ template = File.read("#{extension}/.template").chomp
+ template.should == "c"
+
+ c_file = File.read("#{extension}/src/#{extension}.c")
+ c_file.should match(/#include "postgres.h"/)
+ c_file.should match(/#include "fmgr.h"/)
+ c_file.should match(/PG_MODULE_MAGIC;/)
+ c_file.should match(/PG_FUNCTION_INFO_V1\(#{extension}\);/)
+ c_file.should match(/Datum #{extension}\(PG_FUNCTION_ARGS\);/)
+ end
+
it "should generates a git repo with --git" do
expected_extension = next_extension
skeleton "#{expected_extension}", %w|--git|