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

com.protonail.leveldb.jna.LevelDBIteratorBase Maven / Gradle / Ivy

There is a newer version: 1.20.0
Show newest version
package com.protonail.leveldb.jna;

import com.sun.jna.Native;
import com.sun.jna.ptr.PointerByReference;

import java.util.Iterator;

public abstract class LevelDBIteratorBase implements AutoCloseable, Iterator {
    protected LevelDB levelDB;
    protected LevelDBNative.Iterator iterator;

    public LevelDBIteratorBase(LevelDB levelDB, LevelDBReadOptions readOptions) {
        this.levelDB = levelDB;

        levelDB.checkDatabaseOpen();
        readOptions.checkReadOptionsOpen();
        iterator = LevelDBNative.leveldb_create_iterator(levelDB.levelDB, readOptions.readOptions);
    }

    public void close() {
        levelDB.checkDatabaseOpen();
        checkIteratorOpen();

        LevelDBNative.leveldb_iter_destroy(iterator);
        iterator = null;
    }

    public boolean hasNext() {
        levelDB.checkDatabaseOpen();
        checkIteratorOpen();

        boolean hasNext = LevelDBNative.leveldb_iter_valid(iterator) != 0;
        checkError();
        return hasNext;
    }

    public void seekToFirst() {
        levelDB.checkDatabaseOpen();
        checkIteratorOpen();

        LevelDBNative.leveldb_iter_seek_to_first(iterator);
        checkError();
    }

    public void seekToLast() {
        levelDB.checkDatabaseOpen();
        checkIteratorOpen();

        LevelDBNative.leveldb_iter_seek_to_last(iterator);
        checkError();
    }

    public void seekToKey(byte[] key) {
        levelDB.checkDatabaseOpen();
        checkIteratorOpen();

        if (Native.POINTER_SIZE == 8) {
            long keyLength = key != null ? key.length : 0;
            LevelDBNative.leveldb_iter_seek(iterator, key, keyLength);
        } else {
            int keyLength = key != null ? key.length : 0;
            LevelDBNative.leveldb_iter_seek(iterator, key, keyLength);
        }
        checkError();
    }

    private void checkError() {
        PointerByReference error = new PointerByReference();
        LevelDBNative.leveldb_iter_get_error(iterator, error);
        LevelDBNative.checkError(error);
    }

    protected void checkIteratorOpen() {
        if (iterator == null) {
            throw new LevelDBException("LevelDB iterator was closed.");
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy