4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
# File 'lib/pghero/methods/sequences.rb', line 4
def sequences
sequences = select_all " SELECT\n n.nspname AS table_schema,\n c.relname AS table,\n attname AS column,\n format_type(a.atttypid, a.atttypmod) AS column_type,\n pg_get_expr(d.adbin, d.adrelid) AS default_value\n FROM\n pg_catalog.pg_attribute a\n INNER JOIN\n pg_catalog.pg_class c ON c.oid = a.attrelid\n INNER JOIN\n pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n INNER JOIN\n pg_catalog.pg_attrdef d ON (a.attrelid, a.attnum) = (d.adrelid, d.adnum)\n WHERE\n NOT a.attisdropped\n AND a.attnum > 0\n AND pg_get_expr(d.adbin, d.adrelid) LIKE 'nextval%'\n AND n.nspname NOT LIKE 'pg\\\\_temp\\\\_%'\n SQL\n\n # parse out sequence\n sequences.each do |column|\n column[:max_value] = column[:column_type] == 'integer' ? 2147483647 : 9223372036854775807\n\n column[:schema], column[:sequence] = parse_default_value(column[:default_value])\n column.delete(:default_value) if column[:sequence]\n end\n\n add_sequence_attributes(sequences)\n\n last_value = {}\n sequences.select { |s| s[:readable] }.map { |s| [s[:schema], s[:sequence]] }.uniq.each_slice(1024) do |slice|\n sql = slice.map { |s| \"SELECT last_value FROM \#{quote_ident(s[0])}.\#{quote_ident(s[1])}\" }.join(\" UNION ALL \")\n\n select_all(sql).zip(slice) do |row, seq|\n last_value[seq] = row[:last_value]\n end\n end\n\n sequences.select { |s| s[:readable] }.each do |seq|\n seq[:last_value] = last_value[[seq[:schema], seq[:sequence]]]\n end\n\n # use to_s for unparsable sequences\n sequences.sort_by { |s| s[:sequence].to_s }\nend\n"
|