diff options
author | Dickson S. Guedes | 2011-10-16 01:46:09 +0000 |
---|---|---|
committer | Dickson S. Guedes | 2011-10-16 01:46:09 +0000 |
commit | ce90658da5b10bf6c686da62fcbd02ae5684da31 (patch) | |
tree | 419545f5166673df88843ed1218b9ae3c37127e7 | |
parent | 9cb77dd7655ba24c0212e7d6a3af965f17327c89 (diff) |
added template for C extensions, #20
-rw-r--r-- | lib/pgxn_utils/templates/c/%extension_name%.control.tt | 5 | ||||
-rw-r--r-- | lib/pgxn_utils/templates/c/.gitignore.tt | 8 | ||||
-rw-r--r-- | lib/pgxn_utils/templates/c/.template | 1 | ||||
-rw-r--r-- | lib/pgxn_utils/templates/c/META.json.tt | 37 | ||||
-rw-r--r-- | lib/pgxn_utils/templates/c/Makefile.tt | 24 | ||||
-rw-r--r-- | lib/pgxn_utils/templates/c/README.md.tt | 80 | ||||
-rw-r--r-- | lib/pgxn_utils/templates/c/doc/%extension_name%.md.tt | 33 | ||||
-rw-r--r-- | lib/pgxn_utils/templates/c/sql/%extension_name%.sql.tt | 17 | ||||
-rw-r--r-- | lib/pgxn_utils/templates/c/sql/uninstall_%extension_name%.sql | 1 | ||||
-rw-r--r-- | lib/pgxn_utils/templates/c/src/%extension_name%.c.tt | 26 | ||||
-rw-r--r-- | lib/pgxn_utils/templates/c/test/expected/base.out.tt | 9 | ||||
-rw-r--r-- | lib/pgxn_utils/templates/c/test/sql/base.sql.tt | 10 | ||||
-rw-r--r-- | spec/cli_spec.rb | 44 |
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| |