Summary: This implement the Java interface by using JNI Test Plan: compile test Reviewers: dhruba Reviewed By: dhruba Differential Revision: https://reviews.facebook.net/D5925main
parent
fc23714f27
commit
696b290821
@ -0,0 +1,13 @@ |
||||
*~ |
||||
*.swp |
||||
.idea |
||||
.idea/* |
||||
*.iml |
||||
*.ipr |
||||
*.iws |
||||
target |
||||
.DS_Store |
||||
.project |
||||
.classpath |
||||
.settings |
||||
eclipse-classes |
@ -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 |
@ -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_;
|
||||
|
@ -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 { |
||||
} |
@ -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> |
@ -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> |
@ -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> |
@ -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> |
@ -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> |
@ -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); |
||||
} |
@ -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 */ |
@ -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)); |
||||
} |
||||
} |
@ -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,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> |
@ -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. |
||||
|
@ -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