ar-monocle 0.1.5 → 0.1.6
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/lib/monocle/version.rb +1 -1
- data/lib/monocle/view.rb +42 -14
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 10fbc61e93890eef2c1b59798b325d5dd3e28ad0
|
4
|
+
data.tar.gz: 702017a18200d523e8828274983186f973fb31f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 653872e33fe7b8867b62eab9ad70344713e444ec6725ebbede4aec3ac0405a45750c64e38f677d172c5267c0a343f3103ece4df74be9650e57f6272dec415110
|
7
|
+
data.tar.gz: d1547660d5da98962fe7f9d4196290936a40859d5ee2e8cd7d9bd6147e3a40295d7b4aca6a8fd2c984930c2d459d0d57cc4fa1df72b6f9d98b480d2674a3beab
|
data/lib/monocle/version.rb
CHANGED
data/lib/monocle/view.rb
CHANGED
@@ -18,20 +18,9 @@ module Monocle
|
|
18
18
|
|
19
19
|
def drop
|
20
20
|
debug "Dropping #{name}..."
|
21
|
+
get_dependants_from_pg.each(&:drop) # drop any existing dependants
|
21
22
|
execute drop_command
|
22
23
|
true
|
23
|
-
rescue ActiveRecord::StatementInvalid => e
|
24
|
-
# We have dependants, can't drop this directly.
|
25
|
-
if e.message =~ /PG::DependentObjectsStillExist/
|
26
|
-
# Find the views in the main list, drop them
|
27
|
-
self.dependants = get_dependants_from_error e
|
28
|
-
debug "Can't drop #{name}, it has dependants: #{dependants.map(&:name).join(', ')}"
|
29
|
-
dependants.each &:drop
|
30
|
-
# And try this again
|
31
|
-
retry
|
32
|
-
else
|
33
|
-
fail e
|
34
|
-
end
|
35
24
|
end
|
36
25
|
|
37
26
|
def create
|
@@ -103,11 +92,50 @@ module Monocle
|
|
103
92
|
@path_for_sql ||= File.join views_path, "#{name}.sql"
|
104
93
|
end
|
105
94
|
|
95
|
+
def exists?
|
96
|
+
execute(check_if_view_exists_sql).entries.map(&:values).flatten.first
|
97
|
+
end
|
98
|
+
|
106
99
|
protected
|
107
100
|
|
101
|
+
def check_if_view_exists_sql
|
102
|
+
<<-SQL
|
103
|
+
SELECT count(*) > 0
|
104
|
+
FROM pg_catalog.pg_class c
|
105
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
106
|
+
WHERE c.relkind in ('m','v')
|
107
|
+
AND n.nspname = 'public'
|
108
|
+
AND c.relname = '#{name}';
|
109
|
+
SQL
|
110
|
+
end
|
111
|
+
|
112
|
+
def get_dependants_from_pg
|
113
|
+
map_dependants(execute(find_dependants_sql).entries.map(&:values).flatten - [name])
|
114
|
+
end
|
115
|
+
|
116
|
+
def map_dependants(deps)
|
117
|
+
deps.map { |d| list[d.to_sym] }.compact
|
118
|
+
end
|
119
|
+
|
120
|
+
def find_dependants_sql
|
121
|
+
<<-SQL
|
122
|
+
WITH RECURSIVE vlist AS (
|
123
|
+
SELECT c.oid::REGCLASS AS view_name
|
124
|
+
FROM pg_class c
|
125
|
+
WHERE c.relname = '#{name}'
|
126
|
+
UNION ALL
|
127
|
+
SELECT DISTINCT r.ev_class::REGCLASS AS view_name
|
128
|
+
FROM pg_depend d
|
129
|
+
JOIN pg_rewrite r ON (r.oid = d.objid)
|
130
|
+
JOIN vlist ON (vlist.view_name = d.refobjid)
|
131
|
+
WHERE d.refobjsubid != 0
|
132
|
+
)
|
133
|
+
SELECT * FROM vlist;
|
134
|
+
SQL
|
135
|
+
end
|
136
|
+
|
108
137
|
def get_dependants_from_error(e)
|
109
|
-
e.message.scan(/(\w+) depends on.+view #{name}/).
|
110
|
-
flatten.map { |s| list.fetch s.to_sym }
|
138
|
+
map_dependants e.message.scan(/(\w+) depends on.+view #{name}/).flatten
|
111
139
|
end
|
112
140
|
|
113
141
|
def execute(sql)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ar-monocle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leonardo Bighetti
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|