aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/CHANGELOG2
-rw-r--r--activerecord/lib/active_record/vendor/mysql.rb2
-rw-r--r--activerecord/test/binary_test.rb37
-rw-r--r--activerecord/test/fixtures/associations.pngbin0 -> 40623 bytes
-rw-r--r--activerecord/test/fixtures/binary.rb2
-rwxr-xr-xactiverecord/test/fixtures/db_definitions/mysql.sql6
-rw-r--r--activerecord/test/fixtures/db_definitions/postgresql.sql6
-rw-r--r--activerecord/test/fixtures/db_definitions/sqlite.sql5
-rw-r--r--activerecord/test/fixtures/db_definitions/sqlserver.sql11
9 files changed, 68 insertions, 3 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG
index 2de7f35a64..855ea9cfbc 100644
--- a/activerecord/CHANGELOG
+++ b/activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Fixed a bug in the Ruby/MySQL that caused binary content to be escaped badly and come back mangled #405 [Tobias Luetke]
+
* Added block-style for callbacks #332 [bitsweat].
Before:
diff --git a/activerecord/lib/active_record/vendor/mysql.rb b/activerecord/lib/active_record/vendor/mysql.rb
index 4970f77bd3..84f5d2533c 100644
--- a/activerecord/lib/active_record/vendor/mysql.rb
+++ b/activerecord/lib/active_record/vendor/mysql.rb
@@ -1091,7 +1091,7 @@ class << Mysql
when "\0" then "\\0"
when "\n" then "\\n"
when "\r" then "\\r"
- when "\032" then "\Z"
+ when "\032" then "\\Z"
else "\\"+$1
end
end
diff --git a/activerecord/test/binary_test.rb b/activerecord/test/binary_test.rb
new file mode 100644
index 0000000000..b63fbbaede
--- /dev/null
+++ b/activerecord/test/binary_test.rb
@@ -0,0 +1,37 @@
+require 'abstract_unit'
+require 'fixtures/binary'
+
+class BinaryTest < Test::Unit::TestCase
+ def setup
+ @data = create_data_fixture
+ end
+
+ def test_load_save
+ bin = Binary.new
+ bin.data = @data
+
+ assert bin.data == @data,
+ "Assigned data differs from file data"
+
+ bin.save
+
+ assert bin.data == @data,
+ "Assigned data differs from file data after save"
+
+ db_bin = Binary.find(bin.id)
+
+ assert db_bin.data == bin.data,
+ "Loaded binary data differes from memory version"
+
+ assert db_bin.data == File.new(File.dirname(__FILE__)+"/fixtures/associations.png","rb").read,
+ "Loaded binary data differes from file version"
+ end
+
+ private
+
+ def create_data_fixture
+ Binary.connection.execute("DELETE FROM binaries")
+ File.new(File.dirname(__FILE__)+"/fixtures/associations.png","rb").read
+ end
+
+end \ No newline at end of file
diff --git a/activerecord/test/fixtures/associations.png b/activerecord/test/fixtures/associations.png
new file mode 100644
index 0000000000..661c7a8bbc
--- /dev/null
+++ b/activerecord/test/fixtures/associations.png
Binary files differ
diff --git a/activerecord/test/fixtures/binary.rb b/activerecord/test/fixtures/binary.rb
new file mode 100644
index 0000000000..950c459199
--- /dev/null
+++ b/activerecord/test/fixtures/binary.rb
@@ -0,0 +1,2 @@
+class Binary < ActiveRecord::Base
+end \ No newline at end of file
diff --git a/activerecord/test/fixtures/db_definitions/mysql.sql b/activerecord/test/fixtures/db_definitions/mysql.sql
index ec27a52445..3758f19bfa 100755
--- a/activerecord/test/fixtures/db_definitions/mysql.sql
+++ b/activerecord/test/fixtures/db_definitions/mysql.sql
@@ -115,4 +115,10 @@ CREATE TABLE `people` (
`id` INTEGER NOT NULL PRIMARY KEY,
`first_name` VARCHAR(40) NOT NULL,
`lock_version` INTEGER NOT NULL DEFAULT 0
+);
+
+CREATE TABLE `binaries` (
+ `id` int(11) NOT NULL auto_increment,
+ `data` mediumblob,
+ PRIMARY KEY (`id`)
); \ No newline at end of file
diff --git a/activerecord/test/fixtures/db_definitions/postgresql.sql b/activerecord/test/fixtures/db_definitions/postgresql.sql
index 6d8222cfd6..8f6587f961 100644
--- a/activerecord/test/fixtures/db_definitions/postgresql.sql
+++ b/activerecord/test/fixtures/db_definitions/postgresql.sql
@@ -133,4 +133,10 @@ CREATE TABLE people (
first_name text,
lock_version integer default 0,
PRIMARY KEY (id)
+);
+
+CREATE TABLE binaries (
+ id serial ,
+ data bytea,
+ PRIMARY KEY (id)
); \ No newline at end of file
diff --git a/activerecord/test/fixtures/db_definitions/sqlite.sql b/activerecord/test/fixtures/db_definitions/sqlite.sql
index 5c27832056..65b24a9333 100644
--- a/activerecord/test/fixtures/db_definitions/sqlite.sql
+++ b/activerecord/test/fixtures/db_definitions/sqlite.sql
@@ -103,4 +103,9 @@ CREATE TABLE 'people' (
'id' INTEGER NOT NULL PRIMARY KEY,
'first_name' VARCHAR(40) DEFAULT NULL,
'lock_version' INTEGER NOT NULL DEFAULT 0
+);
+
+CREATE TABLE 'binaries' (
+ 'id' INTEGER NOT NULL PRIMARY KEY,
+ 'data' BLOB DEFAULT NULL
); \ No newline at end of file
diff --git a/activerecord/test/fixtures/db_definitions/sqlserver.sql b/activerecord/test/fixtures/db_definitions/sqlserver.sql
index 74cd381ba3..023ab63406 100644
--- a/activerecord/test/fixtures/db_definitions/sqlserver.sql
+++ b/activerecord/test/fixtures/db_definitions/sqlserver.sql
@@ -109,10 +109,17 @@ CREATE TABLE mixins (
PRIMARY KEY (id)
);
-
CREATE TABLE people (
id int NOT NULL IDENTITY(1, 1),
first_name varchar(40) NULL,
lock_version int default 0,
PRIMARY KEY (id)
-); \ No newline at end of file
+);
+
+CREATE TABLE binaries (
+ id int NOT NULL IDENTITY(1, 1),
+ data blob NULL,
+ PRIMARY KEY (id)
+);
+
+