ar-monocle 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e4605eab43d5ef90c70e7c242c8e76a740cd77a0
4
- data.tar.gz: 42cf6093efbda0ee8833413c481f512f99739dbf
3
+ metadata.gz: 10fbc61e93890eef2c1b59798b325d5dd3e28ad0
4
+ data.tar.gz: 702017a18200d523e8828274983186f973fb31f1
5
5
  SHA512:
6
- metadata.gz: 9c5d66e5a7be45c7765d9b49389428da9f67cb6bfcd9b1d37986a22662321ff911715cff84fbfc937d549efba321c3dea457f3afb3a24280ed89de65d5cc8ed3
7
- data.tar.gz: 1ad0d0d5d0c79bedbe5d8a477a0ef7dac5f9b34290cc4aba44e4418e1588ecc5c6305843bde1271c1eb147d41d6f3706e115d58d4fb892491008409b49c9a5f9
6
+ metadata.gz: 653872e33fe7b8867b62eab9ad70344713e444ec6725ebbede4aec3ac0405a45750c64e38f677d172c5267c0a343f3103ece4df74be9650e57f6272dec415110
7
+ data.tar.gz: d1547660d5da98962fe7f9d4196290936a40859d5ee2e8cd7d9bd6147e3a40295d7b4aca6a8fd2c984930c2d459d0d57cc4fa1df72b6f9d98b480d2674a3beab
@@ -1,3 +1,3 @@
1
1
  module Monocle
2
- VERSION = "0.1.5"
2
+ VERSION = "0.1.6"
3
3
  end
@@ -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.5
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-10 00:00:00.000000000 Z
11
+ date: 2017-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler