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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 18b74f7b66907e7b282bef43f8f12ee5a2829537
4
- data.tar.gz: 0706da8018c41c7103e843fa0308f27fea68132f
3
+ metadata.gz: 3763fb0885067df8427a8ebb62615187c6d77376
4
+ data.tar.gz: ec1f313ef961d6f323333a80e974a7064be4c580
5
5
  SHA512:
6
- metadata.gz: 2f4863be4923061e76bcc4ed83243e2c55ae1afe4db99b389680c55b41f92c089c3f6fe0af2cde95ca916791dfb6a6fd0dc6096a59620a2a9e6510c2b2483e5e
7
- data.tar.gz: 8ef7e4297ab56f94c6a6b8a0f78c6445d89ae223986d8125553ed13f9f22795c8238b2c644c098b071ac82441640e6106964f7f49ac00cfa30fb73a3f3ebe09e
6
+ metadata.gz: 3d108bfa54433ee4398b27115d4e1168755d9a5e2accbc84bd4bd92ba016f6548e0fc894424ecab96b9a5f3384fd9880bb4ca693eeec00b84eeaf1bfb7533b4d
7
+ data.tar.gz: da086fe08adbd715065a118b88c7e0e00c22b32d54f0f1721973d64736df6edcf5e13de002d0ba3cca18f38e32ca5e5b17284629a3a51348eccfd6d1d57ec727
@@ -1,7 +1,7 @@
1
1
  module Activerecord
2
2
  module Jdbcvertica
3
3
  module Adapter
4
- VERSION = "0.0.5"
4
+ VERSION = "0.0.6"
5
5
  end
6
6
  end
7
7
  end
@@ -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 => "auto_increment 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, *args)
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
- return select_value("SELECT LAST_INSERT_ID();")
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(table)
127
+ def primary_keys(table_name)
69
128
  @primary_keys ||= {}
70
- return @primary_keys[table] if @primary_keys[table]
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 = '#{table}';")
73
- @primary_keys[table] = [ keys.first['column_name'] ]
74
- @primary_keys[table]
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.5
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-06 00:00:00.000000000 Z
11
+ date: 2014-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord