pgslice 0.4.4 → 0.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +41 -126
- data/exe/pgslice +1 -1
- data/lib/pgslice.rb +13 -3
- data/lib/pgslice/cli.rb +32 -0
- data/lib/pgslice/cli/add_partitions.rb +130 -0
- data/lib/pgslice/cli/analyze.rb +13 -0
- data/lib/pgslice/cli/fill.rb +103 -0
- data/lib/pgslice/cli/prep.rb +97 -0
- data/lib/pgslice/cli/swap.rb +28 -0
- data/lib/pgslice/cli/unprep.rb +18 -0
- data/lib/pgslice/cli/unswap.rb +25 -0
- data/lib/pgslice/helpers.rb +176 -0
- data/lib/pgslice/table.rb +139 -23
- data/lib/pgslice/version.rb +1 -1
- metadata +11 -4
- data/lib/pgslice/client.rb +0 -584
- data/lib/pgslice/generic_table.rb +0 -89
@@ -1,89 +0,0 @@
|
|
1
|
-
module PgSlice
|
2
|
-
class GenericTable
|
3
|
-
attr_reader :table
|
4
|
-
|
5
|
-
def initialize(table)
|
6
|
-
@table = table.to_s
|
7
|
-
end
|
8
|
-
|
9
|
-
def to_s
|
10
|
-
table
|
11
|
-
end
|
12
|
-
|
13
|
-
def exists?
|
14
|
-
existing_tables(like: table).any?
|
15
|
-
end
|
16
|
-
|
17
|
-
def columns
|
18
|
-
execute("SELECT column_name FROM information_schema.columns WHERE table_schema || '.' || table_name = $1", [table]).map{ |r| r["column_name"] }
|
19
|
-
end
|
20
|
-
|
21
|
-
# http://www.dbforums.com/showthread.php?1667561-How-to-list-sequences-and-the-columns-by-SQL
|
22
|
-
def sequences
|
23
|
-
query = <<-SQL
|
24
|
-
SELECT
|
25
|
-
a.attname as related_column,
|
26
|
-
s.relname as sequence_name
|
27
|
-
FROM pg_class s
|
28
|
-
JOIN pg_depend d ON d.objid = s.oid
|
29
|
-
JOIN pg_class t ON d.objid = s.oid AND d.refobjid = t.oid
|
30
|
-
JOIN pg_attribute a ON (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum)
|
31
|
-
JOIN pg_namespace n ON n.oid = s.relnamespace
|
32
|
-
WHERE s.relkind = 'S'
|
33
|
-
AND n.nspname = $1
|
34
|
-
AND t.relname = $2
|
35
|
-
SQL
|
36
|
-
execute(query, table.split(".", 2))
|
37
|
-
end
|
38
|
-
|
39
|
-
def foreign_keys
|
40
|
-
execute("SELECT pg_get_constraintdef(oid) FROM pg_constraint WHERE conrelid = #{regclass(table)} AND contype ='f'").map { |r| r["pg_get_constraintdef"] }
|
41
|
-
end
|
42
|
-
|
43
|
-
# http://stackoverflow.com/a/20537829
|
44
|
-
def primary_key
|
45
|
-
query = <<-SQL
|
46
|
-
SELECT
|
47
|
-
pg_attribute.attname,
|
48
|
-
format_type(pg_attribute.atttypid, pg_attribute.atttypmod)
|
49
|
-
FROM
|
50
|
-
pg_index, pg_class, pg_attribute, pg_namespace
|
51
|
-
WHERE
|
52
|
-
nspname || '.' || relname = $1 AND
|
53
|
-
indrelid = pg_class.oid AND
|
54
|
-
pg_class.relnamespace = pg_namespace.oid AND
|
55
|
-
pg_attribute.attrelid = pg_class.oid AND
|
56
|
-
pg_attribute.attnum = any(pg_index.indkey) AND
|
57
|
-
indisprimary
|
58
|
-
SQL
|
59
|
-
execute(query, [table]).map { |r| r["attname"] }
|
60
|
-
end
|
61
|
-
|
62
|
-
def index_defs
|
63
|
-
execute("SELECT pg_get_indexdef(indexrelid) FROM pg_index WHERE indrelid = #{regclass(table)} AND indisprimary = 'f'").map { |r| r["pg_get_indexdef"] }
|
64
|
-
end
|
65
|
-
|
66
|
-
protected
|
67
|
-
|
68
|
-
def existing_tables(like:)
|
69
|
-
query = "SELECT schemaname, tablename FROM pg_catalog.pg_tables WHERE schemaname = $1 AND tablename LIKE $2"
|
70
|
-
execute(query, like.split(".", 2)).map { |r| "#{r["schemaname"]}.#{r["tablename"]}" }.sort
|
71
|
-
end
|
72
|
-
|
73
|
-
def execute(*args)
|
74
|
-
$client.send(:execute, *args)
|
75
|
-
end
|
76
|
-
|
77
|
-
def quote_ident(value)
|
78
|
-
PG::Connection.quote_ident(value)
|
79
|
-
end
|
80
|
-
|
81
|
-
def quote_table(table)
|
82
|
-
table.to_s.split(".", 2).map { |v| quote_ident(v) }.join(".")
|
83
|
-
end
|
84
|
-
|
85
|
-
def regclass(table)
|
86
|
-
"'#{quote_table(table)}'::regclass"
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|