Search in sources :

Example 6 with Binary

use of net.morimekta.util.Binary in project providence by morimekta.

the class TProtocolSerializerTest method assertConsistent.

@SuppressWarnings("unchecked")
public <Providence extends PMessage<Providence, ProvidenceField>, ProvidenceField extends PField, Thrift extends TBase<Thrift, ThriftField>, ThriftField extends TFieldIdEnum> void assertConsistent(String prefix, Providence providence, Thrift thrift) {
    if (providence.descriptor().getVariant() == PMessageVariant.UNION) {
        TUnion<?, ThriftField> t_union = (TUnion) thrift;
        PUnion<?, ProvidenceField> p_union = (PUnion) providence;
        ThriftField t_field = t_union.getSetField();
        PField p_field = p_union.unionField();
        assertEquals(p_field.getId(), t_field.getThriftFieldId());
    } else {
        for (PField field : providence.descriptor().getFields()) {
            ThriftField thriftField = thrift.fieldForId(field.getId());
            String fieldPath = (prefix.isEmpty() ? "" : prefix + ".") + field.getName();
            assertEquals("has " + fieldPath, providence.has(field.getId()), thrift.isSet(thriftField));
            if (providence.has(field.getId())) {
                switch(field.getType()) {
                    case MESSAGE:
                        assertConsistent(fieldPath, (PMessage) providence.get(field.getId()), (TBase) thrift.getFieldValue(thriftField));
                        break;
                    case ENUM:
                        {
                            PEnumValue<?> pe = providence.get(field.getId());
                            TEnum te = (TEnum) thrift.getFieldValue(thriftField);
                            assertEquals(fieldPath, pe.asInteger(), te.getValue());
                            break;
                        }
                    case BINARY:
                        {
                            Binary pBin = providence.get(field.getId());
                            byte[] tBytes = (byte[]) thrift.getFieldValue(thriftField);
                            Binary tBin = Binary.wrap(tBytes);
                            assertEquals(fieldPath, pBin, tBin);
                            break;
                        }
                    case MAP:
                        {
                            Map pm = providence.get(field.getId());
                            Map tm = (Map) thrift.getFieldValue(thriftField);
                            assertEquals(fieldPath + " size", pm.size(), tm.size());
                            // TODO: Compare actual content.
                            break;
                        }
                    case SET:
                        {
                            Set ps = providence.get(field.getId());
                            Set ts = (Set) thrift.getFieldValue(thriftField);
                            assertEquals(fieldPath + " size", ps.size(), ts.size());
                            // TODO: Compare actual content.
                            break;
                        }
                    case LIST:
                        {
                            List pl = providence.get(field.getId());
                            List tl = (List) thrift.getFieldValue(thriftField);
                            assertEquals(fieldPath + " size", pl.size(), tl.size());
                            for (int i = 0; i < pl.size(); ++i) {
                                String itemPath = fieldPath + "[" + i + "]";
                                Object pi = pl.get(i);
                                Object ti = tl.get(i);
                                if (pi instanceof PMessage) {
                                    assertConsistent(itemPath, (PMessage) pi, (TBase) ti);
                                } else if (pi instanceof Set) {
                                // TODO: Compare actual content.
                                } else if (pi instanceof List) {
                                // TODO: Compare actual content.
                                } else if (pi instanceof Map) {
                                // TODO: Compare actual content.
                                } else if (pi instanceof Binary) {
                                    Binary pb = (Binary) pi;
                                    Binary tb = Binary.wrap(((ByteBuffer) ti).array());
                                    assertEquals(itemPath, pb, tb);
                                } else if (pi instanceof PEnumValue) {
                                    PEnumValue pe = (PEnumValue) pi;
                                    TEnum te = (TEnum) ti;
                                    assertEquals(itemPath, pe.asInteger(), te.getValue());
                                } else {
                                    assertEquals(itemPath, pi, ti);
                                }
                            }
                            break;
                        }
                    default:
                        assertEquals(fieldPath, providence.get(field.getId()), thrift.getFieldValue(thriftField));
                        break;
                }
            }
        }
    }
}
Also used : TUnion(org.apache.thrift.TUnion) Set(java.util.Set) PField(net.morimekta.providence.descriptor.PField) PEnumValue(net.morimekta.providence.PEnumValue) ByteBuffer(java.nio.ByteBuffer) TEnum(org.apache.thrift.TEnum) PMessage(net.morimekta.providence.PMessage) PUnion(net.morimekta.providence.PUnion) ArrayList(java.util.ArrayList) List(java.util.List) TBase(org.apache.thrift.TBase) Binary(net.morimekta.util.Binary) Map(java.util.Map)

Example 7 with Binary

use of net.morimekta.util.Binary in project providence by morimekta.

the class MessageFieldArgument method apply.

@Override
@SuppressWarnings("unchecked")
public void apply(int position, PreparedStatement statement, StatementContext ctx) throws SQLException {
    if (message.has(field)) {
        switch(field.getType()) {
            case BOOL:
                {
                    boolean value = message.get(field);
                    if (type == Types.BOOLEAN || type == Types.BIT) {
                        statement.setBoolean(position, value);
                    } else {
                        statement.setInt(position, value ? 1 : 0);
                    }
                    break;
                }
            case BYTE:
                {
                    statement.setByte(position, message.get(field));
                    break;
                }
            case I16:
                {
                    statement.setShort(position, message.get(field));
                    break;
                }
            case I32:
                {
                    if (type == Types.TIMESTAMP) {
                        Timestamp timestamp = new Timestamp(1000L * (int) message.get(field));
                        statement.setTimestamp(position, timestamp);
                    } else {
                        statement.setInt(position, message.get(field));
                    }
                    break;
                }
            case I64:
                {
                    if (type == Types.TIMESTAMP) {
                        Timestamp timestamp = new Timestamp(message.get(field));
                        statement.setTimestamp(position, timestamp);
                    } else {
                        statement.setLong(position, message.get(field));
                    }
                    break;
                }
            case DOUBLE:
                {
                    statement.setDouble(position, message.get(field));
                    break;
                }
            case STRING:
                {
                    statement.setString(position, message.get(field));
                    break;
                }
            case BINARY:
                {
                    Binary binary = message.get(field);
                    switch(type) {
                        case Types.BINARY:
                        case Types.VARBINARY:
                            {
                                statement.setBytes(position, binary.get());
                                break;
                            }
                        case Types.BLOB:
                            {
                                statement.setBlob(position, binary.getInputStream());
                                break;
                            }
                        case Types.CHAR:
                        case Types.VARCHAR:
                        case Types.NCHAR:
                        case Types.NVARCHAR:
                            {
                                statement.setString(position, binary.toBase64());
                                break;
                            }
                        default:
                            throw new ResultSetException("Unknown binary field type: " + type + " for " + field, null, ctx);
                    }
                    break;
                }
            case ENUM:
                {
                    PEnumValue value = message.get(field);
                    statement.setInt(position, value.asInteger());
                    break;
                }
            case MESSAGE:
                {
                    PMessage value = message.get(field);
                    switch(type) {
                        case Types.BINARY:
                        case Types.VARBINARY:
                            {
                                ByteArrayOutputStream out = new ByteArrayOutputStream();
                                try {
                                    BINARY.serialize(out, value);
                                    statement.setBytes(position, out.toByteArray());
                                } catch (IOException e) {
                                    throw new ResultSetException(e.getMessage(), e, ctx);
                                }
                                break;
                            }
                        case Types.BLOB:
                            {
                                ByteArrayOutputStream out = new ByteArrayOutputStream();
                                try {
                                    BINARY.serialize(out, value);
                                    statement.setBlob(position, new ByteArrayInputStream(out.toByteArray()));
                                } catch (IOException e) {
                                    throw new ResultSetException(e.getMessage(), e, ctx);
                                }
                                break;
                            }
                        case Types.CHAR:
                        case Types.VARCHAR:
                        case Types.NCHAR:
                        case Types.NVARCHAR:
                            {
                                StringWriter writer = new StringWriter();
                                try {
                                    JSON.serialize(new PrintWriter(writer), value);
                                    statement.setString(position, writer.getBuffer().toString());
                                } catch (IOException e) {
                                    throw new ResultSetException(e.getMessage(), e, ctx);
                                }
                                break;
                            }
                        case Types.CLOB:
                            {
                                StringWriter writer = new StringWriter();
                                try {
                                    JSON.serialize(new PrintWriter(writer), value);
                                    statement.setClob(position, new StringReader(writer.getBuffer().toString()));
                                } catch (IOException e) {
                                    throw new ResultSetException(e.getMessage(), e, ctx);
                                }
                                break;
                            }
                        default:
                            throw new ResultSetException("Unknown message field type: " + type + " for " + field, null, ctx);
                    }
                    break;
                }
            default:
                throw new ResultSetException("Unhandled field type in SQL: " + field, null, ctx);
        }
    } else {
        statement.setNull(position, type);
    }
}
Also used : ResultSetException(org.jdbi.v3.core.result.ResultSetException) StringWriter(java.io.StringWriter) ByteArrayInputStream(java.io.ByteArrayInputStream) PMessage(net.morimekta.providence.PMessage) StringReader(java.io.StringReader) PEnumValue(net.morimekta.providence.PEnumValue) Binary(net.morimekta.util.Binary) ByteArrayOutputStream(java.io.ByteArrayOutputStream) IOException(java.io.IOException) Timestamp(java.sql.Timestamp) PrintWriter(java.io.PrintWriter)

Aggregations

Binary (net.morimekta.util.Binary)7 PEnumValue (net.morimekta.providence.PEnumValue)6 PMessage (net.morimekta.providence.PMessage)4 ByteArrayInputStream (java.io.ByteArrayInputStream)3 ByteArrayOutputStream (java.io.ByteArrayOutputStream)3 IOException (java.io.IOException)2 PrintWriter (java.io.PrintWriter)2 StringReader (java.io.StringReader)2 StringWriter (java.io.StringWriter)2 Timestamp (java.sql.Timestamp)2 Map (java.util.Map)2 File (java.io.File)1 InputStream (java.io.InputStream)1 ByteBuffer (java.nio.ByteBuffer)1 SQLDataException (java.sql.SQLDataException)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 List (java.util.List)1 Set (java.util.Set)1 PUnion (net.morimekta.providence.PUnion)1