dumbo 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile +1 -1
- data/bin/dumbo +65 -24
- data/config/boot.rb +2 -3
- data/dumbo.gemspec +1 -2
- data/lib/dumbo.rb +17 -16
- data/lib/dumbo/aggregate.rb +3 -5
- data/lib/dumbo/base_type.rb +17 -17
- data/lib/dumbo/binding_loader.rb +50 -0
- data/lib/dumbo/cast.rb +5 -5
- data/lib/dumbo/composite_type.rb +4 -4
- data/lib/dumbo/db_task.rb +6 -5
- data/lib/dumbo/dependency_resolver.rb +17 -18
- data/lib/dumbo/enum_type.rb +3 -4
- data/lib/dumbo/extension.rb +64 -20
- data/lib/dumbo/extension_migrator.rb +11 -11
- data/lib/dumbo/extension_version.rb +29 -11
- data/lib/dumbo/function.rb +21 -21
- data/lib/dumbo/operator.rb +4 -6
- data/lib/dumbo/pg_object.rb +17 -21
- data/lib/dumbo/rake_task.rb +63 -53
- data/lib/dumbo/range_type.rb +6 -9
- data/lib/dumbo/test.rb +8 -0
- data/lib/dumbo/test/fixture.rb +51 -0
- data/lib/dumbo/test/helper.rb +64 -0
- data/lib/dumbo/test/matchers.rb +76 -0
- data/lib/dumbo/test/regression_helper.rb +20 -0
- data/lib/dumbo/test/silence_unknown_oid.rb +12 -0
- data/lib/dumbo/type.rb +3 -4
- data/lib/dumbo/version.rb +1 -1
- data/spec/aggregate_spec.rb +9 -10
- data/spec/cast_spec.rb +5 -5
- data/spec/{Makefile → dumbo_sample/Makefile} +4 -0
- data/spec/{dumbo_sample--0.0.1.sql → dumbo_sample/dumbo_sample--0.0.1.sql} +0 -0
- data/spec/{dumbo_sample--0.0.2.sql → dumbo_sample/dumbo_sample--0.0.2.sql} +0 -0
- data/spec/dumbo_sample/dumbo_sample--0.0.3.sql +7 -0
- data/spec/dumbo_sample/dumbo_sample--0.0.4.sql +13 -0
- data/spec/{dumbo_sample.control → dumbo_sample/dumbo_sample.control} +0 -0
- data/spec/dumbo_sample/src/dumbo_sample.c +13 -0
- data/spec/dumbo_sample/src/dumbo_sample.h +17 -0
- data/spec/extension_migrator_spec.rb +12 -11
- data/spec/extension_spec.rb +41 -12
- data/spec/extension_version_spec.rb +27 -0
- data/spec/operator_spec.rb +6 -7
- data/spec/spec_helper.rb +15 -9
- data/spec/support/extension_helper.rb +31 -0
- data/spec/support/silence_unknown_oid.rb +12 -0
- data/spec/type_spec.rb +59 -55
- data/template/Rakefile +6 -6
- data/template/spec/sample_spec.rb.erb +1 -1
- metadata +33 -31
- data/config/database.yml +0 -31
- data/lib/tasks/db.rake +0 -52
- data/lib/tasks/dumbo.rake +0 -23
- data/spec/support/sql_helper.rb +0 -23
data/lib/dumbo/enum_type.rb
CHANGED
@@ -2,7 +2,6 @@ module Dumbo
|
|
2
2
|
class EnumType < Type
|
3
3
|
attr_accessor :labels
|
4
4
|
|
5
|
-
|
6
5
|
def load_attributes
|
7
6
|
super
|
8
7
|
|
@@ -12,11 +11,11 @@ module Dumbo
|
|
12
11
|
WHERE enumtypid = #{oid}
|
13
12
|
ORDER by enumsortorder
|
14
13
|
SQL
|
15
|
-
|
14
|
+
@labels = res.to_a.map { |r| r['enumlabel'] }
|
16
15
|
end
|
17
16
|
|
18
17
|
def to_sql
|
19
|
-
lbl_str = labels.map{|l| "'"+l+"'"}.join(",\n ")
|
18
|
+
lbl_str = labels.map { |l| "'" + l + "'" }.join(",\n ")
|
20
19
|
|
21
20
|
<<-SQL.gsub(/^ {6}/, '')
|
22
21
|
CREATE TYPE #{name} AS ENUM (
|
@@ -25,4 +24,4 @@ module Dumbo
|
|
25
24
|
SQL
|
26
25
|
end
|
27
26
|
end
|
28
|
-
end
|
27
|
+
end
|
data/lib/dumbo/extension.rb
CHANGED
@@ -1,35 +1,80 @@
|
|
1
1
|
module Dumbo
|
2
|
-
class Extension
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
class Extension < Struct.new(:name, :version)
|
3
|
+
class << self
|
4
|
+
def name
|
5
|
+
@_name ||= File.read(makefile)[/EXTENSION\s*=\s*([^\s]*)/, 1]
|
6
|
+
end
|
7
|
+
|
8
|
+
def version
|
9
|
+
@_version ||= File.read(control_file)[/default_version\s*=\s*'([^']*)'/, 1]
|
10
|
+
end
|
11
|
+
|
12
|
+
def versions
|
13
|
+
new.versions
|
14
|
+
end
|
15
|
+
|
16
|
+
def version!(string)
|
17
|
+
content = File.read(control_file)
|
18
|
+
new_content = content.gsub(version, new_version)
|
19
|
+
File.open(control_file, 'w') { |file| file.puts new_content }
|
20
|
+
end
|
21
|
+
|
22
|
+
def file_name
|
23
|
+
"#{name}--#{version}.sql"
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def makefile
|
29
|
+
'Makefile'
|
30
|
+
end
|
31
|
+
|
32
|
+
def control_file
|
33
|
+
"#{name}.control"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def name
|
38
|
+
self[:name] ||= Extension.name
|
39
|
+
end
|
40
|
+
|
41
|
+
def version
|
42
|
+
self[:version] ||= Extension.version
|
7
43
|
end
|
8
44
|
|
9
45
|
# main releases without migrations
|
10
46
|
def releases
|
11
|
-
Dir.glob("#{name}--*.sql").reject{|f| f
|
47
|
+
Dir.glob("#{name}--*.sql").reject { |f| f =~ /\d--\d/ }
|
12
48
|
end
|
13
49
|
|
14
|
-
def
|
15
|
-
|
16
|
-
|
50
|
+
def versions
|
51
|
+
releases.map do |file_name|
|
52
|
+
if version_string = file_name[/([\d+\.]+)\.sql$/, 1]
|
53
|
+
ExtensionVersion.new_from_string(version_string)
|
54
|
+
else
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
end.compact.sort
|
17
58
|
end
|
18
59
|
|
19
|
-
def
|
60
|
+
def create
|
20
61
|
execute "DROP EXTENSION IF EXISTS #{name}"
|
21
|
-
|
62
|
+
|
63
|
+
create_sql = "CREATE EXTENSION #{name}"
|
64
|
+
create_sql = "#{create_sql} VERSION '#{version}'" unless version.nil?
|
65
|
+
|
66
|
+
execute create_sql
|
22
67
|
self
|
23
68
|
end
|
24
69
|
|
25
70
|
def obj_id
|
26
71
|
@obj_id ||= begin
|
27
|
-
result = execute <<-
|
72
|
+
result = execute <<-SQL
|
28
73
|
SELECT e.extname, e.oid
|
29
74
|
FROM pg_catalog.pg_extension e
|
30
75
|
WHERE e.extname ~ '^(#{name})$'
|
31
76
|
ORDER BY 1;
|
32
|
-
|
77
|
+
SQL
|
33
78
|
result.first['oid']
|
34
79
|
end
|
35
80
|
end
|
@@ -43,24 +88,24 @@ module Dumbo
|
|
43
88
|
ORDER BY 1;
|
44
89
|
SQL
|
45
90
|
|
46
|
-
result.map{|r| PgObject.new(r['objid']).get(r['classid'])}
|
91
|
+
result.map { |r| PgObject.new(r['objid']).get(r['classid']) }
|
47
92
|
end
|
48
93
|
end
|
49
94
|
|
50
95
|
def types
|
51
|
-
objects.select{|o| o.kind_of?(Type)}
|
96
|
+
objects.select { |o| o.kind_of?(Type) }
|
52
97
|
end
|
53
98
|
|
54
99
|
def functions
|
55
|
-
objects.select{|o| o.kind_of?(Function)}
|
100
|
+
objects.select { |o| o.kind_of?(Function) }
|
56
101
|
end
|
57
102
|
|
58
103
|
def casts
|
59
|
-
objects.select{|o| o.kind_of?(Cast)}
|
104
|
+
objects.select { |o| o.kind_of?(Cast) }
|
60
105
|
end
|
61
106
|
|
62
107
|
def operators
|
63
|
-
objects.select{|o| o.kind_of?(Operator)}
|
108
|
+
objects.select { |o| o.kind_of?(Operator) }
|
64
109
|
end
|
65
110
|
|
66
111
|
private
|
@@ -68,6 +113,5 @@ module Dumbo
|
|
68
113
|
def execute(sql)
|
69
114
|
ActiveRecord::Base.connection.execute sql
|
70
115
|
end
|
71
|
-
|
72
116
|
end
|
73
|
-
end
|
117
|
+
end
|
@@ -5,31 +5,31 @@ module Dumbo
|
|
5
5
|
|
6
6
|
def initialize(name, old_version, new_version)
|
7
7
|
@name = name
|
8
|
-
@old_version = Extension.new(name, old_version).
|
8
|
+
@old_version = Extension.new(name, old_version).create
|
9
9
|
@old_version.objects
|
10
|
-
@new_version = Extension.new(name, new_version).
|
10
|
+
@new_version = Extension.new(name, new_version).create
|
11
11
|
@new_version.objects
|
12
12
|
end
|
13
13
|
|
14
14
|
def create
|
15
|
-
File.open("#{name}--#{old_version.version}--#{new_version.version}.sql",'w') do |f|
|
15
|
+
File.open("#{name}--#{old_version.version}--#{new_version.version}.sql", 'w') do |f|
|
16
16
|
f.puts upgrade
|
17
17
|
end
|
18
|
-
File.open("#{name}--#{new_version.version}--#{old_version.version}.sql",'w') do |f|
|
18
|
+
File.open("#{name}--#{new_version.version}--#{old_version.version}.sql", 'w') do |f|
|
19
19
|
f.puts downgrade
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
def upgrade
|
24
24
|
TYPES.map do |type|
|
25
|
-
diff = object_diff(type
|
25
|
+
diff = object_diff(type, :upgrade)
|
26
26
|
"----#{type}----\n" + diff if diff.present?
|
27
27
|
end.compact.join("\n")
|
28
28
|
end
|
29
29
|
|
30
30
|
def downgrade
|
31
31
|
TYPES.map do |type|
|
32
|
-
diff = object_diff(type
|
32
|
+
diff = object_diff(type, :downgrade)
|
33
33
|
"----#{type}----\n" + diff if diff.present?
|
34
34
|
end.compact.join("\n")
|
35
35
|
end
|
@@ -46,12 +46,12 @@ module Dumbo
|
|
46
46
|
ids = @old_version.public_send(type).map(&:identify) | @new_version.public_send(type).map(&:identify)
|
47
47
|
|
48
48
|
sqls = ids.map do |id|
|
49
|
-
n = @new_version.public_send(type).find{|n| n.identify == id }
|
50
|
-
o = @old_version.public_send(type).find{|n| n.identify == id }
|
49
|
+
n = @new_version.public_send(type).find { |n| n.identify == id }
|
50
|
+
o = @old_version.public_send(type).find { |n| n.identify == id }
|
51
51
|
if n
|
52
|
-
n.public_send(dir,o)
|
52
|
+
n.public_send(dir, o)
|
53
53
|
elsif o
|
54
|
-
o.public_send(dir,o)
|
54
|
+
o.public_send(dir, o)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
@@ -63,4 +63,4 @@ module Dumbo
|
|
63
63
|
ActiveRecord::Base.connection.execute sql
|
64
64
|
end
|
65
65
|
end
|
66
|
-
end
|
66
|
+
end
|
@@ -1,25 +1,43 @@
|
|
1
1
|
module Dumbo
|
2
|
-
class ExtensionVersion
|
2
|
+
class ExtensionVersion < Struct.new(:major, :minor, :patch)
|
3
3
|
include Comparable
|
4
4
|
|
5
|
-
|
5
|
+
class << self
|
6
|
+
def new_from_string(version)
|
7
|
+
ExtensionVersion.new(*version.split('.').map(&:to_i))
|
8
|
+
end
|
6
9
|
|
7
|
-
|
8
|
-
|
10
|
+
def sort
|
11
|
+
sort! { |a, b| a <=> b }
|
12
|
+
end
|
9
13
|
end
|
10
14
|
|
11
15
|
def <=>(other)
|
12
|
-
return major <=> other.major if (
|
13
|
-
return minor <=> other.minor if (
|
14
|
-
return patch <=> other.patch if (
|
16
|
+
return major <=> other.major if (major <=> other.major) != 0
|
17
|
+
return minor <=> other.minor if (minor <=> other.minor) != 0
|
18
|
+
return patch <=> other.patch if (patch <=> other.patch) != 0
|
15
19
|
end
|
16
20
|
|
17
|
-
def
|
18
|
-
|
21
|
+
def bump(level)
|
22
|
+
send("bump_#{level}")
|
19
23
|
end
|
20
24
|
|
21
25
|
def to_s
|
22
|
-
|
26
|
+
to_a.compact.join('.')
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def bump_major
|
32
|
+
ExtensionVersion.new(major + 1, 0, 0)
|
33
|
+
end
|
34
|
+
|
35
|
+
def bump_minor
|
36
|
+
ExtensionVersion.new(major, minor.to_i + 1, 0)
|
37
|
+
end
|
38
|
+
|
39
|
+
def bump_patch
|
40
|
+
ExtensionVersion.new(major, minor, patch.to_i + 1)
|
23
41
|
end
|
24
42
|
end
|
25
|
-
end
|
43
|
+
end
|
data/lib/dumbo/function.rb
CHANGED
@@ -17,40 +17,40 @@ module Dumbo
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def drop
|
20
|
-
"DROP FUNCTION #{name}
|
20
|
+
"DROP FUNCTION #{name}(#{arg_types});"
|
21
21
|
end
|
22
22
|
|
23
23
|
def upgrade(other)
|
24
|
-
return
|
24
|
+
return to_sql if other.nil?
|
25
25
|
|
26
|
-
if other.identify !=
|
27
|
-
|
26
|
+
if other.identify != identify
|
27
|
+
fail 'Not the Same Objects!'
|
28
28
|
end
|
29
29
|
|
30
|
-
return nil if other.to_sql ==
|
30
|
+
return nil if other.to_sql == to_sql
|
31
31
|
|
32
|
-
if other.result_type !=
|
33
|
-
|
34
|
-
#{
|
35
|
-
#{
|
32
|
+
if other.result_type != result_type
|
33
|
+
<<-SQL.gsub(/^ {8}/, '')
|
34
|
+
#{drop}
|
35
|
+
#{to_sql}
|
36
36
|
SQL
|
37
37
|
else
|
38
|
-
|
38
|
+
to_sql
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
42
|
def downgrade(other)
|
43
|
-
return
|
43
|
+
return to_sql if other.nil?
|
44
44
|
|
45
|
-
if other.identify !=
|
46
|
-
|
45
|
+
if other.identify != identify
|
46
|
+
fail 'Not the Same Objects!'
|
47
47
|
end
|
48
48
|
|
49
|
-
return nil if other.to_sql ==
|
49
|
+
return nil if other.to_sql == to_sql
|
50
50
|
|
51
|
-
if other.result_type !=
|
52
|
-
|
53
|
-
#{
|
51
|
+
if other.result_type != result_type
|
52
|
+
<<-SQL.gsub(/^ {8}/, '')
|
53
|
+
#{drop}
|
54
54
|
#{other.to_sql}
|
55
55
|
SQL
|
56
56
|
else
|
@@ -87,15 +87,15 @@ module Dumbo
|
|
87
87
|
AND p.oid = #{oid};
|
88
88
|
SQL
|
89
89
|
|
90
|
-
result.first.each do |k,v|
|
91
|
-
send("#{k}=",v) rescue nil
|
90
|
+
result.first.each do |k, v|
|
91
|
+
send("#{k}=", v) rescue nil
|
92
92
|
end
|
93
93
|
|
94
94
|
result.first
|
95
95
|
end
|
96
96
|
|
97
97
|
def to_sql
|
98
|
-
definition.gsub("public.#{name}",name)
|
98
|
+
definition.gsub("public.#{name}", name)
|
99
99
|
end
|
100
100
|
end
|
101
|
-
end
|
101
|
+
end
|
data/lib/dumbo/operator.rb
CHANGED
@@ -16,7 +16,6 @@ module Dumbo
|
|
16
16
|
identfied_by :name, :leftarg, :rightarg
|
17
17
|
|
18
18
|
def load_attributes
|
19
|
-
|
20
19
|
result = execute <<-SQL
|
21
20
|
SELECT
|
22
21
|
op.oprname AS name,
|
@@ -42,16 +41,15 @@ module Dumbo
|
|
42
41
|
WHERE op.oid = #{oid}
|
43
42
|
SQL
|
44
43
|
|
45
|
-
result.first.each do |k,v|
|
46
|
-
send("#{k}=",v) rescue nil
|
44
|
+
result.first.each do |k, v|
|
45
|
+
send("#{k}=", v) rescue nil
|
47
46
|
end
|
48
47
|
|
49
48
|
result.first
|
50
|
-
|
51
49
|
end
|
52
50
|
|
53
51
|
def to_sql
|
54
|
-
attrs = [:leftarg, :rightarg, :commutator, :negator, :restrict, :join].
|
52
|
+
attrs = [:leftarg, :rightarg, :commutator, :negator, :restrict, :join].reduce([]) do |mem, attr|
|
55
53
|
mem << "#{attr.to_s.upcase} = #{public_send(attr)}" if public_send(attr)
|
56
54
|
mem
|
57
55
|
end
|
@@ -71,4 +69,4 @@ module Dumbo
|
|
71
69
|
"DROP OPERATOR #{name};"
|
72
70
|
end
|
73
71
|
end
|
74
|
-
end
|
72
|
+
end
|
data/lib/dumbo/pg_object.rb
CHANGED
@@ -17,10 +17,10 @@ module Dumbo
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def identify
|
20
|
-
|
20
|
+
identifier.map { |a| public_send a }
|
21
21
|
end
|
22
22
|
|
23
|
-
def get(type=nil)
|
23
|
+
def get(type = nil)
|
24
24
|
case type
|
25
25
|
when 'function', 'pg_proc'
|
26
26
|
Function.new(oid).get
|
@@ -31,42 +31,39 @@ module Dumbo
|
|
31
31
|
when 'type', 'pg_type'
|
32
32
|
Type.new(oid).get
|
33
33
|
else
|
34
|
-
|
34
|
+
load_attributes
|
35
35
|
self
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
def load_attributes
|
40
|
-
|
41
40
|
end
|
42
41
|
|
43
42
|
def upgrade(other)
|
44
|
-
return
|
43
|
+
return to_sql if other.nil?
|
45
44
|
|
46
|
-
if other.identify !=
|
47
|
-
|
45
|
+
if other.identify != identify
|
46
|
+
fail 'Not the Same Objects!'
|
48
47
|
end
|
49
48
|
|
50
|
-
if other.to_sql !=
|
51
|
-
|
52
|
-
#{
|
53
|
-
#{
|
49
|
+
if other.to_sql != to_sql
|
50
|
+
<<-SQL.gsub(/^ {8}/, '')
|
51
|
+
#{drop}
|
52
|
+
#{to_sql}
|
54
53
|
SQL
|
55
54
|
end
|
56
|
-
|
57
|
-
|
58
55
|
end
|
59
56
|
|
60
57
|
def downgrade(other)
|
61
|
-
return
|
58
|
+
return drop if other.nil?
|
62
59
|
|
63
|
-
if other.identify !=
|
64
|
-
|
60
|
+
if other.identify != identify
|
61
|
+
fail 'Not the Same Objects!'
|
65
62
|
end
|
66
63
|
|
67
|
-
if other.to_sql !=
|
68
|
-
|
69
|
-
#{
|
64
|
+
if other.to_sql != to_sql
|
65
|
+
<<-SQL.gsub(/^ {8}/, '')
|
66
|
+
#{drop}
|
70
67
|
#{other.to_sql}
|
71
68
|
SQL
|
72
69
|
end
|
@@ -75,6 +72,5 @@ module Dumbo
|
|
75
72
|
def execute(sql)
|
76
73
|
ActiveRecord::Base.connection.execute(sql)
|
77
74
|
end
|
78
|
-
|
79
75
|
end
|
80
|
-
end
|
76
|
+
end
|