-
Notifications
You must be signed in to change notification settings - Fork 29
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 63e6edb
Showing
125 changed files
with
19,858 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
.*.swp | ||
*.o | ||
ext/leveldb/Makefile | ||
ext/leveldb/extconf.h | ||
ext/leveldb/leveldb.so | ||
ext/leveldb/libleveldb.a | ||
leveldb/libleveldb.a | ||
leveldb/leveldb.gyp | ||
pkg |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
LevelDB Ruby bindings. | ||
|
||
Do this: | ||
|
||
gem install leveldb-ruby | ||
|
||
|
||
And then run this: | ||
|
||
require 'rubygems' # on ruby < 1.9 | ||
require 'leveldb' | ||
|
||
db = LevelDB.new "/tmp/asdf" | ||
db.put "it", "works" | ||
db.get "it" | ||
|
||
Only a very few operations are supported right now: |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
require 'rubygems' | ||
require 'rubygems/package_task' | ||
require 'find' | ||
|
||
spec = Gem::Specification.new do |s| | ||
s.name = "leveldb-ruby" | ||
s.version = "0.1" | ||
s.date = Time.now.to_s | ||
s.email = "wmorgan-leveldb-ruby-gemspec@masanjin.net" | ||
s.authors = ["William Morgan"] | ||
s.summary = "a Ruby binding to LevelDB" | ||
s.homepage = "http://github.com/wmorgan/leveldb-ruby" | ||
s.files = %w(README ext/leveldb/extconf.rb lib/leveldb.rb ext/leveldb/leveldb.cc) | ||
Find.find("leveldb") { |x| s.files << x } | ||
s.extensions = %w(ext/leveldb/extconf.rb) | ||
s.executables = [] | ||
s.extra_rdoc_files = %w(README ext/leveldb/leveldb.cc) | ||
s.rdoc_options = %w(-c utf8 --main README --title LevelDB) | ||
s.description = "LevelDB-Ruby is a Ruby binding to LevelDB." | ||
end | ||
|
||
task :rdoc do |t| | ||
sh "rm -rf doc; rdoc #{spec.rdoc_options.join(' ')} #{spec.extra_rdoc_files.join(' ')} lib/leveldb.rb" | ||
end | ||
|
||
Gem::PackageTask.new spec do | ||
end | ||
|
||
# vim: syntax=ruby |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
require 'mkmf' | ||
require 'fileutils' | ||
|
||
Dir.chdir "../../leveldb" | ||
system "make" or abort | ||
Dir.chdir "../ext/leveldb" | ||
|
||
$CFLAGS << " -I../../leveldb/include" | ||
$LIBS << " -L../../leveldb -Wl,--whole-archive -lleveldb -Wl,--no-whole-archive" | ||
create_makefile "leveldb/leveldb" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
#include <ruby.h> | ||
|
||
#include "leveldb/db.h" | ||
#include "leveldb/write_batch.h" | ||
|
||
static VALUE m_leveldb; | ||
static VALUE c_db; | ||
static VALUE c_error; | ||
|
||
// support 1.9 and 1.8 | ||
#ifndef RSTRING_PTR | ||
#define RSTRING_PTR(v) RSTRING(v)->ptr | ||
#endif | ||
|
||
// convert status errors into exceptions | ||
#define RAISE_ON_ERROR(status) do { \ | ||
if(!status.ok()) { \ | ||
VALUE exc = rb_exc_new2(c_error, status.ToString().c_str()); \ | ||
rb_exc_raise(exc); \ | ||
} \ | ||
} while(0) | ||
|
||
typedef struct bound_db { | ||
leveldb::DB* db; | ||
} bound_db; | ||
|
||
typedef struct bound_batch { | ||
bound_db* db; | ||
leveldb::WriteBatch* batch; | ||
} bound_batch; | ||
|
||
static void db_free(bound_db* db) { | ||
delete db->db; | ||
} | ||
|
||
static VALUE db_make(VALUE klass, VALUE v_pathname, VALUE v_create_if_necessary, VALUE v_break_if_exists) { | ||
Check_Type(v_pathname, T_STRING); | ||
|
||
bound_db* db = new bound_db; | ||
char* pathname_c = RSTRING_PTR(v_pathname); | ||
std::string pathname = std::string((char*)RSTRING_PTR(v_pathname)); | ||
|
||
leveldb::Options options; | ||
if(RTEST(v_create_if_necessary)) options.create_if_missing = true; | ||
if(RTEST(v_break_if_exists)) options.error_if_exists = true; | ||
leveldb::Status status = leveldb::DB::Open(options, pathname, &db->db); | ||
RAISE_ON_ERROR(status); | ||
|
||
VALUE o_db = Data_Wrap_Struct(klass, NULL, db_free, db); | ||
VALUE argv[1] = { v_pathname }; | ||
rb_obj_call_init(o_db, 1, argv); | ||
|
||
return o_db; | ||
} | ||
|
||
static VALUE db_get(VALUE self, VALUE v_key) { | ||
Check_Type(v_key, T_STRING); | ||
|
||
bound_db* db; | ||
Data_Get_Struct(self, bound_db, db); | ||
|
||
std::string key = std::string((char*)RSTRING_PTR(v_key)); | ||
std::string value; | ||
leveldb::Status status = db->db->Get(leveldb::ReadOptions(), key, &value); | ||
RAISE_ON_ERROR(status); | ||
|
||
return rb_str_new2(value.c_str()); | ||
} | ||
|
||
static VALUE db_put(VALUE self, VALUE v_key, VALUE v_value) { | ||
Check_Type(v_key, T_STRING); | ||
Check_Type(v_value, T_STRING); | ||
|
||
bound_db* db; | ||
Data_Get_Struct(self, bound_db, db); | ||
|
||
std::string key = std::string((char*)RSTRING_PTR(v_key)); | ||
std::string value = std::string((char*)RSTRING_PTR(v_value)); | ||
|
||
leveldb::Status status = db->db->Put(leveldb::WriteOptions(), key, value); | ||
RAISE_ON_ERROR(status); | ||
|
||
return v_value; | ||
} | ||
|
||
static VALUE db_init(VALUE self, VALUE v_pathname) { | ||
rb_iv_set(self, "@pathname", v_pathname); | ||
return self; | ||
} | ||
|
||
extern "C" { | ||
void Init_leveldb() { | ||
VALUE m_leveldb; | ||
|
||
m_leveldb = rb_define_module("LevelDB"); | ||
|
||
c_db = rb_define_class_under(m_leveldb, "DB", rb_cObject); | ||
rb_define_singleton_method(c_db, "make", (VALUE (*)(...))db_make, 3); | ||
rb_define_method(c_db, "initialize", (VALUE (*)(...))db_init, 1); | ||
rb_define_method(c_db, "get", (VALUE (*)(...))db_get, 1); | ||
rb_define_method(c_db, "put", (VALUE (*)(...))db_put, 2); | ||
//rb_define_singleton_method(c_index, "create", db_create, 1); | ||
//rb_define_singleton_method(c_index, "load", db_load, 1); | ||
|
||
c_error = rb_define_class_under(m_leveldb, "Error", rb_eStandardError); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
# Names should be added to this file like so: | ||
# Name or Organization <email address> | ||
|
||
Google Inc. | ||
|
||
# Initial version authors: | ||
Jeffrey Dean <jeff@google.com> | ||
Sanjay Ghemawat <sanjay@google.com> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
Copyright (c) 2011 The LevelDB Authors. 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 Google Inc. 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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,172 @@ | ||
# Copyright (c) 2011 The LevelDB Authors. All rights reserved. | ||
# Use of this source code is governed by a BSD-style license that can be | ||
# found in the LICENSE file. See the AUTHORS file for names of contributors. | ||
|
||
CC = g++ | ||
|
||
#----------------------------------------------- | ||
# Uncomment exactly one of the lines labelled (A), (B), and (C) below | ||
# to switch between compilation modes. | ||
|
||
OPT = -O2 -DNDEBUG # (A) Production use (optimized mode) | ||
# OPT = -g2 # (B) Debug mode, w/ full line-level debugging symbols | ||
# OPT = -O2 -g2 -DNDEBUG # (C) Profiling mode: opt, but w/debugging symbols | ||
#----------------------------------------------- | ||
|
||
|
||
UNAME := $(shell uname) | ||
|
||
ifeq ($(UNAME), Darwin) | ||
# To build for iOS, set PLATFORM=IOS. | ||
ifndef PLATFORM | ||
PLATFORM=OSX | ||
endif # PLATFORM | ||
PLATFORM_CFLAGS = -DLEVELDB_PLATFORM_OSX | ||
PORT_MODULE = port_osx.o | ||
else # UNAME | ||
PLATFORM_CFLAGS = -DLEVELDB_PLATFORM_POSIX -std=c++0x | ||
PORT_MODULE = port_posix.o | ||
endif # UNAME | ||
|
||
CFLAGS = -c -I. -I./include $(PLATFORM_CFLAGS) $(OPT) -DUSE_SNAPPY=1 | ||
|
||
LDFLAGS=-lpthread | ||
|
||
LIBOBJECTS = \ | ||
./db/builder.o \ | ||
./db/db_impl.o \ | ||
./db/db_iter.o \ | ||
./db/filename.o \ | ||
./db/dbformat.o \ | ||
./db/log_reader.o \ | ||
./db/log_writer.o \ | ||
./db/memtable.o \ | ||
./db/repair.o \ | ||
./db/table_cache.o \ | ||
./db/version_edit.o \ | ||
./db/version_set.o \ | ||
./db/write_batch.o \ | ||
./port/$(PORT_MODULE) \ | ||
./table/block.o \ | ||
./table/block_builder.o \ | ||
./table/format.o \ | ||
./table/iterator.o \ | ||
./table/merger.o \ | ||
./table/table.o \ | ||
./table/table_builder.o \ | ||
./table/two_level_iterator.o \ | ||
./util/arena.o \ | ||
./util/cache.o \ | ||
./util/coding.o \ | ||
./util/comparator.o \ | ||
./util/crc32c.o \ | ||
./util/env.o \ | ||
./util/env_posix.o \ | ||
./util/hash.o \ | ||
./util/histogram.o \ | ||
./util/logging.o \ | ||
./util/options.o \ | ||
./util/status.o | ||
|
||
TESTUTIL = ./util/testutil.o | ||
TESTHARNESS = ./util/testharness.o $(TESTUTIL) | ||
|
||
TESTS = \ | ||
arena_test \ | ||
cache_test \ | ||
coding_test \ | ||
corruption_test \ | ||
crc32c_test \ | ||
db_test \ | ||
dbformat_test \ | ||
env_test \ | ||
filename_test \ | ||
log_test \ | ||
skiplist_test \ | ||
table_test \ | ||
version_edit_test \ | ||
write_batch_test | ||
|
||
PROGRAMS = db_bench $(TESTS) | ||
|
||
LIBRARY = libleveldb.a | ||
|
||
ifeq ($(PLATFORM), IOS) | ||
# Only XCode can build executable applications for iOS. | ||
all: $(LIBRARY) | ||
else | ||
all: $(PROGRAMS) $(LIBRARY) | ||
endif | ||
|
||
check: $(TESTS) | ||
for t in $(TESTS); do echo "***** Running $$t"; ./$$t || exit 1; done | ||
|
||
clean: | ||
-rm -f $(PROGRAMS) $(LIBRARY) */*.o ios-x86/*/*.o ios-arm/*/*.o | ||
-rmdir -p ios-x86/* ios-arm/* | ||
|
||
$(LIBRARY): $(LIBOBJECTS) | ||
rm -f $@ | ||
$(AR) -rs $@ $(LIBOBJECTS) | ||
|
||
db_bench: db/db_bench.o $(LIBOBJECTS) $(TESTUTIL) | ||
$(CC) $(LDFLAGS) db/db_bench.o $(LIBOBJECTS) $(TESTUTIL) -o $@ | ||
|
||
arena_test: util/arena_test.o $(LIBOBJECTS) $(TESTHARNESS) | ||
$(CC) $(LDFLAGS) util/arena_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ | ||
|
||
cache_test: util/cache_test.o $(LIBOBJECTS) $(TESTHARNESS) | ||
$(CC) $(LDFLAGS) util/cache_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ | ||
|
||
coding_test: util/coding_test.o $(LIBOBJECTS) $(TESTHARNESS) | ||
$(CC) $(LDFLAGS) util/coding_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ | ||
|
||
corruption_test: db/corruption_test.o $(LIBOBJECTS) $(TESTHARNESS) | ||
$(CC) $(LDFLAGS) db/corruption_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ | ||
|
||
crc32c_test: util/crc32c_test.o $(LIBOBJECTS) $(TESTHARNESS) | ||
$(CC) $(LDFLAGS) util/crc32c_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ | ||
|
||
db_test: db/db_test.o $(LIBOBJECTS) $(TESTHARNESS) | ||
$(CC) $(LDFLAGS) db/db_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ | ||
|
||
dbformat_test: db/dbformat_test.o $(LIBOBJECTS) $(TESTHARNESS) | ||
$(CC) $(LDFLAGS) db/dbformat_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ | ||
|
||
env_test: util/env_test.o $(LIBOBJECTS) $(TESTHARNESS) | ||
$(CC) $(LDFLAGS) util/env_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ | ||
|
||
filename_test: db/filename_test.o $(LIBOBJECTS) $(TESTHARNESS) | ||
$(CC) $(LDFLAGS) db/filename_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ | ||
|
||
log_test: db/log_test.o $(LIBOBJECTS) $(TESTHARNESS) | ||
$(CC) $(LDFLAGS) db/log_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ | ||
|
||
table_test: table/table_test.o $(LIBOBJECTS) $(TESTHARNESS) | ||
$(CC) $(LDFLAGS) table/table_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ | ||
|
||
skiplist_test: db/skiplist_test.o $(LIBOBJECTS) $(TESTHARNESS) | ||
$(CC) $(LDFLAGS) db/skiplist_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ | ||
|
||
version_edit_test: db/version_edit_test.o $(LIBOBJECTS) $(TESTHARNESS) | ||
$(CC) $(LDFLAGS) db/version_edit_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ | ||
|
||
write_batch_test: db/write_batch_test.o $(LIBOBJECTS) $(TESTHARNESS) | ||
$(CC) $(LDFLAGS) db/write_batch_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ | ||
|
||
ifeq ($(PLATFORM), IOS) | ||
# For iOS, create universal object files to be used on both the simulator and | ||
# a device. | ||
.cc.o: | ||
mkdir -p ios-x86/$(dir $@) | ||
$(CC) $(CFLAGS) -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -arch i686 $< -o ios-x86/$@ | ||
mkdir -p ios-arm/$(dir $@) | ||
$(CC) $(CFLAGS) -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -arch armv6 -arch armv7 $< -o ios-arm/$@ | ||
lipo ios-x86/$@ ios-arm/$@ -create -output $@ | ||
else | ||
.cc.o: | ||
$(CC) $(CFLAGS) $< -o $@ | ||
endif | ||
|
||
# TODO(gabor): dependencies for .o files | ||
# TODO(gabor): Build library |
Oops, something went wrong.