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

org.fusesource.lmdbjni.JNI Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (C) 2013, RedHat, Inc.
 *
 *    http://www.redhat.com/
 *
 * 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.
 */

package org.fusesource.lmdbjni;

import org.fusesource.hawtjni.runtime.*;

import static org.fusesource.hawtjni.runtime.ClassFlag.STRUCT;
import static org.fusesource.hawtjni.runtime.ClassFlag.TYPEDEF;
import static org.fusesource.hawtjni.runtime.FieldFlag.CONSTANT;
import static org.fusesource.hawtjni.runtime.MethodFlag.CONSTANT_GETTER;
import static org.fusesource.hawtjni.runtime.MethodFlag.CONSTANT_INITIALIZER;
import static org.fusesource.hawtjni.runtime.ArgFlag.*;

/**
 * This class holds all the native constant, structure and function mappings.
 *
 * @author Hiram Chirino
 */
@JniClass
class JNI {

  public static final Library LIBRARY = new Library("lmdbjni", JNI.class);

  static {
    JNI.LIBRARY.load();
    init();
  }

  @JniMethod(flags = {CONSTANT_INITIALIZER})
  private static final native void init();

  ///////////////////////////////////////////////////////////////////////
  //
  // Posix APIs:
  //
  ///////////////////////////////////////////////////////////////////////

  @JniMethod(flags = {CONSTANT_GETTER})
  public static final native int errno();

  @JniMethod(cast = "char *")
  public static final native long strerror(int errnum);

  public static final native int strlen(
    @JniArg(cast = "const char *") long s);

  @JniMethod(cast = "void *")
  public static final native long malloc(
    @JniArg(cast = "size_t") long size);

  public static final native void free(
    @JniArg(cast = "void *") long self);

  ///////////////////////////////////////////////////////////////////////
  //
  // Additional Helpers
  //
  ///////////////////////////////////////////////////////////////////////
  public static final native void buffer_copy(
    @JniArg(cast = "const void *", flags = {NO_OUT, CRITICAL}) byte[] src,
    @JniArg(cast = "size_t") long srcPos,
    @JniArg(cast = "void *") long dest,
    @JniArg(cast = "size_t") long destPos,
    @JniArg(cast = "size_t") long length);

  public static final native void buffer_copy(
    @JniArg(cast = "const void *") long src,
    @JniArg(cast = "size_t") long srcPos,
    @JniArg(cast = "void *", flags = {NO_IN, CRITICAL}) byte[] dest,
    @JniArg(cast = "size_t") long destPos,
    @JniArg(cast = "size_t") long length);

  ///////////////////////////////////////////////////////////////////////
  //
  // The lmdb API
  //
  ///////////////////////////////////////////////////////////////////////

  //====================================================//
  // Version Info
  //====================================================//
  @JniField(flags = {CONSTANT})
  static public int MDB_VERSION_MAJOR;
  @JniField(flags = {CONSTANT})
  static public int MDB_VERSION_MINOR;
  @JniField(flags = {CONSTANT})
  static public int MDB_VERSION_PATCH;
  @JniField(flags = {CONSTANT})
  static public int MDB_VERSION_FULL;

  @JniField(cast = "const char *", flags = {CONSTANT})
  static long MDB_VERSION_DATE;
  @JniField(cast = "const char *", flags = {CONSTANT})
  static long MDB_VERSION_STRING;

  //====================================================//
  // Environment Flags
  //====================================================//
  @JniField(flags = {CONSTANT})
  static public int MDB_FIXEDMAP;
  @JniField(flags = {CONSTANT})
  static public int MDB_NOSUBDIR;
  @JniField(flags = {CONSTANT})
  static public int MDB_NOSYNC;
  @JniField(flags = {CONSTANT})
  static public int MDB_RDONLY;
  @JniField(flags = {CONSTANT})
  static public int MDB_NOMETASYNC;
  @JniField(flags = {CONSTANT})
  static public int MDB_WRITEMAP;
  @JniField(flags = {CONSTANT})
  static public int MDB_MAPASYNC;
  @JniField(flags = {CONSTANT})
  static public int MDB_NOTLS;
  @JniField(flags = {CONSTANT})
  static public int MDB_NOLOCK;
  @JniField(flags = {CONSTANT})
  static public int MDB_NORDAHEAD;
  @JniField(flags = {CONSTANT})
  static public int MDB_NOMEMINIT;

  //====================================================//
  // Database Flags
  //====================================================//
  @JniField(flags = {CONSTANT})
  static public int MDB_REVERSEKEY;
  @JniField(flags = {CONSTANT})
  static public int MDB_DUPSORT;
  @JniField(flags = {CONSTANT})
  static public int MDB_INTEGERKEY;
  @JniField(flags = {CONSTANT})
  static public int MDB_DUPFIXED;
  @JniField(flags = {CONSTANT})
  static public int MDB_INTEGERDUP;
  @JniField(flags = {CONSTANT})
  static public int MDB_REVERSEDUP;
  @JniField(flags = {CONSTANT})
  static public int MDB_CREATE;

  //====================================================//
  // Write Flags
  //====================================================//
  @JniField(flags = {CONSTANT})
  static public int MDB_NOOVERWRITE;
  @JniField(flags = {CONSTANT})
  static public int MDB_NODUPDATA;
  @JniField(flags = {CONSTANT})
  static public int MDB_CURRENT;
  @JniField(flags = {CONSTANT})
  static public int MDB_RESERVE;
  @JniField(flags = {CONSTANT})
  static public int MDB_APPEND;
  @JniField(flags = {CONSTANT})
  static public int MDB_APPENDDUP;
  @JniField(flags = {CONSTANT})
  static public int MDB_MULTIPLE;

  //====================================================//
  // enum MDB_cursor_op:
  //====================================================//
  @JniField(flags = {CONSTANT})
  static public int MDB_FIRST;
  @JniField(flags = {CONSTANT})
  static public int MDB_FIRST_DUP;
  @JniField(flags = {CONSTANT})
  static public int MDB_GET_BOTH;
  @JniField(flags = {CONSTANT})
  static public int MDB_GET_BOTH_RANGE;
  @JniField(flags = {CONSTANT})
  static public int MDB_GET_CURRENT;
  @JniField(flags = {CONSTANT})
  static public int MDB_GET_MULTIPLE;
  @JniField(flags = {CONSTANT})
  static public int MDB_LAST;
  @JniField(flags = {CONSTANT})
  static public int MDB_LAST_DUP;
  @JniField(flags = {CONSTANT})
  static public int MDB_NEXT;
  @JniField(flags = {CONSTANT})
  static public int MDB_NEXT_DUP;
  @JniField(flags = {CONSTANT})
  static public int MDB_NEXT_MULTIPLE;
  @JniField(flags = {CONSTANT})
  static public int MDB_NEXT_NODUP;
  @JniField(flags = {CONSTANT})
  static public int MDB_PREV;
  @JniField(flags = {CONSTANT})
  static public int MDB_PREV_DUP;
  @JniField(flags = {CONSTANT})
  static public int MDB_PREV_NODUP;
  @JniField(flags = {CONSTANT})
  static public int MDB_SET;
  @JniField(flags = {CONSTANT})
  static public int MDB_SET_KEY;
  @JniField(flags = {CONSTANT})
  static public int MDB_SET_RANGE;

  //====================================================//
  // Return Codes
  //====================================================//
  @JniField(flags = {CONSTANT})
  static public int MDB_SUCCESS;
  @JniField(flags = {CONSTANT})
  static public int MDB_KEYEXIST;
  @JniField(flags = {CONSTANT})
  static public int MDB_NOTFOUND;
  @JniField(flags = {CONSTANT})
  static public int MDB_PAGE_NOTFOUND;
  @JniField(flags = {CONSTANT})
  static public int MDB_CORRUPTED;
  @JniField(flags = {CONSTANT})
  static public int MDB_PANIC;
  @JniField(flags = {CONSTANT})
  static public int MDB_VERSION_MISMATCH;
  @JniField(flags = {CONSTANT})
  static public int MDB_INVALID;
  @JniField(flags = {CONSTANT})
  static public int MDB_MAP_FULL;
  @JniField(flags = {CONSTANT})
  static public int MDB_DBS_FULL;
  @JniField(flags = {CONSTANT})
  static public int MDB_READERS_FULL;
  @JniField(flags = {CONSTANT})
  static public int MDB_TLS_FULL;
  @JniField(flags = {CONSTANT})
  static public int MDB_TXN_FULL;
  @JniField(flags = {CONSTANT})
  static public int MDB_CURSOR_FULL;
  @JniField(flags = {CONSTANT})
  static public int MDB_PAGE_FULL;
  @JniField(flags = {CONSTANT})
  static public int MDB_MAP_RESIZED;
  @JniField(flags = {CONSTANT})
  static public int MDB_INCOMPATIBLE;
  @JniField(flags = {CONSTANT})
  static public int MDB_BAD_RSLOT;
  @JniField(flags = {CONSTANT})
  static public int MDB_BAD_TXN;
  @JniField(flags = {CONSTANT})
  static public int MDB_BAD_VALSIZE;
  @JniField(flags = {CONSTANT})
  static public int MDB_BAD_DBI;
  @JniField(flags = {CONSTANT})
  static public int MDB_LAST_ERRCODE;
  /**
   * details
   */
  @JniClass(flags = {STRUCT, TYPEDEF})
  static public class MDB_envinfo {
    @JniField(cast = "void *")
    public long me_mapaddr;
    @JniField(cast = "size_t")
    public long me_mapsize;
    @JniField(cast = "size_t")
    public long me_last_pgno;
    @JniField(cast = "size_t")
    public long me_last_txnid;
    @JniField(cast = "unsigned int")
    public long me_maxreaders;
    @JniField(cast = "unsigned int")
    public long me_numreaders;

    @Override
    public String toString() {
      return "{" +
        "me_last_pgno=" + me_last_pgno +
        ", me_mapaddr=" + me_mapaddr +
        ", me_mapsize=" + me_mapsize +
        ", me_last_txnid=" + me_last_txnid +
        ", me_maxreaders=" + me_maxreaders +
        ", me_numreaders=" + me_numreaders +
        '}';
    }
  }

  /**
   * details
   */
  @JniClass(flags = {STRUCT, TYPEDEF})
  public static class MDB_stat {
    @JniField(cast = "unsigned int")
    public long ms_psize;
    @JniField(cast = "unsigned int")
    public long ms_depth;
    @JniField(cast = "size_t")
    public long ms_branch_pages;
    @JniField(cast = "size_t")
    public long ms_leaf_pages;
    @JniField(cast = "size_t")
    public long ms_overflow_pages;
    @JniField(cast = "size_t")
    public long ms_entries;

    @Override
    public String toString() {
      return "{" +
        "ms_branch_pages=" + ms_branch_pages +
        ", ms_psize=" + ms_psize +
        ", ms_depth=" + ms_depth +
        ", ms_leaf_pages=" + ms_leaf_pages +
        ", ms_overflow_pages=" + ms_overflow_pages +
        ", ms_entries=" + ms_entries +
        '}';
    }
  }

  /**
   * details
   */
  @JniClass(flags = {STRUCT, TYPEDEF})
  public static class MDB_val {
    @JniField(cast = "size_t")
    public long mv_size;
    @JniField(cast = "void *")
    public long mv_data;
  }

  /**
   * details
   */
  @JniMethod(cast = "char *")
  public static final native long mdb_strerror(int err);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_env_create(
    @JniArg(cast = "MDB_env **", flags = {NO_IN}) long[] env);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_env_open(
    @JniArg(cast = "MDB_env *") long env,
    @JniArg(cast = "const char *") String path,
    @JniArg(cast = "unsigned int") int flags,
    @JniArg(cast = "mdb_mode_t") int mode
  );

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_env_copy(
    @JniArg(cast = "MDB_env *") long env,
    @JniArg(cast = "const char *") String path);

  @JniMethod
  public static final native int mdb_env_copy2(
    @JniArg(cast = "MDB_env *") long env,
    @JniArg(cast = "const char *") String path,
    @JniArg(cast = "unsigned int") int flags);


  /**
   * details
   */
  @JniMethod
  public static final native int mdb_env_stat(
    @JniArg(cast = "MDB_env *") long env,
    @JniArg(cast = "MDB_stat *", flags = {NO_IN}) MDB_stat stat);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_env_info(
    @JniArg(cast = "MDB_env *") long env,
    @JniArg(cast = " MDB_envinfo *", flags = {NO_IN}) MDB_envinfo stat);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_env_sync(
    @JniArg(cast = "MDB_env *") long env,
    @JniArg(cast = "int") int force);


  /**
   * details
   */
  @JniMethod
  public static final native void mdb_env_close(
    @JniArg(cast = "MDB_env *") long env);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_env_set_flags(
    @JniArg(cast = "MDB_env *") long env,
    @JniArg(cast = "unsigned int") int flags,
    @JniArg(cast = "int") int onoff);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_env_get_flags(
    @JniArg(cast = "MDB_env *") long env,
    @JniArg(cast = "unsigned int *") long[] flags);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_env_get_path(
    @JniArg(cast = "MDB_env *") long env,
    @JniArg(cast = "const char **", flags = {NO_IN}) long[] path);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_env_set_mapsize(
    @JniArg(cast = "MDB_env *") long env,
    @JniArg(cast = "size_t") long size);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_env_set_maxreaders(
    @JniArg(cast = "MDB_env *") long env,
    @JniArg(cast = "unsigned int") long readers);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_env_get_maxreaders(
    @JniArg(cast = "MDB_env *") long env,
    @JniArg(cast = "unsigned int *") long[] readers);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_env_set_maxdbs(
    @JniArg(cast = "MDB_env *") long env,
    @JniArg(cast = "unsigned int") long dbs);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_txn_begin(
    @JniArg(cast = "MDB_env *") long env,
    @JniArg(cast = "MDB_txn *") long parent,
    @JniArg(cast = "unsigned int") long flags,
    @JniArg(cast = "MDB_txn **", flags = {NO_IN}) long[] txn);


  /**
   * details
   */
  @JniMethod
  public static final native int mdb_txn_id(
    @JniArg(cast = "MDB_txn *") long txn);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_txn_commit(
    @JniArg(cast = "MDB_txn *") long txn);

  /**
   * details
   */
  @JniMethod
  public static final native void mdb_txn_abort(
    @JniArg(cast = "MDB_txn *") long txn);

  /**
   * details
   */
  @JniMethod
  public static final native void mdb_txn_reset(
    @JniArg(cast = "MDB_txn *") long txn);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_txn_renew(
    @JniArg(cast = "MDB_txn *") long txn);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_dbi_open(
    @JniArg(cast = "MDB_txn *") long txn,
    @JniArg(cast = "const char *") String name,
    @JniArg(cast = "unsigned int") long flags,
    @JniArg(cast = "unsigned int *") long[] dbi);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_stat(
    @JniArg(cast = "MDB_txn *") long txn,
    @JniArg(cast = "unsigned int ") long dbi,
    @JniArg(cast = "MDB_stat *", flags = {NO_IN}) MDB_stat stat);

  /**
   * details
   */
  @JniMethod
  public static final native void mdb_dbi_close(
    @JniArg(cast = "MDB_env *") long env,
    @JniArg(cast = "unsigned int ") long dbi);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_drop(
    @JniArg(cast = "MDB_txn *") long txn,
    @JniArg(cast = "unsigned int ") long dbi,
    int del);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_set_compare(
    @JniArg(cast = "MDB_txn *") long txn,
    @JniArg(cast = "unsigned int ") long dbi,
    @JniArg(cast = "MDB_cmp_func *") long cmp);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_set_dupsort(
    @JniArg(cast = "MDB_txn *") long txn,
    @JniArg(cast = "unsigned int ") long dbi,
    @JniArg(cast = "MDB_cmp_func *") long cmp);


  /**
   * details
   */
  @JniMethod
  public static final native int mdb_get(
    @JniArg(cast = "MDB_txn *") long txn,
    @JniArg(cast = "unsigned int ") long dbi,
    @JniArg(cast = "MDB_val *", flags = {NO_OUT}) MDB_val key,
    @JniArg(cast = "MDB_val *", flags = {NO_IN}) MDB_val data);

  @JniMethod(accessor = "mdb_get")
  public static final native int mdb_get_address(
    @JniArg(cast = "MDB_txn *") long txn,
    @JniArg(cast = "unsigned int ") long dbi,
    @JniArg(cast = "MDB_val *") long key,
    @JniArg(cast = "MDB_val *") long data);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_put(
    @JniArg(cast = "MDB_txn *") long txn,
    @JniArg(cast = "unsigned int ") long dbi,
    @JniArg(cast = "MDB_val *", flags = {NO_OUT}) MDB_val key,
    @JniArg(cast = "MDB_val *") MDB_val data,
    @JniArg(cast = "unsigned int") int flags);


  @JniMethod(accessor = "mdb_put")
  public static final native int mdb_put_address(
    @JniArg(cast = "MDB_txn *") long txn,
    @JniArg(cast = "unsigned int ") long dbi,
    @JniArg(cast = "MDB_val *") long key,
    @JniArg(cast = "MDB_val *") long data,
    @JniArg(cast = "unsigned int") int flags);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_del(
    @JniArg(cast = "MDB_txn *") long txn,
    @JniArg(cast = "unsigned int ") long dbi,
    @JniArg(cast = "MDB_val *", flags = {NO_OUT}) MDB_val key,
    @JniArg(cast = "MDB_val *", flags = {NO_OUT}) MDB_val data);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_cursor_open(
    @JniArg(cast = "MDB_txn *") long txn,
    @JniArg(cast = "unsigned int") long dbi,
    @JniArg(cast = "MDB_cursor **", flags = {NO_IN}) long[] cursor);

  /**
   * details
   */
  @JniMethod
  public static final native void mdb_cursor_close(
    @JniArg(cast = "MDB_cursor *") long cursor);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_cursor_renew(
    @JniArg(cast = "MDB_txn *") long txn,
    @JniArg(cast = "MDB_cursor *") long cursor);

  /**
   * details
   */
  @JniMethod(cast = "MDB_txn *")
  public static final native long mdb_cursor_txn(
    @JniArg(cast = "MDB_cursor *") long cursor);

  /**
   * details
   */
  @JniMethod(cast = "unsigned int")
  public static final native long mdb_cursor_dbi(
    @JniArg(cast = "MDB_cursor *") long cursor);

  /**
   * details
   */
  @JniMethod(accessor = "mdb_cursor_get")
  public static final native int mdb_cursor_get_copy_in(
    @JniArg(cast = "MDB_cursor *") long cursor,
    @JniArg(cast = "MDB_val *") MDB_val key,
    @JniArg(cast = "MDB_val *") MDB_val data,
    @JniArg(cast = "MDB_cursor_op") int op);

  /**
   * details
   */
  @JniMethod(accessor = "mdb_cursor_get")
  public static final native int mdb_cursor_get_no_copy_in(
    @JniArg(cast = "MDB_cursor *") long cursor,
    @JniArg(cast = "MDB_val *", flags = {NO_IN}) MDB_val key,
    @JniArg(cast = "MDB_val *", flags = {NO_IN}) MDB_val data,
    @JniArg(cast = "MDB_cursor_op") int op);

  public static final int mdb_cursor_get(long cursor, MDB_val key, MDB_val data, int op) {
    // In the current version of lmdb, only the following ops need to copy in:
    //   MDB_GET_BOTH:
    //   MDB_GET_BOTH_RANGE:
    //   MDB_SET:
    //   MDB_SET_KEY:
    //   MDB_SET_RANGE:
	//	 MDB_LAST_DUP:
	//	 MDB_FIRST_DUP:
	
    // In order to be future proof, we assume that unknown ops all need to copy in.
    boolean copyIn = !(op == MDB_FIRST ||
      op == MDB_GET_CURRENT ||
      op == MDB_GET_MULTIPLE ||
      op == MDB_LAST ||
      op == MDB_NEXT ||
      op == MDB_NEXT_DUP ||
      op == MDB_NEXT_MULTIPLE ||
      op == MDB_NEXT_NODUP ||
      op == MDB_PREV ||
      op == MDB_PREV_DUP ||
      op == MDB_PREV_NODUP);
    // On my machine we save about 15ns per call by avoiding the copy. The cost of checking
    // whether the op needs a copy is trivial compared to the cost of the extra JNI calls!
    if (copyIn) {
      return mdb_cursor_get_copy_in(cursor, key, data, op);
    } else {
      return mdb_cursor_get_no_copy_in(cursor, key, data, op);
    }
  }

  @JniMethod(accessor = "mdb_cursor_get")
  public static final native int mdb_cursor_get_address(
    @JniArg(cast = "MDB_cursor *") long cursor,
    @JniArg(cast = "MDB_val *") long key,
    @JniArg(cast = "MDB_val *") long data,
    @JniArg(cast = "MDB_cursor_op") int op);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_cursor_put(
    @JniArg(cast = "MDB_cursor *") long cursor,
    @JniArg(cast = "MDB_val *", flags = {NO_OUT}) MDB_val key,
    @JniArg(cast = "MDB_val *", flags = {NO_OUT}) MDB_val data,
    @JniArg(cast = "unsigned int ") int flags);


  @JniMethod(accessor = "mdb_cursor_put")
  public static final native int mdb_cursor_put_address(
    @JniArg(cast = "MDB_cursor *") long cursor,
    @JniArg(cast = "MDB_val *") long key,
    @JniArg(cast = "MDB_val *") long data,
    @JniArg(cast = "unsigned int ") int flags);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_cursor_del(
    @JniArg(cast = "MDB_cursor *") long cursor,
    @JniArg(cast = "unsigned int ") int flags);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_cursor_count(
    @JniArg(cast = "MDB_cursor *") long cursor,
    @JniArg(cast = "size_t *") long[] countp);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_cmp(
    @JniArg(cast = "MDB_txn *") long txn,
    @JniArg(cast = "unsigned int") long dbi,
    @JniArg(cast = "MDB_val *", flags = {NO_OUT}) MDB_val a,
    @JniArg(cast = "MDB_val *", flags = {NO_OUT}) MDB_val b);

  /**
   * details
   */
  @JniMethod
  public static final native int mdb_dcmp(
    @JniArg(cast = "MDB_txn *") long txn,
    @JniArg(cast = "unsigned int") long dbi,
    @JniArg(cast = "MDB_val *", flags = {NO_OUT}) MDB_val a,
    @JniArg(cast = "MDB_val *", flags = {NO_OUT}) MDB_val b);

  @JniMethod
  public static final native int mdb_env_get_maxkeysize(
    @JniArg(cast = "MDB_env *") long env);


  @JniMethod
  public static final native int mdb_reader_check(
    @JniArg(cast = "MDB_env *") long env, @JniArg(cast = "int *") int[] dead);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy