All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.devsmart.microdb.version.Change Maven / Gradle / Ivy

There is a newer version: 0.3.17
Show newest version
package com.devsmart.microdb.version;


import com.devsmart.microdb.Driver;
import com.devsmart.microdb.MapDBDriver;
import com.devsmart.ubjson.UBObject;
import com.devsmart.ubjson.UBValue;
import com.devsmart.ubjson.UBValueFactory;
import org.mapdb.Serializer;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.io.Serializable;
import java.util.UUID;

public class Change {

    public static final byte TYPE_INSERT = 0;
    public static final byte TYPE_DELETE = 1;

    public static final class ChangeSerializer implements Serializer, Serializable {
        @Override
        public void serialize(DataOutput out, Change value) throws IOException {
            out.writeByte(value.mType);
            Serializer.UUID.serialize(out, value.mObjId);
            MapDBDriver.SERIALIZER_UBVALUE.serialize(out, value.mValue);
        }

        @Override
        public Change deserialize(DataInput in, int available) throws IOException {
            Change retval = new Change();
            retval.mType = in.readByte();
            retval.mObjId = Serializer.UUID.deserialize(in, available);
            retval.mValue = MapDBDriver.SERIALIZER_UBVALUE.deserialize(in, available);

            return retval;
        }

        @Override
        public int fixedSize() {
            return -1;
        }
    }

    public static final Serializer SERIALIZER = new ChangeSerializer();

    public static Change createDeleteChange(UUID key) {
        Change retval = new Change();
        retval.mType = TYPE_DELETE;
        retval.mObjId = key;
        retval.mValue = UBValueFactory.createNull();

        return retval;
    }

    public static Change createInsertChange(UUID key, UBValue newValue) {
        Change retval = new Change();
        retval.mType = TYPE_INSERT;
        retval.mObjId = key;
        retval.mValue = newValue;

        return retval;
    }

    private byte mType;
    private UUID mObjId;
    private UBValue mValue;

    public static Change parse(UBObject obj) {
        Change retval = new Change();
        retval.mType = obj.get("t").asByte();
        retval.mObjId = UUID.fromString(obj.get("k").asString());
        retval.mValue = obj.get("v");

        return retval;
    }

    public byte getType() {
        return mType;
    }

    public UUID getObjId() {
        return mObjId;
    }

    public UBValue getObjValue() {
        return mValue;
    }

    public void apply(Driver driver) throws IOException {
        switch (mType) {
            case TYPE_DELETE:
                driver.delete(mObjId);
                break;

            case TYPE_INSERT:
                driver.update(mObjId, mValue);
                break;

            default:
                throw new RuntimeException("unknown change type: " + mType);
        }
    }

    @Override
    public String toString() {
        String retval = (mType == TYPE_INSERT ? "+" : "-") + mObjId.toString().substring(0, 5);
        return retval;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy