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

com.cloudhopper.datastore.tokyo.TokyoDataStoreIterator Maven / Gradle / Ivy

The newest version!
package com.cloudhopper.datastore.tokyo;

/*
 * #%L
 * ch-datastore
 * %%
 * Copyright (C) 2012 Cloudhopper by Twitter
 * %%
 * 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.
 * #L%
 */

import com.cloudhopper.datastore.DataStoreFatalException;
import com.cloudhopper.datastore.DataStoreIterator;
import tokyocabinet.BDB;
import tokyocabinet.BDBCUR;

/**
 *
 * @author joelauer
 */
public class TokyoDataStoreIterator implements DataStoreIterator {

    private BDBCUR cursor;
    private boolean firstNextCall;

    public TokyoDataStoreIterator(BDB bdb) {
        this.cursor = new BDBCUR(bdb);
        // flag to indicate this is the first call to next()
        this.firstNextCall = true;
    }

    public boolean next() throws DataStoreFatalException {
        // tokyo cabinet does things a little different in that the first record
        // is already selected by default -- our interface says that you need
        // to call next() first, so we will only call next on calls after the
        // first one
        if (this.firstNextCall) {
            this.firstNextCall = false;
            // move to first record
            return this.cursor.first();
        } else {
            return cursor.next();
        }
    }

    public boolean jump(byte[] key) throws DataStoreFatalException {
	if (this.firstNextCall) this.firstNextCall = false;
	return this.cursor.jump(key);
    }

    public Record getRecord() throws DataStoreFatalException {
        byte[] key = cursor.key();
        byte[] value = cursor.val();
        if (key == null || value == null) {
            throw new DataStoreFatalException("Record key or value was null");
        }
        return new Record(key, value);
    }

    public void close() throws DataStoreFatalException {
        // don't really have to do anything to close the cursor
        cursor = null;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy