/*
* Copyright 2012-2015, the original author or authors.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.flipkart.aesop.bootstrap.mysql.utils;
import java.nio.charset.Charset;
import java.sql.Time;
import java.util.Calendar;
import java.util.Date;
import org.trpr.platform.core.impl.logging.LogFactory;
import org.trpr.platform.core.spi.logging.Logger;
import com.flipkart.aesop.bootstrap.mysql.MysqlEventProducer;
import com.google.code.or.common.glossary.Column;
import com.google.code.or.common.glossary.column.BitColumn;
import com.google.code.or.common.glossary.column.BlobColumn;
import com.google.code.or.common.glossary.column.DateColumn;
import com.google.code.or.common.glossary.column.DatetimeColumn;
import com.google.code.or.common.glossary.column.DecimalColumn;
import com.google.code.or.common.glossary.column.DoubleColumn;
import com.google.code.or.common.glossary.column.EnumColumn;
import com.google.code.or.common.glossary.column.FloatColumn;
import com.google.code.or.common.glossary.column.Int24Column;
import com.google.code.or.common.glossary.column.LongColumn;
import com.google.code.or.common.glossary.column.LongLongColumn;
import com.google.code.or.common.glossary.column.NullColumn;
import com.google.code.or.common.glossary.column.SetColumn;
import com.google.code.or.common.glossary.column.ShortColumn;
import com.google.code.or.common.glossary.column.StringColumn;
import com.google.code.or.common.glossary.column.TimeColumn;
import com.google.code.or.common.glossary.column.TimestampColumn;
import com.google.code.or.common.glossary.column.TinyColumn;
import com.google.code.or.common.glossary.column.YearColumn;
/**
* <code>ORToMysqlMapper</code> provides mapping of data from open replicator data type to mysql data type
* @author yogesh.dahiya
*/
public class ORToMysqlMapper
{
public static final Logger LOGGER = LogFactory.getLogger(MysqlEventProducer.class);
public Object orToMysqlType(Column column) throws Exception
{
if (column instanceof BitColumn)
{
// This is in byte order
BitColumn byteColumn = (BitColumn) column;
byte[] byteArray = byteColumn.getValue();
return new String(byteArray);
}
else if (column instanceof BlobColumn)
{
BlobColumn blobColumn = (BlobColumn) column;
byte[] byteArray = blobColumn.getValue();
return new String(byteArray);
}
else if (column instanceof DateColumn)
{
DateColumn dateColumn = (DateColumn) column;
Date date = dateColumn.getValue();
return new java.sql.Date(date.getTime());
}
else if (column instanceof DatetimeColumn)
{
DatetimeColumn dateTimeColumn = (DatetimeColumn) column;
Date date = dateTimeColumn.getValue();
/**
* Bug in OR for DateTIme and Time data-types. MilliSeconds is not available for these columns but is set
* with currentMillis() wrongly.
*/
return new java.sql.Timestamp((date.getTime() / 1000) * 1000);
}
else if (column instanceof DecimalColumn)
{
DecimalColumn decimalColumn = (DecimalColumn) column;
return decimalColumn.getValue();
}
else if (column instanceof DoubleColumn)
{
DoubleColumn doubleColumn = (DoubleColumn) column;
return doubleColumn.getValue();
}
else if (column instanceof EnumColumn)
{
EnumColumn enumColumn = (EnumColumn) column;
return enumColumn.getValue();
}
else if (column instanceof FloatColumn)
{
FloatColumn floatColumn = (FloatColumn) column;
return floatColumn.getValue();
}
else if (column instanceof Int24Column)
{
Int24Column intColumn = (Int24Column) column;
return intColumn.getValue();
}
else if (column instanceof LongColumn)
{
LongColumn longColumn = (LongColumn) column;
return longColumn.getValue();
}
else if (column instanceof LongLongColumn)
{
LongLongColumn longLongColumn = (LongLongColumn) column;
return longLongColumn.getValue();
}
else if (column instanceof NullColumn)
{
return null;
}
else if (column instanceof SetColumn)
{
SetColumn setColumn = (SetColumn) column;
return setColumn.getValue();
}
else if (column instanceof ShortColumn)
{
ShortColumn shortColumn = (ShortColumn) column;
return shortColumn.getValue();
}
else if (column instanceof StringColumn)
{
StringColumn stringColumn = (StringColumn) column;
return new String(stringColumn.getValue(), Charset.defaultCharset());
}
else if (column instanceof TimeColumn)
{
TimeColumn timeColumn = (TimeColumn) column;
Time time = timeColumn.getValue();
/**
* There is a bug in OR where instead of using the default year as 1970, it is using 0070.
* This is a temporary measure to resolve it by working around at this layer. The value obtained from OR is
* subtracted from "0070-00-01 00:00:00"
*/
Calendar c = Calendar.getInstance();
c.set(70, 0, 1, 0, 0, 0);
/**
* round off the milli-seconds as TimeColumn type has only seconds granularity but Calendar implementation
* includes milli-second (System.currentTimeMillis() at the time of instantiation)
*/
long rawVal = (c.getTimeInMillis() / 1000) * 1000;
long val2 = (time.getTime() / 1000) * 1000;
return new java.sql.Time(val2 - rawVal);
}
else if (column instanceof TimestampColumn)
{
TimestampColumn timeStampColumn = (TimestampColumn) column;
return timeStampColumn.getValue();
}
else if (column instanceof TinyColumn)
{
TinyColumn tinyColumn = (TinyColumn) column;
return tinyColumn.getValue();
}
else if (column instanceof YearColumn)
{
YearColumn yearColumn = (YearColumn) column;
return yearColumn.getValue();
}
else
{
String message = "Unknown MySQL type in the event" + column.getClass() + " Object = " + column;
LOGGER.error(message);
throw new RuntimeException(message);
}
}
}