activerecord-jdbcvertica-adapter 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|