diff --git a/data_objects/lib/data_objects/spec/typecast/string_spec.rb b/data_objects/lib/data_objects/spec/typecast/string_spec.rb index 0d0b5118..b17ce69c 100644 --- a/data_objects/lib/data_objects/spec/typecast/string_spec.rb +++ b/data_objects/lib/data_objects/spec/typecast/string_spec.rb @@ -1,3 +1,5 @@ +# encoding: utf-8 + shared 'supporting String' do setup_test_environment @@ -79,6 +81,41 @@ end + describe 'writing and reading a multibyte String' do + + ['Aslak Hellesøy', + 'Пётр Алексе́евич Рома́нов', + '歐陽龍'].each do |name| + + it 'should write a multibyte String' do + @command = @connection.create_command('INSERT INTO users (name) VALUES(?)') + should.not.raise(DataObjects::DataError) { @command.execute_non_query(name) } + end + + it 'should read back the multibyte String' do + @command = @connection.create_command('SELECT name FROM users WHERE name = ?') + @reader = @command.execute_reader(name) + @reader.next! + @reader.values.first.should == name + @reader.close + end + + it 'should write a multibyte String (without query parameters)' do + @command = @connection.create_command("INSERT INTO users (name) VALUES(\'#{name}\')") + should.not.raise(DataObjects::DataError) { @command.execute_non_query } + end + + it 'should read back the multibyte String (without query parameters)' do + @command = @connection.create_command("SELECT name FROM users WHERE name = \'#{name}\'") + @reader = @command.execute_reader + @reader.next! + @reader.values.first.should == name + @reader.close + end + + end + end + class ::StringWithExtraPowers < String; end describe 'writing a kind of (subclass of) String' do diff --git a/do_jdbc/src/main/java/data_objects/Command.java b/do_jdbc/src/main/java/data_objects/Command.java index dd806011..af6c432d 100644 --- a/do_jdbc/src/main/java/data_objects/Command.java +++ b/do_jdbc/src/main/java/data_objects/Command.java @@ -242,8 +242,9 @@ public IRubyObject execute_reader(IRubyObject[] args) { // execute the query try { - String sqlText = prepareSqlTextForPs(api.getInstanceVariable(this, - "@text").asJavaString(), args); + String doSqlText = api.convertToRubyString( + api.getInstanceVariable(this, "@text")).getUnicodeValue(); + String sqlText = prepareSqlTextForPs(doSqlText, args); sqlStatement = conn.prepareStatement( sqlText, diff --git a/do_jdbc/src/main/java/data_objects/drivers/AbstractDriverDefinition.java b/do_jdbc/src/main/java/data_objects/drivers/AbstractDriverDefinition.java index 5262ee67..14db666a 100644 --- a/do_jdbc/src/main/java/data_objects/drivers/AbstractDriverDefinition.java +++ b/do_jdbc/src/main/java/data_objects/drivers/AbstractDriverDefinition.java @@ -465,7 +465,7 @@ public void setPreparedStatementParam(PreparedStatement ps, ps.setBoolean(idx, arg.toString().equals("true")); break; case STRING: - ps.setString(idx, arg.toString()); + ps.setString(idx, arg.asString().getUnicodeValue()); break; case CLASS: ps.setString(idx, arg.toString()); diff --git a/do_postgres/ext-java/src/main/java/do_postgres/PostgresDriverDefinition.java b/do_postgres/ext-java/src/main/java/do_postgres/PostgresDriverDefinition.java index b8f638f8..5dc308cb 100644 --- a/do_postgres/ext-java/src/main/java/do_postgres/PostgresDriverDefinition.java +++ b/do_postgres/ext-java/src/main/java/do_postgres/PostgresDriverDefinition.java @@ -84,7 +84,7 @@ public void setPreparedStatementParam(PreparedStatement ps, ps.setInt(idx, Integer.valueOf(arg.toString())); break; default: - ps.setString(idx, arg.toString()); + ps.setString(idx, arg.asString().getUnicodeValue()); } break; case BYTE_ARRAY: