Skip to content

Commit ee1302e

Browse files
committed
fix for http://code.google.com/p/mybatis/issues/detail?id=49 encoding problem when reading script files in migrations. Thanks Iwao.
1 parent 31a9a40 commit ee1302e

File tree

10 files changed

+35
-25
lines changed

10 files changed

+35
-25
lines changed

pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
<name>Franta Mejta</name>
3535
<email>[email protected]</email>
3636
</contributor>
37+
<contributor>
38+
<name>Iwao AVE!</name>
39+
<email>[email protected]</email>
40+
</contributor>
3741
<contributor>
3842
<name>Riccardo Cossu</name>
3943
<email>[email protected]</email>

src/main/java/org/apache/ibatis/jdbc/ScriptRunner.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,11 @@ public class ScriptRunner {
2323

2424
private String delimiter = DEFAULT_DELIMITER;
2525
private boolean fullLineDelimiter = false;
26-
private String characterSetName;
2726

2827
public ScriptRunner(Connection connection) {
2928
this.connection = connection;
3029
}
3130

32-
public void setCharacterSetName(String characterSetName) {
33-
this.characterSetName = characterSetName;
34-
}
35-
3631
public void setStopOnError(boolean stopOnError) {
3732
this.stopOnError = stopOnError;
3833
}
@@ -181,9 +176,6 @@ private boolean commandReadyToExecute(String trimmedLine) {
181176
}
182177

183178
private void executeStatement(String command) throws SQLException, UnsupportedEncodingException {
184-
if(characterSetName != null){
185-
command = new String(command.getBytes(), characterSetName);
186-
}
187179
boolean hasResults = false;
188180
Statement statement = connection.createStatement();
189181
if (stopOnError) {

src/main/java/org/apache/ibatis/migration/commands/BaseCommand.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,16 @@
22

33
import java.io.File;
44
import java.io.FileInputStream;
5+
import java.io.FileNotFoundException;
56
import java.io.FileWriter;
67
import java.io.IOException;
8+
import java.io.InputStream;
9+
import java.io.InputStreamReader;
710
import java.io.LineNumberReader;
811
import java.io.PrintStream;
912
import java.io.PrintWriter;
13+
import java.io.Reader;
14+
import java.io.UnsupportedEncodingException;
1015
import java.math.BigDecimal;
1116
import java.net.URL;
1217
import java.net.URLClassLoader;
@@ -235,12 +240,10 @@ protected ScriptRunner getScriptRunner() {
235240
String url = props.getProperty("url");
236241
String username = props.getProperty("username");
237242
String password = props.getProperty("password");
238-
String charSetName = props.getProperty("script_char_set");
239243
PrintWriter outWriter = new PrintWriter(printStream);
240244
UnpooledDataSource dataSource = new UnpooledDataSource(driverClassLoader, driver, url, username, password);
241245
dataSource.setAutoCommit(false);
242246
ScriptRunner scriptRunner = new ScriptRunner(dataSource.getConnection());
243-
scriptRunner.setCharacterSetName(charSetName);
244247
scriptRunner.setStopOnError(!force);
245248
scriptRunner.setLogWriter(outWriter);
246249
scriptRunner.setErrorLogWriter(outWriter);
@@ -390,4 +393,14 @@ private Change parseChangeFromFilename(String filename) {
390393
throw new MigrationException("Error parsing change from file. Cause: " + e, e);
391394
}
392395
}
396+
397+
protected Reader scriptFileReader(File scriptFile) throws FileNotFoundException, UnsupportedEncodingException {
398+
InputStream inputStream = new FileInputStream(scriptFile);
399+
String charset = environmentProperties().getProperty("script_char_set");
400+
if (charset == null || charset.length() == 0) {
401+
return new InputStreamReader(inputStream);
402+
} else {
403+
return new InputStreamReader(inputStream, charset);
404+
}
405+
}
393406
}

src/main/java/org/apache/ibatis/migration/commands/BootstrapCommand.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import org.apache.ibatis.migration.MigrationReader;
66

77
import java.io.File;
8-
import java.io.FileReader;
98

109
public class BootstrapCommand extends BaseCommand {
1110

@@ -23,7 +22,7 @@ public void execute(String... params) {
2322
printStream.println(horizontalLine("Applying: bootstrap.sql", 80));
2423
ScriptRunner runner = getScriptRunner();
2524
try {
26-
runner.runScript(new MigrationReader(new FileReader(bootstrap), false, environmentProperties()));
25+
runner.runScript(new MigrationReader(scriptFileReader(bootstrap), false, environmentProperties()));
2726
} finally {
2827
runner.closeConnection();
2928
}

src/main/java/org/apache/ibatis/migration/commands/DownCommand.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.apache.ibatis.migration.commands;
22

33
import java.io.File;
4-
import java.io.FileReader;
54
import java.sql.SQLException;
65
import java.util.Collections;
76
import java.util.List;
@@ -29,7 +28,7 @@ public void execute(String... params) {
2928
printStream.println(horizontalLine("Undoing: " + change.getFilename(), 80));
3029
ScriptRunner runner = getScriptRunner();
3130
try {
32-
runner.runScript(new MigrationReader(new FileReader(scriptFile(change.getFilename())), true, environmentProperties()));
31+
runner.runScript(new MigrationReader(scriptFileReader(scriptFile(change.getFilename())), true, environmentProperties()));
3332
} finally {
3433
runner.closeConnection();
3534
}

src/main/java/org/apache/ibatis/migration/commands/PendingCommand.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import org.apache.ibatis.migration.MigrationReader;
77

88
import java.io.File;
9-
import java.io.FileReader;
109
import java.util.ArrayList;
1110
import java.util.Collections;
1211
import java.util.List;
@@ -28,7 +27,7 @@ public void execute(String... params) {
2827
printStream.println(horizontalLine("Applying: " + change.getFilename(), 80));
2928
ScriptRunner runner = getScriptRunner();
3029
try {
31-
runner.runScript(new MigrationReader(new FileReader(scriptFile(change.getFilename())), false, environmentProperties()));
30+
runner.runScript(new MigrationReader(scriptFileReader(scriptFile(change.getFilename())), false, environmentProperties()));
3231
} finally {
3332
runner.closeConnection();
3433
}

src/main/java/org/apache/ibatis/migration/commands/ScriptCommand.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import org.apache.ibatis.migration.MigrationReader;
66

77
import java.io.File;
8-
import java.io.FileReader;
98
import java.io.IOException;
109
import java.math.BigDecimal;
1110
import java.util.Collections;
@@ -41,8 +40,7 @@ public void execute(String... sparams) {
4140
if (shouldRun(change, v1, v2)) {
4241
printStream.println("-- " + change.getFilename());
4342
File file = scriptFile(change.getFilename());
44-
FileReader fileReader = new FileReader(file);
45-
MigrationReader migrationReader = new MigrationReader(fileReader, undo, variables);
43+
MigrationReader migrationReader = new MigrationReader(scriptFileReader(file), undo, variables);
4644
char[] cbuf = new char[1024];
4745
int l;
4846
while ((l = migrationReader.read(cbuf)) == cbuf.length) {

src/main/java/org/apache/ibatis/migration/commands/UpCommand.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import org.apache.ibatis.migration.MigrationReader;
77

88
import java.io.File;
9-
import java.io.FileReader;
109
import java.util.List;
1110

1211
public class UpCommand extends BaseCommand {
@@ -35,7 +34,7 @@ public void execute(String... params) {
3534
printStream.println(horizontalLine("Applying: " + change.getFilename(), 80));
3635
ScriptRunner runner = getScriptRunner();
3736
try {
38-
runner.runScript(new MigrationReader(new FileReader(scriptFile(change.getFilename())), false, environmentProperties()));
37+
runner.runScript(new MigrationReader(scriptFileReader(scriptFile(change.getFilename())), false, environmentProperties()));
3938
} finally {
4039
runner.closeConnection();
4140
}

src/test/java/org/apache/ibatis/submitted/encoding/EncodingTest.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static org.junit.Assert.assertEquals;
44

55
import java.io.Reader;
6+
import java.nio.charset.Charset;
67
import java.sql.Connection;
78
import java.sql.DriverManager;
89

@@ -22,15 +23,18 @@ public class EncodingTest {
2223
public static void setUp() throws Exception {
2324
Connection conn = null;
2425

26+
// save charset
27+
Charset charset = Resources.getCharset();
28+
2529
try {
2630
Class.forName("org.hsqldb.jdbcDriver");
2731
conn = DriverManager.getConnection("jdbc:hsqldb:mem:encoding", "sa", "");
2832

33+
// make sure that the SQL file has been saved in UTF-8!
34+
Resources.setCharset(Charset.forName("utf-8"));
2935
Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/encoding/CreateDB.sql");
3036

3137
ScriptRunner runner = new ScriptRunner(conn);
32-
// make sure that the SQL file has been saved in UTF-8!
33-
runner.setCharacterSetName("UTF-8");
3438
runner.setLogWriter(null);
3539
runner.setErrorLogWriter(null);
3640
runner.runScript(reader);
@@ -40,7 +44,11 @@ public static void setUp() throws Exception {
4044
reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/encoding/EncodingConfig.xml");
4145
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
4246
reader.close();
47+
4348
} finally {
49+
// restore charset
50+
Resources.setCharset(charset);
51+
4452
if (conn != null) {
4553
conn.close();
4654
}

src/test/java/org/apache/ibatis/submitted/multidb/MultiDbTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static org.junit.Assert.assertEquals;
44

55
import java.io.Reader;
6+
import java.nio.charset.Charset;
67
import java.sql.Connection;
78
import java.sql.DriverManager;
89

@@ -30,8 +31,6 @@ public static void setUp() throws Exception {
3031
Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/multidb/CreateDB.sql");
3132

3233
ScriptRunner runner = new ScriptRunner(conn);
33-
// make sure that the SQL file has been saved in UTF-8!
34-
runner.setCharacterSetName("UTF-8");
3534
runner.setLogWriter(null);
3635
runner.setErrorLogWriter(null);
3736
runner.runScript(reader);

0 commit comments

Comments
 (0)