From 5031178cea265e4cffdca6230166f7862c23dc70 Mon Sep 17 00:00:00 2001 From: Elliott Neil Clark Date: Tue, 5 Nov 2013 13:53:52 -0800 Subject: [PATCH] Setup C api for HBase client Created scripts to download third party libs Created CMake script to create libhbase-async Created CMake script to create libhbase-sync Created .h file for hbase types Created .h file for hbase client Created start of C externs Created start of the C++ classes for HBase client. Change-Id: I371c7231408b9014c37de73939bff4c6a3415595 --- .gitignore | 38 +++++++++++ .ycm_extra_conf.py | 92 +++++++++++++++++++++++++ CMakeLists.txt | 153 ++++++++++++++++++++++++++++++++++++++++++ README.md | 8 +++ bin/build-all.sh | 41 +++++++++++ bin/build-thirdparty.sh | 64 ++++++++++++++++++ bin/download-thirdparty.sh | 61 +++++++++++++++++ bin/hbase-client-env.sh | 47 +++++++++++++ cmake_modules/FindGTest.cmake | 36 ++++++++++ cmake_modules/FindLibEv.cmake | 30 +++++++++ src/async/CMakeLists.txt | 27 ++++++++ src/async/get-test.cc | 58 ++++++++++++++++ src/async/hbase_admin.cc | 55 +++++++++++++++ src/async/hbase_admin.h | 97 ++++++++++++++++++++++++++ src/async/hbase_client.cc | 46 +++++++++++++ src/async/hbase_client.h | 70 +++++++++++++++++++ src/async/hbase_connection.cc | 41 +++++++++++ src/async/hbase_connection.h | 55 +++++++++++++++ src/async/hbase_errno.h | 23 +++++++ src/async/hbase_get.cc | 61 +++++++++++++++++ src/async/hbase_get.h | 73 ++++++++++++++++++++ src/async/hbase_mutations.cc | 110 ++++++++++++++++++++++++++++++ src/async/hbase_mutations.h | 119 ++++++++++++++++++++++++++++++++ src/async/hbase_result.cc | 37 ++++++++++ src/async/hbase_result.h | 44 ++++++++++++ src/async/hbase_scanner.cc | 59 ++++++++++++++++ src/async/hbase_scanner.h | 80 ++++++++++++++++++++++ src/async/mutations-test.cc | 102 ++++++++++++++++++++++++++++ src/core/CMakeLists.txt | 24 +++++++ src/core/admin.cc | 20 ++++++ src/core/admin.h | 25 +++++++ src/core/client.cc | 20 ++++++ src/core/client.h | 25 +++++++ src/core/connection.cc | 22 ++++++ src/core/connection.h | 26 +++++++ src/core/get.cc | 20 ++++++ src/core/get.h | 26 +++++++ src/core/hbase_macros.h | 60 +++++++++++++++++ src/core/hbase_types.h | 82 ++++++++++++++++++++++ src/core/mutation.cc | 42 ++++++++++++ src/core/mutation.h | 48 +++++++++++++ src/core/put.cc | 22 ++++++ src/core/put.h | 29 ++++++++ src/core/scanner.cc | 20 ++++++ src/core/scanner.h | 25 +++++++ src/rpc/CMakeLists.txt | 0 src/sync/CMakeLists.txt | 18 +++++ src/sync/hbase_admin.cc | 51 ++++++++++++++ src/sync/hbase_admin.h | 63 +++++++++++++++++ 49 files changed, 2395 insertions(+) create mode 100644 .gitignore create mode 100644 .ycm_extra_conf.py create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100755 bin/build-all.sh create mode 100755 bin/build-thirdparty.sh create mode 100755 bin/download-thirdparty.sh create mode 100644 bin/hbase-client-env.sh create mode 100644 cmake_modules/FindGTest.cmake create mode 100644 cmake_modules/FindLibEv.cmake create mode 100644 src/async/CMakeLists.txt create mode 100644 src/async/get-test.cc create mode 100644 src/async/hbase_admin.cc create mode 100644 src/async/hbase_admin.h create mode 100644 src/async/hbase_client.cc create mode 100644 src/async/hbase_client.h create mode 100644 src/async/hbase_connection.cc create mode 100644 src/async/hbase_connection.h create mode 100644 src/async/hbase_errno.h create mode 100644 src/async/hbase_get.cc create mode 100644 src/async/hbase_get.h create mode 100644 src/async/hbase_mutations.cc create mode 100644 src/async/hbase_mutations.h create mode 100644 src/async/hbase_result.cc create mode 100644 src/async/hbase_result.h create mode 100644 src/async/hbase_scanner.cc create mode 100644 src/async/hbase_scanner.h create mode 100644 src/async/mutations-test.cc create mode 100644 src/core/CMakeLists.txt create mode 100644 src/core/admin.cc create mode 100644 src/core/admin.h create mode 100644 src/core/client.cc create mode 100644 src/core/client.h create mode 100644 src/core/connection.cc create mode 100644 src/core/connection.h create mode 100644 src/core/get.cc create mode 100644 src/core/get.h create mode 100644 src/core/hbase_macros.h create mode 100644 src/core/hbase_types.h create mode 100644 src/core/mutation.cc create mode 100644 src/core/mutation.h create mode 100644 src/core/put.cc create mode 100644 src/core/put.h create mode 100644 src/core/scanner.cc create mode 100644 src/core/scanner.h create mode 100644 src/rpc/CMakeLists.txt create mode 100644 src/sync/CMakeLists.txt create mode 100644 src/sync/hbase_admin.cc create mode 100644 src/sync/hbase_admin.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f14b3be --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# Compiled Object files +*.slo +*.lo +*.o + +# Compiled Dynamic libraries +*.so + +# Compiled Static libraries +*.lai +*.la +*.a + +#python +*.pyc + +# CMake Generated Files +CMakeCache.txt +CMakeFiles +Makefile +cmake_install.CMakeCache +cmake_install.cmake +install_manifest.txt +CTestTestfile.cmake +build +Testing + + + +# Thirdparty dirs + +thirdparty/glog-* +thirdparty/gtest-* +thirdparty/gtest +thirdparty/protobuf-* +thirdparty/libevent-* +thirdparty/libev-* +thirdparty/installed diff --git a/.ycm_extra_conf.py b/.ycm_extra_conf.py new file mode 100644 index 0000000..382742a --- /dev/null +++ b/.ycm_extra_conf.py @@ -0,0 +1,92 @@ +# This file is NOT licensed under the GPLv3, which is the license for the rest +# of YouCompleteMe. +# +# Here's the license text for this file: +# +# This is free and unencumbered software released into the public domain. +# +# Anyone is free to copy, modify, publish, use, compile, sell, or +# distribute this software, either in source code form or as a compiled +# binary, for any purpose, commercial or non-commercial, and by any +# means. +# +# In jurisdictions that recognize copyright laws, the author or authors +# of this software dedicate any and all copyright interest in the +# software to the public domain. We make this dedication for the benefit +# of the public at large and to the detriment of our heirs and +# successors. We intend this dedication to be an overt act of +# relinquishment in perpetuity of all present and future rights to this +# software under copyright law. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +# For more information, please refer to + +import os +import ycm_core + +# These are the compilation flags that will be used in case there's no +# compilation database set (by default, one is not set). +# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR. +flags = [ +'-Wall', +'-Wextra', +'-Werror', +'-std=c++11', +'-x', +'c++', +'-I', +'./src', +'-I', +'./thirdparty/installed/include/', +'-I', +'./thirdparty/gtest/include/', +] + +def DirectoryOfThisScript(): + return os.path.dirname( os.path.abspath( __file__ ) ) + + +def MakeRelativePathsInFlagsAbsolute( flags, working_directory ): + if not working_directory: + return list( flags ) + new_flags = [] + make_next_absolute = False + path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ] + for flag in flags: + new_flag = flag + + if make_next_absolute: + make_next_absolute = False + if not flag.startswith( '/' ): + new_flag = os.path.join( working_directory, flag ) + + for path_flag in path_flags: + if flag == path_flag: + make_next_absolute = True + break + + if flag.startswith( path_flag ): + path = flag[ len( path_flag ): ] + new_flag = path_flag + os.path.join( working_directory, path ) + break + + if new_flag: + new_flags.append( new_flag ) + return new_flags + + +def FlagsForFile( filename, **kwargs ): + relative_to = DirectoryOfThisScript() + final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to ) + + return { + 'flags': final_flags, + 'do_cache': True + } diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..be872df --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,153 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +cmake_minimum_required(VERSION 2.6) + +# generate CTest input files +enable_testing() + +# where to find cmake modules +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake_modules") + +# if no build build type is specified, default to debug builds +if (NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Debug) +endif(NOT CMAKE_BUILD_TYPE) + +STRING(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE) + +set(CXX_COMMON_FLAGS "-Wall -Wextra -std=c++11") +set(C_COMMON_FLAGS "-Wall -Wextra -std=c11") + +set(CXX_FLAGS_DEBUG "-ggdb -g") +set(C_FLAGS_DEBUG "-ggdb") + +set(CXX_FLAGS_FASTDEBUG "-ggdb -O1") +set(C_FLAGS_FASTDEBUG "-ggdb -O1") + +set(CXX_FLAGS_RELEASE "-O3 -g -DNDEBUG -Wno-strict-aliasing") +set(C_FLAGS_RELEASE "-O3 -g -DNDEBUG -Wno-strict-aliasing") + +# if no build build type is specified, default to debug builds +if (NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Debug) +endif(NOT CMAKE_BUILD_TYPE) + +string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE) + +# Set compile flags based on the build type. +message("Configured for ${CMAKE_BUILD_TYPE} build (set with cmake -DCMAKE_BUILD_TYPE={release,debug,...})") +if ("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG") + set(CMAKE_CXX_FLAGS ${CXX_FLAGS_DEBUG}) + set(CMAKE_C_FLAGS ${C_FLAGS_DEBUG}) +elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "FASTDEBUG") + set(CMAKE_CXX_FLAGS ${CXX_FLAGS_FASTDEBUG}) + set(CMAKE_C_FLAGS ${C_FLAGS_FASTDEBUG}) +elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RELEASE") + set(CMAKE_CXX_FLAGS ${CXX_FLAGS_RELEASE}) + set(CMAKE_C_FLAGS ${C_FLAGS_RELEASE}) +else() + message(FATAL_ERROR "Unknown build type: ${CMAKE_BUILD_TYPE}") +endif () + +set(CMAKE_CXX_FLAGS "${CXX_COMMON_FLAGS} ${CMAKE_CXX_FLAGS}") +set(CMAKE_C_FLAGS "${C_COMMON_FLAGS} ${CMAKE_C_FLAGS}") + + +# set compile output directory +string(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_LOWERCASE) +set(BUILD_OUTPUT_ROOT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build/${CMAKE_BUILD_TYPE_LOWERCASE}/") + +# Link build/latest to the current build directory, to avoid developers +# accidentally running the latest debug build when in fact they're building +# release builds. +file(MAKE_DIRECTORY ${BUILD_OUTPUT_ROOT_DIRECTORY}) +execute_process(COMMAND rm -f ${CMAKE_CURRENT_SOURCE_DIR}/build/latest) +execute_process(COMMAND ln -sf ${BUILD_OUTPUT_ROOT_DIRECTORY} + ${CMAKE_CURRENT_SOURCE_DIR}/build/latest) + +# where to put generated libraries +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}") +set(ARCHIVE_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}") +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}") + +# where to put generated binaries +set(EXECUTABLE_OUTPUT_PATH "${BUILD_OUTPUT_ROOT_DIRECTORY}") + +include_directories(src) + +##################### +# Third Party +##################### + +# find boost headers and libs +set(Boost_DEBUG TRUE) +set(Boost_USE_MULTITHREADED ON) +find_package(Boost REQUIRED COMPONENTS thread system-mt) +include_directories(${Boost_INCLUDE_DIRS}) + +find_package(Protobuf REQUIRED) +include_directories(${PROTOBUF_INCLUDE_DIRS}) +add_library(protobuf STATIC IMPORTED) +set_target_properties(protobuf PROPERTIES IMPORTED_LOCATION "${PROTOBUF_STATIC_LIBRARY}") + +find_package(LibEv REQUIRED) +include_directories(${LIBEV_INCLUDE_DIR}) +add_library(libev STATIC IMPORTED) + + +set(HBASE_LIBS + ${PROTOBUF} + ${LIBEV} + ${Boost_LIBRARIES} +) +######### +# Testing Config +######### + +# find GTest headers and libs +find_package(GTest REQUIRED) +include_directories(${GTEST_INCLUDE_DIR}) +add_library(gtest STATIC IMPORTED) +set_target_properties(gtest PROPERTIES IMPORTED_LOCATION "${GTEST_LIBS}") + +set(HBASE_TEST_LIBS ${HBASE_LIBS} ${GTEST_LIBS}) +set(HBASE_ASYNC_TEST_LIBS ${HBASE_LIBS} ${GTEST_LIBS} hbase-async) +set(HBASE_SYNC_TEST_LIBS ${HBASE_LIBS} ${GTEST_LIBS} hbase-sync) + +function(ADD_HBASE_ASYNC_TEST TEST_NAME) + add_executable(${TEST_NAME} ${TEST_NAME}.cc) + target_link_libraries(${TEST_NAME} ${HBASE_ASYNC_TEST_LIBS}) + add_test(${TEST_NAME} "${EXECUTABLE_OUTPUT_PATH}/${TEST_NAME}") +endfunction() + + +function(ADD_HBASE_SYNC_TEST TEST_NAME) + add_executable(${TEST_NAME} ${TEST_NAME}.cc) + target_link_libraries(${TEST_NAME} ${HBASE_ASYNC_TEST_LIBS}) + add_test(${TEST_NAME} "${EXECUTABLE_OUTPUT_PATH}/${TEST_NAME}") +endfunction() + + +##### +# Actual project definition +##### +add_subdirectory(src/async) +add_subdirectory(src/sync) + +add_subdirectory(src/core) +add_subdirectory(src/rpc) + + +add_library(hbase-async SHARED $ $) +add_library(hbase-sync SHARED $ $) diff --git a/README.md b/README.md new file mode 100644 index 0000000..bbf0895 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +hbase-native-client +=================== + +Native client for HBase 0.96 + +This is a C library that implements a +HBase client. It's thread safe and libEv +based. diff --git a/bin/build-all.sh b/bin/build-all.sh new file mode 100755 index 0000000..6d9cf1d --- /dev/null +++ b/bin/build-all.sh @@ -0,0 +1,41 @@ +#! /usr/bin/env bash +# +#/** +# * Copyright 2007 The Apache Software Foundation +# * +# * Licensed to the Apache Software Foundation (ASF) under one +# * or more contributor license agreements. See the NOTICE file +# * distributed with this work for additional information +# * regarding copyright ownership. The ASF licenses this file +# * to you under the Apache License, Version 2.0 (the +# * "License"); you may not use this file except in compliance +# * with the License. You may obtain a copy of the License at +# * +# * http://www.apache.org/licenses/LICENSE-2.0 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# */ + +set -e +set -x + +SOURCE="${BASH_SOURCE[0]}" +while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink + DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located +done +DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + +source ${DIR}/hbase-client-env.sh + +${DIR}/download-thirdparty.sh +${DIR}/build-thirdparty.sh +cd ${HBASE_DIR} +cmake . +make -j4 clean all +make test diff --git a/bin/build-thirdparty.sh b/bin/build-thirdparty.sh new file mode 100755 index 0000000..99fd3fb --- /dev/null +++ b/bin/build-thirdparty.sh @@ -0,0 +1,64 @@ +#! /usr/bin/env bash +# +#/** +# * Copyright 2007 The Apache Software Foundation +# * +# * Licensed to the Apache Software Foundation (ASF) under one +# * or more contributor license agreements. See the NOTICE file +# * distributed with this work for additional information +# * regarding copyright ownership. The ASF licenses this file +# * to you under the Apache License, Version 2.0 (the +# * "License"); you may not use this file except in compliance +# * with the License. You may obtain a copy of the License at +# * +# * http://www.apache.org/licenses/LICENSE-2.0 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# */ + +set -x +set -e + +SOURCE="${BASH_SOURCE[0]}" +while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink + DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located +done +DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + +source ${DIR}/../bin/hbase-client-env.sh + +# On some systems, autotools installs libraries to lib64 rather than lib. Fix +# this by setting up lib64 as a symlink to lib. We have to do this step first +# to handle cases where one third-party library depends on another. +mkdir -p "${HBASE_PREFIX}/lib" +cd ${HBASE_PREFIX} +ln -sf lib "${HBASE_PREFIX}/lib64" + +if [ ! -f gtest ]; then + cd ${HBASE_GTEST_DIR} + cmake . + make -j4 + cd .. + ln -sf ${HBASE_GTEST_DIR} gtest +fi + +if [ ! -f ${HBASE_PREFIX}/lib/libprotobuf.a ]; then + cd ${HBASE_PROTOBUF_DIR} + ./configure --with-pic --disable-shared --prefix=${HBASE_PREFIX} + make -j4 install +fi + +if [ ! -f ${HBASE_PREFIX}/lib/libev.a ]; then + cd ${HBASE_LIBEV_DIR} + ./configure --with-pic --disable-shared --prefix=${HBASE_PREFIX} + make -j4 install +fi + +echo "---------------------" +echo "Thirdparty dependencies built and installed into $HBASE_PREFIX successfully" diff --git a/bin/download-thirdparty.sh b/bin/download-thirdparty.sh new file mode 100755 index 0000000..c834486 --- /dev/null +++ b/bin/download-thirdparty.sh @@ -0,0 +1,61 @@ +#! /usr/bin/env bash +# +#/** +# * Copyright 2007 The Apache Software Foundation +# * +# * Licensed to the Apache Software Foundation (ASF) under one +# * or more contributor license agreements. See the NOTICE file +# * distributed with this work for additional information +# * regarding copyright ownership. The ASF licenses this file +# * to you under the Apache License, Version 2.0 (the +# * "License"); you may not use this file except in compliance +# * with the License. You may obtain a copy of the License at +# * +# * http://www.apache.org/licenses/LICENSE-2.0 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# */ + +set -x +set -e + +SOURCE="${BASH_SOURCE[0]}" +while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink + DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located +done +DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + +source ${DIR}/../bin/hbase-client-env.sh + +mkdir -p ${HBASE_TP_DIR} +cd ${HBASE_TP_DIR} + + +if [ ! -d ${HBASE_GTEST_DIR} ]; then + echo "Fetching gtest" + wget -c http://googletest.googlecode.com/files/gtest-${HBASE_GTEST_VERSION}.zip + unzip gtest-${HBASE_GTEST_VERSION}.zip + rm gtest-${HBASE_GTEST_VERSION}.zip +fi + +if [ ! -d ${HBASE_PROTOBUF_DIR} ]; then + echo "Fetching protobuf" + wget -c http://protobuf.googlecode.com/files/protobuf-${HBASE_PROTOBUF_VERSION}.tar.gz + tar xzf protobuf-${HBASE_PROTOBUF_VERSION}.tar.gz + rm protobuf-${HBASE_PROTOBUF_VERSION}.tar.gz +fi + +if [ ! -d $HBASE_LIBEV_DIR ]; then + echo "Fetching libev" + wget -c http://dist.schmorp.de/libev/libev-${HBASE_LIBEV_VERSION}.tar.gz + tar zxf libev-${HBASE_LIBEV_VERSION}.tar.gz + rm -rf libev-${HBASE_LIBEV_VERSION}.tar.gz +fi +echo "---------------" +echo "Thirdparty dependencies downloaded successfully" diff --git a/bin/hbase-client-env.sh b/bin/hbase-client-env.sh new file mode 100644 index 0000000..6b53e98 --- /dev/null +++ b/bin/hbase-client-env.sh @@ -0,0 +1,47 @@ +#! /usr/bin/env bash +# +#/** +# * Copyright 2007 The Apache Software Foundation +# * +# * Licensed to the Apache Software Foundation (ASF) under one +# * or more contributor license agreements. See the NOTICE file +# * distributed with this work for additional information +# * regarding copyright ownership. The ASF licenses this file +# * to you under the Apache License, Version 2.0 (the +# * "License"); you may not use this file except in compliance +# * with the License. You may obtain a copy of the License at +# * +# * http://www.apache.org/licenses/LICENSE-2.0 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# */ + +SOURCE="${BASH_SOURCE[0]}" +while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink + DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to + # resolve it relative to the path where + # the symlink file was located +done +DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" +HBASE_DIR="${DIR}/../" +HBASE_TP_DIR="${HBASE_DIR}/thirdparty/" + +HBASE_PREFIX=$HBASE_TP_DIR/installed + +HBASE_GTEST_VERSION=1.7.0 +HBASE_GTEST_DIR=$HBASE_TP_DIR/gtest-$HBASE_GTEST_VERSION + +HBASE_PROTOBUF_VERSION=2.5.0 +HBASE_PROTOBUF_DIR=$HBASE_TP_DIR/protobuf-$HBASE_PROTOBUF_VERSION + +HBASE_LIBEV_VERSION=4.15 +HBASE_LIBEV_DIR=$HBASE_TP_DIR/libev-$HBASE_LIBEV_VERSION + +# use the compiled tools +export PATH=$HBASE_PREFIX/bin:$PATH diff --git a/cmake_modules/FindGTest.cmake b/cmake_modules/FindGTest.cmake new file mode 100644 index 0000000..2d7e3e9 --- /dev/null +++ b/cmake_modules/FindGTest.cmake @@ -0,0 +1,36 @@ +set( GTEST_INCLUDE_SEARCH + ${CMAKE_SOURCE_DIR}/thirdparty/gtest/include +) + +set( GTEST_LIB_SEARCH + ${CMAKE_SOURCE_DIR}/thirdparty/gtest +) + +find_path(GTEST_INCLUDE + NAMES gtest/gtest.h + PATHS ${GTEST_INCLUDE_SEARCH} + NO_DEFAULT_PATH +) + +find_library(GTEST_LIBRARY + NAMES gtest + PATHS ${GTEST_LIB_SEARCH} + NO_DEFAULT_PATH +) + +find_library(GTEST_LIBRARY_MAIN + NAMES gtest_main + PATHS ${GTEST_LIB_SEARCH} + NO_DEFAULT_PATH +) + +if (GTEST_INCLUDE AND GTEST_LIBRARY AND GTEST_LIBRARY_MAIN) + set(GTEST_LIBS ${GTEST_LIBRARY} ${GTEST_LIBRARY_MAIN}) + set(GTEST_INCLUDE_DIR ${GTEST_INCLUDE}) + set(GTEST_FOUND TRUE) +endif() + +mark_as_advanced( + GTEST_INCLUDE_DIR + GTEST_LIBS +) diff --git a/cmake_modules/FindLibEv.cmake b/cmake_modules/FindLibEv.cmake new file mode 100644 index 0000000..f61a2a5 --- /dev/null +++ b/cmake_modules/FindLibEv.cmake @@ -0,0 +1,30 @@ +set( LIBEV_INCLUDE_SEARCH + ${CMAKE_SOURCE_DIR}/thirdparty/installed/include +) + +set( LIBEV_LIB_SEARCH + ${CMAKE_SOURCE_DIR}/thirdparty/installed/include +) + +find_path(LIBEV_INCLUDE + NAMES ev++.h + PATHS ${LIBEV_INCLUDE_SEARCH} + NO_DEFAULT_PATH +) + +find_library(LIBEV_LIBRARY + NAMES ev + PATHS ${LIBEV_LIB_SEARCH} + NO_DEFAULT_PATH +) + +if (LIBEV_INCLUDE_PATH AND LIBEV_LIBRARY) + set(LIBEV_LIBS ${LIBEV_LIBRARY}) + set(LIBEV_INCLUDE_DIR ${LIBEV_INCLUDE}) + set(LIBEV_FOUND TRUE) +endif() + +mark_as_advanced( + LIBEV_INCLUDE_DIR + LIBEV_LIBS +) diff --git a/src/async/CMakeLists.txt b/src/async/CMakeLists.txt new file mode 100644 index 0000000..c11537c --- /dev/null +++ b/src/async/CMakeLists.txt @@ -0,0 +1,27 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set( ASYNC_SRC + hbase_admin.cc + hbase_client.cc + hbase_connection.cc + hbase_get.cc + hbase_mutations.cc + hbase_result.cc + hbase_scanner.cc +) + + +add_library(hasync OBJECT ${ASYNC_SRC}) + +ADD_HBASE_ASYNC_TEST(mutations-test) +ADD_HBASE_ASYNC_TEST(get-test) diff --git a/src/async/get-test.cc b/src/async/get-test.cc new file mode 100644 index 0000000..4d64d00 --- /dev/null +++ b/src/async/get-test.cc @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "gtest/gtest.h" +#include "async/hbase_get.h" +#include "async/hbase_client.h" +#include + + +pthread_cond_t cv; +pthread_mutex_t mutex; + +TEST(GetTest, TestPut) { + char tn[] = "T1"; + hb_byte_t row[] = "ROW"; + + hb_client_t client = NULL; + hb_get_t get = NULL; + int32_t s1 = -1; + + pthread_cond_init(&cv, NULL); + pthread_mutex_init(&mutex, NULL); + + s1 = hb_client_create(&client); + EXPECT_EQ(0, s1); + + s1 = hb_get_create(&get); + EXPECT_EQ(0, s1); + + hb_get_set_table(get, tn, 2); + hb_get_set_row(get, row, 3); + + /* + * TODO: + * This is currently a NO-OP as there is no CB. + */ + hb_get_send(client, get, NULL, NULL); + + hb_client_destroy(client, NULL, NULL); + + EXPECT_EQ(0, s1); +} diff --git a/src/async/hbase_admin.cc b/src/async/hbase_admin.cc new file mode 100644 index 0000000..d95f622 --- /dev/null +++ b/src/async/hbase_admin.cc @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "async/hbase_admin.h" + +#include +#include + +#include "core/admin.h" + +int32_t hb_admin_create(hb_admin_t* admin_ptr) { + (*admin_ptr) = reinterpret_cast(new Admin()); + return 0; +} + +/* + * Disconnect the admin releasing any internal objects + * or connections created in the background. + */ +int32_t hb_admin_destroy(hb_admin_t admin, + hb_admin_disconnection_cb cb, void * extra) { + if (cb) + cb(0, admin, extra); + free(admin); + return 0; +} + +/* + * See if a table exists. + */ +int32_t hb_admin_table_exists(hb_admin_t admin, + char * name_space, size_t name_space_length, + char * table, size_t table_length, + hb_admin_table_exists_cb cb, void * extra) { + if (cb) + cb(0, admin, name_space, name_space_length, + table, table_length, true, extra); + return 0; +} diff --git a/src/async/hbase_admin.h b/src/async/hbase_admin.h new file mode 100644 index 0000000..513051c --- /dev/null +++ b/src/async/hbase_admin.h @@ -0,0 +1,97 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef HBASE_ADMIN_H_ +#define HBASE_ADMIN_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#include "core/hbase_macros.h" +#include "async/hbase_connection.h" + + +typedef void (* hb_admin_disconnection_cb)( int32_t status, + hb_admin_t admin, void * extra); +typedef void (* hb_admin_table_exists_cb)(int32_t status, hb_admin_t admin, + char * name_space, size_t name_space_length, + char * table, size_t table_length, bool exsists, void * extra); + +/** + * Create a new hb_admin. + * All fields are initialized to the defaults. If you want to set + * connection or other properties, set those before calling any + * RPC functions. + */ +HBASE_API int32_t hb_admin_create(hb_admin_t* admin_ptr); + +/** + * Set the connection of an hb_admin. This will allow + * an hb_client and an hb_admin to share the same zookeeper + * connection. + * + * For example: + * + * hb_client client = NULL; + * hb_admin admin = NULL; + * hb_connection connection = NULL; + * + * hb_client_create(&client); + * hb_admin_create(&admin); + * hb_connection_create(&connection); + * + * hb_connection_set_zk_quorum(connection, "zk.test.com:2181"); + * + * hb_client_set_connection(client, connection); + * hb_admin_set_connection(admin, connection); + * hb_admin_table_exists(admin, "test", 4, "default", 7, cb, NULL); + */ +HBASE_API int32_t hb_admin_set_connection(hb_admin_t admin, + hb_connection_t connection); + +/** + * Get the current connection from an hb_admin_t + */ +HBASE_API int32_t hb_admin_get_connection(hb_admin_t admin, + hb_connection_t * connection /* Out Pointer. */); +/* + * Disconnect the admin releasing any internal objects + * or connections created in the background. + */ +HBASE_API int32_t hb_admin_destroy(hb_admin_t admin, + hb_admin_disconnection_cb cb, void * extra); + +/* + * See if a table exists. + */ +HBASE_API int32_t hb_admin_table_exists(hb_admin_t admin, + char * name_space, size_t name_space_length, + char * table, size_t table_length, + hb_admin_table_exists_cb cb, void * extra); + + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // HBASE_ADMIN_H_ diff --git a/src/async/hbase_client.cc b/src/async/hbase_client.cc new file mode 100644 index 0000000..4a982c2 --- /dev/null +++ b/src/async/hbase_client.cc @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "async/hbase_client.h" + +#include +#include +#include + +#include "core/client.h" + + +int32_t hb_client_create(hb_client_t* client_ptr) { + (*client_ptr) = reinterpret_cast(new Client()); + if (client_ptr == NULL) + return -1; // TODO(eclark): setup the errno file. + return 0; +} + +int32_t hb_client_destroy(hb_client_t client, + hb_client_disconnection_cb cb, void * extra) { + if (client == NULL) + return -2; + if (cb) { + cb(0, client, extra); + } + free(client); + return 0; +} + diff --git a/src/async/hbase_client.h b/src/async/hbase_client.h new file mode 100644 index 0000000..2256dab --- /dev/null +++ b/src/async/hbase_client.h @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef HBASE_CLIENT_H_ +#define HBASE_CLIENT_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "core/hbase_macros.h" +#include "core/hbase_types.h" + +/* + * Client disconnection callback typedef + * + * This is called after the connections are closed, but just + * before the client is freed. + */ +typedef void (* hb_client_disconnection_cb)( int32_t status, + hb_client_t client, void * extra); + +/** + * Create an hb_client_t. + * All settings start out as default. + * Set all settings that are needed before sending any requests. + */ +HBASE_API int32_t hb_client_create(hb_client_t * client_ptr); + +/** + * Set the current connection. + */ +HBASE_API int32_t hb_client_set_connection(hb_client_t client, + hb_connection_t connection); + +/** + * Get the connection from a client. + */ +HBASE_API int32_t hb_client_get_connection(hb_client_t client, + hb_connection_t * connection /* Out Pointer. */); +/* + * Disconnect the client releasing any internal objects + * or connections created in the background. + */ +HBASE_API int32_t hb_client_destroy(hb_client_t client, + hb_client_disconnection_cb cb, void * extra); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // HBASE_CLIENT_H_ + + diff --git a/src/async/hbase_connection.cc b/src/async/hbase_connection.cc new file mode 100644 index 0000000..1c5fe02 --- /dev/null +++ b/src/async/hbase_connection.cc @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "async/hbase_connection.h" + +#include "core/connection.h" +#include "core/hbase_types.h" + +extern "C" { +int32_t hb_connection_create(hb_connection_t * connection_ptr) { + (*connection_ptr) = reinterpret_cast(new Connection()); + if ((*connection_ptr) == NULL) + return -1; + return 0; +} +int32_t hb_connection_destroy(hb_connection_t connection) { + free(connection); + return 0; +} + +int32_t hb_connection_set_zk_quorum(hb_connection_t connection, + char * zk_quorum) { + return 0; +} +} // extern "C" diff --git a/src/async/hbase_connection.h b/src/async/hbase_connection.h new file mode 100644 index 0000000..e8646bd --- /dev/null +++ b/src/async/hbase_connection.h @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef HBASE_CONNECTION_H_ +#define HBASE_CONNECTION_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "core/hbase_macros.h" +#include "core/hbase_types.h" + +#include + +/** + * Create an hb_connection. + * This is useful if you have a different zk quorum. + */ +HBASE_API int32_t hb_connection_create(hb_connection_t * connection_ptr); +/** + * Destroy the connection and free all resources allocated at creation + * time. + */ +HBASE_API int32_t hb_connection_destroy(hb_connection_t connection); + +/** + * Set the zk quorum of a connection. This should only be done before + * the connection is first used. + */ +HBASE_API int32_t hb_connection_set_zk_quorum(hb_connection_t connection, + char * zk_quorum); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // HBASE_CONNECTION_H_ + diff --git a/src/async/hbase_errno.h b/src/async/hbase_errno.h new file mode 100644 index 0000000..9354992 --- /dev/null +++ b/src/async/hbase_errno.h @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef HBASE_ERRNO_H_ +#define HBASE_ERRNO_H_ + +#endif // HBASE_ERRNO_H_ diff --git a/src/async/hbase_get.cc b/src/async/hbase_get.cc new file mode 100644 index 0000000..32048d8 --- /dev/null +++ b/src/async/hbase_get.cc @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "async/hbase_get.h" + +#include +#include + +#include "core/get.h" + +int32_t hb_get_create(hb_get_t * get_ptr) { + (*get_ptr) = reinterpret_cast(new Get()); + if ((*get_ptr) == NULL) { + return -1; + } + return 0; +} + +int32_t hb_get_destroy(hb_get_t get) { + free(get); + return 0; +} + +int32_t hb_get_set_row(hb_get_t get, unsigned char * row, + size_t row_length) { + return 0; +} + +int32_t hb_get_set_table(hb_get_t get, + char * table, size_t table_length) { + return 0; +} + +int32_t hb_get_set_namespace(hb_get_t get, + char * name_space, size_t name_space_length) { + return 0; +} + +int32_t hb_get_send(hb_client_t client, + hb_get_t get, hb_get_cb cb, void * extra) { + if (cb) { + cb(0, client, get, NULL, extra); + } + return 0; +} diff --git a/src/async/hbase_get.h b/src/async/hbase_get.h new file mode 100644 index 0000000..b90fab6 --- /dev/null +++ b/src/async/hbase_get.h @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef HBASE_GET_H_ +#define HBASE_GET_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "core/hbase_macros.h" +#include "core/hbase_types.h" + +/** + * Allocate a new get structure. + * Ownership passes to the caller. + */ +HBASE_API int32_t hb_get_create(hb_get_t * get_ptr); + +/** + * Destroy and free a get structure. + */ +HBASE_API int32_t hb_get_destroy(hb_get_t get); + +/** + * set the row of this get. + */ +HBASE_API int32_t hb_get_set_row(hb_get_t get, hb_byte_t * row, + size_t row_length); + +/** + * Set the table. + */ +HBASE_API int32_t hb_get_set_table(hb_get_t get, + char * table, size_t table_length); + +/** + * Set the namespace this get is targeting. + */ +HBASE_API int32_t hb_get_set_namespace(hb_get_t get, + char * name_space, size_t name_space_length); + +/* + * get call back typedef. + */ +typedef void (* hb_get_cb)(int32_t status, hb_client_t client, + hb_get_t get, hb_result_t results, void * extra); + +HBASE_API int32_t hb_get_send(hb_client_t client, + hb_get_t get, hb_get_cb cb, void * extra); + + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // HBASE_GET_H_ diff --git a/src/async/hbase_mutations.cc b/src/async/hbase_mutations.cc new file mode 100644 index 0000000..936e962 --- /dev/null +++ b/src/async/hbase_mutations.cc @@ -0,0 +1,110 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "async/hbase_mutations.h" + +#include + +#include "core/hbase_types.h" +#include "core/mutation.h" +#include "core/put.h" + +#include "async/hbase_result.h" + +extern "C" { +int32_t hb_put_create(hb_put_t* put_ptr) { + (*put_ptr) = reinterpret_cast(new Put()); + return 0; +} + +int32_t hb_delete_create(hb_delete_t * delete_ptr) { + //(*delete_ptr) = reinterpret_cast(new Delete()); + return 0; +} + +int32_t hb_increment_create(hb_increment_t * increment_ptr) { + return 0; +} + +int32_t hb_append_create(hb_append_t * append_ptr) { + return 0; +} + +int32_t hb_mutation_destroy(hb_mutation_t mutation) { + return 0; +} + +HBASE_API int32_t hb_mutation_set_namespace(hb_mutation_t mutation, + char * name_space, size_t name_space_length) { + Mutation * m = reinterpret_cast(mutation); + m->set_namespace(name_space, name_space_length); + return 0; +} + +HBASE_API int32_t hb_mutation_set_table(hb_mutation_t mutation, + char * table, size_t table_length) { + Mutation * m = reinterpret_cast(mutation); + m->set_namespace(table, table_length); + return 0; +} + +int32_t hb_mutation_set_row(hb_mutation_t mutation, + unsigned char * rk, size_t row_length) { + Mutation * m = reinterpret_cast(mutation); + m->set_row(rk, row_length); + return 0; +} + +int32_t hb_mutation_set_durability(hb_mutation_t mutation, + hb_durability_type durability) { + Mutation * m = reinterpret_cast(mutation); + m->set_durability(durability); + return 0; +} + +int32_t hb_put_add_cell(hb_put_t put, hb_cell_t * cell) { + return 0; +} + +int32_t hb_delete_add_col(hb_increment_t incr, + unsigned char * family, size_t family_length, + unsigned char * qual, size_t qual_length) { + return 0; +} + +int32_t hb_increment_add_value(hb_increment_t incr, + unsigned char * family, size_t family_length, + unsigned char * qual, size_t qual_length, + int64_t ammount) { + return 0; +} + +int32_t hb_append_add_cell(hb_append_t put, hb_cell_t * cell) { + return 0; +} + +int32_t hb_mutation_send(hb_client_t client, + hb_mutation_t mutation, hb_mutation_cb cb, + void * extra) { + if (cb) { + cb(0, client, mutation, NULL, extra); + } + return 0; +} +} // extern "C" diff --git a/src/async/hbase_mutations.h b/src/async/hbase_mutations.h new file mode 100644 index 0000000..e2cdc79 --- /dev/null +++ b/src/async/hbase_mutations.h @@ -0,0 +1,119 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef HBASE_MUTATIONS_H_ +#define HBASE_MUTATIONS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "core/hbase_types.h" +#include "async/hbase_result.h" + +// Creation methods + +/** + * Create a put. + * Ownership passes to the caller. + */ +HBASE_API int32_t hb_put_create(hb_put_t * put_ptr); + +/** + * Create a delete + * Ownership passes to the caller. + */ +HBASE_API int32_t hb_delete_create(hb_delete_t * delete_ptr); + +/** + * Create an increment + * Ownership passes to the caller. + */ +HBASE_API int32_t hb_increment_create(hb_increment_t * increment_ptr); + +/** + * Create an append + * Ownership passes to the caller. + */ +HBASE_API int32_t hb_append_create(hb_append_t * append_ptr); + +/** + * Destroy the mutation. + * All internal structures are cleaned up. However any backing + * data structures passed in by the user are not cleaned up. + */ +HBASE_API int32_t hb_mutation_destroy(hb_mutation_t mutation); + +// Shared setters. +HBASE_API int32_t hb_mutation_set_namespace(hb_mutation_t mutation, + char * name_space, size_t name_space_length); +HBASE_API int32_t hb_mutation_set_table(hb_mutation_t mutation, + char * table, size_t table_length); +HBASE_API int32_t hb_mutation_set_row(hb_mutation_t mutation, + unsigned char * rk, size_t row_length); +HBASE_API int32_t hb_mutation_set_durability(hb_mutation_t mutation, + hb_durability_type durability); + +// Put Setters etc. +HBASE_API int32_t hb_put_add_cell(hb_put_t put, hb_cell_t * cell); + +// Delete +HBASE_API int32_t hb_delete_add_col(hb_increment_t incr, + unsigned char * family, size_t family_length, + unsigned char * qual, size_t qual_length); + +// Increment +HBASE_API int32_t hb_increment_add_value(hb_increment_t incr, + unsigned char * family, size_t family_length, + unsigned char * qual, size_t qual_length, + int64_t ammount); + +// Append +HBASE_API int32_t hb_append_add_cell(hb_append_t put, hb_cell_t * cell); + +// Now that the mutations are created and populated +// The real meat of the client is below. + +/* + * mutation call back typedef + */ +typedef void (* hb_mutation_cb)(int32_t status, + hb_client_t client, hb_mutation_t mutation, + hb_result_t result, void * extra); + +/* + * Queue a single mutation. This mutation will be + * sent out in the background and can be batched with + * other requests destined for the same server. + * + * The call back will be executed after the response + * is received from the RegionServer. Even if the + * mutation was batched with other requests, + * the call back will be invoked for every mutation + * individually. + */ +HBASE_API int32_t hb_mutation_send(hb_client_t client, + hb_mutation_t mutation, hb_mutation_cb cb, + void * extra); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // HBASE_MUTATIONS_H_ diff --git a/src/async/hbase_result.cc b/src/async/hbase_result.cc new file mode 100644 index 0000000..9351270 --- /dev/null +++ b/src/async/hbase_result.cc @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "async/hbase_result.h" + +#include "core/hbase_types.h" + +int32_t hb_result_get_cells(hb_result_t result, + hb_cell_t ** cell_ptr, size_t * num_cells) { + return 0; +} + +int32_t hb_result_get_table(hb_result_t result, + char ** table, size_t * table_length) { + return 0; +} + +int32_t hb_result_get_namespace(hb_result_t result, + char ** name_space, size_t * name_space_length) { + return 0; +} diff --git a/src/async/hbase_result.h b/src/async/hbase_result.h new file mode 100644 index 0000000..6597de8 --- /dev/null +++ b/src/async/hbase_result.h @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef HBASE_RESULT_H_ +#define HBASE_RESULT_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "core/hbase_macros.h" +#include "core/hbase_types.h" + +HBASE_API int32_t hb_result_destroy(hb_result_t result); + +HBASE_API int32_t hb_result_get_cells(hb_result_t result, + hb_cell_t ** cell_ptr, size_t * num_cells); + +HBASE_API int32_t hb_result_get_table(hb_result_t result, + char ** table, size_t * table_length); +HBASE_API int32_t hb_result_get_namespace(hb_result_t result, + char ** name_space, size_t * name_space_length); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // HBASE_RESULT_H_ diff --git a/src/async/hbase_scanner.cc b/src/async/hbase_scanner.cc new file mode 100644 index 0000000..5a8e555 --- /dev/null +++ b/src/async/hbase_scanner.cc @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include "async/hbase_scanner.h" + +#include + +#include "core/hbase_types.h" +#include "core/scanner.h" + +int32_t hb_scanner_create(hb_scanner_t * scanner_ptr) { + (*scanner_ptr) = reinterpret_cast(new Scanner()); + return (*scanner_ptr != NULL)?0:1; +} + +HBASE_API int32_t hb_scanner_set_table(hb_scanner_t scanner, + char * table, size_t table_length) { + return 0; +} + +HBASE_API int32_t hb_scanner_set_namespace(hb_scanner_t scanner, + char * name_space, size_t name_space_length) { + return 0; +} + +int32_t hb_scanner_set_start_row(hb_scanner_t scanner, + unsigned char * start_row, size_t start_row_length) { + return 0; +} + +int32_t hb_scanner_set_end_row(hb_scanner_t scanner, + unsigned char * end_row, size_t end_row_length) { + return 0; +} + +int32_t hb_scanner_set_cache_size(hb_scanner_t scanner, + size_t cache_size) { + return 0; +} + +int32_t hb_scanner_set_num_versions(hb_scanner_t scanner, + int8_t num_versions) { + return 0; +} diff --git a/src/async/hbase_scanner.h b/src/async/hbase_scanner.h new file mode 100644 index 0000000..0f1f2b6 --- /dev/null +++ b/src/async/hbase_scanner.h @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef HBASE_SCANNER_H_ +#define HBASE_SCANNER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "async/hbase_result.h" +#include "core/hbase_types.h" + +HBASE_API int32_t hb_scanner_create(hb_scanner_t * scanner_ptr); + +HBASE_API int32_t hb_scanner_set_table(hb_scanner_t scanner, + char * table, size_t table_length); +HBASE_API int32_t hb_scanner_set_namespace(hb_scanner_t scanner, + char * name_space, size_t name_space_length); + +HBASE_API int32_t hb_scanner_set_start_row(hb_scanner_t scanner, + unsigned char * start_row, size_t start_row_length); +HBASE_API int32_t hb_scanner_set_end_row(hb_scanner_t scanner, + unsigned char * end_row, size_t end_row_length); + +HBASE_API int32_t hb_scanner_set_cache_size(hb_scanner_t scanner, + size_t cache_size); +HBASE_API int32_t hb_scanner_set_batch_size(hb_scanner_t scanner, + size_t batch_size); +HBASE_API int32_t hb_scanner_set_num_versions(hb_scanner_t scanner, + int8_t num_versions); + +/* + * Scanner call back typedef. + * + * This will be called when initinalization of the scanner + * is complete. It will also be called when scanner next + * returns results. + */ +typedef void (* hb_scanner_cb)(int32_t status, + hb_client_t client, + hb_scanner_t scanner, + hb_result_t results, + size_t num_results, + void * extra); +/* + * Get the next results from the scanner + */ +HBASE_API int32_t hb_scanner_next(hb_client_t client, + hb_scanner_t scanner, hb_scanner_cb cb, void * extra); + +/* + * Close the scanner releasing any local and server side + * resources held. The call back is fired just before the + * scanner's memory is freed. + */ +HBASE_API int32_t hb_scanner_destroy(hb_client_t client, + hb_scanner_t scanner, hb_scanner_cb cb, void * extra); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // HBASE_SCANNER_H_ diff --git a/src/async/mutations-test.cc b/src/async/mutations-test.cc new file mode 100644 index 0000000..83d7180 --- /dev/null +++ b/src/async/mutations-test.cc @@ -0,0 +1,102 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "gtest/gtest.h" +#include "async/hbase_mutations.h" +#include "async/hbase_client.h" +#include + + +pthread_cond_t cv; +pthread_mutex_t mutex; + +bool sent = false; + +TEST(ClientTest, EasyTest) { + EXPECT_EQ(1, 1); +} + +void mutate_cb(int32_t status, + hb_client_t client, hb_mutation_t mutation, + hb_result_t result, void * extra) { + + // Test Stuff. + EXPECT_EQ(status, 0); + EXPECT_TRUE(client != NULL); + EXPECT_TRUE(mutation != NULL); + + pthread_mutex_lock(&mutex); + sent = true; + pthread_cond_signal(&cv); + pthread_mutex_unlock(&mutex); +} + +void wait_send() { + pthread_mutex_lock(&mutex); + while (!sent) { + pthread_cond_wait(&cv, &mutex); + } + pthread_mutex_unlock(&mutex); +} + +TEST(MutationTest, TestPut) { + char tn[] = "T1"; + hb_byte_t row[] = "ROW"; + char fam[] = "D"; + hb_byte_t qual[] = "QUAL"; + hb_byte_t data[] = "Z"; + + hb_client_t client = NULL; + hb_put_t put = NULL; + hb_cell_t cell; + + cell.family = fam; + cell.family_length = 1; + + cell.qual = qual; + cell.qual_length = 4; + + cell.value = data; + cell.value_length = 1; + + int32_t status = -1; + + status = hb_client_create(&client); + EXPECT_EQ(0, status); + + hb_put_create(&put); + hb_mutation_set_table((hb_mutation_t) put, tn, 2); + hb_mutation_set_row((hb_mutation_t) put, row, 3); + hb_put_add_cell(put, &cell); + + pthread_cond_init(&cv, NULL); + pthread_mutex_init(&mutex, NULL); + + status = hb_mutation_send(client, (hb_mutation_t) put, &mutate_cb, NULL); + EXPECT_EQ(0, status); + + // Now wait a while for things to send. + wait_send(); + EXPECT_EQ(true, sent); + + hb_mutation_destroy((hb_mutation_t *) put); + hb_client_destroy(client, NULL, NULL); + + EXPECT_EQ(0, status); +} diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt new file mode 100644 index 0000000..317a881 --- /dev/null +++ b/src/core/CMakeLists.txt @@ -0,0 +1,24 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set( CORE_SRC + admin.cc + client.cc + connection.cc + get.cc + mutation.cc + put.cc + scanner.cc +) + + +add_library(hcore OBJECT ${CORE_SRC}) diff --git a/src/core/admin.cc b/src/core/admin.cc new file mode 100644 index 0000000..897e6bf --- /dev/null +++ b/src/core/admin.cc @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "core/admin.h" diff --git a/src/core/admin.h b/src/core/admin.h new file mode 100644 index 0000000..35ae1f2 --- /dev/null +++ b/src/core/admin.h @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef CLIENT_ADMIN_H_ +#define CLIENT_ADMIN_H_ + +class Admin { +}; +#endif // CLIENT_ADMIN_H_ diff --git a/src/core/client.cc b/src/core/client.cc new file mode 100644 index 0000000..91c235c --- /dev/null +++ b/src/core/client.cc @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "core/client.h" diff --git a/src/core/client.h b/src/core/client.h new file mode 100644 index 0000000..328ddc1 --- /dev/null +++ b/src/core/client.h @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef CLIENT_CLIENT_H_ +#define CLIENT_CLIENT_H_ + +class Client { +}; +#endif // CLIENT_CLIENT_H_ diff --git a/src/core/connection.cc b/src/core/connection.cc new file mode 100644 index 0000000..099f31d --- /dev/null +++ b/src/core/connection.cc @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "core/connection.h" + +void Connection::set_zk_quorum(char * zk_q) { + this->zk_quorum = zk_q; +} diff --git a/src/core/connection.h b/src/core/connection.h new file mode 100644 index 0000000..283c348 --- /dev/null +++ b/src/core/connection.h @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef CLIENT_CONNECTION_H_ +#define CLIENT_CONNECTION_H_ + +class Connection { + char * zk_quorum; + public: + void set_zk_quorum(char * zk_q); +}; +#endif // CLIENT_CONNECTION_H_ diff --git a/src/core/get.cc b/src/core/get.cc new file mode 100644 index 0000000..9e11332 --- /dev/null +++ b/src/core/get.cc @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "core/get.h" diff --git a/src/core/get.h b/src/core/get.h new file mode 100644 index 0000000..2f71980 --- /dev/null +++ b/src/core/get.h @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef CLIENT_GET_H_ +#define CLIENT_GET_H_ + +class Get { +}; + +#endif // CLIENT_GET_H_ diff --git a/src/core/hbase_macros.h b/src/core/hbase_macros.h new file mode 100644 index 0000000..4f335f5 --- /dev/null +++ b/src/core/hbase_macros.h @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef HBASE_MACROS_H_ +#define HBASE_MACROS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * The following code block define HBASE_API as the tag for exported + * functions. The library should be compiled with symbols visibility + * set to hidden by default and only the exported functions should be + * tagged as HBASE_API. + * + * When building the library on Windows, compile with compiler flag + * "-D_LIBHBASE_IMPLEMENTATION_", whereas when linking application with + * this library, this compiler flag should not be used. + */ +#if defined _WIN32 || defined __CYGWIN__ + #ifdef _LIBHBASE_IMPLEMENTATION_ + #define HBASE_API __declspec(dllexport) + #else + #ifdef _LIBHBASE_TEST_ + #define HBASE_API + #else + #define HBASE_API __declspec(dllimport) + #endif + #endif +#else + #if __GNUC__ >= 4 + #define HBASE_API __attribute__ ((visibility ("default"))) + #else + #define HBASE_API + #endif +#endif + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // HBASE_MACROS_H_ + diff --git a/src/core/hbase_types.h b/src/core/hbase_types.h new file mode 100644 index 0000000..f8cce0c --- /dev/null +++ b/src/core/hbase_types.h @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef HBASE_TYPES_H_ +#define HBASE_TYPES_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +typedef unsigned char hb_byte_t; + +/* + * Base kv type. + */ +typedef struct { + hb_byte_t* row; + size_t row_length; + + char * family; + size_t family_length; + + hb_byte_t* qual; + size_t qual_length; + + hb_byte_t* value; + size_t value_length; + + unsigned long timestamp; +} hb_cell_t; + +typedef enum { + DELETE_ONE_VERSION, + DELETE_MULTIPLE_VERSIONS, + DELETE_FAMILY, + DELETE_FAMILY_VERSION +} hb_delete_type; + +typedef enum { + USE_DEFAULT, + SKIP_WAL, + ASYNC_WAL, + SYNC_WAL, + HSYNC_WAL +} hb_durability_type; + +typedef void* hb_admin_t; +typedef void* hb_client_t; +typedef void* hb_connection_t; +typedef void* hb_get_t; +typedef void* hb_mutation_t; +typedef void* hb_put_t; +typedef void* hb_delete_t; +typedef void* hb_increment_t; +typedef void* hb_append_t; +typedef void* hb_result_t; +typedef void* hb_scanner_t; + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif diff --git a/src/core/mutation.cc b/src/core/mutation.cc new file mode 100644 index 0000000..4855076 --- /dev/null +++ b/src/core/mutation.cc @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "core/mutation.h" + +void Mutation::set_namespace(char * name_space, size_t name_space_length) { + this->name_space = name_space; + this->name_space_length = name_space_length; +} + +void Mutation::set_table(char * table, size_t table_length) { + this->table = table; + this->table_length = table_length; +} + +void Mutation::set_row(unsigned char * row, size_t row_length) { + this->row = row; + this->row_length = row_length; +} + +void Mutation::set_durability(hb_durability_type durability) { + this->durability = durability; +} + +Mutation::~Mutation() { +} diff --git a/src/core/mutation.h b/src/core/mutation.h new file mode 100644 index 0000000..eb9ad46 --- /dev/null +++ b/src/core/mutation.h @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef CLIENT_MUTATION_H_ +#define CLIENT_MUTATION_H_ + +#include + +#include "hbase_types.h" + +class Mutation { + char * name_space; + size_t name_space_length; + + char * table; + size_t table_length; + + unsigned char * row; + size_t row_length; + + hb_durability_type durability; + public: + void set_namespace(char * name_space, size_t name_space_length); + void set_table(char * table, size_t table_length); + void set_row(unsigned char * row, size_t row_length); + void set_durability(hb_durability_type durability); + + virtual ~Mutation(); +}; +#endif // CLIENT_MUTATION_H_ + + diff --git a/src/core/put.cc b/src/core/put.cc new file mode 100644 index 0000000..8bedc8b --- /dev/null +++ b/src/core/put.cc @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "core/put.h" + +Put::~Put() { +} diff --git a/src/core/put.h b/src/core/put.h new file mode 100644 index 0000000..27400b5 --- /dev/null +++ b/src/core/put.h @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef CLIENT_PUT_H_ +#define CLIENT_PUT_H_ + +#include "core/mutation.h" + +class Put: public Mutation { + public: + ~Put(); +}; +#endif // CLIENT_PUT_H_ diff --git a/src/core/scanner.cc b/src/core/scanner.cc new file mode 100644 index 0000000..a10e444 --- /dev/null +++ b/src/core/scanner.cc @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "core/scanner.h" diff --git a/src/core/scanner.h b/src/core/scanner.h new file mode 100644 index 0000000..ba3f0cc --- /dev/null +++ b/src/core/scanner.h @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef CLIENT_SCANNER_H_ +#define CLIENT_SCANNER_H_ + +class Scanner { +}; +#endif // CLIENT_SCANNER_H_ diff --git a/src/rpc/CMakeLists.txt b/src/rpc/CMakeLists.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/sync/CMakeLists.txt b/src/sync/CMakeLists.txt new file mode 100644 index 0000000..9194549 --- /dev/null +++ b/src/sync/CMakeLists.txt @@ -0,0 +1,18 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set( SYNC_SRC + hbase_admin.cc +) + + +add_library(hsync OBJECT ${SYNC_SRC}) diff --git a/src/sync/hbase_admin.cc b/src/sync/hbase_admin.cc new file mode 100644 index 0000000..d43c8ec --- /dev/null +++ b/src/sync/hbase_admin.cc @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "sync/hbase_admin.h" + +#include +#include + +#include "core/admin.h" + +int32_t hb_admin_create(hb_admin_t** admin_ptr) { + (*admin_ptr) = reinterpret_cast(new Admin()); + return 0; +} + +/* + * Disconnect the admin releasing any internal objects + * or connections created in the background. + */ +int32_t hb_admin_destroy(hb_admin_t * admin) { + Admin * adm = reinterpret_cast(admin); + delete adm; + return 0; +} + +/* + * See if a table exists. + */ +int32_t hb_admin_table_exists(hb_admin_t * admin, + char * name_space, size_t name_space_length, + char * table, size_t table_length, + bool * exists) { + *exists = true; + return 0; +} diff --git a/src/sync/hbase_admin.h b/src/sync/hbase_admin.h new file mode 100644 index 0000000..eb67671 --- /dev/null +++ b/src/sync/hbase_admin.h @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef HBASE_ADMIN_H_ +#define HBASE_ADMIN_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#include "core/hbase_macros.h" +#include "core/hbase_types.h" + + +typedef void (* hb_admin_disconnection_cb)( int32_t status, + hb_admin_t * admin, void * extra); +typedef void (* hb_admin_table_exists_cb)(int32_t status, hb_admin_t * admin, + char * name_space, size_t name_space_length, + char * table, size_t table_length, bool exsists, void * extra); + +HBASE_API int32_t hb_admin_create(hb_admin_t** admin_ptr); +HBASE_API int32_t hb_admin_set_connection(hb_admin_t * hb_admin, + hb_connection_t * connection); +/* + * Disconnect the admin releasing any internal objects + * or connections created in the background. + */ +HBASE_API int32_t hb_admin_destroy(hb_admin_t * admin, + hb_admin_disconnection_cb cb, void * extra); + +/* + * See if a table exists. + */ +HBASE_API int32_t hb_admin_table_exists(hb_admin_t * admin, + char * name_space, size_t name_space_length, + char * table, size_t table_length, + hb_admin_table_exists_cb cb, void * extra); + + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // HBASE_ADMIN_H_ -- 1.8.4.3