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 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