From 783c065db14533e64b735dbd7dcfaf5a59c38a79 Mon Sep 17 00:00:00 2001 From: gussan Date: Wed, 19 Nov 2014 12:06:57 +0900 Subject: [PATCH] Fix bug with saving binary column incorrectly --- Rakefile | 1 + lib/active_record/turntable/mixer.rb | 2 +- lib/active_record/turntable/sql_tree_patch.rb | 4 ++++ .../active_record_ext/persistence_spec.rb | 14 ++++++++++++++ spec/migrations/001_create_users.rb | 1 + 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index c328367c..41fd7934 100644 --- a/Rakefile +++ b/Rakefile @@ -51,6 +51,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 c6e78993..9e2655eb 100644 --- a/lib/active_record/turntable/mixer.rb +++ b/lib/active_record/turntable/mixer.rb @@ -214,7 +214,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.shard_for(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 2dd341ef..2b54e9ef 100644 --- a/spec/active_record/turntable/active_record_ext/persistence_spec.rb +++ b/spec/active_record/turntable/active_record_ext/persistence_spec.rb @@ -35,6 +35,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