pgxn_utils 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. data/LICENSE +9 -0
  2. data/META.json +32 -10
  3. data/Makefile +1 -1
  4. data/README.md +179 -39
  5. data/Rakefile +77 -14
  6. data/bin/pgxn-bundle +22 -0
  7. data/bin/pgxn-change +22 -0
  8. data/bin/pgxn-release +22 -0
  9. data/bin/pgxn-skeleton +22 -0
  10. data/bin/pgxn-utils +15 -3
  11. data/lib/pgxn_utils/cli.rb +34 -19
  12. data/lib/pgxn_utils/no_tasks.rb +63 -0
  13. data/lib/pgxn_utils/templates/c/%extension_name%.control.tt +5 -0
  14. data/lib/pgxn_utils/templates/c/.gitignore.tt +8 -0
  15. data/lib/pgxn_utils/templates/c/.template +1 -0
  16. data/lib/pgxn_utils/templates/c/META.json.tt +37 -0
  17. data/lib/pgxn_utils/templates/c/Makefile.tt +24 -0
  18. data/lib/pgxn_utils/templates/c/README.md.tt +80 -0
  19. data/lib/pgxn_utils/templates/c/doc/%extension_name%.md.tt +33 -0
  20. data/lib/pgxn_utils/templates/c/sql/%extension_name%.sql.tt +17 -0
  21. data/lib/pgxn_utils/templates/c/sql/uninstall_%extension_name%.sql.tt +1 -0
  22. data/lib/pgxn_utils/templates/c/src/%extension_name%.c.tt +26 -0
  23. data/lib/pgxn_utils/templates/c/test/expected/base.out.tt +9 -0
  24. data/lib/pgxn_utils/templates/c/test/sql/base.sql.tt +10 -0
  25. data/lib/pgxn_utils/templates/fdw/%extension_name%.control.tt +5 -0
  26. data/lib/pgxn_utils/templates/fdw/.gitignore.tt +8 -0
  27. data/lib/pgxn_utils/templates/fdw/.template +1 -0
  28. data/lib/pgxn_utils/templates/fdw/META.json.tt +37 -0
  29. data/lib/pgxn_utils/templates/fdw/Makefile.tt +24 -0
  30. data/lib/pgxn_utils/templates/fdw/README.md.tt +80 -0
  31. data/lib/pgxn_utils/templates/fdw/doc/%extension_name%.md.tt +33 -0
  32. data/lib/pgxn_utils/templates/fdw/sql/%extension_name%.sql.tt +31 -0
  33. data/lib/pgxn_utils/templates/fdw/sql/uninstall_%extension_name%.sql.tt +14 -0
  34. data/lib/pgxn_utils/templates/fdw/src/%extension_name%_fdw.c.tt +323 -0
  35. data/lib/pgxn_utils/templates/fdw/test/expected/base.out.tt +4 -0
  36. data/lib/pgxn_utils/templates/fdw/test/sql/base.sql.tt +8 -0
  37. data/lib/pgxn_utils/templates/root/.gitignore.tt +8 -0
  38. data/lib/pgxn_utils/templates/root/META.json.tt +21 -21
  39. data/lib/pgxn_utils/templates/sql/%extension_name%.control.tt +4 -0
  40. data/lib/pgxn_utils/templates/sql/.gitignore.tt +8 -0
  41. data/lib/pgxn_utils/templates/sql/.template +1 -0
  42. data/lib/pgxn_utils/templates/sql/META.json.tt +27 -0
  43. data/lib/pgxn_utils/templates/sql/Makefile.tt +28 -0
  44. data/lib/pgxn_utils/templates/sql/README.md.tt +80 -0
  45. data/lib/pgxn_utils/templates/sql/doc/%extension_name%.md.tt +33 -0
  46. data/lib/pgxn_utils/templates/sql/sql/%extension_name%.sql.tt +31 -0
  47. data/lib/pgxn_utils/templates/sql/sql/uninstall_%extension_name%.sql.tt +21 -0
  48. data/lib/pgxn_utils/templates/sql/test/expected/base.out.tt +49 -0
  49. data/lib/pgxn_utils/templates/sql/test/sql/base.sql.tt +25 -0
  50. data/lib/pgxn_utils/version.rb +1 -1
  51. data/lib/pgxn_utils.rb +1 -1
  52. data/pgxn_utils.gemspec +21 -30
  53. data/spec/cli_spec.rb +73 -8
  54. data/spec/no_tasks_spec.rb +2 -0
  55. data/spec/spec_helper.rb +21 -4
  56. metadata +87 -30
@@ -23,20 +23,24 @@ module PgxnUtils
23
23
  method_option :generated_by, :aliases => "-b", :type => :string, :desc => "Name of extension's generator"
24
24
  method_option :tags, :aliases => "-t", :type => :array, :desc => "Defines extension's tags"
25
25
  method_option :release_status, :aliases => "-r", :type => :string, :desc => "Initial extension's release status"
26
+ method_option :git, :type => :boolean, :default => false, :desc => "Initialize a git repository after create the extension"
27
+ method_option :template, :type => :string, :default => "sql", :desc => "The template that will be used to create the extension. Expected values are: sql, c, fdw"
26
28
 
27
29
  def skeleton(extension_name,target=nil)
28
30
  self.target = options[:target] || target || "."
29
31
 
30
32
  if is_extension?("#{self.target}/#{extension_name}")
31
33
  say "'#{extension_name}' already exists. Please, use 'change' instead 'skeleton'.", :red
32
- elsif is_extension?(".")
34
+ elsif is_extension?(self.target)
33
35
  say "You are inside a extension directory, already. Consider use 'change' instead.", :red
34
36
  elsif is_dir?("#{self.target}/#{extension_name}")
35
37
  say "Can't create an extension overwriting an existing directory.", :red
36
38
  else
37
39
  self.set_accessors extension_name
38
40
 
39
- directory "root", extension_name
41
+ directory selected_template, extension_name
42
+
43
+ init_repository("#{self.target}/#{extension_name}") if options[:git]
40
44
  end
41
45
  end
42
46
 
@@ -59,14 +63,16 @@ module PgxnUtils
59
63
  def change(extension_name=".")
60
64
  extension_path, extension_name = resolve_extension_path_and_name(extension_name)
61
65
 
66
+ template_type = File.read("#{extension_path}/.template").chomp
67
+
62
68
  self.target = extension_path
63
69
  self.extension_name = extension_name
64
70
 
65
71
  set_accessors(extension_name)
66
72
 
67
73
  if is_extension?(extension_path)
68
- template "root/META.json.tt", "#{extension_path}/META.json"
69
- template "root/%extension_name%.control.tt", "#{extension_path}/%extension_name%.control"
74
+ template "#{template_type}/META.json.tt", "#{extension_path}/META.json"
75
+ template "#{template_type}/%extension_name%.control.tt", "#{extension_path}/%extension_name%.control"
70
76
  else
71
77
  say "'#{extension_name}' doesn't appears to be an extension. Please, supply the extension's name", :red
72
78
  end
@@ -83,21 +89,30 @@ module PgxnUtils
83
89
 
84
90
  self.target = path
85
91
  archive_name = "#{path}-#{config_options['version']}"
86
- ext = "zip"
87
- archive = "#{archive_name}.#{ext}"
88
-
89
- if can_zip?(archive)
90
- make_dist_clean(path)
91
-
92
- Zippy.create(archive) do |zip|
93
- Dir["#{path}/**/**"].each do |file|
94
- zip["#{extension_name}-#{config_options['version']}/#{file.sub(path+'/','')}"] = File.open(file) unless File.directory?(file)
95
- end
96
- end
97
- say_status :create, archive, :green
98
- end
99
- end
100
- end
92
+ prefix_name = "#{extension_name}-#{config_options['version']}/"
93
+
94
+ archive = "#{archive_name}.zip"
95
+ archived = false
96
+
97
+ if has_scm?(path)
98
+ if is_dirty?(path)
99
+ say "Your repository is dirty! You should commit or stash before continue.", :red
100
+ else
101
+ if can_zip?(archive)
102
+ scm_archive(path, archive, prefix_name)
103
+ archived = true
104
+ end
105
+ end
106
+ else
107
+ if can_zip?(archive)
108
+ make_dist_clean(path)
109
+ zip_archive(path, archive, prefix_name)
110
+ archived = true
111
+ end
112
+ end
113
+ say_status(:create, archive, :green) if archived
114
+ end
115
+ end
101
116
 
102
117
  desc "release filename", "Release an extension to PGXN"
103
118
 
@@ -2,6 +2,47 @@ module PgxnUtils
2
2
  module NoTasks
3
3
 
4
4
  include PgxnUtils::Constants
5
+ include Grit
6
+
7
+ def selected_template
8
+ template = options[:template]
9
+
10
+ unless [ 'sql', 'c', 'fdw' ].include?(template)
11
+ if Dir["#{template}/*"].include?("#{template}/META.json") or
12
+ Dir["#{template}/*"].include?("#{template}/META.json.tt")
13
+ template = File.expand_path(options[:template])
14
+ else
15
+ raise "invalid template: #{template}"
16
+ end
17
+ end
18
+ template
19
+ end
20
+
21
+ def init_repository(extension_dir)
22
+ repo = Repo.init(extension_dir)
23
+ original_dir = File.expand_path "."
24
+
25
+ if repo
26
+ say_status :init, "#{extension_dir}", :green
27
+
28
+ FileUtils.chdir extension_dir
29
+ repo.add "."
30
+ if repo.commit_index("initial commit")
31
+ say_status :commit, "initial commit", :green
32
+ else
33
+ say_status :failed, "initial commit", :red
34
+ end
35
+ else
36
+ say_status :error, " initializing #{extension_dir}", :red
37
+ end
38
+
39
+ FileUtils.chdir original_dir
40
+ end
41
+
42
+ def is_dirty?(extension_dir)
43
+ repo = Repo.init(extension_dir)
44
+ repo.status.map(&:type).uniq != [nil]
45
+ end
5
46
 
6
47
  def make_dist_clean(path)
7
48
  inside path do
@@ -77,12 +118,34 @@ module PgxnUtils
77
118
  [ extension_path, extension_name ]
78
119
  end
79
120
 
121
+ def has_scm?(path)
122
+ begin
123
+ Repo.new(path)
124
+ rescue Grit::InvalidGitRepositoryError
125
+ false
126
+ end
127
+ end
128
+
129
+ def scm_archive(path, archive, prefix, treeish='master')
130
+ git = Git.new(Repo.new(path).path)
131
+ git.archive({:format => "zip", :prefix => prefix, :output => archive}, treeish)
132
+ end
133
+
134
+ def zip_archive(path, archive, prefix)
135
+ Zip::ZipFile.open(archive, Zip::ZipFile::CREATE) do |zip|
136
+ Dir["#{path}/**/**"].each do |file|
137
+ zip.add("#{prefix}#{file.sub(path+'/','')}", file) unless File.directory?(file)
138
+ end
139
+ end
140
+ end
141
+
80
142
  def can_zip?(archive)
81
143
  can_zip = false
82
144
 
83
145
  if File.exists?(archive)
84
146
  say_status :conflict, archive, :red
85
147
  if yes? "Overwrite #{archive}? [yN]"
148
+ FileUtils.rm_f archive
86
149
  can_zip = true
87
150
  else
88
151
  can_zip = false
@@ -0,0 +1,5 @@
1
+ # <%= extension_name %> extension
2
+ comment = '<%= abstract %>'
3
+ default_version = '<%= version %>'
4
+ module_pathname = '$libdir/<%= extension_name %>'
5
+ relocatable = true
@@ -0,0 +1,8 @@
1
+ results/
2
+ *.so
3
+ tmp/
4
+ *.o
5
+ regression.diffs
6
+ regression.out
7
+ /sql/<%= extension_name =>--*
8
+ !/sql/<%= extension_name =>--*--*.sql
@@ -0,0 +1 @@
1
+ c
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "<%= extension_name %>",
3
+ "abstract": "<%= abstract %>",
4
+ "description": "<%= description %>",
5
+ "version": "<%= version %>",
6
+ "maintainer": "<%= maintainer %>",
7
+ "license": "<%= license %>",
8
+ "provides": {
9
+ "<%= extension_name %>": {
10
+ "abstract": "<%= abstract %>",
11
+ "file": "sql/<%= extension_name %>.sql",
12
+ "docfile": "doc/<%= extension_name %>.md",
13
+ "version": "<%= version %>"
14
+ }
15
+ },
16
+ "release_status": "<%= release_status %>",
17
+ "resources": {
18
+ "bugtracker": {
19
+ "web": "http://change.me"
20
+ },
21
+ "repository": {
22
+ "url": "git://change.me/<%= extension_name %>.git",
23
+ "web": "http://change.me",
24
+ "type": "git"
25
+ }
26
+ },
27
+ <% if generated_by %>
28
+ "generated_by": "<%= generated_by %>",
29
+ <% end %>
30
+ <% if tags %>
31
+ "tags": [ <%= tags.collect { |t| %Q|"#{t}"| }.join(",") %> ],
32
+ <% end %>
33
+ "meta-spec": {
34
+ "version": "1.0.0",
35
+ "url": "http://pgxn.org/meta/spec.txt"
36
+ }
37
+ }
@@ -0,0 +1,24 @@
1
+ EXTENSION = <%= extension_name %>
2
+ EXTVERSION = $(shell grep default_version $(EXTENSION).control | sed -e "s/default_version[[:space:]]*=[[:space:]]*'\([^']*\)'/\1/")
3
+
4
+ DATA = $(filter-out $(wildcard sql/*--*.sql),$(wildcard sql/*.sql))
5
+ DOCS = $(wildcard doc/*.md)
6
+ TESTS = $(wildcard test/sql/*.sql)
7
+ REGRESS = $(patsubst test/sql/%.sql,%,$(TESTS))
8
+ REGRESS_OPTS = --inputdir=test --load-language=plpgsql
9
+ MODULES = $(patsubst %.c,%,$(wildcard src/*.c))
10
+ PG_CONFIG = pg_config
11
+ PG91 = $(shell $(PG_CONFIG) --version | grep -qE " 8\.| 9\.0" && echo no || echo yes)
12
+
13
+ ifeq ($(PG91),yes)
14
+ all: sql/$(EXTENSION)--$(EXTVERSION).sql
15
+
16
+ sql/$(EXTENSION)--$(EXTVERSION).sql: sql/$(EXTENSION).sql
17
+ cp $< $@
18
+
19
+ DATA = $(wildcard sql/*--*.sql) sql/$(EXTENSION)--$(EXTVERSION).sql
20
+ EXTRA_CLEAN = sql/$(EXTENSION)--$(EXTVERSION).sql
21
+ endif
22
+
23
+ PGXS := $(shell $(PG_CONFIG) --pgxs)
24
+ include $(PGXS)
@@ -0,0 +1,80 @@
1
+ <%= extension_name %>
2
+ <%= extension_name.gsub(/./,"=") %>
3
+
4
+ <%= description %>
5
+
6
+ To build it, just do this:
7
+
8
+ make
9
+ make installcheck
10
+ make install
11
+
12
+ If you encounter an error such as:
13
+
14
+ "Makefile", line 8: Need an operator
15
+
16
+ You need to use GNU make, which may well be installed on your system as
17
+ `gmake`:
18
+
19
+ gmake
20
+ gmake install
21
+ gmake installcheck
22
+
23
+ If you encounter an error such as:
24
+
25
+ make: pg_config: Command not found
26
+
27
+ Be sure that you have `pg_config` installed and in your path. If you used a
28
+ package management system such as RPM to install PostgreSQL, be sure that the
29
+ `-devel` package is also installed. If necessary tell the build process where
30
+ to find it:
31
+
32
+ env PG_CONFIG=/path/to/pg_config make && make installcheck && make install
33
+
34
+ And finally, if all that fails (and if you're on PostgreSQL 8.1 or lower, it
35
+ likely will), copy the entire distribution directory to the `contrib/`
36
+ subdirectory of the PostgreSQL source tree and try it there without
37
+ `pg_config`:
38
+
39
+ env NO_PGXS=1 make && make installcheck && make install
40
+
41
+ If you encounter an error such as:
42
+
43
+ ERROR: must be owner of database regression
44
+
45
+ You need to run the test suite using a super user, such as the default
46
+ "postgres" super user:
47
+
48
+ make installcheck PGUSER=postgres
49
+
50
+ Once <%= extension_name %> is installed, you can add it to a database. If you're running
51
+ PostgreSQL 9.1.0 or greater, it's a simple as connecting to a database as a
52
+ super user and running:
53
+
54
+ CREATE EXTENSION <%= extension_name %>;
55
+
56
+ If you've upgraded your cluster to PostgreSQL 9.1 and already had <%= extension_name %>
57
+ installed, you can upgrade it to a properly packaged extension with:
58
+
59
+ CREATE EXTENSION <%= extension_name %> FROM unpackaged;
60
+
61
+ For versions of PostgreSQL less than 9.1.0, you'll need to run the
62
+ installation script:
63
+
64
+ psql -d mydb -f /path/to/pgsql/share/contrib/<%= extension_name %>.sql
65
+
66
+ If you want to install <%= extension_name %> and all of its supporting objects into a specific
67
+ schema, use the `PGOPTIONS` environment variable to specify the schema, like
68
+ so:
69
+
70
+ PGOPTIONS=--search_path=extensions psql -d mydb -f <%= extension_name %>.sql
71
+
72
+ Dependencies
73
+ ------------
74
+ The `<%= extension_name %>` data type has no dependencies other than PostgreSQL.
75
+
76
+ Copyright and License
77
+ ---------------------
78
+
79
+ Copyright (c) <%= Time.now.strftime("%Y") %> <%= maintainer %>.
80
+
@@ -0,0 +1,33 @@
1
+ <%= extension_name %>
2
+ <%= extension_name.gsub(/./,"=") %>
3
+
4
+ Synopsis
5
+ --------
6
+
7
+ Show a brief synopsis of the extension.
8
+
9
+ Description
10
+ -----------
11
+
12
+ <%= description %>
13
+
14
+ Usage
15
+ -----
16
+
17
+ Show usage.
18
+
19
+ Support
20
+ -------
21
+
22
+ There is issues tracker? Github? Put this information here.
23
+
24
+ Author
25
+ ------
26
+
27
+ [<%= maintainer %>]
28
+
29
+ Copyright and License
30
+ ---------------------
31
+
32
+ Copyright (c) <%= Time.now.strftime("%Y") %> <%= maintainer %>.
33
+
@@ -0,0 +1,17 @@
1
+ /*
2
+ * Author: <%= maintainer %>
3
+ * Created at: <%= Time.now %>
4
+ *
5
+ */
6
+
7
+ --
8
+ -- This is a example code genereted automaticaly
9
+ -- by pgxn-utils.
10
+
11
+ -- This is how you define a C function in PostgreSQL.
12
+ CREATE OR REPLACE FUNCTION <%= extension_name %>(text)
13
+ RETURNS text
14
+ AS '<%= extension_name %>'
15
+ LANGUAGE C IMMUTABLE STRICT;
16
+
17
+ -- See more: http://www.postgresql.org/docs/current/static/xfunc-c.html
@@ -0,0 +1 @@
1
+ DROP FUNCTION <%= extension_name %>(text);
@@ -0,0 +1,26 @@
1
+ #include "postgres.h"
2
+ #include "fmgr.h"
3
+ /*
4
+ * You can include more files here if needed.
5
+ * To use some types, you must include the
6
+ * correct file here based on:
7
+ * http://www.postgresql.org/docs/current/static/xfunc-c.html#XFUNC-C-TYPE-TABLE
8
+ */
9
+
10
+ PG_MODULE_MAGIC;
11
+
12
+ PG_FUNCTION_INFO_V1(<%= extension_name %>);
13
+ Datum <%= extension_name %>(PG_FUNCTION_ARGS);
14
+
15
+ Datum
16
+ <%= extension_name %>(PG_FUNCTION_ARGS)
17
+ {
18
+ /*
19
+ * This is an empty body and will return NULL
20
+ *
21
+ * You should remove this comment and type
22
+ * cool code here!
23
+ */
24
+
25
+ PG_RETURN_NULL();
26
+ }
@@ -0,0 +1,9 @@
1
+ \set ECHO 0
2
+ -- You should write your tests
3
+ SELECT <%= extension_name %>('test');
4
+ <%= extension_name %>
5
+ <%= '-' * (extension_name.length + 2) %>
6
+
7
+ (1 row)
8
+
9
+ ROLLBACK;
@@ -0,0 +1,10 @@
1
+ \set ECHO 0
2
+ BEGIN;
3
+ \i sql/<%= extension_name %>.sql
4
+ \set ECHO all
5
+
6
+ -- You should write your tests
7
+
8
+ SELECT <%= extension_name %>('test');
9
+
10
+ ROLLBACK;
@@ -0,0 +1,5 @@
1
+ # <%= extension_name %> extension
2
+ comment = '<%= abstract %>'
3
+ default_version = '<%= version %>'
4
+ module_pathname = '$libdir/<%= extension_name %>'
5
+ relocatable = true
@@ -0,0 +1,8 @@
1
+ results/
2
+ *.so
3
+ tmp/
4
+ *.o
5
+ regression.diffs
6
+ regression.out
7
+ /sql/<%= extension_name =>--*
8
+ !/sql/<%= extension_name =>--*--*.sql
@@ -0,0 +1 @@
1
+ fdw
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "<%= extension_name %>",
3
+ "abstract": "<%= abstract %>",
4
+ "description": "<%= description %>",
5
+ "version": "<%= version %>",
6
+ "maintainer": "<%= maintainer %>",
7
+ "license": "<%= license %>",
8
+ "provides": {
9
+ "<%= extension_name %>": {
10
+ "abstract": "<%= abstract %>",
11
+ "file": "sql/<%= extension_name %>.sql",
12
+ "docfile": "doc/<%= extension_name %>.md",
13
+ "version": "<%= version %>"
14
+ }
15
+ },
16
+ "release_status": "<%= release_status %>",
17
+ "resources": {
18
+ "bugtracker": {
19
+ "web": "http://change.me"
20
+ },
21
+ "repository": {
22
+ "url": "git://change.me/<%= extension_name %>.git",
23
+ "web": "http://change.me",
24
+ "type": "git"
25
+ }
26
+ },
27
+ <% if generated_by %>
28
+ "generated_by": "<%= generated_by %>",
29
+ <% end %>
30
+ <% if tags %>
31
+ "tags": [ <%= tags.collect { |t| %Q|"#{t}"| }.join(",") %> ],
32
+ <% end %>
33
+ "meta-spec": {
34
+ "version": "1.0.0",
35
+ "url": "http://pgxn.org/meta/spec.txt"
36
+ }
37
+ }
@@ -0,0 +1,24 @@
1
+ EXTENSION = <%= extension_name %>
2
+ EXTVERSION = $(shell grep default_version $(EXTENSION).control | sed -e "s/default_version[[:space:]]*=[[:space:]]*'\([^']*\)'/\1/")
3
+
4
+ DATA = $(filter-out $(wildcard sql/*--*.sql),$(wildcard sql/*.sql))
5
+ DOCS = $(wildcard doc/*.md)
6
+ TESTS = $(wildcard test/sql/*.sql)
7
+ REGRESS = $(patsubst test/sql/%.sql,%,$(TESTS))
8
+ REGRESS_OPTS = --inputdir=test --load-language=plpgsql
9
+ MODULES = $(patsubst %.c,%,$(wildcard src/*.c))
10
+ PG_CONFIG = pg_config
11
+ PG91 = $(shell $(PG_CONFIG) --version | grep -qE " 8\.| 9\.0" && echo no || echo yes)
12
+
13
+ ifeq ($(PG91),yes)
14
+ all: sql/$(EXTENSION)--$(EXTVERSION).sql
15
+
16
+ sql/$(EXTENSION)--$(EXTVERSION).sql: sql/$(EXTENSION).sql
17
+ cp $< $@
18
+
19
+ DATA = $(wildcard sql/*--*.sql) sql/$(EXTENSION)--$(EXTVERSION).sql
20
+ EXTRA_CLEAN = sql/$(EXTENSION)--$(EXTVERSION).sql
21
+ endif
22
+
23
+ PGXS := $(shell $(PG_CONFIG) --pgxs)
24
+ include $(PGXS)
@@ -0,0 +1,80 @@
1
+ <%= extension_name %>
2
+ <%= extension_name.gsub(/./,"=") %>
3
+
4
+ <%= description %>
5
+
6
+ To build it, just do this:
7
+
8
+ make
9
+ make installcheck
10
+ make install
11
+
12
+ If you encounter an error such as:
13
+
14
+ "Makefile", line 8: Need an operator
15
+
16
+ You need to use GNU make, which may well be installed on your system as
17
+ `gmake`:
18
+
19
+ gmake
20
+ gmake install
21
+ gmake installcheck
22
+
23
+ If you encounter an error such as:
24
+
25
+ make: pg_config: Command not found
26
+
27
+ Be sure that you have `pg_config` installed and in your path. If you used a
28
+ package management system such as RPM to install PostgreSQL, be sure that the
29
+ `-devel` package is also installed. If necessary tell the build process where
30
+ to find it:
31
+
32
+ env PG_CONFIG=/path/to/pg_config make && make installcheck && make install
33
+
34
+ And finally, if all that fails (and if you're on PostgreSQL 8.1 or lower, it
35
+ likely will), copy the entire distribution directory to the `contrib/`
36
+ subdirectory of the PostgreSQL source tree and try it there without
37
+ `pg_config`:
38
+
39
+ env NO_PGXS=1 make && make installcheck && make install
40
+
41
+ If you encounter an error such as:
42
+
43
+ ERROR: must be owner of database regression
44
+
45
+ You need to run the test suite using a super user, such as the default
46
+ "postgres" super user:
47
+
48
+ make installcheck PGUSER=postgres
49
+
50
+ Once <%= extension_name %> is installed, you can add it to a database. If you're running
51
+ PostgreSQL 9.1.0 or greater, it's a simple as connecting to a database as a
52
+ super user and running:
53
+
54
+ CREATE EXTENSION <%= extension_name %>;
55
+
56
+ If you've upgraded your cluster to PostgreSQL 9.1 and already had <%= extension_name %>
57
+ installed, you can upgrade it to a properly packaged extension with:
58
+
59
+ CREATE EXTENSION <%= extension_name %> FROM unpackaged;
60
+
61
+ For versions of PostgreSQL less than 9.1.0, you'll need to run the
62
+ installation script:
63
+
64
+ psql -d mydb -f /path/to/pgsql/share/contrib/<%= extension_name %>.sql
65
+
66
+ If you want to install <%= extension_name %> and all of its supporting objects into a specific
67
+ schema, use the `PGOPTIONS` environment variable to specify the schema, like
68
+ so:
69
+
70
+ PGOPTIONS=--search_path=extensions psql -d mydb -f <%= extension_name %>.sql
71
+
72
+ Dependencies
73
+ ------------
74
+ The `<%= extension_name %>` data type has no dependencies other than PostgreSQL.
75
+
76
+ Copyright and License
77
+ ---------------------
78
+
79
+ Copyright (c) <%= Time.now.strftime("%Y") %> <%= maintainer %>.
80
+
@@ -0,0 +1,33 @@
1
+ <%= extension_name %>
2
+ <%= extension_name.gsub(/./,"=") %>
3
+
4
+ Synopsis
5
+ --------
6
+
7
+ Show a brief synopsis of the extension.
8
+
9
+ Description
10
+ -----------
11
+
12
+ <%= description %>
13
+
14
+ Usage
15
+ -----
16
+
17
+ Show usage.
18
+
19
+ Support
20
+ -------
21
+
22
+ There is issues tracker? Github? Put this information here.
23
+
24
+ Author
25
+ ------
26
+
27
+ [<%= maintainer %>]
28
+
29
+ Copyright and License
30
+ ---------------------
31
+
32
+ Copyright (c) <%= Time.now.strftime("%Y") %> <%= maintainer %>.
33
+
@@ -0,0 +1,31 @@
1
+ /*
2
+ * Author: <%= maintainer %>
3
+ * Created at: <%= Time.now %>
4
+ *
5
+ */
6
+
7
+ --
8
+ -- This is a example code genereted automaticaly
9
+ -- by pgxn-utils.
10
+
11
+ CREATE OR REPLACE FUNCTION <%= extension_name %>_fdw_validator (text[], oid)
12
+ RETURNS bool
13
+ AS 'MODULE_PATHNAME'
14
+ LANGUAGE C STRICT;
15
+
16
+ CREATE OR REPLACE FUNCTION <%= extension_name %>_fdw_handler ()
17
+ RETURNS fdw_handler
18
+ AS 'MODULE_PATHNAME'
19
+ LANGUAGE C STRICT;
20
+
21
+ CREATE FOREIGN DATA WRAPPER <%= extension_name %>_fdw
22
+ VALIDATOR <%= extension_name %>_fdw_validator HANDLER <%= extension_name %>_fdw_handler;
23
+
24
+ CREATE SERVER <%= extension_name %>_local_service
25
+ FOREIGN DATA WRAPPER <%= extension_name %>_fdw
26
+ OPTIONS ( server_address 'localhost', server_port '389');
27
+
28
+ -- See more:
29
+ -- http://www.postgresql.org/docs/current/static/sql-createserver.html
30
+ -- http://www.postgresql.org/docs/current/static/sql-createusermapping.html
31
+ -- http://www.postgresql.org/docs/current/static/sql-createforeigndatawrapper.html