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

org.jsimpledb.kv.util.PrefixKVTransaction Maven / Gradle / Ivy


/*
 * Copyright (C) 2015 Archie L. Cobbs. All rights reserved.
 */

package org.jsimpledb.kv.util;

import com.google.common.base.Preconditions;
import com.google.common.primitives.Bytes;

import java.util.concurrent.Future;

import org.jsimpledb.kv.CloseableKVStore;
import org.jsimpledb.kv.KVTransaction;

/**
 * {@link KVTransaction} view of all keys having a common {@code byte[]} prefix in a containing {@link KVTransaction}.
 *
 * 

* Instances are normally created indirectly from {@link PrefixKVDatabase} instances via {@link PrefixKVDatabase#createTransaction}. * Instances may also be created directly from an existing {@link KVTransaction}; in that case, * {@link #setTimeout setTimeout()}, {@link #commit}, and {@link #rollback} forward to the containing transaction, * while {@link #getKVDatabase} throws {@link UnsupportedOperationException}. */ public class PrefixKVTransaction extends PrefixKVStore implements KVTransaction { private final KVTransaction tx; private final PrefixKVDatabase db; // Constructors /** * Constructor that wraps an existing {@link KVTransaction}. There will be no associated {@link PrefixKVDatabase}. * * @param tx the containing {@link KVTransaction} * @param keyPrefix prefix for all keys * @throws IllegalArgumentException if {@code tx} or {@code keyPrefix} is null */ public PrefixKVTransaction(KVTransaction tx, byte[] keyPrefix) { this(tx, keyPrefix, null); } /** * Constructor for when there is an associated {@link PrefixKVDatabase}. * * @param db the containing {@link PrefixKVDatabase} * @throws NullPointerException if {@code db} is null */ PrefixKVTransaction(PrefixKVDatabase db) { this(db.getContainingKVDatabase().createTransaction(), db.getKeyPrefix(), db); } private PrefixKVTransaction(KVTransaction tx, byte[] keyPrefix, PrefixKVDatabase db) { super(keyPrefix); Preconditions.checkArgument(tx != null, "null tx"); this.tx = tx; this.db = db; } // PrefixKVStore @Override protected KVTransaction delegate() { return this.tx; } // KVTransaction /** * Get the {@link PrefixKVDatabase} associated with this instance. * * @throws UnsupportedOperationException if this instance was created directly from a containing {@link KVTransaction} */ @Override public PrefixKVDatabase getKVDatabase() { if (this.db == null) throw new UnsupportedOperationException("instance was not created from a PrefixKVDatabase"); return this.db; } @Override public void setTimeout(long timeout) { this.delegate().setTimeout(timeout); } @Override public Future watchKey(byte[] key) { Preconditions.checkArgument(key != null, "null key"); return this.delegate().watchKey(Bytes.concat(this.db.getKeyPrefix(), key)); } @Override public void commit() { this.delegate().commit(); } @Override public void rollback() { this.delegate().rollback(); } @Override public CloseableKVStore mutableSnapshot() { final CloseableKVStore kvstore = this.tx.mutableSnapshot(); return new CloseableForwardingKVStore(PrefixKVStore.create(kvstore, this.getKeyPrefix()), kvstore); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy