Skip to content

Commit

Permalink
0000868: dbimport needs to support imports from xml format
Browse files Browse the repository at this point in the history
  • Loading branch information
chenson42 committed Oct 23, 2012
1 parent e756f0d commit 3fef63c
Show file tree
Hide file tree
Showing 6 changed files with 332 additions and 9 deletions.
Expand Up @@ -36,9 +36,10 @@
import org.jumpmind.db.util.BinaryEncoding;
import org.jumpmind.exception.IoException;
import org.jumpmind.symmetric.io.data.DataProcessor;
import org.jumpmind.symmetric.io.data.reader.BatchXmlDataReader;
import org.jumpmind.symmetric.io.data.reader.SymXmlDataReader;
import org.jumpmind.symmetric.io.data.reader.CsvTableDataReader;
import org.jumpmind.symmetric.io.data.reader.SqlDataReader;
import org.jumpmind.symmetric.io.data.reader.XmlDataReader;
import org.jumpmind.symmetric.io.data.writer.Conflict;
import org.jumpmind.symmetric.io.data.writer.Conflict.DetectConflict;
import org.jumpmind.symmetric.io.data.writer.Conflict.ResolveConflict;
Expand Down Expand Up @@ -181,18 +182,31 @@ protected void importTablesFromCsv(InputStream in, String tableName) {
}

protected void importTablesFromXml(InputStream in) {

// TODO should probably handle database creation in xml/data reader writer.
in.mark(Integer.MAX_VALUE);

Database database = platform.readDatabaseFromXml(in, alterCaseToMatchDatabaseDefaultCase);
if (alterTables) {
platform.alterDatabase(database, forceImport);
} else {
platform.createDatabase(database, dropIfExists, forceImport);
}

// TODO: read in data from XML also
try {
in.reset();
} catch (IOException e) {
throw new IoException(e);
}

XmlDataReader reader = new XmlDataReader(in);
DatabaseWriter writer = new DatabaseWriter(platform, buildDatabaseWriterSettings());
DataProcessor dataProcessor = new DataProcessor(reader, writer);
dataProcessor.process();
}

protected void importTablesFromSymXml(InputStream in) {
BatchXmlDataReader reader = new BatchXmlDataReader(in);
SymXmlDataReader reader = new SymXmlDataReader(in);
DatabaseWriter writer = new DatabaseWriter(platform, buildDatabaseWriterSettings());
DataProcessor dataProcessor = new DataProcessor(reader, writer);
dataProcessor.process();
Expand Down
Expand Up @@ -171,7 +171,7 @@ public void importSymXmlData() throws Exception {
assertCountDbImportTableRecords(0);

DbImport importCsv = new DbImport(ds);
importCsv.setFormat(DbImport.Format.SYM_XML);
importCsv.setFormat(DbImport.Format.SYM_XML);
importCsv.importTables(getClass().getResourceAsStream(FILE));

assertCountDbImportTableRecords(2);
Expand All @@ -192,6 +192,27 @@ public void importSymXmlData() throws Exception {
assertCountDbImportTableRecords(2);

}

@Test
public void importXmlData() throws Exception {
final String FILE = "/test-dbimport-1-xml-1.xml";
ISymmetricEngine engine = getSymmetricEngine();
DataSource ds = engine.getDataSource();

DbImport importer = new DbImport(ds);
importer.setFormat(DbImport.Format.XML);
importer.setDropIfExists(true);
importer.setAlterCaseToMatchDatabaseDefaultCase(true);
importer.importTables(getClass().getResourceAsStream(FILE));

assertCountDbImportTableRecords(3);

// table should be dropped so this should work again
importer.importTables(getClass().getResourceAsStream(FILE));

assertCountDbImportTableRecords(3);

}

@Test
public void exportThenImportCsv() throws Exception {
Expand Down
63 changes: 63 additions & 0 deletions symmetric-client/src/test/resources/test-dbimport-1-xml-1.xml
@@ -0,0 +1,63 @@
<database name="testdb">
<table name="test_db_import_1">
<column name="id" type="INTEGER" required="true" primaryKey="true" />
<column name="string_value" type="VARCHAR" size="50" />
<column name="string_required_value" type="VARCHAR" size="50" required="true" />
<column name="char_value" type="CHAR" size="50" />
<column name="char_required_value" type="CHAR" size="50" required="true" />
<column name="date_value" type="DATE" />
<column name="time_value" type="TIMESTAMP" />
<column name="boolean_value" type="BOOLEANINT" size="1" />
<column name="integer_value" type="INTEGER" />
<column name="decimal_value" type="DECIMAL" size="10,2" />
<column name="double_value" type="DOUBLE" />
<index name="idx_tst_db_imprt_1">
<index-column name="id" />
<index-column name="string_value" />
</index>
<unique name="idx_tst_db_imprt_uq">
<unique-column name="string_required_value" />
</unique>
</table>
<table_data name="test_db_import_1">
<row>
<field name="id">100</field>
<field name="string_value">This is a test</field>
<field name="string_required_value">This must be here for 100</field>
<field name="char_required_value">This must be here</field>
<field name="char_value">T</field>
<field name="date_value">2014-01-18 14:29:47</field>
<field name="time_value">2014-01-18 14:29:47</field>
<field name="boolean_value">1</field>
<field name="integer_value">31415</field>
<field name="decimal_value">3.1415</field>
<field name="double_value">3.1415</field>
</row>
<row>
<field name="id">3</field>
<field name="string_value">abc</field>
<field name="string_required_value">This must be here for 3</field>
<field name="char_required_value">This must be here</field>
<field name="char_value">T</field>
<field name="date_value">2012-01-18 14:29:47</field>
<field name="time_value">2012-01-18 14:29:47</field>
<field name="boolean_value">0</field>
<field name="integer_value">31415</field>
<field name="decimal_value">3.1415</field>
<field name="double_value">3.1415</field>
</row>
<row>
<field name="id">1</field>
<field name="string_value">This is a test</field>
<field name="string_required_value">This must be here for 1</field>
<field name="char_required_value">This must be here</field>
<field name="char_value">T</field>
<field name="date_value">2014-01-18 14:29:47</field>
<field name="time_value">2014-01-18 14:29:47</field>
<field name="boolean_value">1</field>
<field name="integer_value">31415</field>
<field name="decimal_value">3.1415</field>
<field name="double_value">3.1415</field>
</row>
</table_data>
</database>
Expand Up @@ -624,7 +624,6 @@ public Database readDatabaseFromXml(String filePath, boolean alterCaseToMatchDat
public Database readDatabaseFromXml(InputStream is, boolean alterCaseToMatchDatabaseDefaultCase) {
InputStreamReader reader = new InputStreamReader(is);
Database database = new DatabaseIO().read(reader);
IOUtils.closeQuietly(reader);
if (alterCaseToMatchDatabaseDefaultCase) {
boolean storesUpperCase = isStoresUpperCaseIdentifiers();
Table[] tables = database.getTables();
Expand Down
Expand Up @@ -42,7 +42,7 @@
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

public class BatchXmlDataReader extends AbstractDataReader implements IDataReader {
public class SymXmlDataReader extends AbstractDataReader implements IDataReader {

protected Reader reader;
protected DataContext context;
Expand All @@ -55,11 +55,11 @@ public class BatchXmlDataReader extends AbstractDataReader implements IDataReade
protected Statistics statistics = new Statistics();
protected Object next = null;

public BatchXmlDataReader(InputStream is) {
public SymXmlDataReader(InputStream is) {
this(toReader(is));
}

public BatchXmlDataReader(Reader reader) {
public SymXmlDataReader(Reader reader) {
this.reader = reader;
}

Expand Down

0 comments on commit 3fef63c

Please sign in to comment.