diff --git a/Rakefile b/Rakefile index 6dcbb6b0..42665ed2 100644 --- a/Rakefile +++ b/Rakefile @@ -46,6 +46,7 @@ namespace :turntable do ActiveRecord::Base.connection.create_table :users do |t| t.string :nickname t.string :thumbnail_url + t.binary :blob t.datetime :joined_at t.datetime :deleted_at t.timestamps diff --git a/lib/active_record/turntable/mixer.rb b/lib/active_record/turntable/mixer.rb index f17414d6..733a9172 100644 --- a/lib/active_record/turntable/mixer.rb +++ b/lib/active_record/turntable/mixer.rb @@ -192,7 +192,7 @@ def build_insert_fader(tree, method, query, *args, &block) tree.values = [[SQLTree::Node::Expression::Variable.new("\\0")]] sql = tree.to_sql value_sql = vs.map do |val| - "(#{val.map { |v| @proxy.connection.quote(v.value)}.join(', ')})" + "(#{val.map { |v| "#{v.escape}#{@proxy.connection.quote(v.value)}" }.join(', ')})" end.join(', ') sql.gsub!('("\0")') { value_sql } shards_with_query[@proxy.cluster.select_shard(k)] = sql diff --git a/lib/active_record/turntable/sql_tree_patch.rb b/lib/active_record/turntable/sql_tree_patch.rb index 58a04d2f..2fe7fb7d 100644 --- a/lib/active_record/turntable/sql_tree_patch.rb +++ b/lib/active_record/turntable/sql_tree_patch.rb @@ -208,6 +208,10 @@ def to_sql(options = {}) end end + class Value + leaf :escape + end + class EscapedValue < Value def initialize(value, escape = nil) @value = value diff --git a/spec/active_record/turntable/active_record_ext/persistence_spec.rb b/spec/active_record/turntable/active_record_ext/persistence_spec.rb index 500f316d..7a24168e 100644 --- a/spec/active_record/turntable/active_record_ext/persistence_spec.rb +++ b/spec/active_record/turntable/active_record_ext/persistence_spec.rb @@ -29,6 +29,20 @@ Card.create!(:name => 'foobar') } + context "When creating record" do + context "with blob column" do + let(:blob_value) { "\123\123\123" } + let(:user) { + u = User.new(:nickname => 'x', :blob => blob_value ) + u.id = 1 + u.save + u + } + subject { user } + its(:blob) { is_expected.to eq(user.reload.blob) } + end + end + context "When the model is sharded by surrogate key" do it "should not changed from normal operation when updating" do user.nickname = "fizzbuzz" diff --git a/spec/migrations/001_create_users.rb b/spec/migrations/001_create_users.rb index eeaf99ea..7db923d2 100644 --- a/spec/migrations/001_create_users.rb +++ b/spec/migrations/001_create_users.rb @@ -3,6 +3,7 @@ def self.up create_table :users do |t| t.string :nickname t.string :thumbnail_url + t.binary :blob t.datetime :joined_at t.datetime :deleted_at