Skip to content

Commit

Permalink
Merge pull request #3 from kadena-io/gain-all-ffi
Browse files Browse the repository at this point in the history
Gain all ffi
  • Loading branch information
edmundnoble authored Aug 10, 2022
2 parents f053800 + bf2a062 commit cda088d
Show file tree
Hide file tree
Showing 876 changed files with 305,549 additions and 421 deletions.
136 changes: 0 additions & 136 deletions vendored/rocksdb-haskell/Setup.hs

This file was deleted.

132 changes: 132 additions & 0 deletions vendored/rocksdb-haskell/cpp/chainweb-rocksdb.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// 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.

// The code not taken from the LevelDB and RocksDB authors is
// Copyright (c) 2022 Kadena.

// copied from rocksdb/c.cc
#include <stdlib.h>
#include "rocksdb/db.h"
#include "rocksdb/slice_transform.h"

#include <vector>
#include <unordered_set>
#include <map>

using rocksdb::DB;
using rocksdb::DBOptions;
using rocksdb::DbPath;
using rocksdb::Env;
using rocksdb::EnvOptions;
using rocksdb::Options;
using rocksdb::ReadOptions;
using rocksdb::Slice;
using rocksdb::SliceParts;
using rocksdb::SliceTransform;
using rocksdb::Snapshot;
using rocksdb::SstFileWriter;
using rocksdb::Status;
using rocksdb::WritableFile;
using rocksdb::WriteOptions;

using std::shared_ptr;
using std::vector;
using std::unordered_set;
using std::map;

class DelimitedPrefixTransform : public SliceTransform {
protected:
std::vector<char> *delims;
public:

explicit DelimitedPrefixTransform(std::vector<char> *_delims) : delims(_delims) { }
~DelimitedPrefixTransform() {
}

static const char* kClassName() { return "rocksdb-haskell.DelimitedPrefix"; }
static const char* kNickName() { return "table"; }
const char* Name() const override { return kClassName(); }
Slice Transform(const Slice& src) const override {
size_t prefix_end;
for (char c : *delims) {
if ((prefix_end = std::string(src.data()).find(c)) != std::string::npos) {
return Slice(src.data(), prefix_end);
}
}
// we must return the entire string if there's no symbol because of the law:
// prefix(prefix(str)) == prefix(str)
// this prevents us from implementing a real InDomain, which will go badly
// (redundant prefix seeking)
// *if* we mix prefixed and nonprefixed keys in the same database
return src;
}

bool InDomain(const Slice&) const override {
return true;
}

bool InRange(const Slice&) const override {
return true;
}

bool FullLengthEnabled(size_t*) const override {
return false;
}

bool SameResultWhenAppended(const Slice&) const override {
return false;
}
};

std::vector<char> std_delimiters { '$', '%' };

DelimitedPrefixTransform dollar_percent_delimited_transform(&std_delimiters);

extern "C" {

struct rocksdb_t { DB* rep; };
struct rocksdb_options_t { Options rep; };
struct rocksdb_writeoptions_t { WriteOptions rep; };
struct rocksdb_readoptions_t { ReadOptions rep; };

static bool SaveError(char** errptr, const Status& s) {
assert(errptr != nullptr);
if (s.ok()) {
return false;
} else if (*errptr == nullptr) {
*errptr = strdup(s.ToString().c_str());
} else {
// TODO(sanjay): Merge with existing error?
// This is a bug if *errptr is not created by malloc()
free(*errptr);
*errptr = strdup(s.ToString().c_str());
}
return true;
}
// end of code copied from rocksdb/c.cc

void rocksdb_delete_range(rocksdb_t* db,
const rocksdb_writeoptions_t* options,
const char* start_key, size_t start_key_len,
const char* end_key, size_t end_key_len,
char** errptr) {
SaveError(errptr, db->rep->DeleteRange(options->rep, nullptr,
Slice(start_key, start_key_len),
Slice(end_key, end_key_len)));
}

void rocksdb_readoptions_set_auto_prefix_mode(rocksdb_readoptions_t* options, bool auto_prefix_mode) {
options->rep.auto_prefix_mode = auto_prefix_mode;
}

const void* rocksdb_options_table_prefix_extractor() {
return &dollar_percent_delimited_transform;
}

}
15 changes: 15 additions & 0 deletions vendored/rocksdb-haskell/cpp/chainweb-rocksdb.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#pragma once

#include "rocksdb/c.h"

extern ROCKSDB_LIBRARY_API void rocksdb_delete_range(rocksdb_t* db,
const rocksdb_writeoptions_t* options,
const char* start_key, size_t start_key_len,
const char* end_key, size_t end_key_len,
char** errptr);

extern ROCKSDB_LIBRARY_API void rocksdb_readoptions_set_auto_prefix_mode(
rocksdb_readoptions_t* options, int auto_prefix_mode);

extern ROCKSDB_LIBRARY_API void* rocksdb_options_table_prefix_extractor(
char *delims, int delimsLen);
Binary file removed vendored/rocksdb-haskell/rocksdb-6.29.3.tar.gz
Binary file not shown.
72 changes: 72 additions & 0 deletions vendored/rocksdb-haskell/rocksdb-6.29.3/cache/cache.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// 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.

#include "rocksdb/cache.h"

#include "cache/lru_cache.h"
#include "rocksdb/secondary_cache.h"
#include "rocksdb/utilities/customizable_util.h"
#include "rocksdb/utilities/options_type.h"
#include "util/string_util.h"

namespace ROCKSDB_NAMESPACE {
#ifndef ROCKSDB_LITE
static std::unordered_map<std::string, OptionTypeInfo>
lru_cache_options_type_info = {
{"capacity",
{offsetof(struct LRUCacheOptions, capacity), OptionType::kSizeT,
OptionVerificationType::kNormal, OptionTypeFlags::kMutable}},
{"num_shard_bits",
{offsetof(struct LRUCacheOptions, num_shard_bits), OptionType::kInt,
OptionVerificationType::kNormal, OptionTypeFlags::kMutable}},
{"strict_capacity_limit",
{offsetof(struct LRUCacheOptions, strict_capacity_limit),
OptionType::kBoolean, OptionVerificationType::kNormal,
OptionTypeFlags::kMutable}},
{"high_pri_pool_ratio",
{offsetof(struct LRUCacheOptions, high_pri_pool_ratio),
OptionType::kDouble, OptionVerificationType::kNormal,
OptionTypeFlags::kMutable}},
};
#endif // ROCKSDB_LITE

Status SecondaryCache::CreateFromString(
const ConfigOptions& config_options, const std::string& value,
std::shared_ptr<SecondaryCache>* result) {
return LoadSharedObject<SecondaryCache>(config_options, value, nullptr,
result);
}

Status Cache::CreateFromString(const ConfigOptions& config_options,
const std::string& value,
std::shared_ptr<Cache>* result) {
Status status;
std::shared_ptr<Cache> cache;
if (value.find('=') == std::string::npos) {
cache = NewLRUCache(ParseSizeT(value));
} else {
#ifndef ROCKSDB_LITE
LRUCacheOptions cache_opts;
status = OptionTypeInfo::ParseStruct(config_options, "",
&lru_cache_options_type_info, "",
value, &cache_opts);
if (status.ok()) {
cache = NewLRUCache(cache_opts);
}
#else
(void)config_options;
status = Status::NotSupported("Cannot load cache in LITE mode ", value);
#endif //! ROCKSDB_LITE
}
if (status.ok()) {
result->swap(cache);
}
return status;
}
} // namespace ROCKSDB_NAMESPACE
Loading

0 comments on commit cda088d

Please sign in to comment.