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 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