Add LevelDb's JNI wrapper
Summary: This implement the Java interface by using JNI Test Plan: compile test Reviewers: dhruba Reviewed By: dhruba Differential Revision: https://reviews.facebook.net/D5925
This commit is contained in:
parent
fc23714f27
commit
696b290821
13
java/leveldbjni/.gitignore
vendored
Normal file
13
java/leveldbjni/.gitignore
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
*~
|
||||
*.swp
|
||||
.idea
|
||||
.idea/*
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
target
|
||||
.DS_Store
|
||||
.project
|
||||
.classpath
|
||||
.settings
|
||||
eclipse-classes
|
42
java/leveldbjni/changelog.md
Normal file
42
java/leveldbjni/changelog.md
Normal file
@ -0,0 +1,42 @@
|
||||
# [LevelDBJNI](https://github.com/fusesource/leveldbjni)
|
||||
|
||||
## [leveldbjni 1.3][1_3], released 2012-09-24
|
||||
[1_3]: http://repo.fusesource.com/nexus/content/groups/public/org/fusesource/leveldbjni/leveldbjni/1.3
|
||||
|
||||
* Make Util.link work on windows too.
|
||||
* Expose the CreateHardLinkW windows API call.
|
||||
* Added Windows LevelDB Support
|
||||
* Update to hawtjni 1.6.
|
||||
* Support the db.compactRange method to force compaction of the leveldb files.
|
||||
* Fixed bug need to get leveldbjni workin on the Zing JVM
|
||||
|
||||
## [leveldbjni 1.2][1_2], released 2012-02-27
|
||||
[1_2]: http://repo.fusesource.com/nexus/content/groups/public/org/fusesource/leveldbjni/leveldbjni/1.2
|
||||
|
||||
* Document how to use the memory pools.
|
||||
* Fixes issue #6 Support using a memory pool to reduce native memory allocation overhead.
|
||||
* Update leveldb, hawtjni, and leveldb-api versions.
|
||||
* Store the version in the factory class.
|
||||
* Added a release guide.
|
||||
|
||||
## [leveldbjni 1.1][1_1], released 2011-09-29
|
||||
[1_1]: http://repo.fusesource.com/nexus/content/groups/public/org/fusesource/leveldbjni/leveldbjni/1.1
|
||||
|
||||
* the all module needs at least one java file so that it produces a javadoc and src.zip
|
||||
* Try to load the native lib when the JniDBFactory class is loaded.
|
||||
* Fixes issue #1 : Bug on NativeBuffer offset
|
||||
* Switch the license from CDDL to the New BSD license to match the license used in the leveldb project.
|
||||
* Add the sonatype snapshot repo since that's where the leveldb-api is at currently.
|
||||
* Pickup updates in the api module.
|
||||
* Updating build instructions.
|
||||
* implement repair and destroy.
|
||||
* api updated
|
||||
* Cleaner java package structure. We only need to expose one public class now since we are using the org.iq80.leveldb abstract api.
|
||||
* Refactored so that the main user API is the abstract API defined in 'org.iq80.leveldb.api' package.
|
||||
|
||||
## [leveldbjni 1.0][1_0], released 2011-08-08
|
||||
[1_0]: http://repo.fusesource.com/nexus/content/groups/public/org/fusesource/leveldbjni/leveldbjni/1.0
|
||||
|
||||
* Initial Release
|
||||
* OS X Intel 32 and 64 bit support
|
||||
* Linux Intel 32 and 64 bit support
|
29
java/leveldbjni/leveldb.patch
Normal file
29
java/leveldbjni/leveldb.patch
Normal file
@ -0,0 +1,29 @@
|
||||
diff --git a/build_detect_platform b/build_detect_platform
|
||||
index 959a7d6..388d225 100755
|
||||
--- a/build_detect_platform
|
||||
+++ b/build_detect_platform
|
||||
@@ -171,9 +171,9 @@ echo "CC=$CC" >> $OUTPUT
|
||||
echo "CXX=$CXX" >> $OUTPUT
|
||||
echo "PLATFORM=$PLATFORM" >> $OUTPUT
|
||||
echo "PLATFORM_LDFLAGS=$PLATFORM_LDFLAGS" >> $OUTPUT
|
||||
-echo "PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS" >> $OUTPUT
|
||||
-echo "PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS" >> $OUTPUT
|
||||
-echo "PLATFORM_SHARED_CFLAGS=$PLATFORM_SHARED_CFLAGS" >> $OUTPUT
|
||||
+echo "PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS $PLATFORM_SHARED_CFLAGS" >> $OUTPUT
|
||||
+echo "PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS $PLATFORM_SHARED_CFLAGS" >> $OUTPUT
|
||||
+echo "PLATFORM_SHARED_CFLAGS=" >> $OUTPUT
|
||||
echo "PLATFORM_SHARED_EXT=$PLATFORM_SHARED_EXT" >> $OUTPUT
|
||||
echo "PLATFORM_SHARED_LDFLAGS=$PLATFORM_SHARED_LDFLAGS" >> $OUTPUT
|
||||
echo "PLATFORM_SHARED_VERSIONED=$PLATFORM_SHARED_VERSIONED" >> $OUTPUT
|
||||
diff --git a/include/leveldb/slice.h b/include/leveldb/slice.h
|
||||
index 74ea8fa..135bbd7 100644
|
||||
--- a/include/leveldb/slice.h
|
||||
+++ b/include/leveldb/slice.h
|
||||
@@ -77,7 +77,6 @@ class Slice {
|
||||
(memcmp(data_, x.data_, x.size_) == 0));
|
||||
}
|
||||
|
||||
- private:
|
||||
const char* data_;
|
||||
size_t size_;
|
||||
|
95
java/leveldbjni/leveldbjni-all/pom.xml
Executable file
95
java/leveldbjni/leveldbjni-all/pom.xml
Executable file
@ -0,0 +1,95 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
|
||||
http://fusesource.com
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of FuseSource Corp. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-project</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-all</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
|
||||
<name>${project.artifactId}</name>
|
||||
<description>An uber jar which contains all the leveldbjni platform libraries and dependencies</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-osx</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-linux32</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-linux64</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-win32</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-win64</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.fusesource.mvnplugins</groupId>
|
||||
<artifactId>maven-uberize-plugin</artifactId>
|
||||
<version>1.15</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals><goal>uberize</goal></goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
@ -0,0 +1,4 @@
|
||||
package org.fusesource.leveldbjni;
|
||||
|
||||
public class All {
|
||||
}
|
100
java/leveldbjni/leveldbjni-linux32/pom.xml
Executable file
100
java/leveldbjni/leveldbjni-linux32/pom.xml
Executable file
@ -0,0 +1,100 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
|
||||
http://fusesource.com
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of FuseSource Corp. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-project</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-linux32</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
|
||||
<name>${project.artifactId}</name>
|
||||
<description>The leveldbjni linux 32 native libraries</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<testSourceDirectory>${basedir}/../leveldbjni/src/test/java</testSourceDirectory>
|
||||
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>2.3.1</version>
|
||||
<configuration>
|
||||
<classesDirectory>${basedir}/target/generated-sources/hawtjni/lib</classesDirectory>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.fusesource.hawtjni</groupId>
|
||||
<artifactId>maven-hawtjni-plugin</artifactId>
|
||||
<version>${hawtjni-version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>build</goal>
|
||||
</goals>
|
||||
<phase>compile</phase>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<name>leveldbjni</name>
|
||||
<classified>false</classified>
|
||||
<nativeSrcDependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<classifier>native-src</classifier>
|
||||
<type>zip</type>
|
||||
</nativeSrcDependency>
|
||||
<configureArgs>
|
||||
<arg>--with-leveldb=${env.LEVELDB_HOME}</arg>
|
||||
<arg>--with-snappy=${env.SNAPPY_HOME}</arg>
|
||||
</configureArgs>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
99
java/leveldbjni/leveldbjni-linux64/pom.xml
Executable file
99
java/leveldbjni/leveldbjni-linux64/pom.xml
Executable file
@ -0,0 +1,99 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
|
||||
http://fusesource.com
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of FuseSource Corp. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-project</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-linux64</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
|
||||
<name>${project.artifactId}</name>
|
||||
<description>The leveldbjni linux 64 native libraries</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<testSourceDirectory>${basedir}/../leveldbjni/src/test/java</testSourceDirectory>
|
||||
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>2.3.1</version>
|
||||
<configuration>
|
||||
<classesDirectory>${basedir}/target/generated-sources/hawtjni/lib</classesDirectory>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.fusesource.hawtjni</groupId>
|
||||
<artifactId>maven-hawtjni-plugin</artifactId>
|
||||
<version>${hawtjni-version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>build</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<name>leveldbjni</name>
|
||||
<classified>false</classified>
|
||||
<nativeSrcDependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<classifier>native-src</classifier>
|
||||
<type>zip</type>
|
||||
</nativeSrcDependency>
|
||||
<configureArgs>
|
||||
<arg>--with-leveldb=${env.LEVELDB_HOME}</arg>
|
||||
<arg>--with-snappy=${env.SNAPPY_HOME}</arg>
|
||||
</configureArgs>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
110
java/leveldbjni/leveldbjni-osx/pom.xml
Executable file
110
java/leveldbjni/leveldbjni-osx/pom.xml
Executable file
@ -0,0 +1,110 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
|
||||
http://fusesource.com
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of FuseSource Corp. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-project</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-osx</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
|
||||
<name>${project.artifactId}</name>
|
||||
<description>The leveldbjni OS X universal native libraries</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
<type>test-jar</type>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<testSourceDirectory>${basedir}/../leveldbjni/src/test/java</testSourceDirectory>
|
||||
<plugins>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>2.3.1</version>
|
||||
<configuration>
|
||||
<classesDirectory>${basedir}/target/generated-sources/hawtjni/lib</classesDirectory>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.fusesource.hawtjni</groupId>
|
||||
<artifactId>maven-hawtjni-plugin</artifactId>
|
||||
<version>${hawtjni-version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>build</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<name>leveldbjni</name>
|
||||
<classified>false</classified>
|
||||
<nativeSrcDependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<classifier>native-src</classifier>
|
||||
<type>zip</type>
|
||||
</nativeSrcDependency>
|
||||
<platform>osx</platform>
|
||||
<configureArgs>
|
||||
<arg>--with-leveldb=${env.LEVELDB_HOME}</arg>
|
||||
<arg>--with-snappy=${env.SNAPPY_HOME}</arg>
|
||||
<arg>--with-universal</arg>
|
||||
</configureArgs>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
97
java/leveldbjni/leveldbjni-win32/pom.xml
Executable file
97
java/leveldbjni/leveldbjni-win32/pom.xml
Executable file
@ -0,0 +1,97 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
|
||||
http://fusesource.com
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of FuseSource Corp. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-project</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-win32</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
|
||||
<name>${project.artifactId}</name>
|
||||
<description>The leveldbjni Windows 32 bit native libraries</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<testSourceDirectory>${basedir}/../leveldbjni/src/test/java</testSourceDirectory>
|
||||
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>2.3.1</version>
|
||||
<configuration>
|
||||
<classesDirectory>${basedir}/target/generated-sources/hawtjni/lib</classesDirectory>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.fusesource.hawtjni</groupId>
|
||||
<artifactId>maven-hawtjni-plugin</artifactId>
|
||||
<version>${hawtjni-version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>build</goal>
|
||||
</goals>
|
||||
<phase>compile</phase>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<name>leveldbjni</name>
|
||||
<classified>false</classified>
|
||||
<nativeSrcDependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<classifier>native-src</classifier>
|
||||
<type>zip</type>
|
||||
</nativeSrcDependency>
|
||||
<packageDirectory>${basedir}/../leveldbjni/target/generated-sources/hawtjni/native-package</packageDirectory>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
96
java/leveldbjni/leveldbjni-win64/pom.xml
Executable file
96
java/leveldbjni/leveldbjni-win64/pom.xml
Executable file
@ -0,0 +1,96 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
|
||||
http://fusesource.com
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of FuseSource Corp. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-project</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-win64</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
|
||||
<name>${project.artifactId}</name>
|
||||
<description>The leveldbjni Windows 64 bit native libraries</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<testSourceDirectory>${basedir}/../leveldbjni/src/test/java</testSourceDirectory>
|
||||
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>2.3.1</version>
|
||||
<configuration>
|
||||
<classesDirectory>${basedir}/target/generated-sources/hawtjni/lib</classesDirectory>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.fusesource.hawtjni</groupId>
|
||||
<artifactId>maven-hawtjni-plugin</artifactId>
|
||||
<version>${hawtjni-version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>build</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<name>leveldbjni</name>
|
||||
<classified>false</classified>
|
||||
<nativeSrcDependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<classifier>native-src</classifier>
|
||||
<type>zip</type>
|
||||
</nativeSrcDependency>
|
||||
<packageDirectory>${basedir}/../leveldbjni/target/generated-sources/hawtjni/native-package</packageDirectory>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
180
java/leveldbjni/leveldbjni/pom.xml
Executable file
180
java/leveldbjni/leveldbjni/pom.xml
Executable file
@ -0,0 +1,180 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
|
||||
http://fusesource.com
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of FuseSource Corp. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-project</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>${project.artifactId}</name>
|
||||
<description>leveldbjni is a jni library for acessing leveldb.</description>
|
||||
|
||||
<properties>
|
||||
<skipAutogen>false</skipAutogen>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.fusesource.hawtjni</groupId>
|
||||
<artifactId>hawtjni-runtime</artifactId>
|
||||
<version>${hawtjni-version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.iq80.leveldb</groupId>
|
||||
<artifactId>leveldb-api</artifactId>
|
||||
<version>${leveldb-api-version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>${project.basedir}/src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
<includes>
|
||||
<include>**/*</include>
|
||||
</includes>
|
||||
</resource>
|
||||
</resources>
|
||||
<plugins>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>test-jar</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.fusesource.hawtjni</groupId>
|
||||
<artifactId>maven-hawtjni-plugin</artifactId>
|
||||
<version>${hawtjni-version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>generate</goal>
|
||||
<goal>package-source</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<skipAutogen>${skipAutogen}</skipAutogen>
|
||||
<name>leveldbjni</name>
|
||||
<callbacks>true</callbacks>
|
||||
<copyright><![CDATA[
|
||||
/*******************************************************************************
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* The software in this package is published under the terms of the
|
||||
* CDDL license a copy of which has been included with this distribution
|
||||
* in the license.txt file.
|
||||
*******************************************************************************/
|
||||
]]></copyright>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.4.3</version>
|
||||
<configuration>
|
||||
<redirectTestOutputToFile>true</redirectTestOutputToFile>
|
||||
<forkMode>once</forkMode>
|
||||
<argLine>-ea</argLine>
|
||||
<failIfNoTests>false</failIfNoTests>
|
||||
<workingDirectory>${project.build.directory}</workingDirectory>
|
||||
<excludes>
|
||||
<exclude>**/*</exclude>
|
||||
</excludes>
|
||||
<includes>
|
||||
<include>**/*Test.java</include>
|
||||
</includes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>1.5</source>
|
||||
<target>1.5</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.felix</groupId>
|
||||
<artifactId>maven-bundle-plugin</artifactId>
|
||||
<version>2.0.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>bundle-manifest</id>
|
||||
<phase>process-classes</phase>
|
||||
<goals>
|
||||
<goal>manifest</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<instructions>
|
||||
<Import-Package>!org.fusesource.leveldbjni*,!org.fusesource.hawtjni*,sun.reflect;resolution:=optional,*</Import-Package>
|
||||
</instructions>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<configuration>
|
||||
<archive>
|
||||
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
|
||||
</archive>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
@ -0,0 +1,212 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni;
|
||||
|
||||
import org.fusesource.leveldbjni.internal.*;
|
||||
import org.iq80.leveldb.*;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.URL;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
/**
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public class JniDBFactory implements DBFactory {
|
||||
|
||||
public static final JniDBFactory factory = new JniDBFactory();
|
||||
static {
|
||||
NativeDB.LIBRARY.load();
|
||||
}
|
||||
|
||||
public static final String VERSION;
|
||||
static {
|
||||
String v="unknown";
|
||||
InputStream is = JniDBFactory.class.getResourceAsStream("version.txt");
|
||||
try {
|
||||
v = new BufferedReader(new InputStreamReader(is, "UTF-8")).readLine();
|
||||
} catch (Throwable e) {
|
||||
} finally {
|
||||
try {
|
||||
is.close();
|
||||
} catch (Throwable e) {
|
||||
}
|
||||
}
|
||||
VERSION = v;
|
||||
}
|
||||
|
||||
public static byte[] bytes(String value) {
|
||||
if( value == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return value.getBytes("UTF-8");
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static String asString(byte value[]) {
|
||||
if( value == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return new String(value, "UTF-8");
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
static private class OptionsResourceHolder {
|
||||
|
||||
NativeCache cache = null;
|
||||
NativeComparator comparator=null;
|
||||
NativeLogger logger=null;
|
||||
NativeOptions options;
|
||||
|
||||
public void init(Options value) {
|
||||
|
||||
options = new NativeOptions();
|
||||
options.blockRestartInterval(value.blockRestartInterval());
|
||||
options.blockSize(value.blockSize());
|
||||
options.createIfMissing(value.createIfMissing());
|
||||
options.errorIfExists(value.errorIfExists());
|
||||
options.maxOpenFiles(value.maxOpenFiles());
|
||||
options.paranoidChecks(value.paranoidChecks());
|
||||
options.writeBufferSize(value.writeBufferSize());
|
||||
|
||||
switch(value.compressionType()) {
|
||||
case NONE:
|
||||
options.compression(NativeCompressionType.kNoCompression);
|
||||
break;
|
||||
case SNAPPY:
|
||||
options.compression(NativeCompressionType.kSnappyCompression);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if(value.cacheSize()>0 ) {
|
||||
cache = new NativeCache(value.cacheSize());
|
||||
options.cache(cache);
|
||||
}
|
||||
|
||||
final DBComparator userComparator = value.comparator();
|
||||
if(userComparator!=null) {
|
||||
comparator = new NativeComparator() {
|
||||
@Override
|
||||
public int compare(byte[] key1, byte[] key2) {
|
||||
return userComparator.compare(key1, key2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return userComparator.name();
|
||||
}
|
||||
};
|
||||
options.comparator(comparator);
|
||||
}
|
||||
|
||||
final Logger userLogger = value.logger();
|
||||
if(userLogger!=null) {
|
||||
logger = new NativeLogger() {
|
||||
@Override
|
||||
public void log(String message) {
|
||||
userLogger.log(message);
|
||||
}
|
||||
};
|
||||
options.infoLog(logger);
|
||||
}
|
||||
|
||||
}
|
||||
public void close() {
|
||||
if(cache!=null) {
|
||||
cache.delete();
|
||||
}
|
||||
if(comparator!=null){
|
||||
comparator.delete();
|
||||
}
|
||||
if(logger!=null) {
|
||||
logger.delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public DB open(File path, Options options) throws IOException {
|
||||
NativeDB db=null;
|
||||
OptionsResourceHolder holder = new OptionsResourceHolder();
|
||||
try {
|
||||
holder.init(options);
|
||||
db = NativeDB.open(holder.options, path);
|
||||
} finally {
|
||||
// if we could not open up the DB, then clean up the
|
||||
// other allocated native resouces..
|
||||
if(db==null) {
|
||||
holder.close();
|
||||
}
|
||||
}
|
||||
return new JniDB(db, holder.cache, holder.comparator, holder.logger);
|
||||
}
|
||||
|
||||
public void destroy(File path, Options options) throws IOException {
|
||||
OptionsResourceHolder holder = new OptionsResourceHolder();
|
||||
try {
|
||||
holder.init(options);
|
||||
NativeDB.destroy(path, holder.options);
|
||||
} finally {
|
||||
holder.close();
|
||||
}
|
||||
}
|
||||
|
||||
public void repair(File path, Options options) throws IOException {
|
||||
OptionsResourceHolder holder = new OptionsResourceHolder();
|
||||
try {
|
||||
holder.init(options);
|
||||
NativeDB.repair(path, holder.options);
|
||||
} finally {
|
||||
holder.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("leveldbjni version %s", VERSION);
|
||||
}
|
||||
|
||||
|
||||
public static void pushMemoryPool(int size) {
|
||||
NativeBuffer.pushMemoryPool(size);
|
||||
}
|
||||
|
||||
public static void popMemoryPool() {
|
||||
NativeBuffer.popMemoryPool();
|
||||
}
|
||||
}
|
@ -0,0 +1,228 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.Callback;
|
||||
import org.iq80.leveldb.*;
|
||||
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
|
||||
/**
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public class JniDB implements DB {
|
||||
|
||||
private final NativeDB db;
|
||||
private final NativeCache cache;
|
||||
private final NativeComparator comparator;
|
||||
private final NativeLogger logger;
|
||||
|
||||
public JniDB(NativeDB db, NativeCache cache, NativeComparator comparator, NativeLogger logger) {
|
||||
this.db = db;
|
||||
this.cache = cache;
|
||||
this.comparator = comparator;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
public void close() {
|
||||
db.delete();
|
||||
if(cache!=null) {
|
||||
cache.delete();
|
||||
}
|
||||
if(comparator!=null){
|
||||
comparator.delete();
|
||||
}
|
||||
if(logger!=null) {
|
||||
logger.delete();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public byte[] get(byte[] key) throws DBException {
|
||||
return get(key, new ReadOptions());
|
||||
}
|
||||
|
||||
public byte[] get(byte[] key, ReadOptions options) throws DBException {
|
||||
try {
|
||||
return db.get(convert(options), key);
|
||||
} catch (NativeDB.DBException e) {
|
||||
if(e.isNotFound()) {
|
||||
return null;
|
||||
}
|
||||
throw new DBException(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
public DBIterator iterator() {
|
||||
return iterator(new ReadOptions());
|
||||
}
|
||||
|
||||
public DBIterator iterator(ReadOptions options) {
|
||||
return new JniDBIterator(db.iterator(convert(options)));
|
||||
}
|
||||
|
||||
public void put(byte[] key, byte[] value) throws DBException {
|
||||
put(key, value, new WriteOptions());
|
||||
}
|
||||
|
||||
public void delete(byte[] key) throws DBException {
|
||||
delete(key, new WriteOptions());
|
||||
}
|
||||
|
||||
public void write(WriteBatch updates) throws DBException {
|
||||
write(updates, new WriteOptions());
|
||||
}
|
||||
|
||||
public WriteBatch createWriteBatch() {
|
||||
return new JniWriteBatch(new NativeWriteBatch());
|
||||
}
|
||||
|
||||
public Snapshot put(byte[] key, byte[] value, WriteOptions options) throws DBException {
|
||||
try {
|
||||
db.put(convert(options), key, value);
|
||||
return null;
|
||||
} catch (NativeDB.DBException e) {
|
||||
throw new DBException(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
public Snapshot delete(byte[] key, WriteOptions options) throws DBException {
|
||||
try {
|
||||
db.delete(convert(options), key);
|
||||
return null;
|
||||
} catch (NativeDB.DBException e) {
|
||||
throw new DBException(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
public Snapshot write(WriteBatch updates, WriteOptions options) throws DBException {
|
||||
try {
|
||||
db.write(convert(options), ((JniWriteBatch) updates).writeBatch());
|
||||
return null;
|
||||
} catch (NativeDB.DBException e) {
|
||||
throw new DBException(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
public Snapshot getSnapshot() {
|
||||
return new JniSnapshot(db, db.getSnapshot());
|
||||
}
|
||||
|
||||
public long[] getApproximateSizes(Range... ranges) {
|
||||
NativeRange args[] = new NativeRange[ranges.length];
|
||||
for (int i = 0; i < args.length; i++) {
|
||||
args[i] = new NativeRange(ranges[i].start(), ranges[i].limit());
|
||||
}
|
||||
return db.getApproximateSizes(args);
|
||||
}
|
||||
|
||||
public String getProperty(String name) {
|
||||
return db.getProperty(name);
|
||||
}
|
||||
|
||||
private NativeReadOptions convert(ReadOptions options) {
|
||||
if(options==null) {
|
||||
return null;
|
||||
}
|
||||
NativeReadOptions rc = new NativeReadOptions();
|
||||
rc.fillCache(options.fillCache());
|
||||
rc.verifyChecksums(options.verifyChecksums());
|
||||
if(options.snapshot()!=null) {
|
||||
rc.snapshot(((JniSnapshot) options.snapshot()).snapshot());
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
private NativeWriteOptions convert(WriteOptions options) {
|
||||
if(options==null) {
|
||||
return null;
|
||||
}
|
||||
NativeWriteOptions rc = new NativeWriteOptions();
|
||||
rc.sync(options.sync());
|
||||
if(options.snapshot()) {
|
||||
throw new UnsupportedOperationException("WriteOptions snapshot not supported");
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
public void compactRange(byte[] begin, byte[] end) throws DBException {
|
||||
db.compactRange(begin, end);
|
||||
}
|
||||
|
||||
|
||||
private static class Suspension {
|
||||
static long env = Util.EnvJNI.Default();
|
||||
|
||||
CountDownLatch suspended = new CountDownLatch(1);
|
||||
CountDownLatch resumed = new CountDownLatch(1);
|
||||
Callback callback = new Callback(this, "suspended", 1);
|
||||
|
||||
public Suspension() {
|
||||
Util.EnvJNI.Schedule(env, callback.getAddress(), 0);
|
||||
}
|
||||
|
||||
private long suspended(long arg) {
|
||||
suspended.countDown();
|
||||
try {
|
||||
resumed.await();
|
||||
} catch (InterruptedException e) {
|
||||
} finally {
|
||||
callback.dispose();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int suspendCounter = 0;
|
||||
Suspension suspension = null;
|
||||
|
||||
public void suspendCompactions() throws InterruptedException {
|
||||
Suspension s = null;
|
||||
synchronized (this) {
|
||||
suspendCounter++;
|
||||
if( suspendCounter==1 ) {
|
||||
suspension = new Suspension();
|
||||
}
|
||||
s = suspension;
|
||||
}
|
||||
// Don't return until the compactions have suspended.
|
||||
s.suspended.await();
|
||||
}
|
||||
|
||||
synchronized public void resumeCompactions() {
|
||||
suspendCounter--;
|
||||
if( suspendCounter==0 ) {
|
||||
suspension.resumed.countDown();
|
||||
suspension = null;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,146 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.leveldbjni.internal.NativeDB;
|
||||
import org.fusesource.leveldbjni.internal.NativeIterator;
|
||||
import org.iq80.leveldb.DBIterator;
|
||||
|
||||
import java.util.AbstractMap;
|
||||
import java.util.Map;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
/**
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public class JniDBIterator implements DBIterator {
|
||||
|
||||
private final NativeIterator iterator;
|
||||
|
||||
JniDBIterator(NativeIterator iterator) {
|
||||
this.iterator = iterator;
|
||||
}
|
||||
|
||||
public void close() {
|
||||
iterator.delete();
|
||||
}
|
||||
|
||||
public void remove() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void seek(byte[] key) {
|
||||
try {
|
||||
iterator.seek(key);
|
||||
} catch (NativeDB.DBException e) {
|
||||
if( e.isNotFound() ) {
|
||||
throw new NoSuchElementException();
|
||||
} else {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void seekToFirst() {
|
||||
iterator.seekToFirst();
|
||||
}
|
||||
|
||||
public void seekToLast() {
|
||||
iterator.seekToLast();
|
||||
}
|
||||
|
||||
|
||||
public Map.Entry<byte[], byte[]> peekNext() {
|
||||
if(!iterator.isValid()) {
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
try {
|
||||
return new AbstractMap.SimpleImmutableEntry<byte[],byte[]>(iterator.key(), iterator.value());
|
||||
} catch (NativeDB.DBException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean hasNext() {
|
||||
return iterator.isValid();
|
||||
}
|
||||
|
||||
public Map.Entry<byte[], byte[]> next() {
|
||||
Map.Entry<byte[], byte[]> rc = peekNext();
|
||||
try {
|
||||
iterator.next();
|
||||
} catch (NativeDB.DBException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
public boolean hasPrev() {
|
||||
if( !iterator.isValid() )
|
||||
return false;
|
||||
try {
|
||||
iterator.prev();
|
||||
try {
|
||||
return iterator.isValid();
|
||||
} finally {
|
||||
iterator.next();
|
||||
}
|
||||
} catch (NativeDB.DBException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public Map.Entry<byte[], byte[]> peekPrev() {
|
||||
try {
|
||||
iterator.prev();
|
||||
try {
|
||||
return peekNext();
|
||||
} finally {
|
||||
iterator.next();
|
||||
}
|
||||
} catch (NativeDB.DBException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public Map.Entry<byte[], byte[]> prev() {
|
||||
Map.Entry<byte[], byte[]> rc = peekPrev();
|
||||
try {
|
||||
iterator.prev();
|
||||
} catch (NativeDB.DBException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.leveldbjni.internal.*;
|
||||
import org.iq80.leveldb.Snapshot;
|
||||
|
||||
/**
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public class JniSnapshot implements Snapshot {
|
||||
|
||||
private final NativeDB db;
|
||||
private final NativeSnapshot snapshot;
|
||||
|
||||
JniSnapshot(NativeDB db, NativeSnapshot snapshot) {
|
||||
this.db = db;
|
||||
this.snapshot = snapshot;
|
||||
}
|
||||
|
||||
public void close() {
|
||||
db.releaseSnapshot(snapshot);
|
||||
}
|
||||
|
||||
NativeSnapshot snapshot() {
|
||||
return snapshot;
|
||||
}
|
||||
}
|
@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.leveldbjni.internal.NativeWriteBatch;
|
||||
import org.iq80.leveldb.WriteBatch;
|
||||
|
||||
/**
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public class JniWriteBatch implements WriteBatch {
|
||||
|
||||
private final NativeWriteBatch writeBatch;
|
||||
|
||||
JniWriteBatch(NativeWriteBatch writeBatch) {
|
||||
this.writeBatch = writeBatch;
|
||||
}
|
||||
|
||||
public void close() {
|
||||
writeBatch.delete();
|
||||
}
|
||||
|
||||
public WriteBatch put(byte[] key, byte[] value) {
|
||||
writeBatch.put(key, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public WriteBatch delete(byte[] key) {
|
||||
writeBatch.delete(key);
|
||||
return this;
|
||||
}
|
||||
|
||||
public NativeWriteBatch writeBatch() {
|
||||
return writeBatch;
|
||||
}
|
||||
}
|
@ -0,0 +1,285 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.JniArg;
|
||||
import org.fusesource.hawtjni.runtime.JniClass;
|
||||
import org.fusesource.hawtjni.runtime.JniMethod;
|
||||
import org.fusesource.hawtjni.runtime.PointerMath;
|
||||
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import static org.fusesource.hawtjni.runtime.ArgFlag.*;
|
||||
|
||||
/**
|
||||
* A NativeBuffer allocates a native buffer on the heap. It supports
|
||||
* creating sub slices/views of that buffer and manages reference tracking
|
||||
* so that the the native buffer is freed once all NativeBuffer views
|
||||
* are deleted.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public class NativeBuffer extends NativeObject {
|
||||
|
||||
@JniClass
|
||||
static class NativeBufferJNI {
|
||||
static {
|
||||
NativeDB.LIBRARY.load();
|
||||
}
|
||||
|
||||
@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);
|
||||
|
||||
// public static final native void buffer_copy (
|
||||
// @JniArg(cast="const void *") long 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 *", 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);
|
||||
|
||||
// @JniMethod(cast="void *")
|
||||
// public static final native long memset (
|
||||
// @JniArg(cast="void *") long buffer,
|
||||
// int c,
|
||||
// @JniArg(cast="size_t") long num);
|
||||
|
||||
}
|
||||
|
||||
private static class Allocation extends NativeObject {
|
||||
private final AtomicInteger retained = new AtomicInteger(0);
|
||||
|
||||
private Allocation(long size) {
|
||||
super(NativeBufferJNI.malloc(size));
|
||||
}
|
||||
|
||||
void retain() {
|
||||
assertAllocated();
|
||||
retained.incrementAndGet();
|
||||
}
|
||||
|
||||
void release() {
|
||||
assertAllocated();
|
||||
int r = retained.decrementAndGet();
|
||||
if( r < 0 ) {
|
||||
throw new Error("The object has already been deleted.");
|
||||
} else if( r==0 ) {
|
||||
NativeBufferJNI.free(self);
|
||||
}
|
||||
self = 0;
|
||||
}
|
||||
}
|
||||
|
||||
private static class Pool {
|
||||
private final NativeBuffer.Pool prev;
|
||||
Allocation allocation;
|
||||
long pos;
|
||||
long remaining;
|
||||
int chunk;
|
||||
|
||||
public Pool(int chunk, Pool prev) {
|
||||
this.chunk = chunk;
|
||||
this.prev = prev;
|
||||
}
|
||||
|
||||
NativeBuffer create(long size) {
|
||||
if( size >= chunk ) {
|
||||
Allocation allocation = new Allocation(size);
|
||||
return new NativeBuffer(allocation, allocation.self, size);
|
||||
}
|
||||
|
||||
if( remaining < size ) {
|
||||
delete();
|
||||
}
|
||||
|
||||
if( allocation == null ) {
|
||||
allocate();
|
||||
}
|
||||
|
||||
NativeBuffer rc = new NativeBuffer(allocation, pos, size);
|
||||
pos = PointerMath.add(pos, size);
|
||||
remaining -= size;
|
||||
return rc;
|
||||
}
|
||||
|
||||
private void allocate() {
|
||||
allocation = new NativeBuffer.Allocation(chunk);
|
||||
allocation.retain();
|
||||
remaining = chunk;
|
||||
pos = allocation.self;
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
if( allocation!=null ) {
|
||||
allocation.release();
|
||||
allocation = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private final Allocation allocation;
|
||||
private final long capacity;
|
||||
|
||||
static final private ThreadLocal<Pool> CURRENT_POOL = new ThreadLocal<Pool>();
|
||||
|
||||
static public NativeBuffer create(long capacity) {
|
||||
Pool pool = CURRENT_POOL.get();
|
||||
if( pool == null ) {
|
||||
Allocation allocation = new Allocation(capacity);
|
||||
return new NativeBuffer(allocation, allocation.self, capacity);
|
||||
} else {
|
||||
return pool.create(capacity);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void pushMemoryPool(int size) {
|
||||
Pool original = CURRENT_POOL.get();
|
||||
Pool next = new Pool(size, original);
|
||||
CURRENT_POOL.set(next);
|
||||
}
|
||||
|
||||
public static void popMemoryPool() {
|
||||
Pool next = CURRENT_POOL.get();
|
||||
next.delete();
|
||||
if( next.prev == null ) {
|
||||
CURRENT_POOL.remove();
|
||||
} else {
|
||||
CURRENT_POOL.set(next.prev);
|
||||
}
|
||||
}
|
||||
|
||||
static public NativeBuffer create(byte[] data) {
|
||||
if( data == null ) {
|
||||
return null;
|
||||
} else {
|
||||
return create(data, 0 , data.length);
|
||||
}
|
||||
}
|
||||
|
||||
static public NativeBuffer create(String data) {
|
||||
return create(cbytes(data));
|
||||
}
|
||||
|
||||
static public NativeBuffer create(byte[] data, int offset, int length) {
|
||||
NativeBuffer rc = create(length);
|
||||
rc.write(0, data, offset, length);
|
||||
return rc;
|
||||
}
|
||||
|
||||
private NativeBuffer(Allocation allocation, long self, long capacity) {
|
||||
super(self);
|
||||
this.capacity = capacity;
|
||||
this.allocation = allocation;
|
||||
this.allocation.retain();
|
||||
}
|
||||
|
||||
public NativeBuffer slice(long offset, long length) {
|
||||
assertAllocated();
|
||||
if( length < 0 ) throw new IllegalArgumentException("length cannot be negative");
|
||||
if( offset < 0 ) throw new IllegalArgumentException("offset cannot be negative");
|
||||
if( offset+length >= capacity) throw new ArrayIndexOutOfBoundsException("offset + length exceed the length of this buffer");
|
||||
return new NativeBuffer(allocation, PointerMath.add(self, offset), length);
|
||||
}
|
||||
|
||||
static byte[] cbytes(String strvalue) {
|
||||
byte[] value = strvalue.getBytes();
|
||||
// expand by 1 so we get a null at the end.
|
||||
byte[] rc = new byte[value.length+1];
|
||||
System.arraycopy(value, 0, rc, 0, value.length);
|
||||
return rc;
|
||||
}
|
||||
|
||||
public NativeBuffer head(long length) {
|
||||
return slice(0, length);
|
||||
}
|
||||
|
||||
public NativeBuffer tail(long length) {
|
||||
if( capacity-length < 0) throw new ArrayIndexOutOfBoundsException("capacity-length cannot be less than zero");
|
||||
return slice(capacity-length, length);
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
allocation.release();
|
||||
}
|
||||
|
||||
public long capacity() {
|
||||
return capacity;
|
||||
}
|
||||
|
||||
public void write(long at, byte []source, int offset, int length) {
|
||||
assertAllocated();
|
||||
if( length < 0 ) throw new IllegalArgumentException("length cannot be negative");
|
||||
if( offset < 0 ) throw new IllegalArgumentException("offset cannot be negative");
|
||||
if( at < 0 ) throw new IllegalArgumentException("at cannot be negative");
|
||||
if( at+length > capacity ) throw new ArrayIndexOutOfBoundsException("at + length exceeds the capacity of this object");
|
||||
if( offset+length > source.length) throw new ArrayIndexOutOfBoundsException("offset + length exceed the length of the source buffer");
|
||||
NativeBufferJNI.buffer_copy(source, offset, self, at, length);
|
||||
}
|
||||
|
||||
public void read(long at, byte []target, int offset, int length) {
|
||||
assertAllocated();
|
||||
if( length < 0 ) throw new IllegalArgumentException("length cannot be negative");
|
||||
if( offset < 0 ) throw new IllegalArgumentException("offset cannot be negative");
|
||||
if( at < 0 ) throw new IllegalArgumentException("at cannot be negative");
|
||||
if( at+length > capacity ) throw new ArrayIndexOutOfBoundsException("at + length exceeds the capacity of this object");
|
||||
if( offset+length > target.length) throw new ArrayIndexOutOfBoundsException("offset + length exceed the length of the target buffer");
|
||||
NativeBufferJNI.buffer_copy(self, at, target, offset, length);
|
||||
}
|
||||
|
||||
public byte[] toByteArray() {
|
||||
if( capacity > Integer.MAX_VALUE ) {
|
||||
throw new OutOfMemoryError("Native buffer larger than the largest allowed Java byte[]");
|
||||
}
|
||||
byte [] rc = new byte[(int) capacity];
|
||||
read(0, rc, 0, rc.length);
|
||||
return rc;
|
||||
}
|
||||
}
|
@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.JniArg;
|
||||
import org.fusesource.hawtjni.runtime.JniClass;
|
||||
import org.fusesource.hawtjni.runtime.JniMethod;
|
||||
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.CPP;
|
||||
import static org.fusesource.hawtjni.runtime.MethodFlag.CPP_DELETE;
|
||||
|
||||
/**
|
||||
* Provides a java interface to the C++ leveldb::Cache class.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public class NativeCache extends NativeObject {
|
||||
|
||||
@JniClass(name="leveldb::Cache", flags={CPP})
|
||||
private static class CacheJNI {
|
||||
static {
|
||||
NativeDB.LIBRARY.load();
|
||||
}
|
||||
|
||||
@JniMethod(cast="leveldb::Cache *", accessor="leveldb::NewLRUCache")
|
||||
public static final native long NewLRUCache(
|
||||
@JniArg(cast="size_t") long capacity);
|
||||
|
||||
@JniMethod(flags={CPP_DELETE})
|
||||
public static final native void delete(long self);
|
||||
}
|
||||
|
||||
public NativeCache(long capacity) {
|
||||
super(CacheJNI.NewLRUCache(capacity));
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
assertAllocated();
|
||||
CacheJNI.delete(self);
|
||||
self = 0;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,160 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.*;
|
||||
|
||||
import static org.fusesource.hawtjni.runtime.FieldFlag.*;
|
||||
import static org.fusesource.hawtjni.runtime.MethodFlag.*;
|
||||
import static org.fusesource.hawtjni.runtime.ArgFlag.*;
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.*;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Provides a java interface to the C++ leveldb::Comparator class.
|
||||
* </p>
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public abstract class NativeComparator extends NativeObject {
|
||||
|
||||
@JniClass(name="JNIComparator", flags={STRUCT, CPP})
|
||||
static public class ComparatorJNI {
|
||||
|
||||
static {
|
||||
NativeDB.LIBRARY.load();
|
||||
init();
|
||||
}
|
||||
|
||||
@JniMethod(flags={CPP_NEW})
|
||||
public static final native long create();
|
||||
@JniMethod(flags={CPP_DELETE})
|
||||
public static final native void delete(long ptr);
|
||||
|
||||
public static final native void memmove (
|
||||
@JniArg(cast="void *") long dest,
|
||||
@JniArg(cast="const void *", flags={NO_OUT, CRITICAL}) ComparatorJNI src,
|
||||
@JniArg(cast="size_t") long size);
|
||||
|
||||
public static final native void memmove (
|
||||
@JniArg(cast="void *", flags={NO_IN, CRITICAL}) ComparatorJNI dest,
|
||||
@JniArg(cast="const void *") long src,
|
||||
@JniArg(cast="size_t") long size);
|
||||
|
||||
@JniField(cast="jobject", flags={POINTER_FIELD})
|
||||
long target;
|
||||
|
||||
@JniField(cast="jmethodID", flags={POINTER_FIELD})
|
||||
long compare_method;
|
||||
|
||||
@JniField(cast="const char *")
|
||||
long name;
|
||||
|
||||
@JniMethod(flags={CONSTANT_INITIALIZER})
|
||||
private static final native void init();
|
||||
|
||||
@JniField(flags={CONSTANT}, accessor="sizeof(struct JNIComparator)")
|
||||
static int SIZEOF;
|
||||
|
||||
@JniField(flags={CONSTANT}, cast="const Comparator*", accessor="leveldb::BytewiseComparator()")
|
||||
private static long BYTEWISE_COMPARATOR;
|
||||
|
||||
}
|
||||
|
||||
private NativeBuffer name_buffer;
|
||||
private long globalRef;
|
||||
|
||||
public NativeComparator() {
|
||||
super(ComparatorJNI.create());
|
||||
try {
|
||||
name_buffer = NativeBuffer.create(name());
|
||||
globalRef = NativeDB.DBJNI.NewGlobalRef(this);
|
||||
if( globalRef==0 ) {
|
||||
throw new RuntimeException("jni call failed: NewGlobalRef");
|
||||
}
|
||||
ComparatorJNI struct = new ComparatorJNI();
|
||||
struct.compare_method = NativeDB.DBJNI.GetMethodID(this.getClass(), "compare", "(JJ)I");
|
||||
if( struct.compare_method==0 ) {
|
||||
throw new RuntimeException("jni call failed: GetMethodID");
|
||||
}
|
||||
struct.target = globalRef;
|
||||
struct.name = name_buffer.pointer();
|
||||
ComparatorJNI.memmove(self, struct, ComparatorJNI.SIZEOF);
|
||||
|
||||
} catch (RuntimeException e) {
|
||||
delete();
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
public static final NativeComparator BYTEWISE_COMPARATOR = new NativeComparator(ComparatorJNI.BYTEWISE_COMPARATOR) {
|
||||
@Override
|
||||
public void delete() {
|
||||
// we won't really delete this one since it's static.
|
||||
}
|
||||
@Override
|
||||
public int compare(byte[] key1, byte[] key2) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
@Override
|
||||
public String name() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
};
|
||||
|
||||
NativeComparator(long ptr) {
|
||||
super(ptr);
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
if( name_buffer!=null ) {
|
||||
name_buffer.delete();
|
||||
name_buffer = null;
|
||||
}
|
||||
if( globalRef!=0 ) {
|
||||
NativeDB.DBJNI.DeleteGlobalRef(globalRef);
|
||||
globalRef = 0;
|
||||
}
|
||||
}
|
||||
|
||||
private int compare(long ptr1, long ptr2) {
|
||||
NativeSlice s1 = new NativeSlice();
|
||||
s1.read(ptr1, 0);
|
||||
NativeSlice s2 = new NativeSlice();
|
||||
s2.read(ptr2, 0);
|
||||
return compare(s1.toByteArray(), s2.toByteArray());
|
||||
}
|
||||
|
||||
public abstract int compare(byte[] key1, byte[] key2);
|
||||
public abstract String name();
|
||||
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
/**
|
||||
* Provides a java interface to the C++ leveldb::CompressionType enum.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public enum NativeCompressionType {
|
||||
kNoCompression(0x0), kSnappyCompression(0x1);
|
||||
|
||||
static final int t = kNoCompression.value;
|
||||
final int value;
|
||||
|
||||
NativeCompressionType(int value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
@ -0,0 +1,414 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.JniArg;
|
||||
import org.fusesource.hawtjni.runtime.JniClass;
|
||||
import org.fusesource.hawtjni.runtime.JniMethod;
|
||||
import org.fusesource.hawtjni.runtime.Library;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
import static org.fusesource.hawtjni.runtime.ArgFlag.*;
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.CPP;
|
||||
import static org.fusesource.hawtjni.runtime.MethodFlag.*;
|
||||
|
||||
/**
|
||||
* The DB object provides the main interface to acessing LevelDB
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public class NativeDB extends NativeObject {
|
||||
|
||||
public static final Library LIBRARY = new Library("leveldbjni", NativeDB.class);
|
||||
|
||||
@JniClass(name="leveldb::DB", flags={CPP})
|
||||
static class DBJNI {
|
||||
static {
|
||||
NativeDB.LIBRARY.load();
|
||||
}
|
||||
|
||||
@JniMethod(flags={JNI, POINTER_RETURN}, cast="jobject")
|
||||
public static final native long NewGlobalRef(
|
||||
Object target);
|
||||
|
||||
@JniMethod(flags={JNI}, cast="jobject")
|
||||
public static final native void DeleteGlobalRef(
|
||||
@JniArg(cast="jobject", flags={POINTER_ARG})
|
||||
long target);
|
||||
|
||||
@JniMethod(flags={JNI, POINTER_RETURN}, cast="jmethodID")
|
||||
public static final native long GetMethodID(
|
||||
@JniArg(cast="jclass", flags={POINTER_ARG})
|
||||
Class clazz,
|
||||
String name,
|
||||
String signature);
|
||||
|
||||
@JniMethod(flags={CPP_DELETE})
|
||||
static final native void delete(
|
||||
long self
|
||||
);
|
||||
|
||||
@JniMethod(copy="leveldb::Status", accessor = "leveldb::DB::Open")
|
||||
static final native long Open(
|
||||
@JniArg(flags={BY_VALUE, NO_OUT}) NativeOptions options,
|
||||
@JniArg(cast="const char*") String path,
|
||||
@JniArg(cast="leveldb::DB**") long[] self);
|
||||
|
||||
@JniMethod(copy="leveldb::Status", flags={CPP_METHOD})
|
||||
static final native long Put(
|
||||
long self,
|
||||
@JniArg(flags={BY_VALUE, NO_OUT}) NativeWriteOptions options,
|
||||
@JniArg(flags={BY_VALUE, NO_OUT}) NativeSlice key,
|
||||
@JniArg(flags={BY_VALUE, NO_OUT}) NativeSlice value
|
||||
);
|
||||
|
||||
@JniMethod(copy="leveldb::Status", flags={CPP_METHOD})
|
||||
static final native long Delete(
|
||||
long self,
|
||||
@JniArg(flags={BY_VALUE, NO_OUT}) NativeWriteOptions options,
|
||||
@JniArg(flags={BY_VALUE, NO_OUT}) NativeSlice key
|
||||
);
|
||||
|
||||
@JniMethod(copy="leveldb::Status", flags={CPP_METHOD})
|
||||
static final native long Write(
|
||||
long self,
|
||||
@JniArg(flags={BY_VALUE}) NativeWriteOptions options,
|
||||
@JniArg(cast="leveldb::WriteBatch *") long updates
|
||||
);
|
||||
|
||||
@JniMethod(copy="leveldb::Status", flags={CPP_METHOD})
|
||||
static final native long Get(
|
||||
long self,
|
||||
@JniArg(flags={NO_OUT, BY_VALUE}) NativeReadOptions options,
|
||||
@JniArg(flags={BY_VALUE, NO_OUT}) NativeSlice key,
|
||||
@JniArg(cast="std::string *") long value
|
||||
);
|
||||
|
||||
@JniMethod(cast="leveldb::Iterator *", flags={CPP_METHOD})
|
||||
static final native long NewIterator(
|
||||
long self,
|
||||
@JniArg(flags={NO_OUT, BY_VALUE}) NativeReadOptions options
|
||||
);
|
||||
|
||||
@JniMethod(cast="leveldb::Snapshot *", flags={CPP_METHOD})
|
||||
static final native long GetSnapshot(
|
||||
long self);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD})
|
||||
static final native void ReleaseSnapshot(
|
||||
long self,
|
||||
@JniArg(cast="const leveldb::Snapshot *") long snapshot
|
||||
);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD})
|
||||
static final native void GetApproximateSizes(
|
||||
long self,
|
||||
@JniArg(cast="const leveldb::Range *") long range,
|
||||
int n,
|
||||
@JniArg(cast="uint64_t*") long[] sizes
|
||||
);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD})
|
||||
static final native boolean GetProperty(
|
||||
long self,
|
||||
@JniArg(flags={BY_VALUE, NO_OUT}) NativeSlice property,
|
||||
@JniArg(cast="std::string *") long value
|
||||
);
|
||||
|
||||
@JniMethod(copy="leveldb::Status", accessor = "leveldb::DestroyDB")
|
||||
static final native long DestroyDB(
|
||||
@JniArg(cast="const char*") String path,
|
||||
@JniArg(flags={BY_VALUE, NO_OUT}) NativeOptions options);
|
||||
|
||||
@JniMethod(copy="leveldb::Status", accessor = "leveldb::RepairDB")
|
||||
static final native long RepairDB(
|
||||
@JniArg(cast="const char*") String path,
|
||||
@JniArg(flags={BY_VALUE, NO_OUT}) NativeOptions options);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD})
|
||||
static final native void CompactRange(
|
||||
long self,
|
||||
@JniArg(flags={NO_OUT}) NativeSlice begin,
|
||||
@JniArg(flags={NO_OUT}) NativeSlice end
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
assertAllocated();
|
||||
DBJNI.delete(self);
|
||||
self = 0;
|
||||
}
|
||||
|
||||
private NativeDB(long self) {
|
||||
super(self);
|
||||
}
|
||||
|
||||
public static class DBException extends IOException {
|
||||
private final boolean notFound;
|
||||
|
||||
DBException(String s, boolean notFound) {
|
||||
super(s);
|
||||
this.notFound = notFound;
|
||||
}
|
||||
|
||||
public boolean isNotFound() {
|
||||
return notFound;
|
||||
}
|
||||
}
|
||||
|
||||
static void checkStatus(long s) throws DBException {
|
||||
NativeStatus status = new NativeStatus(s);
|
||||
try {
|
||||
if( !status.isOk() ) {
|
||||
throw new DBException(status.toString(), status.isNotFound());
|
||||
}
|
||||
} finally {
|
||||
status.delete();
|
||||
}
|
||||
}
|
||||
|
||||
static void checkArgNotNull(Object value, String name) {
|
||||
if(value==null) {
|
||||
throw new IllegalArgumentException("The "+name+" argument cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
public static NativeDB open(NativeOptions options, File path) throws IOException, DBException {
|
||||
checkArgNotNull(options, "options");
|
||||
checkArgNotNull(path, "path");
|
||||
long rc[] = new long[1];
|
||||
try {
|
||||
checkStatus(DBJNI.Open(options, path.getCanonicalPath(), rc));
|
||||
} catch (IOException e) {
|
||||
if( rc[0]!=0 ) {
|
||||
DBJNI.delete(rc[0]);
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
return new NativeDB(rc[0]);
|
||||
}
|
||||
|
||||
public void put(NativeWriteOptions options, byte[] key, byte[] value) throws DBException {
|
||||
checkArgNotNull(options, "options");
|
||||
checkArgNotNull(key, "key");
|
||||
checkArgNotNull(value, "value");
|
||||
NativeBuffer keyBuffer = NativeBuffer.create(key);
|
||||
try {
|
||||
NativeBuffer valueBuffer = NativeBuffer.create(value);
|
||||
try {
|
||||
put(options, keyBuffer, valueBuffer);
|
||||
} finally {
|
||||
valueBuffer.delete();
|
||||
}
|
||||
} finally {
|
||||
keyBuffer.delete();
|
||||
}
|
||||
}
|
||||
|
||||
private void put(NativeWriteOptions options, NativeBuffer keyBuffer, NativeBuffer valueBuffer) throws DBException {
|
||||
put(options, new NativeSlice(keyBuffer), new NativeSlice(valueBuffer));
|
||||
}
|
||||
|
||||
private void put(NativeWriteOptions options, NativeSlice keySlice, NativeSlice valueSlice) throws DBException {
|
||||
assertAllocated();
|
||||
checkStatus(DBJNI.Put(self, options, keySlice, valueSlice));
|
||||
}
|
||||
|
||||
public void delete(NativeWriteOptions options, byte[] key) throws DBException {
|
||||
checkArgNotNull(options, "options");
|
||||
checkArgNotNull(key, "key");
|
||||
NativeBuffer keyBuffer = NativeBuffer.create(key);
|
||||
try {
|
||||
delete(options, keyBuffer);
|
||||
} finally {
|
||||
keyBuffer.delete();
|
||||
}
|
||||
}
|
||||
|
||||
private void delete(NativeWriteOptions options, NativeBuffer keyBuffer) throws DBException {
|
||||
delete(options, new NativeSlice(keyBuffer));
|
||||
}
|
||||
|
||||
private void delete(NativeWriteOptions options, NativeSlice keySlice) throws DBException {
|
||||
assertAllocated();
|
||||
checkStatus(DBJNI.Delete(self, options, keySlice));
|
||||
}
|
||||
|
||||
public void write(NativeWriteOptions options, NativeWriteBatch updates) throws DBException {
|
||||
checkArgNotNull(options, "options");
|
||||
checkArgNotNull(updates, "updates");
|
||||
checkStatus(DBJNI.Write(self, options, updates.pointer()));
|
||||
}
|
||||
|
||||
public byte[] get(NativeReadOptions options, byte[] key) throws DBException {
|
||||
checkArgNotNull(options, "options");
|
||||
checkArgNotNull(key, "key");
|
||||
NativeBuffer keyBuffer = NativeBuffer.create(key);
|
||||
try {
|
||||
return get(options, keyBuffer);
|
||||
} finally {
|
||||
keyBuffer.delete();
|
||||
}
|
||||
}
|
||||
|
||||
private byte[] get(NativeReadOptions options, NativeBuffer keyBuffer) throws DBException {
|
||||
return get(options, new NativeSlice(keyBuffer));
|
||||
}
|
||||
|
||||
private byte[] get(NativeReadOptions options, NativeSlice keySlice) throws DBException {
|
||||
assertAllocated();
|
||||
NativeStdString result = new NativeStdString();
|
||||
try {
|
||||
checkStatus(DBJNI.Get(self, options, keySlice, result.pointer()));
|
||||
return result.toByteArray();
|
||||
} finally {
|
||||
result.delete();
|
||||
}
|
||||
}
|
||||
|
||||
public NativeSnapshot getSnapshot() {
|
||||
return new NativeSnapshot(DBJNI.GetSnapshot(self));
|
||||
}
|
||||
|
||||
public void releaseSnapshot(NativeSnapshot snapshot) {
|
||||
checkArgNotNull(snapshot, "snapshot");
|
||||
DBJNI.ReleaseSnapshot(self, snapshot.pointer());
|
||||
}
|
||||
|
||||
public NativeIterator iterator(NativeReadOptions options) {
|
||||
checkArgNotNull(options, "options");
|
||||
return new NativeIterator(DBJNI.NewIterator(self, options));
|
||||
}
|
||||
|
||||
public long[] getApproximateSizes(NativeRange... ranges) {
|
||||
if( ranges==null ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
long rc[] = new long[ranges.length];
|
||||
NativeRange.RangeJNI structs[] = new NativeRange.RangeJNI[ranges.length];
|
||||
if( rc.length> 0 ) {
|
||||
NativeBuffer range_array = NativeRange.RangeJNI.arrayCreate(ranges.length);
|
||||
try {
|
||||
for(int i=0; i < ranges.length; i++) {
|
||||
structs[i] = new NativeRange.RangeJNI(ranges[i]);
|
||||
structs[i].arrayWrite(range_array.pointer(), i);
|
||||
}
|
||||
DBJNI.GetApproximateSizes(self,range_array.pointer(), ranges.length, rc);
|
||||
} finally {
|
||||
for(int i=0; i < ranges.length; i++) {
|
||||
if( structs[i] != null ) {
|
||||
structs[i].delete();
|
||||
}
|
||||
}
|
||||
range_array.delete();
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
public String getProperty(String name) {
|
||||
checkArgNotNull(name, "name");
|
||||
NativeBuffer keyBuffer = NativeBuffer.create(name.getBytes());
|
||||
try {
|
||||
byte[] property = getProperty(keyBuffer);
|
||||
if( property==null ) {
|
||||
return null;
|
||||
} else {
|
||||
return new String(property);
|
||||
}
|
||||
} finally {
|
||||
keyBuffer.delete();
|
||||
}
|
||||
}
|
||||
|
||||
private byte[] getProperty(NativeBuffer nameBuffer) {
|
||||
return getProperty(new NativeSlice(nameBuffer));
|
||||
}
|
||||
|
||||
private byte[] getProperty(NativeSlice nameSlice) {
|
||||
assertAllocated();
|
||||
NativeStdString result = new NativeStdString();
|
||||
try {
|
||||
if( DBJNI.GetProperty(self, nameSlice, result.pointer()) ) {
|
||||
return result.toByteArray();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
} finally {
|
||||
result.delete();
|
||||
}
|
||||
}
|
||||
|
||||
public void compactRange(byte[] begin, byte[] end) {
|
||||
NativeBuffer keyBuffer = NativeBuffer.create(begin);
|
||||
try {
|
||||
NativeBuffer valueBuffer = NativeBuffer.create(end);
|
||||
try {
|
||||
compactRange(keyBuffer, valueBuffer);
|
||||
} finally {
|
||||
if( valueBuffer!=null ) {
|
||||
valueBuffer.delete();
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
if( keyBuffer!=null ) {
|
||||
keyBuffer.delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void compactRange( NativeBuffer beginBuffer, NativeBuffer endBuffer) {
|
||||
compactRange(NativeSlice.create(beginBuffer), NativeSlice.create(endBuffer));
|
||||
}
|
||||
|
||||
private void compactRange( NativeSlice beginSlice, NativeSlice endSlice) {
|
||||
assertAllocated();
|
||||
DBJNI.CompactRange(self, beginSlice, endSlice);
|
||||
}
|
||||
|
||||
|
||||
static public void destroy(File path, NativeOptions options) throws IOException, DBException {
|
||||
checkArgNotNull(options, "options");
|
||||
checkArgNotNull(path, "path");
|
||||
checkStatus(DBJNI.DestroyDB(path.getCanonicalPath(), options));
|
||||
}
|
||||
|
||||
static public void repair(File path, NativeOptions options) throws IOException, DBException {
|
||||
checkArgNotNull(options, "options");
|
||||
checkArgNotNull(path, "path");
|
||||
checkStatus(DBJNI.RepairDB(path.getCanonicalPath(), options));
|
||||
}
|
||||
}
|
@ -0,0 +1,191 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.*;
|
||||
|
||||
import static org.fusesource.hawtjni.runtime.MethodFlag.*;
|
||||
import static org.fusesource.hawtjni.runtime.ArgFlag.*;
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.*;
|
||||
|
||||
/**
|
||||
* Provides a java interface to the C++ leveldb::Iterator class.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public class NativeIterator extends NativeObject {
|
||||
|
||||
@JniClass(name="leveldb::Iterator", flags={CPP})
|
||||
private static class IteratorJNI {
|
||||
static {
|
||||
NativeDB.LIBRARY.load();
|
||||
}
|
||||
|
||||
@JniMethod(flags={CPP_DELETE})
|
||||
public static final native void delete(
|
||||
long self
|
||||
);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD})
|
||||
static final native boolean Valid(
|
||||
long self
|
||||
);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD})
|
||||
static final native void SeekToFirst(
|
||||
long self
|
||||
);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD})
|
||||
static final native void SeekToLast(
|
||||
long self
|
||||
);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD})
|
||||
static final native void Seek(
|
||||
long self,
|
||||
@JniArg(flags={BY_VALUE, NO_OUT}) NativeSlice target
|
||||
);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD})
|
||||
static final native void Next(
|
||||
long self
|
||||
);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD})
|
||||
static final native void Prev(
|
||||
long self
|
||||
);
|
||||
|
||||
@JniMethod(copy="leveldb::Slice", flags={CPP_METHOD})
|
||||
static final native long key(
|
||||
long self
|
||||
);
|
||||
|
||||
@JniMethod(copy="leveldb::Slice", flags={CPP_METHOD})
|
||||
static final native long value(
|
||||
long self
|
||||
);
|
||||
|
||||
@JniMethod(copy="leveldb::Status", flags={CPP_METHOD})
|
||||
static final native long status(
|
||||
long self
|
||||
);
|
||||
}
|
||||
|
||||
NativeIterator(long self) {
|
||||
super(self);
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
assertAllocated();
|
||||
IteratorJNI.delete(self);
|
||||
self = 0;
|
||||
}
|
||||
|
||||
public boolean isValid() {
|
||||
assertAllocated();
|
||||
return IteratorJNI.Valid(self);
|
||||
}
|
||||
|
||||
private void checkStatus() throws NativeDB.DBException {
|
||||
NativeDB.checkStatus(IteratorJNI.status(self));
|
||||
}
|
||||
|
||||
public void seekToFirst() {
|
||||
assertAllocated();
|
||||
IteratorJNI.SeekToFirst(self);
|
||||
}
|
||||
|
||||
public void seekToLast() {
|
||||
assertAllocated();
|
||||
IteratorJNI.SeekToLast(self);
|
||||
}
|
||||
|
||||
public void seek(byte[] key) throws NativeDB.DBException {
|
||||
NativeDB.checkArgNotNull(key, "key");
|
||||
NativeBuffer keyBuffer = NativeBuffer.create(key);
|
||||
try {
|
||||
seek(keyBuffer);
|
||||
} finally {
|
||||
keyBuffer.delete();
|
||||
}
|
||||
}
|
||||
|
||||
private void seek(NativeBuffer keyBuffer) throws NativeDB.DBException {
|
||||
seek(new NativeSlice(keyBuffer));
|
||||
}
|
||||
|
||||
private void seek(NativeSlice keySlice) throws NativeDB.DBException {
|
||||
assertAllocated();
|
||||
IteratorJNI.Seek(self, keySlice);
|
||||
checkStatus();
|
||||
}
|
||||
|
||||
public void next() throws NativeDB.DBException {
|
||||
assertAllocated();
|
||||
IteratorJNI.Next(self);
|
||||
checkStatus();
|
||||
}
|
||||
|
||||
public void prev() throws NativeDB.DBException {
|
||||
assertAllocated();
|
||||
IteratorJNI.Prev(self);
|
||||
checkStatus();
|
||||
}
|
||||
|
||||
public byte[] key() throws NativeDB.DBException {
|
||||
assertAllocated();
|
||||
long slice_ptr = IteratorJNI.key(self);
|
||||
checkStatus();
|
||||
try {
|
||||
NativeSlice slice = new NativeSlice();
|
||||
slice.read(slice_ptr, 0);
|
||||
return slice.toByteArray();
|
||||
} finally {
|
||||
NativeSlice.SliceJNI.delete(slice_ptr);
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] value() throws NativeDB.DBException {
|
||||
assertAllocated();
|
||||
long slice_ptr = IteratorJNI.value(self);
|
||||
checkStatus();
|
||||
try {
|
||||
NativeSlice slice = new NativeSlice();
|
||||
slice.read(slice_ptr, 0);
|
||||
return slice.toByteArray();
|
||||
} finally {
|
||||
NativeSlice.SliceJNI.delete(slice_ptr);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,126 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.JniArg;
|
||||
import org.fusesource.hawtjni.runtime.JniClass;
|
||||
import org.fusesource.hawtjni.runtime.JniField;
|
||||
import org.fusesource.hawtjni.runtime.JniMethod;
|
||||
|
||||
import static org.fusesource.hawtjni.runtime.ArgFlag.CRITICAL;
|
||||
import static org.fusesource.hawtjni.runtime.ArgFlag.NO_OUT;
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.CPP;
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.STRUCT;
|
||||
import static org.fusesource.hawtjni.runtime.FieldFlag.CONSTANT;
|
||||
import static org.fusesource.hawtjni.runtime.FieldFlag.POINTER_FIELD;
|
||||
import static org.fusesource.hawtjni.runtime.MethodFlag.*;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Provides a java interface to the C++ leveldb::Logger class.
|
||||
* </p>
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public abstract class NativeLogger extends NativeObject {
|
||||
|
||||
@JniClass(name="JNILogger", flags={STRUCT, CPP})
|
||||
static public class LoggerJNI {
|
||||
|
||||
static {
|
||||
NativeDB.LIBRARY.load();
|
||||
init();
|
||||
}
|
||||
|
||||
@JniMethod(flags={CPP_NEW})
|
||||
public static final native long create();
|
||||
|
||||
@JniMethod(flags={CPP_DELETE})
|
||||
public static final native void delete(
|
||||
long self
|
||||
);
|
||||
|
||||
public static final native void memmove (
|
||||
@JniArg(cast="void *") long dest,
|
||||
@JniArg(cast="const void *", flags={NO_OUT, CRITICAL}) LoggerJNI src,
|
||||
@JniArg(cast="size_t") long size);
|
||||
|
||||
@JniField(cast="jobject", flags={POINTER_FIELD})
|
||||
long target;
|
||||
|
||||
@JniField(cast="jmethodID", flags={POINTER_FIELD})
|
||||
long log_method;
|
||||
|
||||
@JniMethod(flags={CONSTANT_INITIALIZER})
|
||||
private static final native void init();
|
||||
|
||||
@JniField(flags={CONSTANT}, accessor="sizeof(struct JNILogger)")
|
||||
static int SIZEOF;
|
||||
}
|
||||
|
||||
private long globalRef;
|
||||
|
||||
public NativeLogger() {
|
||||
super(LoggerJNI.create());
|
||||
try {
|
||||
globalRef = NativeDB.DBJNI.NewGlobalRef(this);
|
||||
if( globalRef==0 ) {
|
||||
throw new RuntimeException("jni call failed: NewGlobalRef");
|
||||
}
|
||||
LoggerJNI struct = new LoggerJNI();
|
||||
struct.log_method = NativeDB.DBJNI.GetMethodID(this.getClass(), "log", "(Ljava/lang/String;)V");
|
||||
if( struct.log_method ==0 ) {
|
||||
throw new RuntimeException("jni call failed: GetMethodID");
|
||||
}
|
||||
struct.target = globalRef;
|
||||
LoggerJNI.memmove(self, struct, LoggerJNI.SIZEOF);
|
||||
|
||||
} catch (RuntimeException e) {
|
||||
delete();
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
NativeLogger(long ptr) {
|
||||
super(ptr);
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
if( globalRef!=0 ) {
|
||||
NativeDB.DBJNI.DeleteGlobalRef(globalRef);
|
||||
globalRef = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public abstract void log(String message);
|
||||
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
/**
|
||||
* A helper base class which is used to track a pointer to a native
|
||||
* structure or class.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
class NativeObject {
|
||||
|
||||
protected long self;
|
||||
|
||||
protected NativeObject(long self) {
|
||||
this.self = self;
|
||||
if( self ==0 ) {
|
||||
throw new OutOfMemoryError("Failure allocating native heap memory");
|
||||
}
|
||||
}
|
||||
|
||||
long pointer() {
|
||||
return self;
|
||||
}
|
||||
|
||||
public boolean isAllocated() {
|
||||
return self !=0;
|
||||
}
|
||||
|
||||
protected void assertAllocated() {
|
||||
assert isAllocated() : "This object has been deleted";
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,207 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.JniClass;
|
||||
import org.fusesource.hawtjni.runtime.JniField;
|
||||
import org.fusesource.hawtjni.runtime.JniMethod;
|
||||
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.CPP;
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.STRUCT;
|
||||
import static org.fusesource.hawtjni.runtime.FieldFlag.CONSTANT;
|
||||
import static org.fusesource.hawtjni.runtime.FieldFlag.FIELD_SKIP;
|
||||
import static org.fusesource.hawtjni.runtime.MethodFlag.CONSTANT_INITIALIZER;
|
||||
|
||||
/**
|
||||
* Provides a java interface to the C++ leveldb::Options class.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
@JniClass(name="leveldb::Options", flags={STRUCT, CPP})
|
||||
public class NativeOptions {
|
||||
|
||||
static {
|
||||
NativeDB.LIBRARY.load();
|
||||
init();
|
||||
}
|
||||
|
||||
@JniMethod(flags={CONSTANT_INITIALIZER})
|
||||
private static final native void init();
|
||||
|
||||
@JniField(flags={CONSTANT}, cast="Env*", accessor="leveldb::Env::Default()")
|
||||
private static long DEFAULT_ENV;
|
||||
|
||||
private boolean create_if_missing = false;
|
||||
private boolean error_if_exists = false;
|
||||
private boolean paranoid_checks = false;
|
||||
@JniField(cast="size_t")
|
||||
private long write_buffer_size = 4 << 20;
|
||||
@JniField(cast="size_t")
|
||||
private long block_size = 4086;
|
||||
private int max_open_files = 1000;
|
||||
private int block_restart_interval = 16;
|
||||
|
||||
@JniField(flags={FIELD_SKIP})
|
||||
private NativeComparator comparatorObject = NativeComparator.BYTEWISE_COMPARATOR;
|
||||
@JniField(cast="const leveldb::Comparator*")
|
||||
private long comparator = comparatorObject.pointer();
|
||||
|
||||
@JniField(flags={FIELD_SKIP})
|
||||
private NativeLogger infoLogObject = null;
|
||||
@JniField(cast="leveldb::Logger*")
|
||||
private long info_log = 0;
|
||||
|
||||
@JniField(cast="leveldb::Env*")
|
||||
private long env = DEFAULT_ENV;
|
||||
@JniField(cast="leveldb::Cache*")
|
||||
private long block_cache = 0;
|
||||
@JniField(flags={FIELD_SKIP})
|
||||
private NativeCache cache;
|
||||
|
||||
@JniField(cast="leveldb::CompressionType")
|
||||
private int compression = NativeCompressionType.kSnappyCompression.value;
|
||||
|
||||
public NativeOptions createIfMissing(boolean value) {
|
||||
this.create_if_missing = value;
|
||||
return this;
|
||||
}
|
||||
public boolean createIfMissing() {
|
||||
return create_if_missing;
|
||||
}
|
||||
|
||||
public NativeOptions errorIfExists(boolean value) {
|
||||
this.error_if_exists = value;
|
||||
return this;
|
||||
}
|
||||
public boolean errorIfExists() {
|
||||
return error_if_exists;
|
||||
}
|
||||
|
||||
public NativeOptions paranoidChecks(boolean value) {
|
||||
this.paranoid_checks = value;
|
||||
return this;
|
||||
}
|
||||
public boolean paranoidChecks() {
|
||||
return paranoid_checks;
|
||||
}
|
||||
|
||||
public NativeOptions writeBufferSize(long value) {
|
||||
this.write_buffer_size = value;
|
||||
return this;
|
||||
}
|
||||
public long writeBufferSize() {
|
||||
return write_buffer_size;
|
||||
}
|
||||
|
||||
public NativeOptions maxOpenFiles(int value) {
|
||||
this.max_open_files = value;
|
||||
return this;
|
||||
}
|
||||
public int maxOpenFiles() {
|
||||
return max_open_files;
|
||||
}
|
||||
|
||||
public NativeOptions blockRestartInterval(int value) {
|
||||
this.block_restart_interval = value;
|
||||
return this;
|
||||
}
|
||||
public int blockRestartInterval() {
|
||||
return block_restart_interval;
|
||||
}
|
||||
|
||||
public NativeOptions blockSize(long value) {
|
||||
this.block_size = value;
|
||||
return this;
|
||||
}
|
||||
public long blockSize() {
|
||||
return block_size;
|
||||
}
|
||||
|
||||
// @JniField(cast="Env*")
|
||||
// private long env = DEFAULT_ENV;
|
||||
|
||||
public NativeComparator comparator() {
|
||||
return comparatorObject;
|
||||
}
|
||||
|
||||
public NativeOptions comparator(NativeComparator comparator) {
|
||||
if( comparator==null ) {
|
||||
throw new IllegalArgumentException("comparator cannot be null");
|
||||
}
|
||||
this.comparatorObject = comparator;
|
||||
this.comparator = comparator.pointer();
|
||||
return this;
|
||||
}
|
||||
|
||||
public NativeLogger infoLog() {
|
||||
return infoLogObject;
|
||||
}
|
||||
|
||||
public NativeOptions infoLog(NativeLogger logger) {
|
||||
this.infoLogObject = logger;
|
||||
if( logger ==null ) {
|
||||
this.info_log = 0;
|
||||
} else {
|
||||
this.info_log = logger.pointer();
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public NativeCompressionType compression() {
|
||||
if(compression == NativeCompressionType.kNoCompression.value) {
|
||||
return NativeCompressionType.kNoCompression;
|
||||
} else if(compression == NativeCompressionType.kSnappyCompression.value) {
|
||||
return NativeCompressionType.kSnappyCompression;
|
||||
} else {
|
||||
return NativeCompressionType.kSnappyCompression;
|
||||
}
|
||||
}
|
||||
|
||||
public NativeOptions compression(NativeCompressionType compression) {
|
||||
this.compression = compression.value;
|
||||
return this;
|
||||
}
|
||||
|
||||
public NativeCache cache() {
|
||||
return cache;
|
||||
}
|
||||
|
||||
public NativeOptions cache(NativeCache cache) {
|
||||
this.cache = cache;
|
||||
if( cache!=null ) {
|
||||
this.block_cache = cache.pointer();
|
||||
} else {
|
||||
this.block_cache = 0;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
}
|
@ -0,0 +1,133 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.*;
|
||||
|
||||
import static org.fusesource.hawtjni.runtime.ArgFlag.*;
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.CPP;
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.STRUCT;
|
||||
import static org.fusesource.hawtjni.runtime.FieldFlag.CONSTANT;
|
||||
import static org.fusesource.hawtjni.runtime.FieldFlag.FIELD_SKIP;
|
||||
import static org.fusesource.hawtjni.runtime.MethodFlag.CONSTANT_INITIALIZER;
|
||||
|
||||
/**
|
||||
* Provides a java interface to the C++ leveldb::ReadOptions class.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public class NativeRange {
|
||||
|
||||
@JniClass(name="leveldb::Range", flags={STRUCT, CPP})
|
||||
static public class RangeJNI {
|
||||
|
||||
static {
|
||||
NativeDB.LIBRARY.load();
|
||||
init();
|
||||
}
|
||||
|
||||
public static final native void memmove (
|
||||
@JniArg(cast="void *") long dest,
|
||||
@JniArg(cast="const void *", flags={NO_OUT, CRITICAL}) RangeJNI src,
|
||||
@JniArg(cast="size_t") long size);
|
||||
|
||||
public static final native void memmove (
|
||||
@JniArg(cast="void *", flags={NO_IN, CRITICAL}) RangeJNI dest,
|
||||
@JniArg(cast="const void *") long src,
|
||||
@JniArg(cast="size_t") long size);
|
||||
|
||||
|
||||
@JniMethod(flags={CONSTANT_INITIALIZER})
|
||||
private static final native void init();
|
||||
|
||||
@JniField(flags={CONSTANT}, accessor="sizeof(struct leveldb::Range)")
|
||||
static int SIZEOF;
|
||||
|
||||
@JniField
|
||||
NativeSlice start = new NativeSlice();
|
||||
@JniField(flags={FIELD_SKIP})
|
||||
NativeBuffer start_buffer;
|
||||
|
||||
@JniField
|
||||
NativeSlice limit = new NativeSlice();
|
||||
@JniField(flags={FIELD_SKIP})
|
||||
NativeBuffer limit_buffer;
|
||||
|
||||
public RangeJNI(NativeRange range) {
|
||||
start_buffer = NativeBuffer.create(range.start());
|
||||
start.set(start_buffer);
|
||||
try {
|
||||
limit_buffer = NativeBuffer.create(range.limit());
|
||||
} catch (OutOfMemoryError e) {
|
||||
start_buffer.delete();
|
||||
throw e;
|
||||
}
|
||||
limit.set(limit_buffer);
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
start_buffer.delete();
|
||||
limit_buffer.delete();
|
||||
}
|
||||
|
||||
static NativeBuffer arrayCreate(int dimension) {
|
||||
return NativeBuffer.create(dimension*SIZEOF);
|
||||
}
|
||||
|
||||
void arrayWrite(long buffer, int index) {
|
||||
RangeJNI.memmove(PointerMath.add(buffer, SIZEOF * index), this, SIZEOF);
|
||||
}
|
||||
|
||||
void arrayRead(long buffer, int index) {
|
||||
RangeJNI.memmove(this, PointerMath.add(buffer, SIZEOF * index), SIZEOF);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
final private byte[] start;
|
||||
final private byte[] limit;
|
||||
|
||||
public byte[] limit() {
|
||||
return limit;
|
||||
}
|
||||
|
||||
public byte[] start() {
|
||||
return start;
|
||||
}
|
||||
|
||||
public NativeRange(byte[] start, byte[] limit) {
|
||||
NativeDB.checkArgNotNull(start, "start");
|
||||
NativeDB.checkArgNotNull(limit, "limit");
|
||||
this.limit = limit;
|
||||
this.start = start;
|
||||
}
|
||||
}
|
@ -0,0 +1,91 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.JniClass;
|
||||
import org.fusesource.hawtjni.runtime.JniField;
|
||||
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.CPP;
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.STRUCT;
|
||||
|
||||
/**
|
||||
* Provides a java interface to the C++ leveldb::ReadOptions class.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
@JniClass(name="leveldb::ReadOptions", flags={STRUCT, CPP})
|
||||
public class NativeReadOptions {
|
||||
|
||||
@JniField
|
||||
private boolean verify_checksums = false;
|
||||
|
||||
@JniField
|
||||
private boolean fill_cache = true;
|
||||
|
||||
@JniField(cast="const leveldb::Snapshot*")
|
||||
private long snapshot=0;
|
||||
|
||||
public boolean fillCache() {
|
||||
return fill_cache;
|
||||
}
|
||||
|
||||
public NativeReadOptions fillCache(boolean fill_cache) {
|
||||
this.fill_cache = fill_cache;
|
||||
return this;
|
||||
}
|
||||
|
||||
public NativeSnapshot snapshot() {
|
||||
if( snapshot == 0 ) {
|
||||
return null;
|
||||
} else {
|
||||
return new NativeSnapshot(snapshot);
|
||||
}
|
||||
}
|
||||
|
||||
public NativeReadOptions snapshot(NativeSnapshot snapshot) {
|
||||
if( snapshot==null ) {
|
||||
this.snapshot = 0;
|
||||
} else {
|
||||
this.snapshot = snapshot.pointer();
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean verifyChecksums() {
|
||||
return verify_checksums;
|
||||
}
|
||||
|
||||
public NativeReadOptions verifyChecksums(boolean verify_checksums) {
|
||||
this.verify_checksums = verify_checksums;
|
||||
return this;
|
||||
}
|
||||
}
|
@ -0,0 +1,160 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.*;
|
||||
|
||||
import static org.fusesource.hawtjni.runtime.ArgFlag.*;
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.CPP;
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.STRUCT;
|
||||
import static org.fusesource.hawtjni.runtime.FieldFlag.CONSTANT;
|
||||
import static org.fusesource.hawtjni.runtime.MethodFlag.CONSTANT_INITIALIZER;
|
||||
import static org.fusesource.hawtjni.runtime.MethodFlag.CPP_DELETE;
|
||||
|
||||
/**
|
||||
* Provides a java interface to the C++ leveldb::Slice class.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
@JniClass(name="leveldb::Slice", flags={STRUCT, CPP})
|
||||
class NativeSlice {
|
||||
|
||||
@JniClass(name="leveldb::Slice", flags={CPP})
|
||||
static class SliceJNI {
|
||||
static {
|
||||
NativeDB.LIBRARY.load();
|
||||
init();
|
||||
}
|
||||
|
||||
@JniMethod(flags={CPP_DELETE})
|
||||
public static final native void delete(
|
||||
long self
|
||||
);
|
||||
|
||||
public static final native void memmove (
|
||||
@JniArg(cast="void *") long dest,
|
||||
@JniArg(cast="const void *", flags={NO_OUT, CRITICAL}) NativeSlice src,
|
||||
@JniArg(cast="size_t") long size);
|
||||
|
||||
public static final native void memmove (
|
||||
@JniArg(cast="void *", flags={NO_IN, CRITICAL}) NativeSlice dest,
|
||||
@JniArg(cast="const void *") long src,
|
||||
@JniArg(cast="size_t") long size);
|
||||
|
||||
|
||||
@JniMethod(flags={CONSTANT_INITIALIZER})
|
||||
private static final native void init();
|
||||
|
||||
@JniField(flags={CONSTANT}, accessor="sizeof(struct leveldb::Slice)")
|
||||
static int SIZEOF;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@JniField(cast="const char*")
|
||||
private long data_;
|
||||
@JniField(cast="size_t")
|
||||
private long size_;
|
||||
|
||||
public NativeSlice() {
|
||||
}
|
||||
|
||||
public NativeSlice(long data, long length) {
|
||||
this.data_ = data;
|
||||
this.size_ = length;
|
||||
}
|
||||
|
||||
public NativeSlice(NativeBuffer buffer) {
|
||||
this(buffer.pointer(), buffer.capacity());
|
||||
}
|
||||
|
||||
public static NativeSlice create(NativeBuffer buffer) {
|
||||
if(buffer == null ) {
|
||||
return null;
|
||||
} else {
|
||||
return new NativeSlice(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
public long data() {
|
||||
return data_;
|
||||
}
|
||||
|
||||
public NativeSlice data(long data) {
|
||||
this.data_ = data;
|
||||
return this;
|
||||
}
|
||||
|
||||
public long size() {
|
||||
return size_;
|
||||
}
|
||||
|
||||
public NativeSlice size(long size) {
|
||||
this.size_ = size;
|
||||
return this;
|
||||
}
|
||||
|
||||
public NativeSlice set(NativeSlice buffer) {
|
||||
this.size_ = buffer.size_;
|
||||
this.data_ = buffer.data_;
|
||||
return this;
|
||||
}
|
||||
|
||||
public NativeSlice set(NativeBuffer buffer) {
|
||||
this.size_ = buffer.capacity();
|
||||
this.data_ = buffer.pointer();
|
||||
return this;
|
||||
}
|
||||
|
||||
public byte[] toByteArray() {
|
||||
if( size_ > Integer.MAX_VALUE ) {
|
||||
throw new ArrayIndexOutOfBoundsException("Native slice is larger than the maximum Java array");
|
||||
}
|
||||
byte []rc = new byte[(int) size_];
|
||||
NativeBuffer.NativeBufferJNI.buffer_copy(data_, 0, rc, 0, rc.length);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static NativeBuffer arrayCreate(int dimension) {
|
||||
return NativeBuffer.create(dimension*SliceJNI.SIZEOF);
|
||||
}
|
||||
|
||||
void write(long buffer, int index) {
|
||||
SliceJNI.memmove(PointerMath.add(buffer, SliceJNI.SIZEOF*index), this, SliceJNI.SIZEOF);
|
||||
}
|
||||
|
||||
void read(long buffer, int index) {
|
||||
SliceJNI.memmove(this, PointerMath.add(buffer, SliceJNI.SIZEOF*index), SliceJNI.SIZEOF);
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
/**
|
||||
* Provides a java interface to the C++ leveldb::Snapshot class.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public class NativeSnapshot extends NativeObject {
|
||||
|
||||
NativeSnapshot(long self) {
|
||||
super(self);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,106 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.JniClass;
|
||||
import org.fusesource.hawtjni.runtime.JniMethod;
|
||||
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.CPP;
|
||||
import static org.fusesource.hawtjni.runtime.MethodFlag.CPP_DELETE;
|
||||
import static org.fusesource.hawtjni.runtime.MethodFlag.CPP_METHOD;
|
||||
|
||||
/**
|
||||
* Provides a java interface to the C++ leveldb::Status class.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
class NativeStatus extends NativeObject{
|
||||
|
||||
@JniClass(name="leveldb::Status", flags={CPP})
|
||||
static class StatusJNI {
|
||||
static {
|
||||
NativeDB.LIBRARY.load();
|
||||
}
|
||||
|
||||
@JniMethod(flags={CPP_DELETE})
|
||||
public static final native void delete(
|
||||
long self);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD})
|
||||
public static final native boolean ok(
|
||||
long self);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD})
|
||||
public static final native boolean IsNotFound(
|
||||
long self);
|
||||
|
||||
@JniMethod(copy="std::string", flags={CPP_METHOD})
|
||||
public static final native long ToString(
|
||||
long self);
|
||||
}
|
||||
|
||||
public NativeStatus(long self) {
|
||||
super(self);
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
assertAllocated();
|
||||
StatusJNI.delete(self);
|
||||
self = 0;
|
||||
}
|
||||
|
||||
public boolean isOk() {
|
||||
assertAllocated();
|
||||
return StatusJNI.ok(self);
|
||||
}
|
||||
|
||||
public boolean isNotFound() {
|
||||
assertAllocated();
|
||||
return StatusJNI.IsNotFound(self);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
assertAllocated();
|
||||
long strptr = StatusJNI.ToString(self);
|
||||
if( strptr==0 ) {
|
||||
return null;
|
||||
} else {
|
||||
NativeStdString rc = new NativeStdString(strptr);
|
||||
try {
|
||||
return rc.toString();
|
||||
} finally {
|
||||
rc.delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,105 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.JniClass;
|
||||
import org.fusesource.hawtjni.runtime.JniMethod;
|
||||
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.CPP;
|
||||
import static org.fusesource.hawtjni.runtime.MethodFlag.*;
|
||||
|
||||
/**
|
||||
* Provides a java interface to the C++ std::string class.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
class NativeStdString extends NativeObject {
|
||||
|
||||
@JniClass(name="std::string", flags={CPP})
|
||||
private static class StdStringJNI {
|
||||
static {
|
||||
NativeDB.LIBRARY.load();
|
||||
}
|
||||
|
||||
@JniMethod(flags={CPP_NEW})
|
||||
public static final native long create();
|
||||
|
||||
@JniMethod(flags={CPP_NEW})
|
||||
public static final native long create(String value);
|
||||
|
||||
@JniMethod(flags={CPP_DELETE})
|
||||
static final native void delete(
|
||||
long self);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD}, accessor = "c_str", cast="const char*")
|
||||
public static final native long c_str_ptr (
|
||||
long self);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD},cast = "size_t")
|
||||
public static final native long length (
|
||||
long self);
|
||||
|
||||
}
|
||||
|
||||
public NativeStdString(long self) {
|
||||
super(self);
|
||||
}
|
||||
|
||||
public NativeStdString() {
|
||||
super(StdStringJNI.create());
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
assertAllocated();
|
||||
StdStringJNI.delete(self);
|
||||
self = 0;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return new String(toByteArray());
|
||||
}
|
||||
|
||||
public long length() {
|
||||
assertAllocated();
|
||||
return StdStringJNI.length(self);
|
||||
}
|
||||
|
||||
public byte[] toByteArray() {
|
||||
long l = length();
|
||||
if( l > Integer.MAX_VALUE ) {
|
||||
throw new ArrayIndexOutOfBoundsException("Native string is larger than the maximum Java array");
|
||||
}
|
||||
byte []rc = new byte[(int) l];
|
||||
NativeBuffer.NativeBufferJNI.buffer_copy(StdStringJNI.c_str_ptr(self), 0, rc, 0, rc.length);
|
||||
return rc;
|
||||
}
|
||||
}
|
@ -0,0 +1,142 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.JniArg;
|
||||
import org.fusesource.hawtjni.runtime.JniClass;
|
||||
import org.fusesource.hawtjni.runtime.JniMethod;
|
||||
|
||||
import static org.fusesource.hawtjni.runtime.ArgFlag.BY_VALUE;
|
||||
import static org.fusesource.hawtjni.runtime.ArgFlag.NO_OUT;
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.CPP;
|
||||
import static org.fusesource.hawtjni.runtime.MethodFlag.*;
|
||||
|
||||
/**
|
||||
* Provides a java interface to the C++ leveldb::WriteBatch class.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public class NativeWriteBatch extends NativeObject {
|
||||
|
||||
@JniClass(name="leveldb::WriteBatch", flags={CPP})
|
||||
private static class WriteBatchJNI {
|
||||
static {
|
||||
NativeDB.LIBRARY.load();
|
||||
}
|
||||
|
||||
@JniMethod(flags={CPP_NEW})
|
||||
public static final native long create();
|
||||
@JniMethod(flags={CPP_DELETE})
|
||||
public static final native void delete(
|
||||
long self);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD})
|
||||
static final native void Put(
|
||||
long self,
|
||||
@JniArg(flags={BY_VALUE, NO_OUT}) NativeSlice key,
|
||||
@JniArg(flags={BY_VALUE, NO_OUT}) NativeSlice value
|
||||
);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD})
|
||||
static final native void Delete(
|
||||
long self,
|
||||
@JniArg(flags={BY_VALUE, NO_OUT}) NativeSlice key
|
||||
);
|
||||
|
||||
@JniMethod(flags={CPP_METHOD})
|
||||
static final native void Clear(
|
||||
long self
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
public NativeWriteBatch() {
|
||||
super(WriteBatchJNI.create());
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
assertAllocated();
|
||||
WriteBatchJNI.delete(self);
|
||||
self = 0;
|
||||
}
|
||||
|
||||
public void put(byte[] key, byte[] value) {
|
||||
NativeDB.checkArgNotNull(key, "key");
|
||||
NativeDB.checkArgNotNull(value, "value");
|
||||
NativeBuffer keyBuffer = NativeBuffer.create(key);
|
||||
try {
|
||||
NativeBuffer valueBuffer = NativeBuffer.create(value);
|
||||
try {
|
||||
put(keyBuffer, valueBuffer);
|
||||
} finally {
|
||||
valueBuffer.delete();
|
||||
}
|
||||
} finally {
|
||||
keyBuffer.delete();
|
||||
}
|
||||
}
|
||||
|
||||
private void put(NativeBuffer keyBuffer, NativeBuffer valueBuffer) {
|
||||
put(new NativeSlice(keyBuffer), new NativeSlice(valueBuffer));
|
||||
}
|
||||
|
||||
private void put(NativeSlice keySlice, NativeSlice valueSlice) {
|
||||
assertAllocated();
|
||||
WriteBatchJNI.Put(self, keySlice, valueSlice);
|
||||
}
|
||||
|
||||
|
||||
public void delete(byte[] key) {
|
||||
NativeDB.checkArgNotNull(key, "key");
|
||||
NativeBuffer keyBuffer = NativeBuffer.create(key);
|
||||
try {
|
||||
delete(keyBuffer);
|
||||
} finally {
|
||||
keyBuffer.delete();
|
||||
}
|
||||
}
|
||||
|
||||
private void delete(NativeBuffer keyBuffer) {
|
||||
delete(new NativeSlice(keyBuffer));
|
||||
}
|
||||
|
||||
private void delete(NativeSlice keySlice) {
|
||||
assertAllocated();
|
||||
WriteBatchJNI.Delete(self, keySlice);
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
assertAllocated();
|
||||
WriteBatchJNI.Clear(self);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.JniClass;
|
||||
import org.fusesource.hawtjni.runtime.JniField;
|
||||
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.CPP;
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.STRUCT;
|
||||
|
||||
/**
|
||||
* Provides a java interface to the C++ leveldb::WriteOptions class.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
@JniClass(name="leveldb::WriteOptions", flags={STRUCT, CPP})
|
||||
public class NativeWriteOptions {
|
||||
|
||||
@JniField
|
||||
boolean sync;
|
||||
|
||||
public boolean sync() {
|
||||
return sync;
|
||||
}
|
||||
|
||||
public NativeWriteOptions sync(boolean sync) {
|
||||
this.sync = sync;
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,141 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.internal;
|
||||
|
||||
import org.fusesource.hawtjni.runtime.JniArg;
|
||||
import org.fusesource.hawtjni.runtime.JniClass;
|
||||
import org.fusesource.hawtjni.runtime.JniField;
|
||||
import org.fusesource.hawtjni.runtime.JniMethod;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
import static org.fusesource.hawtjni.runtime.ClassFlag.CPP;
|
||||
import static org.fusesource.hawtjni.runtime.FieldFlag.CONSTANT;
|
||||
import static org.fusesource.hawtjni.runtime.MethodFlag.*;
|
||||
import static org.fusesource.hawtjni.runtime.ArgFlag.*;
|
||||
|
||||
/**
|
||||
* Some miscellaneous utility functions.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public class Util {
|
||||
|
||||
@JniClass(name="leveldb::Env", flags={CPP})
|
||||
static class EnvJNI {
|
||||
|
||||
static {
|
||||
NativeDB.LIBRARY.load();
|
||||
}
|
||||
|
||||
@JniMethod(cast = "leveldb::Env *", accessor = "leveldb::Env::Default")
|
||||
public static final native long Default();
|
||||
|
||||
@JniMethod(flags = {CPP_METHOD})
|
||||
public static final native void Schedule(
|
||||
long self,
|
||||
@JniArg(cast = "void (*)(void*)") long fp,
|
||||
@JniArg(cast = "void *") long arg);
|
||||
|
||||
}
|
||||
|
||||
@JniClass(flags={CPP})
|
||||
static class UtilJNI {
|
||||
|
||||
static {
|
||||
NativeDB.LIBRARY.load();
|
||||
init();
|
||||
}
|
||||
|
||||
@JniMethod(flags={CONSTANT_INITIALIZER})
|
||||
private static final native void init();
|
||||
|
||||
@JniField(flags={CONSTANT}, accessor="1", conditional="defined(_WIN32) || defined(_WIN64)")
|
||||
static int ON_WINDOWS;
|
||||
|
||||
|
||||
@JniMethod(conditional="!defined(_WIN32) && !defined(_WIN64)")
|
||||
static final native int link(
|
||||
@JniArg(cast="const char*") String source,
|
||||
@JniArg(cast="const char*") String target);
|
||||
|
||||
@JniMethod(conditional="defined(_WIN32) || defined(_WIN64)")
|
||||
static final native int CreateHardLinkW(
|
||||
@JniArg(cast="LPCTSTR", flags={POINTER_ARG, UNICODE}) String target,
|
||||
@JniArg(cast="LPCTSTR", flags={POINTER_ARG, UNICODE}) String source,
|
||||
@JniArg(cast="LPSECURITY_ATTRIBUTES", flags={POINTER_ARG}) long lpSecurityAttributes);
|
||||
|
||||
@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);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a hard link from source to target.
|
||||
* @param source
|
||||
* @param target
|
||||
* @return
|
||||
*/
|
||||
public static void link(File source, File target) throws IOException {
|
||||
if( UtilJNI.ON_WINDOWS == 1 ) {
|
||||
if( UtilJNI.CreateHardLinkW(target.getCanonicalPath(), source.getCanonicalPath(), 0) == 0) {
|
||||
throw new IOException("link failed");
|
||||
}
|
||||
} else {
|
||||
if( UtilJNI.link(source.getCanonicalPath(), target.getCanonicalPath()) != 0 ) {
|
||||
throw new IOException("link failed: "+strerror());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int errno() {
|
||||
return UtilJNI.errno();
|
||||
}
|
||||
|
||||
static String strerror() {
|
||||
return string(UtilJNI.strerror(errno()));
|
||||
}
|
||||
|
||||
static String string(long ptr) {
|
||||
if( ptr == 0 )
|
||||
return null;
|
||||
return new String(new NativeSlice(ptr, UtilJNI.strlen(ptr)).toByteArray());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
Copyright (c) 2011 FuseSource Corp. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of FuseSource Corp. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
@ -0,0 +1,63 @@
|
||||
dnl ---------------------------------------------------------------------------
|
||||
dnl Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
dnl
|
||||
dnl http://fusesource.com
|
||||
dnl
|
||||
dnl Redistribution and use in source and binary forms, with or without
|
||||
dnl modification, are permitted provided that the following conditions are
|
||||
dnl met:
|
||||
dnl
|
||||
dnl * Redistributions of source code must retain the above copyright
|
||||
dnl notice, this list of conditions and the following disclaimer.
|
||||
dnl * Redistributions in binary form must reproduce the above
|
||||
dnl copyright notice, this list of conditions and the following disclaimer
|
||||
dnl in the documentation and/or other materials provided with the
|
||||
dnl distribution.
|
||||
dnl * Neither the name of FuseSource Corp. nor the names of its
|
||||
dnl contributors may be used to endorse or promote products derived from
|
||||
dnl this software without specific prior written permission.
|
||||
dnl
|
||||
dnl THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
dnl "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
dnl LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
dnl A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
dnl OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
dnl LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
dnl DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
dnl THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
dnl (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
dnl OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
dnl ---------------------------------------------------------------------------
|
||||
|
||||
AC_DEFUN([CUSTOM_M4_SETUP],
|
||||
[
|
||||
AC_LANG_PUSH(C++)
|
||||
|
||||
AC_CHECK_HEADER([pthread.h],[AC_DEFINE([HAVE_PTHREAD_H], [1], [Define to 1 if you have the <pthread.h> header file.])])
|
||||
|
||||
AC_ARG_WITH([leveldb],
|
||||
[AS_HELP_STRING([--with-leveldb@<:@=PATH@:>@],
|
||||
[Directory where leveldb was built. Example: --with-leveldb=/opt/leveldb])],
|
||||
[
|
||||
CFLAGS="$CFLAGS -I${withval}/include"
|
||||
CXXFLAGS="$CXXFLAGS -I${withval}/include"
|
||||
AC_SUBST(CXXFLAGS)
|
||||
LDFLAGS="$LDFLAGS -lleveldb -L${withval}"
|
||||
AC_SUBST(LDFLAGS)
|
||||
])
|
||||
|
||||
AC_CHECK_HEADER([leveldb/db.h],,AC_MSG_ERROR([cannot find headers for leveldb]))
|
||||
|
||||
AC_ARG_WITH([snappy],
|
||||
[AS_HELP_STRING([--with-snappy@<:@=PATH@:>@],
|
||||
[Directory where snappy was built. Example: --with-snappy=/opt/snappy])],
|
||||
[
|
||||
LDFLAGS="$LDFLAGS -lsnappy -L${withval}"
|
||||
AC_SUBST(LDFLAGS)
|
||||
])
|
||||
|
||||
AC_CHECK_HEADER([sys/errno.h],[AC_DEFINE([HAVE_SYS_ERRNO_H], [1], [Define to 1 if you have the <sys/errno.h> header file.])])
|
||||
|
||||
AC_LANG_POP()
|
||||
])
|
@ -0,0 +1,36 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*******************************************************************************/
|
||||
#include "leveldbjni.h"
|
||||
|
||||
void buffer_copy(const void *source, size_t source_pos, void *dest, size_t dest_pos, size_t length) {
|
||||
memmove(((char *)dest)+dest_pos, ((const char *)source)+source_pos, length);
|
||||
}
|
142
java/leveldbjni/leveldbjni/src/main/native-package/src/leveldbjni.h
Executable file
142
java/leveldbjni/leveldbjni/src/main/native-package/src/leveldbjni.h
Executable file
@ -0,0 +1,142 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*******************************************************************************/
|
||||
#ifndef LEVELDBJNI_H
|
||||
#define LEVELDBJNI_H
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
/* configure based build.. we will use what it discovered about the platform */
|
||||
#include "config.h"
|
||||
#else
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
/* Windows based build */
|
||||
#define HAVE_STDLIB_H 1
|
||||
#define HAVE_STRINGS_H 1
|
||||
#include <windows.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRINGS_H
|
||||
#include <string.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_ERRNO_H
|
||||
#include <sys/errno.h>
|
||||
#endif
|
||||
|
||||
#include "hawtjni.h"
|
||||
#include <stdint.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
#include "leveldb/db.h"
|
||||
#include "leveldb/options.h"
|
||||
#include "leveldb/write_batch.h"
|
||||
#include "leveldb/cache.h"
|
||||
#include "leveldb/comparator.h"
|
||||
#include "leveldb/env.h"
|
||||
#include "leveldb/slice.h"
|
||||
|
||||
struct JNIComparator : public leveldb::Comparator {
|
||||
jobject target;
|
||||
jmethodID compare_method;
|
||||
const char *name;
|
||||
|
||||
int Compare(const leveldb::Slice& a, const leveldb::Slice& b) const {
|
||||
JNIEnv *env;
|
||||
if ( hawtjni_attach_thread(&env, "leveldb") ) {
|
||||
return 0;
|
||||
}
|
||||
int rc = env->CallIntMethod(target, compare_method, (jlong)(intptr_t)&a, (jlong)(intptr_t)&b);
|
||||
hawtjni_detach_thread();
|
||||
return rc;
|
||||
}
|
||||
|
||||
const char* Name() const {
|
||||
return name;
|
||||
}
|
||||
|
||||
void FindShortestSeparator(std::string*, const leveldb::Slice&) const { }
|
||||
void FindShortSuccessor(std::string*) const { }
|
||||
};
|
||||
|
||||
struct JNILogger : public leveldb::Logger {
|
||||
jobject target;
|
||||
jmethodID log_method;
|
||||
|
||||
void Logv(const char* format, va_list ap) {
|
||||
JNIEnv *env;
|
||||
if ( hawtjni_attach_thread(&env, "leveldb") ) {
|
||||
return;
|
||||
}
|
||||
|
||||
char buffer[1024];
|
||||
vsnprintf(buffer, sizeof(buffer), format, ap);
|
||||
|
||||
jstring message = env->NewStringUTF(buffer);
|
||||
if( message ) {
|
||||
env->CallVoidMethod(target, log_method, message);
|
||||
env->DeleteLocalRef(message);
|
||||
}
|
||||
|
||||
if (env->ExceptionOccurred() ) {
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
}
|
||||
hawtjni_detach_thread();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void buffer_copy(const void *source, size_t source_pos, void *dest, size_t dest_pos, size_t length);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* LEVELDBJNI_H */
|
194
java/leveldbjni/leveldbjni/src/main/native-package/vs2010.vcxproj
Executable file
194
java/leveldbjni/leveldbjni/src/main/native-package/vs2010.vcxproj
Executable file
@ -0,0 +1,194 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- msbuild vs2008.vcxproj -->
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="debug|Win32">
|
||||
<Configuration>debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="debug|x64">
|
||||
<Configuration>debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="release|Win32">
|
||||
<Configuration>release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="release|x64">
|
||||
<Configuration>release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectName>leveldbjni</ProjectName>
|
||||
<RootNamespace>leveldbjni</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='debug|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='release|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='release|Win32'">$(ProjectDir)/target/$(Platform)-$(Configuration)/lib\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='release|Win32'">$(ProjectDir)/target/$(Platform)-$(Configuration)/obj\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='release|Win32'">false</LinkIncremental>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='release|x64'">$(ProjectDir)/target/$(Platform)-$(Configuration)/lib\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='release|x64'">$(ProjectDir)/target/$(Platform)-$(Configuration)/obj\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='release|x64'">false</LinkIncremental>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectDir)/target/$(Platform)-$(Configuration)/lib\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectDir)/target/$(Platform)-$(Configuration)/obj\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='debug|x64'">$(ProjectDir)/target/$(Platform)-$(Configuration)/lib\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='debug|x64'">$(ProjectDir)/target/$(Platform)-$(Configuration)/obj\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='debug|x64'">true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='release|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>$(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(ProjectDir)\src\windows;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='release|x64'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>$(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(ProjectDir)\src\windows;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<PreprocessorDefinitions>WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>$(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(ProjectDir)\src\windows;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='debug|x64'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>$(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(ProjectDir)\src\windows;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<PreprocessorDefinitions>WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include=".\src\leveldbjni.cpp"/>
|
||||
<ClCompile Include=".\src\leveldbjni_stats.cpp"/>
|
||||
<ClCompile Include=".\src\leveldbjni_structs.cpp"/>
|
||||
<ClCompile Include=".\src\buffer.c"/>
|
||||
<ClCompile Include=".\src\hawtjni.c"/>
|
||||
</ItemGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<PreprocessorDefinitions>SNAPPY;LEVELDB_PLATFORM_WINDOWS;OS_WIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>$(LEVELDB_HOME);$(LEVELDB_HOME)\include;$(LEVELDB_HOME)\port\win;$(SNAPPY_HOME);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Platform)'=='Win32'">
|
||||
<Link>
|
||||
<AdditionalDependencies>shlwapi.lib;$(LEVELDB_HOME)\Release\leveldb.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Platform)'=='x64'">
|
||||
<Link>
|
||||
<AdditionalDependencies>shlwapi.lib;$(LEVELDB_HOME)\x64\Release\leveldb.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
@ -0,0 +1 @@
|
||||
${project.version}
|
@ -0,0 +1,422 @@
|
||||
/*
|
||||
* Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
*
|
||||
* http://fusesource.com
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of FuseSource Corp. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package org.fusesource.leveldbjni.test;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.fusesource.leveldbjni.JniDBFactory;
|
||||
import org.fusesource.leveldbjni.internal.JniDB;
|
||||
import org.iq80.leveldb.*;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
|
||||
import static org.fusesource.leveldbjni.JniDBFactory.asString;
|
||||
import static org.fusesource.leveldbjni.JniDBFactory.bytes;
|
||||
|
||||
/**
|
||||
* A Unit test for the DB class implementation.
|
||||
*
|
||||
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
|
||||
*/
|
||||
public class DBTest extends TestCase {
|
||||
DBFactory factory = JniDBFactory.factory;
|
||||
|
||||
File getTestDirectory(String name) throws IOException {
|
||||
File rc = new File(new File("test-data"), name);
|
||||
factory.destroy(rc, new Options().createIfMissing(true));
|
||||
rc.mkdirs();
|
||||
return rc;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOpen() throws IOException {
|
||||
|
||||
Options options = new Options().createIfMissing(true);
|
||||
|
||||
File path = getTestDirectory(getName());
|
||||
DB db = factory.open(path, options);
|
||||
|
||||
db.close();
|
||||
|
||||
// Try again.. this time we expect a failure since it exists.
|
||||
options = new Options().errorIfExists(true);
|
||||
try {
|
||||
factory.open(path, options);
|
||||
fail("Expected exception.");
|
||||
} catch (IOException e) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRepair() throws IOException, DBException {
|
||||
testCRUD();
|
||||
factory.repair(new File(new File("test-data"), getName()), new Options());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCRUD() throws IOException, DBException {
|
||||
|
||||
Options options = new Options().createIfMissing(true);
|
||||
|
||||
File path = getTestDirectory(getName());
|
||||
DB db = factory.open(path, options);
|
||||
|
||||
WriteOptions wo = new WriteOptions().sync(false);
|
||||
ReadOptions ro = new ReadOptions().fillCache(true).verifyChecksums(true);
|
||||
|
||||
db.put(bytes("Tampa"), bytes("green"));
|
||||
db.put(bytes("London"), bytes("red"));
|
||||
db.put(bytes("New York"), bytes("blue"));
|
||||
|
||||
assertEquals(db.get(bytes("Tampa"), ro), bytes("green"));
|
||||
assertEquals(db.get(bytes("London"), ro), bytes("red"));
|
||||
assertEquals(db.get(bytes("New York"), ro), bytes("blue"));
|
||||
|
||||
db.delete(bytes("New York"), wo);
|
||||
assertNull(db.get(bytes("New York"), ro));
|
||||
|
||||
// leveldb does not consider deleting something that does not exist an error.
|
||||
db.delete(bytes("New York"), wo);
|
||||
|
||||
db.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIterator() throws IOException, DBException {
|
||||
|
||||
Options options = new Options().createIfMissing(true);
|
||||
|
||||
File path = getTestDirectory(getName());
|
||||
DB db = factory.open(path, options);
|
||||
|
||||
db.put(bytes("Tampa"), bytes("green"));
|
||||
db.put(bytes("London"), bytes("red"));
|
||||
db.put(bytes("New York"), bytes("blue"));
|
||||
|
||||
ArrayList<String> expecting = new ArrayList<String>();
|
||||
expecting.add("London");
|
||||
expecting.add("New York");
|
||||
expecting.add("Tampa");
|
||||
|
||||
ArrayList<String> actual = new ArrayList<String>();
|
||||
|
||||
DBIterator iterator = db.iterator();
|
||||
for (iterator.seekToFirst(); iterator.hasNext(); iterator.next()) {
|
||||
actual.add(asString(iterator.peekNext().getKey()));
|
||||
}
|
||||
iterator.close();
|
||||
assertEquals(expecting, actual);
|
||||
|
||||
db.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSnapshot() throws IOException, DBException {
|
||||
|
||||
Options options = new Options().createIfMissing(true);
|
||||
|
||||
File path = getTestDirectory(getName());
|
||||
DB db = factory.open(path, options);
|
||||
|
||||
db.put(bytes("Tampa"), bytes("green"));
|
||||
db.put(bytes("London"), bytes("red"));
|
||||
db.delete(bytes("New York"));
|
||||
|
||||
ReadOptions ro = new ReadOptions().snapshot(db.getSnapshot());
|
||||
|
||||
db.put(bytes("New York"), bytes("blue"));
|
||||
|
||||
assertEquals(db.get(bytes("Tampa"), ro), bytes("green"));
|
||||
assertEquals(db.get(bytes("London"), ro), bytes("red"));
|
||||
|
||||
// Should not be able to get "New York" since it was added
|
||||
// after the snapshot
|
||||
assertNull(db.get(bytes("New York"), ro));
|
||||
|
||||
ro.snapshot().close();
|
||||
|
||||
// Now try again without the snapshot..
|
||||
ro.snapshot(null);
|
||||
assertEquals(db.get(bytes("New York"), ro), bytes("blue"));
|
||||
|
||||
db.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWriteBatch() throws IOException, DBException {
|
||||
|
||||
Options options = new Options().createIfMissing(true);
|
||||
|
||||
File path = getTestDirectory(getName());
|
||||
DB db = factory.open(path, options);
|
||||
|
||||
db.put(bytes("NA"), bytes("Na"));
|
||||
|
||||
WriteBatch batch = db.createWriteBatch();
|
||||
batch.delete(bytes("NA"));
|
||||
batch.put(bytes("Tampa"), bytes("green"));
|
||||
batch.put(bytes("London"), bytes("red"));
|
||||
batch.put(bytes("New York"), bytes("blue"));
|
||||
db.write(batch);
|
||||
batch.close();
|
||||
|
||||
ArrayList<String> expecting = new ArrayList<String>();
|
||||
expecting.add("London");
|
||||
expecting.add("New York");
|
||||
expecting.add("Tampa");
|
||||
|
||||
ArrayList<String> actual = new ArrayList<String>();
|
||||
|
||||
DBIterator iterator = db.iterator();
|
||||
for (iterator.seekToFirst(); iterator.hasNext(); iterator.next()) {
|
||||
actual.add(asString(iterator.peekNext().getKey()));
|
||||
}
|
||||
iterator.close();
|
||||
assertEquals(expecting, actual);
|
||||
|
||||
db.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testApproximateSizes() throws IOException, DBException {
|
||||
Options options = new Options().createIfMissing(true);
|
||||
|
||||
File path = getTestDirectory(getName());
|
||||
DB db = factory.open(path, options);
|
||||
|
||||
Random r = new Random(0);
|
||||
String data="";
|
||||
for(int i=0; i < 1024; i++) {
|
||||
data+= 'a'+r.nextInt(26);
|
||||
}
|
||||
for(int i=0; i < 5*1024; i++) {
|
||||
db.put(bytes("row"+i), bytes(data));
|
||||
}
|
||||
|
||||
long[] approximateSizes = db.getApproximateSizes(new Range(bytes("row"), bytes("s")));
|
||||
assertNotNull(approximateSizes);
|
||||
assertEquals(1, approximateSizes.length);
|
||||
assertTrue("Wrong size", approximateSizes[0] > 0);
|
||||
|
||||
db.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetProperty() throws IOException, DBException {
|
||||
Options options = new Options().createIfMissing(true);
|
||||
|
||||
File path = getTestDirectory(getName());
|
||||
DB db = factory.open(path, options);
|
||||
|
||||
Random r = new Random(0);
|
||||
String data="";
|
||||
for(int i=0; i < 1024; i++) {
|
||||
data+= 'a'+r.nextInt(26);
|
||||
}
|
||||
for(int i=0; i < 5*1024; i++) {
|
||||
db.put(bytes("row"+i), bytes(data));
|
||||
}
|
||||
|
||||
String stats = db.getProperty("leveldb.stats");
|
||||
assertNotNull(stats);
|
||||
assertTrue(stats.contains("Compactions"));
|
||||
|
||||
db.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCustomComparator1() throws IOException, DBException {
|
||||
Options options = new Options().createIfMissing(true);
|
||||
options.comparator(new DBComparator() {
|
||||
|
||||
public int compare(byte[] key1, byte[] key2) {
|
||||
return new String(key1).compareTo(new String(key2));
|
||||
}
|
||||
|
||||
public String name() {
|
||||
return getName();
|
||||
}
|
||||
|
||||
public byte[] findShortestSeparator(byte[] start, byte[] limit) {
|
||||
return start;
|
||||
}
|
||||
|
||||
public byte[] findShortSuccessor(byte[] key) {
|
||||
return key;
|
||||
}
|
||||
});
|
||||
|
||||
File path = getTestDirectory(getName());
|
||||
DB db = factory.open(path, options);
|
||||
|
||||
ArrayList<String> expecting = new ArrayList<String>();
|
||||
for(int i=0; i < 26; i++) {
|
||||
String t = ""+ ((char) ('a' + i));
|
||||
expecting.add(t);
|
||||
db.put(bytes(t), bytes(t));
|
||||
}
|
||||
|
||||
ArrayList<String> actual = new ArrayList<String>();
|
||||
|
||||
DBIterator iterator = db.iterator();
|
||||
for (iterator.seekToFirst(); iterator.hasNext(); iterator.next()) {
|
||||
actual.add(asString(iterator.peekNext().getKey()));
|
||||
}
|
||||
iterator.close();
|
||||
assertEquals(expecting, actual);
|
||||
|
||||
|
||||
db.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCustomComparator2() throws IOException, DBException {
|
||||
Options options = new Options().createIfMissing(true);
|
||||
options.comparator(new DBComparator() {
|
||||
|
||||
public int compare(byte[] key1, byte[] key2) {
|
||||
return new String(key1).compareTo(new String(key2)) * -1;
|
||||
}
|
||||
|
||||
public String name() {
|
||||
return getName();
|
||||
}
|
||||
|
||||
public byte[] findShortestSeparator(byte[] start, byte[] limit) {
|
||||
return start;
|
||||
}
|
||||
|
||||
public byte[] findShortSuccessor(byte[] key) {
|
||||
return key;
|
||||
}
|
||||
});
|
||||
|
||||
File path = getTestDirectory(getName());
|
||||
DB db = factory.open(path, options);
|
||||
|
||||
ArrayList<String> expecting = new ArrayList<String>();
|
||||
for(int i=0; i < 26; i++) {
|
||||
String t = ""+ ((char) ('a' + i));
|
||||
expecting.add(t);
|
||||
db.put(bytes(t), bytes(t));
|
||||
}
|
||||
Collections.reverse(expecting);
|
||||
|
||||
ArrayList<String> actual = new ArrayList<String>();
|
||||
DBIterator iterator = db.iterator();
|
||||
for (iterator.seekToFirst(); iterator.hasNext(); iterator.next()) {
|
||||
actual.add(asString(iterator.peekNext().getKey()));
|
||||
}
|
||||
iterator.close();
|
||||
assertEquals(expecting, actual);
|
||||
|
||||
db.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLogger() throws IOException, InterruptedException, DBException {
|
||||
final List<String> messages = Collections.synchronizedList(new ArrayList<String>());
|
||||
|
||||
Options options = new Options().createIfMissing(true);
|
||||
options.logger(new Logger() {
|
||||
public void log(String message) {
|
||||
messages.add(message);
|
||||
}
|
||||
});
|
||||
|
||||
File path = getTestDirectory(getName());
|
||||
DB db = factory.open(path, options);
|
||||
|
||||
for( int j=0; j < 5; j++) {
|
||||
Random r = new Random(0);
|
||||
String data="";
|
||||
for(int i=0; i < 1024; i++) {
|
||||
data+= 'a'+r.nextInt(26);
|
||||
}
|
||||
for(int i=0; i < 5*1024; i++) {
|
||||
db.put(bytes("row"+i), bytes(data));
|
||||
}
|
||||
Thread.sleep(100);
|
||||
}
|
||||
|
||||
db.close();
|
||||
|
||||
assertFalse(messages.isEmpty());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCompactRanges() throws IOException, InterruptedException, DBException {
|
||||
Options options = new Options().createIfMissing(true);
|
||||
File path = getTestDirectory(getName());
|
||||
DB db = factory.open(path, options);
|
||||
if( db instanceof JniDB) {
|
||||
Random r = new Random(0);
|
||||
String data="";
|
||||
for(int i=0; i < 1024; i++) {
|
||||
data+= 'a'+r.nextInt(26);
|
||||
}
|
||||
for(int i=0; i < 5*1024; i++) {
|
||||
db.put(bytes("row"+i), bytes(data));
|
||||
}
|
||||
for(int i=0; i < 5*1024; i++) {
|
||||
db.delete(bytes("row" + i));
|
||||
}
|
||||
|
||||
String stats = db.getProperty("leveldb.stats");
|
||||
System.out.println(stats);
|
||||
|
||||
// Compactions
|
||||
// Level Files Size(MB) Time(sec) Read(MB) Write(MB)
|
||||
// --------------------------------------------------
|
||||
assertFalse(stats.contains("1 0 0 0"));
|
||||
assertFalse(stats.contains("2 0 0 0"));
|
||||
|
||||
// After the compaction, level 1 and 2 should not have any files in it..
|
||||
((JniDB) db).compactRange(null, null);
|
||||
|
||||
stats = db.getProperty("leveldb.stats");
|
||||
System.out.println(stats);
|
||||
assertTrue(stats.contains("1 0 0 0"));
|
||||
assertTrue(stats.contains("2 0 0 0"));
|
||||
|
||||
}
|
||||
db.close();
|
||||
}
|
||||
|
||||
public void assertEquals(byte[] arg1, byte[] arg2) {
|
||||
assertTrue(Arrays.equals(arg1, arg2));
|
||||
}
|
||||
}
|
27
java/leveldbjni/license.txt
Normal file
27
java/leveldbjni/license.txt
Normal file
@ -0,0 +1,27 @@
|
||||
Copyright (c) 2011 FuseSource Corp. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of FuseSource Corp. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
303
java/leveldbjni/pom.xml
Executable file
303
java/leveldbjni/pom.xml
Executable file
@ -0,0 +1,303 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright (C) 2011, FuseSource Corp. All rights reserved.
|
||||
|
||||
http://fusesource.com
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of FuseSource Corp. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.fusesource</groupId>
|
||||
<artifactId>fusesource-pom</artifactId>
|
||||
<version>1.9</version>
|
||||
</parent>
|
||||
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-project</artifactId>
|
||||
<version>99-master-SNAPSHOT</version>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<name>${project.artifactId}</name>
|
||||
<description>leveldbjni is a jni library for accessing leveldb.</description>
|
||||
|
||||
<properties>
|
||||
<forge-project-id>leveldbjni</forge-project-id>
|
||||
<forge-project-id-uc>LEVELDBJNI</forge-project-id-uc>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<hawtjni-version>1.6</hawtjni-version>
|
||||
<leveldb-api-version>0.2</leveldb-api-version>
|
||||
</properties>
|
||||
|
||||
<modules>
|
||||
<module>leveldbjni</module>
|
||||
</modules>
|
||||
|
||||
<url>http://${forge-project-id}.fusesource.org</url>
|
||||
<inceptionYear>2009</inceptionYear>
|
||||
|
||||
<issueManagement>
|
||||
<system>github</system>
|
||||
<url>https://github.com/fusesource/leveldbjni/issues</url>
|
||||
</issueManagement>
|
||||
|
||||
<mailingLists>
|
||||
<mailingList>
|
||||
<name>${forge-project-id} dev</name>
|
||||
<post>${forge-project-id}-dev@fusesource.org</post>
|
||||
<subscribe>${forge-project-id}-dev-subscribe@fusesource.org</subscribe>
|
||||
</mailingList>
|
||||
<mailingList>
|
||||
<name>${forge-project-id} commits</name>
|
||||
<post>${forge-project-id}-commits@fusesource.org</post>
|
||||
<subscribe>${forge-project-id}-commits-subscribe@fusesource.org</subscribe>
|
||||
</mailingList>
|
||||
</mailingLists>
|
||||
|
||||
<licenses>
|
||||
<license>
|
||||
<name>The BSD 3-Clause License</name>
|
||||
<url>http://www.opensource.org/licenses/BSD-3-Clause</url>
|
||||
<distribution>repo</distribution>
|
||||
</license>
|
||||
</licenses>
|
||||
|
||||
<scm>
|
||||
<connection>scm:git:git://github.com/fusesource/leveldbjni.git</connection>
|
||||
<developerConnection>scm:git:git@github.com:fusesource/leveldbjni.git</developerConnection>
|
||||
<url>https://github.com/fusesource/leveldbjni</url>
|
||||
</scm>
|
||||
|
||||
<distributionManagement>
|
||||
<site>
|
||||
<id>website.fusesource.org</id>
|
||||
<name>website</name>
|
||||
<url>dav:http://fusesource.com/forge/dav/${forge-project-id}/maven/${project.version}</url>
|
||||
</site>
|
||||
</distributionManagement>
|
||||
|
||||
<developers>
|
||||
<developer>
|
||||
<id>chirino</id>
|
||||
<name>Hiram Chirino</name>
|
||||
<email>hiram@hiramchirino.com</email>
|
||||
<url>http://hiramchirino.com</url>
|
||||
<timezone>GMT-5</timezone>
|
||||
</developer>
|
||||
</developers>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.7</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
|
||||
<!-- the older clean plugin has trouble deleting directories with symlinks in them -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-clean-plugin</artifactId>
|
||||
<version>2.3</version>
|
||||
</plugin>
|
||||
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>1.5</source>
|
||||
<target>1.5</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.4.3</version>
|
||||
<configuration>
|
||||
<redirectTestOutputToFile>true</redirectTestOutputToFile>
|
||||
<forkMode>once</forkMode>
|
||||
<argLine>-ea</argLine>
|
||||
<failIfNoTests>false</failIfNoTests>
|
||||
<workingDirectory>${project.build.directory}</workingDirectory>
|
||||
<includes>
|
||||
<include>**/*Test.java</include>
|
||||
</includes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<reporting>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>jxr-maven-plugin</artifactId>
|
||||
<version>2.0-beta-1</version>
|
||||
<configuration>
|
||||
<aggregate>true</aggregate>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<version>2.6</version>
|
||||
<configuration>
|
||||
<excludePackageNames>*.internal</excludePackageNames>
|
||||
<linksource>true</linksource>
|
||||
<links>
|
||||
<link>http://java.sun.com/j2se/1.5.0/docs/api</link>
|
||||
</links>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-project-info-reports-plugin</artifactId>
|
||||
<version>2.1.1</version>
|
||||
<reportSets>
|
||||
<reportSet>
|
||||
<reports>
|
||||
<report>index</report>
|
||||
<report>sumary</report>
|
||||
<report>plugins</report>
|
||||
<report>dependencies</report>
|
||||
<report>mailing-list</report>
|
||||
<report>issue-tracking</report>
|
||||
<report>license</report>
|
||||
<report>scm</report>
|
||||
</reports>
|
||||
</reportSet>
|
||||
</reportSets>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>surefire-report-maven-plugin</artifactId>
|
||||
<version>2.0-beta-1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-plugin-plugin</artifactId>
|
||||
<version>2.5</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</reporting>
|
||||
|
||||
<profiles>
|
||||
|
||||
<profile>
|
||||
<id>download</id>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>fusesource.nexus.snapshot</id>
|
||||
<name>FuseSource Community Snapshot Repository</name>
|
||||
<url>http://repo.fusesource.com/nexus/content/groups/public-snapshots</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>sonatype-nexus</id>
|
||||
<name>Sonatype Nexus</name>
|
||||
<url>https://oss.sonatype.org/content/repositories/public</url>
|
||||
<releases><enabled>true</enabled></releases>
|
||||
<snapshots><enabled>true</enabled></snapshots>
|
||||
</repository>
|
||||
</repositories>
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>fusesource.nexus.snapshot</id>
|
||||
<name>FuseSource Community Snapshot Repository</name>
|
||||
<url>http://repo.fusesource.com/nexus/content/groups/public-snapshots</url>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>full</id>
|
||||
<modules>
|
||||
<module>leveldbjni-osx</module>
|
||||
<module>leveldbjni-linux32</module>
|
||||
<module>leveldbjni-linux64</module>
|
||||
<module>leveldbjni-win32</module>
|
||||
<module>leveldbjni-win64</module>
|
||||
<module>leveldbjni-all</module>
|
||||
</modules>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>all</id>
|
||||
<modules>
|
||||
<module>leveldbjni-all</module>
|
||||
</modules>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>osx</id>
|
||||
<modules>
|
||||
<module>leveldbjni-osx</module>
|
||||
</modules>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>linux32</id>
|
||||
<modules>
|
||||
<module>leveldbjni-linux32</module>
|
||||
</modules>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>linux64</id>
|
||||
<modules>
|
||||
<module>leveldbjni-linux64</module>
|
||||
</modules>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>win32</id>
|
||||
<properties>
|
||||
<skipAutogen>true</skipAutogen>
|
||||
</properties>
|
||||
<modules>
|
||||
<module>leveldbjni-win32</module>
|
||||
</modules>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>win64</id>
|
||||
<properties>
|
||||
<skipAutogen>true</skipAutogen>
|
||||
</properties>
|
||||
<modules>
|
||||
<module>leveldbjni-win64</module>
|
||||
</modules>
|
||||
</profile>
|
||||
|
||||
</profiles>
|
||||
</project>
|
242
java/leveldbjni/readme.md
Normal file
242
java/leveldbjni/readme.md
Normal file
@ -0,0 +1,242 @@
|
||||
# LevelDB JNI
|
||||
|
||||
## Description
|
||||
|
||||
LevelDB JNI gives you a Java interface to the
|
||||
[LevelDB](http://code.google.com/p/leveldb/) C++ library
|
||||
which is a fast key-value storage library written at Google
|
||||
that provides an ordered mapping from string keys to string values..
|
||||
|
||||
|
||||
## Using as a Maven Dependency
|
||||
|
||||
You just nee to add the following repositories and dependencies to your Maven pom.
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>fusesource.nexus.snapshot</id>
|
||||
<name>FuseSource Community Snapshot Repository</name>
|
||||
<url>http://repo.fusesource.com/nexus/content/groups/public-snapshots</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.fusesource.leveldbjni</groupId>
|
||||
<artifactId>leveldbjni-all</artifactId>
|
||||
<version>1.1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
## API Usage:
|
||||
|
||||
Recommended Package imports:
|
||||
|
||||
import org.iq80.leveldb.*;
|
||||
import static org.fusesource.leveldbjni.JniDBFactory.*;
|
||||
import java.io.*;
|
||||
|
||||
Opening and closing the database.
|
||||
|
||||
Options options = new Options();
|
||||
options.createIfMissing(true);
|
||||
DB db = factory.open(new File("example"), options);
|
||||
try {
|
||||
// Use the db in here....
|
||||
} finally {
|
||||
// Make sure you close the db to shutdown the
|
||||
// database and avoid resource leaks.
|
||||
db.close();
|
||||
}
|
||||
|
||||
Putting, Getting, and Deleting key/values.
|
||||
|
||||
db.put(bytes("Tampa"), bytes("rocks"));
|
||||
String value = asString(db.get(bytes("Tampa")));
|
||||
db.delete(wo, bytes("Tampa"));
|
||||
|
||||
Performing Batch/Bulk/Atomic Updates.
|
||||
|
||||
WriteBatch batch = db.createWriteBatch();
|
||||
try {
|
||||
batch.delete(bytes("Denver"));
|
||||
batch.put(bytes("Tampa"), bytes("green"));
|
||||
batch.put(bytes("London"), bytes("red"));
|
||||
|
||||
db.write(batch);
|
||||
} finally {
|
||||
// Make sure you close the batch to avoid resource leaks.
|
||||
batch.close();
|
||||
}
|
||||
|
||||
Iterating key/values.
|
||||
|
||||
DBIterator iterator = db.iterator();
|
||||
try {
|
||||
for(iterator.seekToFirst(); iterator.hasNext(); iterator.next()) {
|
||||
String key = asString(iterator.peekNext().getKey());
|
||||
String value = asString(iterator.peekNext().getValue());
|
||||
System.out.println(key+" = "+value);
|
||||
}
|
||||
} finally {
|
||||
// Make sure you close the iterator to avoid resource leaks.
|
||||
iterator.close();
|
||||
}
|
||||
|
||||
Working against a Snapshot view of the Database.
|
||||
|
||||
ReadOptions ro = new ReadOptions();
|
||||
ro.snapshot(db.getSnapshot());
|
||||
try {
|
||||
|
||||
// All read operations will now use the same
|
||||
// consistent view of the data.
|
||||
... = db.iterator(ro);
|
||||
... = db.get(bytes("Tampa"), ro);
|
||||
|
||||
} finally {
|
||||
// Make sure you close the snapshot to avoid resource leaks.
|
||||
ro.snapshot().close();
|
||||
}
|
||||
|
||||
Using a custom Comparator.
|
||||
|
||||
DBComparator comparator = new DBComparator(){
|
||||
public int compare(byte[] key1, byte[] key2) {
|
||||
return new String(key1).compareTo(new String(key2));
|
||||
}
|
||||
public String name() {
|
||||
return "simple";
|
||||
}
|
||||
public byte[] findShortestSeparator(byte[] start, byte[] limit) {
|
||||
return start;
|
||||
}
|
||||
public byte[] findShortSuccessor(byte[] key) {
|
||||
return key;
|
||||
}
|
||||
};
|
||||
Options options = new Options();
|
||||
options.comparator(comparator);
|
||||
DB db = factory.open(new File("example"), options);
|
||||
|
||||
Disabling Compression
|
||||
|
||||
Options options = new Options();
|
||||
options.compressionType(CompressionType.NONE);
|
||||
DB db = factory.open(new File("example"), options);
|
||||
|
||||
Configuring the Cache
|
||||
|
||||
Options options = new Options();
|
||||
options.cacheSize(100 * 1048576); // 100MB cache
|
||||
DB db = factory.open(new File("example"), options);
|
||||
|
||||
Getting approximate sizes.
|
||||
|
||||
long[] sizes = db.getApproximateSizes(new Range(bytes("a"), bytes("k")), new Range(bytes("k"), bytes("z")));
|
||||
System.out.println("Size: "+sizes[0]+", "+sizes[1]);
|
||||
|
||||
Getting database status.
|
||||
|
||||
String stats = db.getProperty("leveldb.stats");
|
||||
System.out.println(stats);
|
||||
|
||||
Getting informational log messages.
|
||||
|
||||
Logger logger = new Logger() {
|
||||
public void log(String message) {
|
||||
System.out.println(message);
|
||||
}
|
||||
};
|
||||
Options options = new Options();
|
||||
options.logger(logger);
|
||||
DB db = factory.open(new File("example"), options);
|
||||
|
||||
Destroying a database.
|
||||
|
||||
Options options = new Options();
|
||||
factory.destroy(new File("example"), options);
|
||||
|
||||
Repairing a database.
|
||||
|
||||
Options options = new Options();
|
||||
factory.repair(new File("example"), options);
|
||||
|
||||
Using a memory pool to make native memory allocations more efficient:
|
||||
|
||||
JniDBFactory.pushMemoryPool(1024 * 512);
|
||||
try {
|
||||
// .. work with the DB in here,
|
||||
} finally {
|
||||
JniDBFactory.popMemoryPool();
|
||||
}
|
||||
|
||||
## Building
|
||||
|
||||
### Prerequisites
|
||||
|
||||
* GNU compiler toolchain
|
||||
* [Maven 3](http://maven.apache.org/download.html)
|
||||
|
||||
### Supported Platforms
|
||||
|
||||
The following worked for me on:
|
||||
|
||||
* OS X Lion with X Code 4
|
||||
* CentOS 5.6 (32 and 64 bit)
|
||||
* Ubuntu 12.04 (32 and 64 bit)
|
||||
* apt-get install autoconf libtool
|
||||
|
||||
### Build Procedure
|
||||
|
||||
Then download the snappy, leveldb, and leveldbjni project source code:
|
||||
|
||||
wget http://snappy.googlecode.com/files/snappy-1.0.5.tar.gz
|
||||
tar -zxvf snappy-1.0.5.tar.gz
|
||||
git clone git://github.com/chirino/leveldb.git
|
||||
git clone git://github.com/fusesource/leveldbjni.git
|
||||
export SNAPPY_HOME=`cd snappy-1.0.5; pwd`
|
||||
export LEVELDB_HOME=`cd leveldb; pwd`
|
||||
export LEVELDBJNI_HOME=`cd leveldbjni; pwd`
|
||||
|
||||
Compile the snappy project. This produces a static library.
|
||||
|
||||
cd ${SNAPPY_HOME}
|
||||
./configure --disable-shared --with-pic
|
||||
make
|
||||
|
||||
Patch and Compile the leveldb project. This produces a static library.
|
||||
|
||||
cd ${LEVELDB_HOME}
|
||||
export LIBRARY_PATH=${SNAPPY_HOME}
|
||||
export C_INCLUDE_PATH=${LIBRARY_PATH}
|
||||
export CPLUS_INCLUDE_PATH=${LIBRARY_PATH}
|
||||
git apply ../leveldbjni/leveldb.patch
|
||||
make libleveldb.a
|
||||
|
||||
Now use maven to build the leveldbjni project.
|
||||
|
||||
cd ${LEVELDBJNI_HOME}
|
||||
mvn clean install -P download -P ${platform}
|
||||
|
||||
Replace ${platform} with one of the following platform identifiers (depending on the platform your building on):
|
||||
|
||||
* osx
|
||||
* linux32
|
||||
* linux64
|
||||
* win32
|
||||
* win64
|
||||
|
||||
If your platform does not have the right auto-tools levels available
|
||||
just copy the `leveldbjni-${version}-SNAPSHOT-native-src.zip` artifact
|
||||
from a platform the does have the tools available then add the
|
||||
following argument to your maven build:
|
||||
|
||||
-Dnative-src-url=file:leveldbjni-${verision}-SNAPSHOT-native-src.zip
|
||||
|
||||
### Build Results
|
||||
|
||||
* `leveldbjni/target/leveldbjni-${version}.jar` : The java class file to the library.
|
||||
* `leveldbjni/target/leveldbjni-${version}-native-src.zip` : A GNU style source project which you can use to build the native library on other systems.
|
||||
* `leveldbjni-${platform}/target/leveldbjni-${platform}-${version}.jar` : A jar file containing the built native library using your currently platform.
|
||||
|
30
java/leveldbjni/releasing.md
Normal file
30
java/leveldbjni/releasing.md
Normal file
@ -0,0 +1,30 @@
|
||||
# How To Release
|
||||
|
||||
Since levedbjni has to be build against multiple platforms, the standard maven release plugin will not work to do the release.
|
||||
|
||||
Once you ready to do the release, create a branch for the release using:
|
||||
|
||||
git co -b ${version}.x
|
||||
|
||||
Update the version number in the poms using:
|
||||
|
||||
mvn -P all org.codehaus.mojo:versions-maven-plugin:1.2:set org.codehaus.mojo:versions-maven-plugin:1.2:commit -DnewVersion="${version}"
|
||||
git commit -am "Preping for a the ${version} release"
|
||||
git tag "leveldbjni-${version}"
|
||||
git push origin "leveldbjni-${version}"
|
||||
|
||||
Now release the non-platform specific artifacts using:
|
||||
|
||||
mvn clean deploy -P release -P download
|
||||
|
||||
Then for each platform, shell into the box check out the "leveldbjni-${version}" tag and then:
|
||||
|
||||
cd $platform
|
||||
mvn clean deploy -Dleveldb=`cd ../../leveldb; pwd` -Dsnappy=`cd ../../snappy-1.0.3; pwd` -P release -P download
|
||||
|
||||
Finally release the `leveldbjni-all` which uber jars all the previously released artifacts.
|
||||
|
||||
cd leveldbjni-all
|
||||
mvn clean deploy -P release -P download
|
||||
|
||||
Congrats your done. Make sure your releasing the artifacts in Nexus after each step.
|
Loading…
Reference in New Issue
Block a user