prick 0.10.0 → 0.15.0
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.
- checksums.yaml +4 -4
- data/exe/prick +7 -0
- data/lib/prick/builder.rb +40 -10
- data/lib/prick/database.rb +17 -1
- data/lib/prick/program.rb +25 -12
- data/lib/prick/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65c56eb6650acf4a9a15acc00589075fe551548f06df7f714db56b89fc8f0f7d
|
4
|
+
data.tar.gz: 585b320426243c5a3a82df87a924e89e03807c47b618a44350a8c7e646112f34
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 72f83cb2412de38665afac3c6b3e7bd293d17ad35c64910bec6ef6db5080922d5d6771b044b76dcc52539da60327843861f681f979f3e04739a3cb04f804f8e1
|
7
|
+
data.tar.gz: c5460d78662709f1c5cb8bc5badd3243230cd41ff800b3d8fb9eee3d3e49cd314f51548dab060f0435d5c1aa58c3dbdfb22c490acc96b8e4dc101659675af027
|
data/exe/prick
CHANGED
@@ -195,6 +195,13 @@ begin
|
|
195
195
|
exit 0
|
196
196
|
end
|
197
197
|
|
198
|
+
# Change to parent directory containing the Prick version file if not found
|
199
|
+
# in the current directory
|
200
|
+
program.current_directory = Dir.getwd
|
201
|
+
while !Dir.getwd != "/" && !File.exist?(PRICK_VERSION_FILE)
|
202
|
+
Dir.chdir("..")
|
203
|
+
end
|
204
|
+
|
198
205
|
# Check prick version
|
199
206
|
file = PrickVersion.new
|
200
207
|
file.exist? or raise Prick::Error, "Can't find prick version file '#{file.path}'"
|
data/lib/prick/builder.rb
CHANGED
@@ -7,20 +7,24 @@ module Prick
|
|
7
7
|
# and is used to match a build file. Build files are looked up in the
|
8
8
|
# following order:
|
9
9
|
#
|
10
|
-
# #{name}
|
10
|
+
# #{name} executable
|
11
|
+
# #{name}.* executable
|
11
12
|
# #{name}.yml
|
12
13
|
# #{name}.sql
|
13
14
|
# #{name}/
|
14
15
|
#
|
16
|
+
# The output from executable objects is expected to be SQL statements that
|
17
|
+
# are fed into postgres
|
18
|
+
#
|
15
19
|
# When a resource match a directory, the directory can contain a special
|
16
20
|
# default resource ('build' or 'migrate') that takes over the rest of the
|
17
21
|
# build process for that directory. Typically, you'll use the 'build.yml' or
|
18
|
-
# 'migrate.yml' to control the build order of the other resources
|
19
|
-
#
|
20
|
-
#
|
21
|
-
# directory are built in alphabetic order
|
22
|
+
# 'migrate.yml' to control the build order of the other resources. If a
|
23
|
+
# directory doesn't contain a build resource, the resources in the directory
|
24
|
+
# are built in alphabetic order
|
22
25
|
#
|
23
|
-
# Build SQL scripts are executed with
|
26
|
+
# Build (but not migration) SQL scripts and executables are executed with
|
27
|
+
# search path set to containing schema
|
24
28
|
#
|
25
29
|
class Builder
|
26
30
|
attr_reader :database
|
@@ -34,6 +38,7 @@ module Prick
|
|
34
38
|
@default = default
|
35
39
|
@execute = true
|
36
40
|
@lines = []
|
41
|
+
@cwd = Dir.getwd # used in error messages
|
37
42
|
end
|
38
43
|
|
39
44
|
def build(subject = default, execute: true)
|
@@ -63,7 +68,13 @@ module Prick
|
|
63
68
|
# puts "do_sql(#{path})"
|
64
69
|
do_dir(path) { |file|
|
65
70
|
if @execute
|
66
|
-
|
71
|
+
begin
|
72
|
+
Rdbms.exec_file(database.name, file, user: database.user, schema: schema)
|
73
|
+
rescue Command::Error => ex
|
74
|
+
$stderr.puts ex.stderr
|
75
|
+
$stderr.puts "in #{reldir}/#{file}"
|
76
|
+
exit 1
|
77
|
+
end
|
67
78
|
else
|
68
79
|
@lines += IO.readlines(file).map(&:chomp)
|
69
80
|
end
|
@@ -71,12 +82,18 @@ module Prick
|
|
71
82
|
true
|
72
83
|
end
|
73
84
|
|
74
|
-
def do_exe(path)
|
85
|
+
def do_exe(path, schema: nil)
|
75
86
|
# puts "do_exe(#{path})"
|
76
87
|
do_dir(path) { |file|
|
77
|
-
lines = Command.command "
|
88
|
+
lines = Command.command "./#{file} #{database.name} #{database.user}" # FIXME Security
|
78
89
|
if @execute
|
79
|
-
|
90
|
+
begin
|
91
|
+
Rdbms.exec_sql(database.name, lines.join("\n"), user: database.user, schema: schema)
|
92
|
+
rescue Command::Error => ex
|
93
|
+
$stderr.puts ex.stderr
|
94
|
+
$stderr.puts "from #{reldir}/#{file}"
|
95
|
+
exit 1
|
96
|
+
end
|
80
97
|
else
|
81
98
|
@lines += lines
|
82
99
|
end
|
@@ -126,6 +143,14 @@ module Prick
|
|
126
143
|
end
|
127
144
|
}
|
128
145
|
end
|
146
|
+
|
147
|
+
private
|
148
|
+
# Return the relative path to the current directory from the directory of
|
149
|
+
# the time of the instantiation of the Builder object. Used in error
|
150
|
+
# messages
|
151
|
+
def reldir
|
152
|
+
Dir.getwd.sub(/^#{@cwd}\//, "")
|
153
|
+
end
|
129
154
|
end
|
130
155
|
|
131
156
|
class MigrationBuilder < Builder
|
@@ -167,6 +192,11 @@ module Prick
|
|
167
192
|
schema = Dir.getwd.sub(/^.*schema\/([^\/]+)(?:\/.*)?$/, '\1')
|
168
193
|
super(path, schema: schema)
|
169
194
|
end
|
195
|
+
|
196
|
+
def do_exe(path)
|
197
|
+
schema = Dir.getwd.sub(/^.*schema\/([^\/]+)(?:\/.*)?$/, '\1')
|
198
|
+
super(path, schema: schema)
|
199
|
+
end
|
170
200
|
end
|
171
201
|
end
|
172
202
|
|
data/lib/prick/database.rb
CHANGED
@@ -59,7 +59,23 @@ module Prick
|
|
59
59
|
@version = nil
|
60
60
|
end
|
61
61
|
|
62
|
-
|
62
|
+
# Hollow-out a database without dropping it. This is useful compared to a
|
63
|
+
# simple drop database since it wont block on other sessions wont block
|
64
|
+
def clean()
|
65
|
+
if exist?
|
66
|
+
schemas = Rdbms.select_values(
|
67
|
+
"postgres",
|
68
|
+
"select nspname from pg_namespace where nspowner != 10")
|
69
|
+
for schema in schemas
|
70
|
+
Rdbms.exec_sql(name, "drop schema \"#{schema}\" cascade")
|
71
|
+
end
|
72
|
+
Rdbms.exec_sql(name, "drop schema if exists public cascade")
|
73
|
+
Rdbms.exec_sql(name, "create schema public authorization postgres")
|
74
|
+
Rdbms.exec_sql(name, "grant usage, create on schema public to public")
|
75
|
+
else
|
76
|
+
create
|
77
|
+
end
|
78
|
+
end
|
63
79
|
|
64
80
|
def to_s() name end
|
65
81
|
end
|
data/lib/prick/program.rb
CHANGED
@@ -10,8 +10,10 @@ module Prick
|
|
10
10
|
|
11
11
|
attr_accessor :quiet
|
12
12
|
attr_accessor :verbose
|
13
|
+
attr_accessor :current_directory # Path to the directory where prick was called from
|
13
14
|
|
14
|
-
def initialize(quiet: false, verbose: false)
|
15
|
+
def initialize(current_directory = Dir.getwd, quiet: false, verbose: false)
|
16
|
+
@current_directory = current_directory
|
15
17
|
@quiet = quiet
|
16
18
|
@verbose = verbose
|
17
19
|
end
|
@@ -95,8 +97,9 @@ module Prick
|
|
95
97
|
database = database ? Database.new(database, project.user) : project.database(version)
|
96
98
|
project.load(database, version: version)
|
97
99
|
mesg "Loaded v#{version}", into_mesg, "from cache"
|
98
|
-
else
|
99
|
-
|
100
|
+
else
|
101
|
+
file = file_or_version
|
102
|
+
project.load(database, file: norm_path(file))
|
100
103
|
mesg "Loaded #{File.basename(file)}", into_mesg
|
101
104
|
end
|
102
105
|
end
|
@@ -104,9 +107,8 @@ module Prick
|
|
104
107
|
def save(version, file)
|
105
108
|
database = project.database(version)
|
106
109
|
database.exist? or raise "Can't find database '#{database}'"
|
107
|
-
|
108
|
-
|
109
|
-
mesg "Saved #{database} to #{subj_mesg}"
|
110
|
+
project.save(database, file: norm_path(file))
|
111
|
+
mesg "Saved #{database} to #{file || 'cache'}"
|
110
112
|
end
|
111
113
|
|
112
114
|
def drop(database, all)
|
@@ -230,15 +232,16 @@ module Prick
|
|
230
232
|
|
231
233
|
# TODO: Create a Backup class and a Project#backup_store object
|
232
234
|
def backup(file = nil)
|
233
|
-
|
234
|
-
|
235
|
+
path = norm_path(file) ||
|
236
|
+
File.join(SPOOL_DIR, "#{project.name}-#{Time.now.utc.strftime("%Y%m%d-%H%M%S")}.sql.gz")
|
237
|
+
project.save(file: path)
|
235
238
|
mesg "Backed-up database to #{file}"
|
236
239
|
end
|
237
240
|
|
238
|
-
def restore(
|
239
|
-
|
240
|
-
File.exist?(
|
241
|
-
project.load(file:
|
241
|
+
def restore(file = nil)
|
242
|
+
path = norm_path(file) || Dir.glob(File.join(SPOOL_DIR, "#{name}-*.sql.gz")).sort.last
|
243
|
+
File.exist?(path) or raise Error, "Can't find #{file || "any backup file"}"
|
244
|
+
project.load(file: path)
|
242
245
|
mesg "Restored database from #{file}"
|
243
246
|
end
|
244
247
|
|
@@ -249,6 +252,16 @@ module Prick
|
|
249
252
|
project_name == project.name or raise Error, "Database not owned by this prick project: #{database}"
|
250
253
|
end
|
251
254
|
|
255
|
+
# Expand relative path with respect to the directory where prick was called
|
256
|
+
# from. Return nil if file is nil
|
257
|
+
def norm_path(file)
|
258
|
+
if file && !file.start_with?("/")
|
259
|
+
File.join(current_directory, file)
|
260
|
+
else
|
261
|
+
file
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
252
265
|
def mesg(*args) puts args.compact.grep(/\S/).join(' ') if !quiet end
|
253
266
|
def verb(*args) puts args.compact.grep(/\S/).join(' ') if verbose end
|
254
267
|
end
|
data/lib/prick/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prick
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Claus Rasmussen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: shellopts
|