Skip to content

Commit

Permalink
initial version
Browse files Browse the repository at this point in the history
  • Loading branch information
wmorgan committed Jun 17, 2011
0 parents commit 63e6edb
Show file tree
Hide file tree
Showing 125 changed files with 19,858 additions and 0 deletions.
9 changes: 9 additions & 0 deletions .gitignore
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
17 changes: 17 additions & 0 deletions README
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:
29 changes: 29 additions & 0 deletions Rakefile
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
10 changes: 10 additions & 0 deletions ext/leveldb/extconf.rb
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"
107 changes: 107 additions & 0 deletions ext/leveldb/leveldb.cc
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);
}
}
8 changes: 8 additions & 0 deletions leveldb/AUTHORS
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>
27 changes: 27 additions & 0 deletions leveldb/LICENSE
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.
172 changes: 172 additions & 0 deletions leveldb/Makefile
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
Loading

0 comments on commit 63e6edb

Please sign in to comment.