package com.taobao.yugong.translator;
import java.sql.Types;
import java.util.Date;
import org.apache.commons.lang.ObjectUtils;
import com.taobao.yugong.common.db.meta.ColumnMeta;
import com.taobao.yugong.common.db.meta.ColumnValue;
import com.taobao.yugong.common.model.record.Record;
/**
* 一个迁移的例子,涵盖一些基本转换操作
*
* <pre>
* 例子包含特性:
* 1. schema/table名不同. oracle中为yugong_example_oracle,mysql中为test.yugong_example_mysql
* 2. 字段名字不同. oracle中的name字段,映射到mysql的display_name
* 3. 字段逻辑处理. mysql的display_name字段数据来源为oracle库的:name+'('alias_name+')'
* 4. 字段类型不同. oracle中的amount为number类型,映射到mysql的amount为varchar文本型
* 5. 源库多一个字段. oracle中多了一个alias_name字段
* 6. 目标库多了一个字段. mysql中多了一个gmt_move字段,(简单的用迁移时的当前时间进行填充)
*
* 测试的表结构:
* // oracle表
* create table yugong_example_oracle
* (
* id NUMBER(11) ,
* name varchar2(32) ,
* alias_name char(32) default ' ' not null,
* amount number(11,2),
* score number(20),
* text_b blob,
* text_c clob,
* gmt_create date not null,
* gmt_modified date not null,
* CONSTRAINT yugong_example_oracle_pk_id PRIMARY KEY (id)
* );
*
* // mysql表
* create table test.yugong_example_mysql
* (
* id bigint(20) unsigned auto_increment,
* display_name varchar(128) ,
* amount varchar(32),
* score bigint(20) unsigned ,
* text_b blob,
* text_c text,
* gmt_create timestamp not null,
* gmt_modified timestamp not null,
* gmt_move timestamp not null,
* CONSTRAINT yugong_example_mysql_pk_id PRIMARY KEY (id)
* );
* </pre>
*
* @author agapple 2013-10-10 下午3:28:33
*/
public class YugongExampleOracleDataTranslator extends AbstractDataTranslator implements DataTranslator {
public boolean translator(Record record) {
// 1. schema/table名不同
// record.setSchemaName("test");
record.setTableName("yugong_example_mysql");
// 2. 字段名字不同
ColumnValue nameColumn = record.getColumnByName("name");
if (nameColumn != null) {
nameColumn.getColumn().setName("display_name");
}
// 3. 字段逻辑处理
ColumnValue aliasNameColumn = record.getColumnByName("alias_name");
if (aliasNameColumn != null) {
StringBuilder displayNameValue = new StringBuilder(64);
displayNameValue.append(ObjectUtils.toString(nameColumn.getValue()))
.append('(')
.append(ObjectUtils.toString(aliasNameColumn.getValue()))
.append(')');
nameColumn.setValue(displayNameValue.toString());
}
// 4. 字段类型不同
ColumnValue amountColumn = record.getColumnByName("amount");
if (amountColumn != null) {
amountColumn.getColumn().setType(Types.VARCHAR);
amountColumn.setValue(ObjectUtils.toString(amountColumn.getValue()));
}
// 5. 源库多一个字段
record.removeColumnByName("alias_name");
// 6. 目标库多了一个字段
ColumnMeta gmtMoveMeta = new ColumnMeta("gmt_move", Types.TIMESTAMP);
ColumnValue gmtMoveColumn = new ColumnValue(gmtMoveMeta, new Date());
gmtMoveColumn.setCheck(false);// 该字段不做对比
record.addColumn(gmtMoveColumn);
// ColumnValue text_c = record.getColumnByName("text_c");
// try {
// text_c.setValue(new String((byte[]) text_c.getValue(), "GBK"));
// } catch (UnsupportedEncodingException e) {
// e.printStackTrace();
// }
return super.translator(record);
}
}