activerecord-jdbcvertica-adapter 0.0.5 → 0.0.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/activerecord-jdbcvertica-adapter/version.rb +1 -1
- data/lib/arjdbc/vertica/adapter.rb +80 -8
- 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: 3763fb0885067df8427a8ebb62615187c6d77376
|
4
|
+
data.tar.gz: ec1f313ef961d6f323333a80e974a7064be4c580
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d108bfa54433ee4398b27115d4e1168755d9a5e2accbc84bd4bd92ba016f6548e0fc894424ecab96b9a5f3384fd9880bb4ca693eeec00b84eeaf1bfb7533b4d
|
7
|
+
data.tar.gz: da086fe08adbd715065a118b88c7e0e00c22b32d54f0f1721973d64736df6edcf5e13de002d0ba3cca18f38e32ca5e5b17284629a3a51348eccfd6d1d57ec727
|
@@ -6,9 +6,10 @@ require 'arjdbc/vertica/column'
|
|
6
6
|
module ::ArJdbc
|
7
7
|
module Vertica
|
8
8
|
ADAPTER_NAME = 'Vertica'.freeze
|
9
|
+
INSERT_TABLE_EXTRACTION = /into\s+(?<table_name>[^\(]*).*values\s*\(/im
|
9
10
|
|
10
11
|
NATIVE_DATABASE_TYPES = {
|
11
|
-
:primary_key => "
|
12
|
+
:primary_key => "integer primary key",
|
12
13
|
:string => { :name => "varchar", :limit => 255 },
|
13
14
|
:text => { :name => "varchar", :limit => 15000 },
|
14
15
|
:integer => { :name => "integer" },
|
@@ -47,31 +48,89 @@ module ::ArJdbc
|
|
47
48
|
return columns
|
48
49
|
end
|
49
50
|
|
51
|
+
##
|
52
|
+
# Override create_table to create the sequences
|
53
|
+
# needed to manage primary keys
|
54
|
+
#
|
55
|
+
def create_table(table_name, options = {})
|
56
|
+
super
|
57
|
+
|
58
|
+
sequence_name = sequence_name_for(table_name, options[:primary_key] || "id")
|
59
|
+
unless sequence_exists?(sequence_name)
|
60
|
+
create_sequence(sequence_name)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def create_sequence(sequence_name)
|
65
|
+
sql = <<-SQL
|
66
|
+
CREATE SEQUENCE #{sequence_name};
|
67
|
+
SQL
|
68
|
+
|
69
|
+
return execute(sql)
|
70
|
+
end
|
71
|
+
|
72
|
+
def drop_sequence(sequence_name)
|
73
|
+
sql = <<-SQL
|
74
|
+
DROP SEQUENCE #{sequence_name};
|
75
|
+
SQL
|
76
|
+
|
77
|
+
return execute(sql)
|
78
|
+
end
|
79
|
+
|
80
|
+
def drop_table(table_name, options = {})
|
81
|
+
super
|
82
|
+
|
83
|
+
sequence_name = sequence_name_for(table_name, options[:primary_key] || "id")
|
84
|
+
if sequence_exists?(sequence_name)
|
85
|
+
drop_sequence(sequence_name)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
50
89
|
##
|
51
90
|
# Vertica JDBC does not work with JDBC GET_GENERATED_KEYS
|
52
91
|
# so we need to execute the sql raw and then lookup the
|
53
92
|
# LAST_INSERT_ID() that occurred in this "session"
|
54
93
|
#
|
55
|
-
def exec_insert(sql, name, binds,
|
94
|
+
def exec_insert(sql, name, binds, primary_key = nil, sequence_name = nil)
|
95
|
+
# Execute the SQL
|
56
96
|
execute(sql, name, binds)
|
97
|
+
end
|
57
98
|
|
58
|
-
|
99
|
+
def extract_table_ref_from_insert_sql(sql)
|
100
|
+
match_data = INSERT_TABLE_EXTRACTION.match(sql)
|
101
|
+
match_data[:table_name].strip if match_data[:table_name]
|
59
102
|
end
|
60
103
|
|
61
104
|
def native_database_types
|
62
105
|
NATIVE_DATABASE_TYPES
|
63
106
|
end
|
64
107
|
|
108
|
+
def next_insert_id_for(sequence_name)
|
109
|
+
return select_value("SELECT NEXTVAL('#{sequence_name}');")
|
110
|
+
end
|
111
|
+
|
112
|
+
def next_sequence_value(sequence_name)
|
113
|
+
next_insert_id_for(sequence_name)
|
114
|
+
end
|
115
|
+
|
116
|
+
def prefetch_primary_key?(table_name = nil)
|
117
|
+
true
|
118
|
+
end
|
119
|
+
|
120
|
+
def primary_key_for(table_name)
|
121
|
+
primary_keys(table_name)
|
122
|
+
end
|
123
|
+
|
65
124
|
##
|
66
125
|
# Vertica should "auto-discover" the primary key if marked on the table
|
67
126
|
#
|
68
|
-
def primary_keys(
|
127
|
+
def primary_keys(table_name)
|
69
128
|
@primary_keys ||= {}
|
70
|
-
return @primary_keys[
|
129
|
+
return @primary_keys[table_name] if @primary_keys[table_name]
|
71
130
|
|
72
|
-
keys = self.execute("SELECT column_name FROM v_catalog.primary_keys WHERE table_name = '#{
|
73
|
-
@primary_keys[
|
74
|
-
@primary_keys[
|
131
|
+
keys = self.execute("SELECT column_name FROM v_catalog.primary_keys WHERE table_name = '#{table_name}';")
|
132
|
+
@primary_keys[table_name] = [ keys.first['column_name'] ]
|
133
|
+
@primary_keys[table_name]
|
75
134
|
end
|
76
135
|
|
77
136
|
##
|
@@ -90,6 +149,19 @@ module ::ArJdbc
|
|
90
149
|
# no op
|
91
150
|
end
|
92
151
|
|
152
|
+
def sequence_exists?(sequence_name)
|
153
|
+
sql = <<-SQL
|
154
|
+
SELECT 1 from v_catalog.sequences WHERE sequence_name = '#{sequence_name}';
|
155
|
+
SQL
|
156
|
+
|
157
|
+
sequence_present = select_value(sql)
|
158
|
+
return sequence_present == 1
|
159
|
+
end
|
160
|
+
|
161
|
+
def sequence_name_for(table_name, primary_key_name = nil)
|
162
|
+
"#{table_name}_#{primary_key_name || 'id'}_seq"
|
163
|
+
end
|
164
|
+
|
93
165
|
end
|
94
166
|
end
|
95
167
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-jdbcvertica-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Dewitt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|