Skip to content

Commit b775aeb

Browse files
authored
Merge pull request #82 from buptyzc/supportUnsignedIntFeature2
add int unsigned col type support
2 parents 6b15d62 + 212f4f5 commit b775aeb

3 files changed

Lines changed: 71 additions & 9 deletions

File tree

databus-util-cmdline/databus-util-cmdline-impl/src/main/java/com/linkedin/databus/util/AvroPrimitiveTypes.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
*/
2929
public enum AvroPrimitiveTypes
3030
{
31-
INTEGER("int"),
31+
INTEGER("long"),
32+
INTEGER_UNSIGNED("long"),
3233
LONG("long"),
3334
RAW("bytes"),
3435
FLOAT("float"),
@@ -44,7 +45,17 @@ public enum AvroPrimitiveTypes
4445
BLOB("bytes"),
4546
ARRAY("array"),
4647
TABLE("record"),
47-
XMLTYPE("string");
48+
XMLTYPE("string"),
49+
TINYINT("int"),
50+
TINYINT_UNSIGNED("int"),
51+
SMALLINT("int"),
52+
SMALLINT_UNSIGNED("int"),
53+
MEDIUMINT("int"),
54+
MEDIUMINT_UNSIGNED("int"),
55+
INT("long"),
56+
INT_UNSIGNED("long"),
57+
BIGINT("long"),
58+
BIGINT_UNSIGNED("long");
4859

4960
private final String _avroType;
5061
private AvroPrimitiveTypes(String avroType)

databus-util-cmdline/databus-util-cmdline-impl/src/main/java/com/linkedin/databus/util/SimpleTypeInfo.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,28 @@ public class SimpleTypeInfo
3030

3131
public SimpleTypeInfo(String name, int precision, int scale)
3232
{
33-
if(name.equals("NUMBER"))
33+
boolean unsigned = false;
34+
if (name.contains(" "))
35+
{
36+
String nameArr[] = name.split(" ");
37+
if (nameArr[1].trim().toLowerCase().equals("unsigned"))
38+
{
39+
unsigned = true;
40+
}
41+
name = nameArr[0];
42+
}
43+
if (name.toLowerCase().equals("integer") || name.toLowerCase().endsWith("int"))
44+
{
45+
if ((precision > 9) || (precision == 0))
46+
{
47+
_type = unsigned ? AvroPrimitiveTypes.BIGINT_UNSIGNED : AvroPrimitiveTypes.BIGINT;
48+
}
49+
else
50+
{
51+
_type = AvroPrimitiveTypes.valueOf((name + (unsigned ? "_unsigned" : "")).toUpperCase());
52+
}
53+
}
54+
else if(name.equals("NUMBER"))
3455
{
3556
if(scale > 0)
3657
{

databus2-relay/databus2-event-producer-or/src/main/java/com/linkedin/databus2/producers/ORListener.java

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.linkedin.databus2.producers;
22

3+
import java.math.BigInteger;
34
import java.nio.ByteBuffer;
45
import java.nio.charset.Charset;
56
import java.sql.Time;
@@ -16,6 +17,7 @@
1617
import java.util.concurrent.TimeUnit;
1718

1819
import org.apache.avro.Schema;
20+
import org.apache.avro.Schema.Field;
1921
import org.apache.avro.generic.GenericData;
2022
import org.apache.avro.generic.GenericRecord;
2123
import org.apache.log4j.Logger;
@@ -138,6 +140,13 @@ public interface TransactionProcessor
138140

139141
/** Milli sec timeout for _binlogEventQueue operation **/
140142
private long _queueTimeoutMs = 100L;
143+
144+
/** correct unsigned int type*/
145+
public static final int TINYINT_MAX_VALUE = 256;
146+
public static final int SMALLINT_MAX_VALUE = 65536;
147+
public static final int MEDIUMINT_MAX_VALUE = 16777216;
148+
public static final long INTEGER_MAX_VALUE = 4294967296L;
149+
public static final BigInteger BIGINT_MAX_VALUE = new BigInteger("18446744073709551616");
141150

142151
public ORListener(String name,
143152
int currentFileNumber,
@@ -444,7 +453,7 @@ private void insertFieldIntoRecord(
444453
try
445454
{
446455
if (! isFieldNull)
447-
fieldValueObj = orToAvroType(fieldValue);
456+
fieldValueObj = orToAvroType(fieldValue, avroField);
448457
else
449458
fieldValueObj = null;
450459

@@ -461,8 +470,9 @@ private void insertFieldIntoRecord(
461470
/**
462471
* Given a OR Column, it returns a corresponding Java object that can be inserted into
463472
* AVRO record
473+
* @param avroField
464474
*/
465-
private Object orToAvroType(Column s)
475+
private Object orToAvroType(Column s, Field avroField)
466476
throws DatabusException
467477
{
468478
if (s instanceof BitColumn)
@@ -523,19 +533,31 @@ else if (s instanceof Int24Column)
523533
{
524534
Int24Column ic = (Int24Column) s;
525535
Integer i = ic.getValue();
536+
if (i < 0 && SchemaHelper.getMetaField(avroField, "dbFieldType").contains("UNSIGNED"))
537+
{
538+
i += ORListener.MEDIUMINT_MAX_VALUE;
539+
}
526540
return i;
527541
}
528542
else if (s instanceof LongColumn)
529543
{
530544
LongColumn lc = (LongColumn) s;
531-
Integer i = lc.getValue();
532-
return i;
545+
Long l = lc.getValue().longValue();
546+
if (l < 0 && SchemaHelper.getMetaField(avroField, "dbFieldType").contains("UNSIGNED"))
547+
{
548+
l += ORListener.INTEGER_MAX_VALUE;
549+
}
550+
return l;
533551
}
534552
else if (s instanceof LongLongColumn)
535553
{
536554
LongLongColumn llc = (LongLongColumn) s;
537-
Long l = llc.getValue();
538-
return l;
555+
BigInteger b = new BigInteger(llc.getValue()+"");
556+
if (b.compareTo(BigInteger.ZERO) < 0 && SchemaHelper.getMetaField(avroField, "dbFieldType").contains("UNSIGNED"))
557+
{
558+
b = b.add(ORListener.BIGINT_MAX_VALUE);
559+
}
560+
return b;
539561
}
540562
else if (s instanceof NullColumn)
541563
{
@@ -551,6 +573,10 @@ else if (s instanceof ShortColumn)
551573
{
552574
ShortColumn sc = (ShortColumn) s;
553575
Integer i = sc.getValue();
576+
if (i < 0 && SchemaHelper.getMetaField(avroField, "dbFieldType").contains("UNSIGNED"))
577+
{
578+
i = i + ORListener.SMALLINT_MAX_VALUE;
579+
}
554580
return i;
555581
}
556582
else if (s instanceof StringColumn)
@@ -587,6 +613,10 @@ else if (s instanceof TinyColumn)
587613
{
588614
TinyColumn tc = (TinyColumn) s;
589615
Integer i = tc.getValue();
616+
if (i < 0 && SchemaHelper.getMetaField(avroField, "dbFieldType").contains("UNSIGNED"))
617+
{
618+
i = i + ORListener.TINYINT_MAX_VALUE;
619+
}
590620
return i;
591621
}
592622
else if (s instanceof YearColumn)

0 commit comments

Comments
 (0)