@ -0,0 +1,8 @@ | |||||
[submodule "contrib/mongocxx/mongo-cxx-driver"] | |||||
path = contrib/mongocxx/mongo-cxx-driver | |||||
url = https://github.com/mongodb/mongo-cxx-driver.git | |||||
branch = releases/stable | |||||
[submodule "contrib/iniParser/inih"] | |||||
path = contrib/iniParser/inih | |||||
url = https://github.com/benhoyt/inih.git |
@ -0,0 +1,124 @@ | |||||
import os | |||||
globalEnv = Environment() | |||||
globalEnv["ROOTPATH"] = os.path.abspath('.') | |||||
basicBuildPath = os.path.join(globalEnv['ROOTPATH'], 'build') | |||||
globalEnv['BUILDPATH'] = os.path.join(basicBuildPath, 'release') | |||||
globalEnv['CONTRIBPATH'] = os.path.join(globalEnv['ROOTPATH'], 'contrib') | |||||
globalEnv['MONGOCPATH'] = os.path.join(globalEnv['CONTRIBPATH'], 'mongoc') | |||||
globalEnv['MONGOCXXPATH'] = os.path.join(globalEnv['CONTRIBPATH'], 'mongocxx') | |||||
globalEnv["INIHSRC"] = os.path.join( | |||||
os.path.join(globalEnv["CONTRIBPATH"], | |||||
"iniParser"), | |||||
"inih") | |||||
globalEnv["INIHCPPSRC"] = os.path.join(globalEnv["INIHSRC"], "cpp") | |||||
globalEnv["MINISATSRC"] = os.path.join( | |||||
os.path.join(globalEnv["CONTRIBPATH"], | |||||
"minisat"), | |||||
"src") | |||||
#compiler option | |||||
AddOption('--dbg', action='store_true', dest='DEBUG') | |||||
if GetOption('DEBUG'): | |||||
globalEnv.Append(CCFLAGS="-g") | |||||
globalEnv['BUILDPATH'] = os.path.join(basicBuildPath, 'debug') | |||||
globalEnv.Append(CXXFLAGS='-std=c++11') | |||||
AddOption("--init", action="store_true", dest="INIT") | |||||
#build libs | |||||
# | |||||
globalEnv['LIB_BUILD_PATH'] = os.path.join(globalEnv['BUILDPATH'], 'libs') | |||||
#build mongoc | |||||
globalEnv['MONGOC_LIB_PATH'] = os.path.join(globalEnv['LIB_BUILD_PATH'], 'mongoc') | |||||
if GetOption("INIT"): | |||||
globalEnv.SConscript(os.path.join( | |||||
os.path.join(globalEnv['CONTRIBPATH'], | |||||
'mongoc'), | |||||
'SConscript'), | |||||
variant_dir=globalEnv['MONGOC_LIB_PATH'], | |||||
duplicate=0, | |||||
exports='globalEnv') | |||||
#build mongocxx | |||||
globalEnv["MONGOCXX_LIB_PATH"] = os.path.join(globalEnv["LIB_BUILD_PATH"], "mongocxx") | |||||
if GetOption("INIT"): | |||||
globalEnv.SConscript(os.path.join( | |||||
os.path.join(globalEnv["CONTRIBPATH"], | |||||
"mongocxx"), | |||||
"SConscript"), | |||||
variant_dir=globalEnv["MONGOCXX_LIB_PATH"], | |||||
duplicate=0, | |||||
exports="globalEnv") | |||||
#build inih | |||||
globalEnv["INIH_LIB_PATH"] = os.path.join(globalEnv["LIB_BUILD_PATH"], "inih") | |||||
globalEnv.SConscript(os.path.join( | |||||
os.path.join(globalEnv["CONTRIBPATH"], | |||||
"iniParser"), | |||||
"SConscript"), | |||||
variant_dir=globalEnv["INIH_LIB_PATH"], | |||||
duplicate=0, | |||||
exports="globalEnv") | |||||
#build minisat | |||||
globalEnv["MINISAT_LIB_PATH"] = os.path.join(globalEnv["LIB_BUILD_PATH"], "minisat") | |||||
globalEnv.SConscript(os.path.join( | |||||
os.path.join(globalEnv["CONTRIBPATH"], | |||||
"minisat"), | |||||
"SConscript"), | |||||
variant_dir=globalEnv["MINISAT_LIB_PATH"], | |||||
duplicate=0, | |||||
exports="globalEnv") | |||||
mongocxxIncludeDir = os.path.join( | |||||
os.path.join( | |||||
os.path.join(globalEnv["MONGOCXX_LIB_PATH"], | |||||
"include"), | |||||
"mongocxx"), | |||||
"v_noabi") | |||||
bsoncxxIncludeDir = os.path.join( | |||||
os.path.join( | |||||
os.path.join(globalEnv["MONGOCXX_LIB_PATH"], | |||||
"include"), | |||||
"bsoncxx"), | |||||
"v_noabi") | |||||
inihIncludeDir = globalEnv["INIHSRC"] | |||||
inihcppIncludeDir = globalEnv["INIHCPPSRC"] | |||||
minisatIncludeDir = globalEnv["MINISATSRC"] | |||||
globalEnv.Append(CPPPATH=[mongocxxIncludeDir, | |||||
bsoncxxIncludeDir, | |||||
inihIncludeDir, | |||||
inihcppIncludeDir, | |||||
minisatIncludeDir]) | |||||
globalEnv.Append(LIBPATH=[os.path.join(globalEnv["MONGOCXX_LIB_PATH"], "lib"), | |||||
globalEnv["INIH_LIB_PATH"], | |||||
globalEnv["MINISAT_LIB_PATH"]]) | |||||
#build runMinisat | |||||
globalEnv.SConscript(os.path.join( | |||||
os.path.join(globalEnv['ROOTPATH'], | |||||
'src'), | |||||
'SConscript'), | |||||
variant_dir=globalEnv['BUILDPATH'], | |||||
duplicate=0, | |||||
exports='globalEnv') | |||||
@ -0,0 +1,12 @@ | |||||
import os | |||||
Import("globalEnv") | |||||
env = globalEnv.Clone() | |||||
env.Append(CPPPATH=[env["INIHCPPSRC"], env["INIHSRC"]]) | |||||
files = Glob(os.path.join(env["INIHCPPSRC"], "*.cpp")) | |||||
files.append(Glob(os.path.join(env["INIHSRC"], "*.c"))) | |||||
env.Library(target="inihcpp", source=files) |
@ -0,0 +1 @@ | |||||
Subproject commit 2023872dfffb38b6a98f2c45a0eb25652aaea91f |
@ -0,0 +1,24 @@ | |||||
import os | |||||
Import("globalEnv") | |||||
env = globalEnv.Clone() | |||||
env.Append(CPPPATH=[env["MINISATSRC"]]) | |||||
files = Glob(os.path.join( | |||||
os.path.join(env["MINISATSRC"], | |||||
"core"), | |||||
"*.cc")) | |||||
files.append(Glob(os.path.join( | |||||
os.path.join(env["MINISATSRC"], | |||||
"simp"), | |||||
"*.cc"))) | |||||
files.append(Glob(os.path.join( | |||||
os.path.join(env["MINISATSRC"], | |||||
"util"), | |||||
"*.cc"))) | |||||
env.Library(target="minisat", source=files) |
@ -0,0 +1,36 @@ | |||||
import os | |||||
import subprocess | |||||
Import('globalEnv') | |||||
env = globalEnv.Clone() | |||||
env['MONGOC_1_13_1_PATH'] = os.path.join(env['MONGOCPATH'], 'mongo-c-driver-1.13.1') | |||||
cmake_build_path = os.path.join(env['MONGOC_LIB_PATH'], 'cmake_build') | |||||
if not os.path.exists(cmake_build_path): | |||||
os.makedirs(cmake_build_path) | |||||
if not os.path.exists(env["MONGOC_LIB_PATH"]): | |||||
os.makedirs(env["MONGOC_LIB_PATH"]) | |||||
cwd = os.getcwd() | |||||
os.chdir(cmake_build_path) | |||||
cmakeCall = "cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF " | |||||
cmakeCall += "-DCMAKE_INSTALL_PREFIX=" + env["MONGOC_LIB_PATH"] + " " | |||||
cmakeCall += env["MONGOC_1_13_1_PATH"] | |||||
print(cmakeCall) | |||||
os.system(cmakeCall) | |||||
os.system("make") | |||||
os.system("make install") | |||||
os.chdir(cwd) | |||||
@ -0,0 +1,361 @@ | |||||
cmake_minimum_required (VERSION 3.1) | |||||
# Used in MaintainerFlags.cmake to silence errors while testing configs. | |||||
set (MESSAGES_ENABLED 1) | |||||
function (message) | |||||
list (GET ARGV 0 MessageType) | |||||
if (MESSAGES_ENABLED) | |||||
list (REMOVE_AT ARGV 0) | |||||
_message (${MessageType} "${ARGV}") | |||||
endif () | |||||
endfunction () | |||||
set (ENABLE_SSL AUTO CACHE STRING | |||||
"Enable TLS connections and SCRAM-SHA-1 authentication. Options are | |||||
\"DARWIN\" to use Apple's Secure Transport, \"WINDOWS\" to use Windows | |||||
Secure Channel, \"OPENSSL\", \"LIBRESSL\", \"AUTO\",\ or \"OFF\". These options are | |||||
case-sensitive. The default is \"AUTO\". Note\ that SCRAM-SHA-1 is | |||||
required for authenticating to MongoDB 3.0 and later.") | |||||
set (ENABLE_SASL AUTO CACHE STRING | |||||
"Enable SASL authentication (Kerberos). Options are \"CYRUS\" to use Cyrus | |||||
SASL, \"SSPI\" to use Windows Native SSPI, \"GSSAPI\" to use macOS Native GSS, | |||||
\"AUTO\",\ or \"OFF\". These options are case-sensitive.") | |||||
set (ENABLE_STATIC AUTO CACHE STRING "Build static libmongoc. Set to ON/AUTO/OFF, default AUTO.") | |||||
option (ENABLE_TESTS "Build MongoDB C Driver tests." ON) | |||||
option (ENABLE_EXAMPLES "Build MongoDB C Driver examples." ON) | |||||
set (ENABLE_SRV AUTO CACHE STRING "Support mongodb+srv URIs. Set to ON/AUTO/OFF, default AUTO.") | |||||
option (ENABLE_MAINTAINER_FLAGS "Use strict compiler checks" OFF) | |||||
option (ENABLE_AUTOMATIC_INIT_AND_CLEANUP "Enable automatic init and cleanup (GCC only)" ON) | |||||
option (ENABLE_CRYPTO_SYSTEM_PROFILE "Use system crypto profile (OpenSSL only)" OFF) | |||||
option (ENABLE_TRACING "Turn on verbose debug output" OFF) | |||||
option (ENABLE_COVERAGE "Turn on compile options for lcov" OFF) | |||||
set (ENABLE_SHM_COUNTERS AUTO CACHE STRING "Enable memory performance counters that use shared memory on Linux. Set to ON/AUTO/OFF, default AUTO.") | |||||
set (ENABLE_MONGOC ON CACHE STRING "Whether to build libmongoc. Set to ON/OFF, default ON.") | |||||
set (ENABLE_BSON AUTO CACHE STRING "Whether to build libbson. Set to ON/AUTO/SYSTEM, default AUTO.") | |||||
set (ENABLE_SNAPPY AUTO CACHE STRING "Enable snappy support. Set to ON/AUTO/OFF, default AUTO.") | |||||
set (ENABLE_ZLIB AUTO CACHE STRING "Enable zlib support") | |||||
option (ENABLE_MAN_PAGES "Build MongoDB C Driver manual pages." OFF) | |||||
option (ENABLE_HTML_DOCS "Build MongoDB C Driver HTML documentation." OFF) | |||||
option (ENABLE_EXTRA_ALIGNMENT | |||||
"Turn on extra alignment of libbson types. Set to ON/OFF, default ON.\ | |||||
Required for the 1.0 ABI but better disabled." | |||||
ON | |||||
) | |||||
option (ENABLE_RDTSCP | |||||
"Fast performance counters on Intel using the RDTSCP instruction" | |||||
OFF | |||||
) | |||||
option (ENABLE_APPLE_FRAMEWORK "Build libraries as frameworks on darwin platforms" OFF) | |||||
set (ENABLE_ICU AUTO CACHE STRING "Enable ICU support, necessary to use non-ASCII usernames or passwords, default AUTO.") | |||||
option (ENABLE_UNINSTALL "Enable creation of uninstall script and associate uninstall build target." ON) | |||||
project (mongo-c-driver C) | |||||
if (NOT CMAKE_BUILD_TYPE) | |||||
set (CMAKE_BUILD_TYPE "RelWithDebInfo") | |||||
message ( | |||||
STATUS "No CMAKE_BUILD_TYPE selected, defaulting to ${CMAKE_BUILD_TYPE}" | |||||
) | |||||
endif () | |||||
set (CMAKE_MODULE_PATH | |||||
${CMAKE_MODULE_PATH} | |||||
${PROJECT_SOURCE_DIR}/build/cmake | |||||
${PROJECT_SOURCE_DIR}/build/cmake/make_dist | |||||
) | |||||
include (InstallRequiredSystemLibraries) | |||||
include (GNUInstallDirs) | |||||
# Set MONGOC_MAJOR_VERSION, MONGOC_MINOR_VERSION, etc. | |||||
include (LoadVersion) | |||||
LoadVersion (${PROJECT_SOURCE_DIR}/VERSION_CURRENT MONGOC) | |||||
LoadVersion (${PROJECT_SOURCE_DIR}/VERSION_RELEASED MONGOC_RELEASED) | |||||
include (MaintainerFlags) | |||||
if ( (ENABLE_BUILD_DEPENDECIES STREQUAL OFF) AND (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) ) | |||||
set (ENABLE_BUILD_DEPENDECIES ON) | |||||
endif () | |||||
if (ENABLE_EXTRA_ALIGNMENT STREQUAL ON) | |||||
set (BSON_EXTRA_ALIGN 1) | |||||
else () | |||||
set (BSON_EXTRA_ALIGN 0) | |||||
endif () | |||||
if (ENABLE_RDTSCP) | |||||
set (MONGOC_ENABLE_RDTSCP 1) | |||||
else () | |||||
set (MONGOC_ENABLE_RDTSCP 0) | |||||
endif () | |||||
if (NOT ENABLE_MONGOC MATCHES "ON|OFF") | |||||
message (FATAL_ERROR "ENABLE_MONGOC option must be ON or OFF") | |||||
endif () | |||||
if (NOT ENABLE_BSON MATCHES "ON|AUTO|SYSTEM") | |||||
message (FATAL_ERROR "ENABLE_BSON option must be ON, AUTO, or SYSTEM") | |||||
endif () | |||||
if (ENABLE_BSON STREQUAL SYSTEM) | |||||
# The input variable BSON_ROOT_DIR is respected for backwards compatibility, | |||||
# but you should use the standard CMAKE_PREFIX_PATH instead. | |||||
message (STATUS "Searching for libbson CMake packages") | |||||
find_package (libbson-1.0 | |||||
"${MONGOC_MAJOR_VERSION}.${MONGOC_MINOR_VERSION}.${MONGOC_MICRO_VERSION}" | |||||
HINTS | |||||
${BSON_ROOT_DIR}) | |||||
if (ENABLE_BSON STREQUAL SYSTEM AND NOT BSON_LIBRARIES) | |||||
message (FATAL_ERROR "System libbson not found") | |||||
endif () | |||||
if (BSON_LIBRARIES) | |||||
message ("-- libbson found version \"${BSON_VERSION}\"") | |||||
message ("-- libbson include path \"${BSON_INCLUDE_DIRS}\"") | |||||
message ("-- libbson libraries \"${BSON_LIBRARIES}\"") | |||||
message ("-- disabling test-libmongoc since using system libbson") | |||||
SET (ENABLE_TESTS OFF) | |||||
if (ENABLE_STATIC MATCHES "ON|AUTO") | |||||
find_package (libbson-static-1.0 | |||||
"${MONGOC_MAJOR_VERSION}.${MONGOC_MINOR_VERSION}.${MONGOC_MICRO_VERSION}" | |||||
HINTS | |||||
${BSON_ROOT_DIR}) | |||||
if (ENABLE_STATIC STREQUAL ON AND NOT BSON_STATIC_LIBRARY) | |||||
message (FATAL_ERROR "Static libbson not found. Pass -DENABLE_STATIC=OFF") | |||||
endif () | |||||
if (BSON_STATIC_LIBRARY) | |||||
set (MONGOC_ENABLE_STATIC ON) | |||||
endif () | |||||
message ("-- libbson-static found version \"${BSON_STATIC_VERSION}\"") | |||||
message ("-- libbson-static include path \"${BSON_STATIC_INCLUDE_DIRS}\"") | |||||
message ("-- libbson-static libraries \"${BSON_STATIC_LIBRARIES}\"") | |||||
endif () | |||||
endif () | |||||
endif () | |||||
unset (dist_generated CACHE) | |||||
unset (dist_generated_depends CACHE) | |||||
set (BUILD_SOURCE_DIR ${CMAKE_BINARY_DIR}) | |||||
include (MakeDistFiles) | |||||
# Ensure the default behavior: don't ignore RPATH settings. | |||||
set (CMAKE_SKIP_BUILD_RPATH OFF) | |||||
# Ensure the default behavior: don't use the final install destination as the | |||||
# temporary RPATH for executables (ensure we can run tests and programs from | |||||
# the build directory). | |||||
set (CMAKE_BUILD_WITH_INSTALL_RPATH OFF) | |||||
# Include any custom library paths in the final RPATH. | |||||
set (CMAKE_INSTALL_RPATH_USE_LINK_PATH ON) | |||||
# Install libs with names like @rpath/libmongoc-1.0.0.dylib, not bare names. | |||||
set (CMAKE_MACOSX_RPATH ON) | |||||
# https://cmake.org/cmake/help/v3.11/policy/CMP0042.html | |||||
# Enable a CMake 3.0+ policy that sets CMAKE_MACOSX_RPATH by default, and | |||||
# silence a CMake 3.11 warning that the old behavior is deprecated. | |||||
cmake_policy (SET CMP0042 NEW) | |||||
if (NOT BSON_LIBRARIES) | |||||
message (" -- Using bundled libbson") | |||||
if (ENABLE_STATIC MATCHES "ON|AUTO") | |||||
set (MONGOC_ENABLE_STATIC ON) | |||||
endif () | |||||
add_subdirectory (src/libbson) | |||||
# Defined in src/libbson/CMakeLists.txt | |||||
set (BSON_STATIC_LIBRARIES bson_static) | |||||
set (BSON_LIBRARIES bson_shared) | |||||
set (BSON_STATIC_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/src/libbson/src" "${PROJECT_BINARY_DIR}/src/libbson/src") | |||||
set (BSON_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/src/libbson/src" "${PROJECT_BINARY_DIR}/src/libbson/src") | |||||
set (BSON_STATIC_DEFINITIONS "BSON_STATIC") | |||||
endif () | |||||
if (MSVC) | |||||
add_definitions (-D_CRT_SECURE_NO_WARNINGS) | |||||
endif () | |||||
add_definitions (-D_GNU_SOURCE) | |||||
add_definitions (-D_BSD_SOURCE) | |||||
add_definitions (-D_DEFAULT_SOURCE) | |||||
if (ENABLE_MONGOC) | |||||
if (ENABLE_TESTS AND NOT MONGOC_ENABLE_STATIC) | |||||
message (FATAL_ERROR "ENABLE_TESTS requires ENABLE_STATIC") | |||||
endif () | |||||
if (NOT ENABLE_SSL MATCHES "DARWIN|WINDOWS|OPENSSL|LIBRESSL|AUTO|OFF") | |||||
message (FATAL_ERROR | |||||
"ENABLE_SSL option must be DARWIN, WINDOWS, OPENSSL, LIBRESSL, AUTO, or OFF") | |||||
endif () | |||||
set (SOURCE_DIR "${PROJECT_SOURCE_DIR}/") | |||||
set (ZLIB_SOURCES | |||||
${SOURCE_DIR}/src/zlib-1.2.11/adler32.c | |||||
${SOURCE_DIR}/src/zlib-1.2.11/crc32.c | |||||
${SOURCE_DIR}/src/zlib-1.2.11/deflate.c | |||||
${SOURCE_DIR}/src/zlib-1.2.11/infback.c | |||||
${SOURCE_DIR}/src/zlib-1.2.11/inffast.c | |||||
${SOURCE_DIR}/src/zlib-1.2.11/inflate.c | |||||
${SOURCE_DIR}/src/zlib-1.2.11/inftrees.c | |||||
${SOURCE_DIR}/src/zlib-1.2.11/trees.c | |||||
${SOURCE_DIR}/src/zlib-1.2.11/zutil.c | |||||
${SOURCE_DIR}/src/zlib-1.2.11/compress.c | |||||
${SOURCE_DIR}/src/zlib-1.2.11/uncompr.c | |||||
${SOURCE_DIR}/src/zlib-1.2.11/gzclose.c | |||||
${SOURCE_DIR}/src/zlib-1.2.11/gzlib.c | |||||
${SOURCE_DIR}/src/zlib-1.2.11/gzread.c | |||||
${SOURCE_DIR}/src/zlib-1.2.11/gzwrite.c | |||||
) | |||||
set (MONGOC_ENABLE_ICU 0) | |||||
set (CPACK_RESOURCE_FILE_LICENSE "${SOURCE_DIR}/COPYING") | |||||
include (CPack) | |||||
# Ensure the default behavior: don't ignore RPATH settings. | |||||
set (CMAKE_SKIP_BUILD_RPATH OFF) | |||||
if (APPLE) | |||||
# Until CDRIVER-520. | |||||
add_definitions (-Wno-deprecated-declarations) | |||||
endif () | |||||
add_subdirectory (src/libmongoc) | |||||
if (ENABLE_MAN_PAGES STREQUAL ON OR ENABLE_HTML_DOCS STREQUAL ON) | |||||
find_package (Sphinx REQUIRED) | |||||
add_custom_target (doc | |||||
ALL | |||||
DEPENDS | |||||
$<$<STREQUAL:"${ENABLE_BSON}","ON">:bson-doc> | |||||
$<$<STREQUAL:"${ENABLE_MONGOC}","ON">:mongoc-doc> | |||||
) | |||||
endif () | |||||
# Implement 'dist' and 'distcheck' targets | |||||
# | |||||
# CMake does not implement anything like 'dist' and 'distcheck' from autotools. | |||||
# This implementation is based on the one in GnuCash. | |||||
add_subdirectory (build) | |||||
# sub-directory 'doc' was already included above | |||||
add_subdirectory (orchestration_configs) | |||||
add_subdirectory (src) | |||||
# 'src/libbson' was already included, so 'src' will not include it directly | |||||
# 'src/libmongoc' was already included, so 'src' will not include it directly | |||||
set (PACKAGE_PREFIX "mongo-c-driver-${MONGOC_VERSION}") | |||||
set (DIST_FILE "${PACKAGE_PREFIX}.tar.gz") | |||||
set (top_DIST_local | |||||
CMakeLists.txt | |||||
CONTRIBUTING.md | |||||
COPYING | |||||
NEWS | |||||
README.rst | |||||
THIRD_PARTY_NOTICES | |||||
VERSION_CURRENT | |||||
VERSION_RELEASED | |||||
# This sub-directory is added later, so manually include here | |||||
generate_uninstall/CMakeLists.txt | |||||
) | |||||
set_local_dist (top_DIST ${top_DIST_local}) | |||||
set (ALL_DIST | |||||
${top_DIST} | |||||
${build_DIST} | |||||
${orchestration_configs_DIST} | |||||
${src_DIST} | |||||
${src_libbson_DIST} | |||||
${src_libmongoc_DIST} | |||||
) | |||||
# Write a dist manifest | |||||
string (REPLACE ";" "\n" ALL_DIST_LINES "${ALL_DIST}") | |||||
file (WRITE ${CMAKE_BINARY_DIR}/dist_manifest.txt ${ALL_DIST_LINES}) | |||||
# This is the command that produces the distribution tarball | |||||
add_custom_command (OUTPUT ${DIST_FILE} | |||||
COMMAND ${CMAKE_COMMAND} | |||||
-D CMAKE_MODULE_PATH=${PROJECT_SOURCE_DIR}/build/cmake/make_dist | |||||
-D PACKAGE_PREFIX=${PACKAGE_PREFIX} | |||||
-D MONGOC_SOURCE_DIR=${CMAKE_SOURCE_DIR} | |||||
-D BUILD_SOURCE_DIR=${BUILD_SOURCE_DIR} | |||||
-D SHELL=${SHELL} | |||||
"-Ddist_generated=\"${dist_generated}\"" | |||||
-P ${PROJECT_SOURCE_DIR}/build/cmake/make_dist/MakeDist.cmake | |||||
DEPENDS | |||||
${ALL_DIST} ${dist_generated_depends} | |||||
) | |||||
if (ENABLE_BSON MATCHES "ON|AUTO" AND ENABLE_MAN_PAGES STREQUAL ON AND ENABLE_HTML_DOCS STREQUAL ON) | |||||
# Since our 'dist' implementation does not add top-level targets for every | |||||
# file to be included, we declare a dependency on the 'mongo-doc' target so | |||||
# that documentation is built before the distribution tarball is generated. | |||||
add_custom_target (dist DEPENDS doc ${DIST_FILE}) | |||||
add_custom_target (distcheck DEPENDS dist | |||||
COMMAND ${CMAKE_COMMAND} | |||||
-D CMAKE_MODULE_PATH=${PROJECT_SOURCE_DIR}/build/cmake/make_dist | |||||
-D CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} | |||||
-D PACKAGE_PREFIX=${PACKAGE_PREFIX} | |||||
-D CMAKE_C_FLAGS=${CMAKE_C_FLAGS} | |||||
-D CMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} | |||||
-P ${PROJECT_SOURCE_DIR}/build/cmake/make_dist/MakeDistCheck.cmake | |||||
) | |||||
else () | |||||
string (CONCAT DISTERRMSG | |||||
"The dist and distcheck targets disabled. Set ENABLE_BSON=ON, " | |||||
"ENABLE_MAN_PAGES=ON, and ENABLE_HTML_DOCS=ON to enable." | |||||
) | |||||
add_custom_target (dist | |||||
COMMAND ${CMAKE_COMMAND} -E echo "${DISTERRMSG}" | |||||
) | |||||
add_custom_target (distcheck | |||||
COMMAND ${CMAKE_COMMAND} -E echo "${DISTERRMSG}" | |||||
) | |||||
endif () | |||||
endif () | |||||
if (ENABLE_UNINSTALL) | |||||
if (WIN32) | |||||
if (ENABLE_MONGOC) | |||||
set (UNINSTALL_PROG "uninstall.cmd") | |||||
else () | |||||
set (UNINSTALL_PROG "uninstall-bson.cmd") | |||||
endif () | |||||
else () | |||||
if (ENABLE_MONGOC) | |||||
set (UNINSTALL_PROG "uninstall.sh") | |||||
else () | |||||
set (UNINSTALL_PROG "uninstall-bson.sh") | |||||
endif () | |||||
endif () | |||||
set (UNINSTALL_PROG_DIR "${CMAKE_INSTALL_DATADIR}/mongo-c-driver") | |||||
# Create uninstall program and associated uninstall target | |||||
# | |||||
# This needs to be last (after all other add_subdirectory calls) to ensure that | |||||
# the generated uninstall program is complete and correct | |||||
add_subdirectory (generate_uninstall) | |||||
endif () |
@ -0,0 +1,258 @@ | |||||
# Contributing to mongo-c-driver | |||||
Thanks for considering contributing to the mongo-c-driver! | |||||
This document intends to be a short guide to helping you contribute to the codebase. | |||||
It expects a familiarity with the C programming language and writing portable software. | |||||
Whenever in doubt, feel free to ask others that have contributed or look at the existing body of code. | |||||
## Guidelines | |||||
The mongo-c-driver has a few guidelines that help direct the process. | |||||
### Portability | |||||
mongo-c-driver is portable software. It needs to run on a multitude of | |||||
operating systems and architectures. | |||||
* Linux (RHEL 5 and newer) | |||||
* FreeBSD (10 and newer) | |||||
* Windows (Vista and newer) | |||||
* macOS (10.8 and newer) | |||||
* ARM/SPARC/x86/x86_64 | |||||
### Licensing | |||||
Some of the mongo-c-driver users embed the library statically in their | |||||
products. Therefore, the driver and all contributions must be liberally | |||||
licensed. As a policy, we have chosen Apache 2.0 as the license for the | |||||
project. | |||||
### Coding Style | |||||
We try not to be pedantic with taking contributions that are not properly | |||||
formatted, but we will likely perform a followup commit that cleans things up. | |||||
The basics are, in vim: | |||||
``` | |||||
: set ts=3 sw=3 et | |||||
``` | |||||
3 space tabs, insert spaces instead of tabs. | |||||
For all the gory details, see [.clang-format](.clang-format) | |||||
### Adding a new error code or domain | |||||
When adding a new error code or domain, you must do the following. This is most | |||||
applicable if you are adding a new symbol with a bson_error_t as a parameter, | |||||
and the existing codes or domains are inappropriate. | |||||
- Add the domain to `mongoc_error_domain_t` in `src/mongoc/mongoc-error.h` | |||||
- Add the code to `mongoc_error_code_t` in `src/mongoc/mongoc-error.h` | |||||
- Add documentation for the domain or code to the table in `doc/mongoc_errors.rst` | |||||
### Adding a new symbol | |||||
This should be done rarely but there are several things that you need to do | |||||
when adding a new symbol. | |||||
- Add documentation for the new symbol in `doc/mongoc_your_new_symbol_name.rst` | |||||
### Documentation | |||||
We strive to document all symbols. See doc/ for documentation examples. If you | |||||
add a new public function, add a new .rst file describing the function so that | |||||
we can generate man pages and HTML for it. | |||||
For complex internal functions, comment above the function definition with | |||||
a block comment like the following: | |||||
``` | |||||
/*-------------------------------------------------------------------------- | |||||
* | |||||
* mongoc_cmd_parts_append_read_write -- | |||||
* | |||||
* Append user-supplied options to @parts->command_extra, taking the | |||||
* selected server's max wire version into account. | |||||
* | |||||
* Return: | |||||
* True if the options were successfully applied. If any options are | |||||
* invalid, returns false and fills out @error. In that case @parts is | |||||
* invalid and must not be used. | |||||
* | |||||
* Side effects: | |||||
* May partly apply options before returning an error. | |||||
* | |||||
*-------------------------------------------------------------------------- | |||||
*/ | |||||
``` | |||||
Public functions do not need these comment blocks, since they are documented in | |||||
the .rst files. | |||||
### Testing | |||||
To run the entire test suite, including authentication tests, | |||||
start `mongod` with auth enabled: | |||||
``` | |||||
$ mongod --auth | |||||
``` | |||||
In another terminal, use the `mongo` shell to create a user: | |||||
``` | |||||
$ mongo --eval "db.createUser({user: 'admin', pwd: 'pass', roles: ['root']})" admin | |||||
``` | |||||
Authentication in MongoDB 3.0 and later uses SCRAM-SHA-1, which in turn | |||||
requires a driver built with SSL. | |||||
Set the user and password environment variables, then build and run the tests: | |||||
``` | |||||
$ export MONGOC_TEST_USER=admin | |||||
$ export MONGOC_TEST_PASSWORD=pass | |||||
$ ./test-libmongoc | |||||
``` | |||||
Additional environment variables: | |||||
* `MONGOC_TEST_HOST`: default `localhost`, the host running MongoDB. | |||||
* `MONGOC_TEST_PORT`: default 27017, MongoDB's listening port. | |||||
* `MONGOC_TEST_URI`: override both host and port with a full connection string, | |||||
like "mongodb://server1,server2". | |||||
* `MONGOC_TEST_SERVER_LOG`: set to `stdout` or `stderr` for wire protocol | |||||
logging from tests that use `mock_server_t`. Set to `json` to include these | |||||
logs in the test framework's JSON output, in a format compatible with | |||||
[Evergreen](https://github.com/evergreen-ci/evergreen). | |||||
* `MONGOC_TEST_MONITORING_VERBOSE`: set to `on` for verbose output from | |||||
Application Performance Monitoring tests. | |||||
* `MONGOC_TEST_COMPRESSORS=snappy,zlib`: wire protocol compressors to use | |||||
If you start `mongod` with SSL, set these variables to configure how | |||||
`test-libmongoc` connects to it: | |||||
* `MONGOC_TEST_SSL`: set to `on` to connect to the server with SSL. | |||||
* `MONGOC_TEST_SSL_PEM_FILE`: path to a client PEM file. | |||||
* `MONGOC_TEST_SSL_PEM_PWD`: the PEM file's password. | |||||
* `MONGOC_TEST_SSL_CA_FILE`: path to a certificate authority file. | |||||
* `MONGOC_TEST_SSL_CA_DIR`: path to a certificate authority directory. | |||||
* `MONGOC_TEST_SSL_CRL_FILE`: path to a certificate revocation list. | |||||
* `MONGOC_TEST_SSL_WEAK_CERT_VALIDATION`: set to `on` to relax the client's | |||||
validation of the server's certificate. | |||||
The SASL / GSSAPI / Kerberos tests are skipped by default. To run them, set up a | |||||
separate `mongod` with Kerberos and set its host and Kerberos principal name | |||||
as environment variables: | |||||
* `MONGOC_TEST_GSSAPI_HOST` | |||||
* `MONGOC_TEST_GSSAPI_USER` | |||||
URI-escape the username, for example write "user@realm" as "user%40realm". | |||||
The user must be authorized to query `kerberos.test`. | |||||
MongoDB 3.2 adds support for readConcern, but does not enable support for | |||||
read concern majority by default. mongod must be launched using | |||||
`--enableMajorityReadConcern`. | |||||
The test framework does not (and can't) automatically discover if this option was | |||||
provided to MongoDB, so an additional variable must be set to enable these tests: | |||||
* `MONGOC_ENABLE_MAJORITY_READ_CONCERN` | |||||
Set this environment variable to `on` if MongoDB has enabled majority read concern. | |||||
Some tests require Internet access, e.g. to check the error message when failing | |||||
to open a MongoDB connection to example.com. Skip them with: | |||||
* `MONGOC_TEST_OFFLINE=on` | |||||
Some tests require a running MongoDB server. Skip them with: | |||||
* `MONGOC_TEST_SKIP_LIVE=on` | |||||
For quick checks during development, disable long-running tests: | |||||
* `MONGOC_TEST_SKIP_SLOW=on` | |||||
Some tests run against a local mock server, these can be skipped with: | |||||
* `MONGOC_TEST_SKIP_MOCK=on` | |||||
If you have started with MongoDB with `--ipv6`, you can test IPv6 with: | |||||
* `MONGOC_CHECK_IPV6=on` | |||||
The tests for mongodb+srv:// connection strings require some setup, see the | |||||
Initial DNS Seedlist Discovery Spec. By default these connection strings are | |||||
NOT tested, enable them with: | |||||
* `MONGOC_TEST_DNS=on` | |||||
The mock server timeout threshold for future functions can be set with: | |||||
* `MONGOC_TEST_FUTURE_TIMEOUT_MS=<int>` | |||||
This is useful for debugging, so future calls don't timeout when stepping through code. | |||||
All tests should pass before submitting a patch. | |||||
## Configuring the test runner | |||||
The test runner can be configured with command-line options. Run `test-libmongoc | |||||
--help` for details. | |||||
To run just a specific portion of the test suite use the -l option like so: | |||||
``` | |||||
$ ./test-libmongoc -l "/server_selection/*" | |||||
``` | |||||
The full list of tests is shown in the help. | |||||
## Creating and checking a distribution tarball | |||||
The `make distcheck` command can be used to confirm that any modifications are | |||||
able to be packaged into the distribution tarball and that the resulting | |||||
distribution tarball can be used to successfully build the project. | |||||
A failure of the `make distcheck` target is an indicator of an oversight in the | |||||
modification to the project. For example, if a new source file is added to the | |||||
project but it is not added to the proper distribution list, it is possible that | |||||
the distribution tarball will be created without that file. An attempt to build | |||||
the project without the file is likely to fail. | |||||
When `make distcheck` is invoked, several things happen. The `dist` target is | |||||
executed to create a distribution tarball. Then the tarball is unpacked, | |||||
configured (with an invocation of `cmake`), built (by calling `make`), installed | |||||
(by calling `make install`), and tested (by calling `make check`). Three | |||||
environment variables can be used to modify these steps. | |||||
To adjust the options passed to `make` during the build step, set: | |||||
* `DISTCHECK_BUILD_OPTS` | |||||
If this variable is not set, then `make` is called with a default of "-j 8". | |||||
To adjust the options passed to `make install` during the installation step, | |||||
set: | |||||
* `DISTCHECK_INSTALL_OPTS` | |||||
To adjust the options passed to `make check` during the test step, set: | |||||
* `DISTCHECK_CHECK_OPTS` | |||||
Remember, if you want to modify the top-level `make` invocation, you will need | |||||
to pass options on the command line as normal. | |||||
For example, the command `make -j 6 distcheck DISTCHECK_BUILD_OPTS="-j 4"` will | |||||
call the standard sequence of targets depended upon by `distcheck` with a | |||||
parallelism level of 6, while the build step that is later called by the | |||||
`distcheck` target will be executed with a parallelism level of 4. |
@ -0,0 +1,177 @@ | |||||
Apache License | |||||
Version 2.0, January 2004 | |||||
http://www.apache.org/licenses/ | |||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | |||||
1. Definitions. | |||||
"License" shall mean the terms and conditions for use, reproduction, | |||||
and distribution as defined by Sections 1 through 9 of this document. | |||||
"Licensor" shall mean the copyright owner or entity authorized by | |||||
the copyright owner that is granting the License. | |||||
"Legal Entity" shall mean the union of the acting entity and all | |||||
other entities that control, are controlled by, or are under common | |||||
control with that entity. For the purposes of this definition, | |||||
"control" means (i) the power, direct or indirect, to cause the | |||||
direction or management of such entity, whether by contract or | |||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the | |||||
outstanding shares, or (iii) beneficial ownership of such entity. | |||||
"You" (or "Your") shall mean an individual or Legal Entity | |||||
exercising permissions granted by this License. | |||||
"Source" form shall mean the preferred form for making modifications, | |||||
including but not limited to software source code, documentation | |||||
source, and configuration files. | |||||
"Object" form shall mean any form resulting from mechanical | |||||
transformation or translation of a Source form, including but | |||||
not limited to compiled object code, generated documentation, | |||||
and conversions to other media types. | |||||
"Work" shall mean the work of authorship, whether in Source or | |||||
Object form, made available under the License, as indicated by a | |||||
copyright notice that is included in or attached to the work | |||||
(an example is provided in the Appendix below). | |||||
"Derivative Works" shall mean any work, whether in Source or Object | |||||
form, that is based on (or derived from) the Work and for which the | |||||
editorial revisions, annotations, elaborations, or other modifications | |||||
represent, as a whole, an original work of authorship. For the purposes | |||||
of this License, Derivative Works shall not include works that remain | |||||
separable from, or merely link (or bind by name) to the interfaces of, | |||||
the Work and Derivative Works thereof. | |||||
"Contribution" shall mean any work of authorship, including | |||||
the original version of the Work and any modifications or additions | |||||
to that Work or Derivative Works thereof, that is intentionally | |||||
submitted to Licensor for inclusion in the Work by the copyright owner | |||||
or by an individual or Legal Entity authorized to submit on behalf of | |||||
the copyright owner. For the purposes of this definition, "submitted" | |||||
means any form of electronic, verbal, or written communication sent | |||||
to the Licensor or its representatives, including but not limited to | |||||
communication on electronic mailing lists, source code control systems, | |||||
and issue tracking systems that are managed by, or on behalf of, the | |||||
Licensor for the purpose of discussing and improving the Work, but | |||||
excluding communication that is conspicuously marked or otherwise | |||||
designated in writing by the copyright owner as "Not a Contribution." | |||||
"Contributor" shall mean Licensor and any individual or Legal Entity | |||||
on behalf of whom a Contribution has been received by Licensor and | |||||
subsequently incorporated within the Work. | |||||
2. Grant of Copyright License. Subject to the terms and conditions of | |||||
this License, each Contributor hereby grants to You a perpetual, | |||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable | |||||
copyright license to reproduce, prepare Derivative Works of, | |||||
publicly display, publicly perform, sublicense, and distribute the | |||||
Work and such Derivative Works in Source or Object form. | |||||
3. Grant of Patent License. Subject to the terms and conditions of | |||||
this License, each Contributor hereby grants to You a perpetual, | |||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable | |||||
(except as stated in this section) patent license to make, have made, | |||||
use, offer to sell, sell, import, and otherwise transfer the Work, | |||||
where such license applies only to those patent claims licensable | |||||
by such Contributor that are necessarily infringed by their | |||||
Contribution(s) alone or by combination of their Contribution(s) | |||||
with the Work to which such Contribution(s) was submitted. If You | |||||
institute patent litigation against any entity (including a | |||||
cross-claim or counterclaim in a lawsuit) alleging that the Work | |||||
or a Contribution incorporated within the Work constitutes direct | |||||
or contributory patent infringement, then any patent licenses | |||||
granted to You under this License for that Work shall terminate | |||||
as of the date such litigation is filed. | |||||
4. Redistribution. You may reproduce and distribute copies of the | |||||
Work or Derivative Works thereof in any medium, with or without | |||||
modifications, and in Source or Object form, provided that You | |||||
meet the following conditions: | |||||
(a) You must give any other recipients of the Work or | |||||
Derivative Works a copy of this License; and | |||||
(b) You must cause any modified files to carry prominent notices | |||||
stating that You changed the files; and | |||||
(c) You must retain, in the Source form of any Derivative Works | |||||
that You distribute, all copyright, patent, trademark, and | |||||
attribution notices from the Source form of the Work, | |||||
excluding those notices that do not pertain to any part of | |||||
the Derivative Works; and | |||||
(d) If the Work includes a "NOTICE" text file as part of its | |||||
distribution, then any Derivative Works that You distribute must | |||||
include a readable copy of the attribution notices contained | |||||
within such NOTICE file, excluding those notices that do not | |||||
pertain to any part of the Derivative Works, in at least one | |||||
of the following places: within a NOTICE text file distributed | |||||
as part of the Derivative Works; within the Source form or | |||||
documentation, if provided along with the Derivative Works; or, | |||||
within a display generated by the Derivative Works, if and | |||||
wherever such third-party notices normally appear. The contents | |||||
of the NOTICE file are for informational purposes only and | |||||
do not modify the License. You may add Your own attribution | |||||
notices within Derivative Works that You distribute, alongside | |||||
or as an addendum to the NOTICE text from the Work, provided | |||||
that such additional attribution notices cannot be construed | |||||
as modifying the License. | |||||
You may add Your own copyright statement to Your modifications and | |||||
may provide additional or different license terms and conditions | |||||
for use, reproduction, or distribution of Your modifications, or | |||||
for any such Derivative Works as a whole, provided Your use, | |||||
reproduction, and distribution of the Work otherwise complies with | |||||
the conditions stated in this License. | |||||
5. Submission of Contributions. Unless You explicitly state otherwise, | |||||
any Contribution intentionally submitted for inclusion in the Work | |||||
by You to the Licensor shall be under the terms and conditions of | |||||
this License, without any additional terms or conditions. | |||||
Notwithstanding the above, nothing herein shall supersede or modify | |||||
the terms of any separate license agreement you may have executed | |||||
with Licensor regarding such Contributions. | |||||
6. Trademarks. This License does not grant permission to use the trade | |||||
names, trademarks, service marks, or product names of the Licensor, | |||||
except as required for reasonable and customary use in describing the | |||||
origin of the Work and reproducing the content of the NOTICE file. | |||||
7. Disclaimer of Warranty. Unless required by applicable law or | |||||
agreed to in writing, Licensor provides the Work (and each | |||||
Contributor provides its Contributions) on an "AS IS" BASIS, | |||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | |||||
implied, including, without limitation, any warranties or conditions | |||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | |||||
PARTICULAR PURPOSE. You are solely responsible for determining the | |||||
appropriateness of using or redistributing the Work and assume any | |||||
risks associated with Your exercise of permissions under this License. | |||||
8. Limitation of Liability. In no event and under no legal theory, | |||||
whether in tort (including negligence), contract, or otherwise, | |||||
unless required by applicable law (such as deliberate and grossly | |||||
negligent acts) or agreed to in writing, shall any Contributor be | |||||
liable to You for damages, including any direct, indirect, special, | |||||
incidental, or consequential damages of any character arising as a | |||||
result of this License or out of the use or inability to use the | |||||
Work (including but not limited to damages for loss of goodwill, | |||||
work stoppage, computer failure or malfunction, or any and all | |||||
other commercial damages or losses), even if such Contributor | |||||
has been advised of the possibility of such damages. | |||||
9. Accepting Warranty or Additional Liability. While redistributing | |||||
the Work or Derivative Works thereof, You may choose to offer, | |||||
and charge a fee for, acceptance of support, warranty, indemnity, | |||||
or other liability obligations and/or rights consistent with this | |||||
License. However, in accepting such obligations, You may act only | |||||
on Your own behalf and on Your sole responsibility, not on behalf | |||||
of any other Contributor, and only if You agree to indemnify, | |||||
defend, and hold each Contributor harmless for any liability | |||||
incurred by, or claims asserted against, such Contributor by reason | |||||
of your accepting any such warranty or additional liability. | |||||
END OF TERMS AND CONDITIONS |
@ -0,0 +1,90 @@ | |||||
============== | |||||
mongo-c-driver | |||||
============== | |||||
About | |||||
===== | |||||
mongo-c-driver is a project that includes two libraries: | |||||
- libmongoc, a client library written in C for MongoDB. | |||||
- libbson, a library providing useful routines related to building, parsing, and iterating BSON documents. | |||||
If libmongoc is not needed, it is possible to build and install only libbson. | |||||
Documentation / Support / Feedback | |||||
================================== | |||||
The documentation is available at http://mongoc.org/. | |||||
For issues with, questions about, or feedback for libmongoc, please look into | |||||
our `support channels <http://www.mongodb.org/about/support>`_. Please | |||||
do not email any of the libmongoc developers directly with issues or | |||||
questions - you're more likely to get an answer on the `mongodb-user list`_ | |||||
on Google Groups. | |||||
Bugs / Feature Requests | |||||
======================= | |||||
Think you’ve found a bug? Want to see a new feature in libmongoc? Please open a | |||||
case in our issue management tool, JIRA: | |||||
- `Create an account and login <https://jira.mongodb.org>`_. | |||||
- Navigate to `the CDRIVER project <https://jira.mongodb.org/browse/CDRIVER>`_. | |||||
- Click **Create Issue** - Please provide as much information as possible about the issue type and how to reproduce it. | |||||
Bug reports in JIRA for all driver projects (i.e. CDRIVER, CSHARP, JAVA) and the | |||||
Core Server (i.e. SERVER) project are **public**. | |||||
How To Ask For Help | |||||
------------------- | |||||
If you are having difficulty building the driver after reading the below instructions, please email | |||||
the `mongodb-user list`_ to ask for help. Please include in your email all of the following | |||||
information: | |||||
- The version of the driver you are trying to build (branch or tag). | |||||
- Examples: master branch, 1.9.5 tag | |||||
- Host OS, version, and architecture. | |||||
- Examples: Windows 10 64-bit x86, Ubuntu 16.04 64-bit x86, macOS 10.13 | |||||
- C Compiler and version. | |||||
- Examples: GCC 7.3.0, Visual Studio Community 2017, clang 3.9, XCode 9.3 | |||||
- The output of ``cmake``. | |||||
- The text of the error you encountered. | |||||
Failure to include the relevant information will delay a useful response. | |||||
Here is a made-up example of a help request that provides the relevant | |||||
information: | |||||
Hello, I'm trying to build the C driver with Kerberos support, from | |||||
mongo-c-driver-1.9.5.tar.gz. I'm on Ubuntu 16.04, 64-bit Intel, with gcc | |||||
5.4.0. I run CMake like:: | |||||
$ cmake . | |||||
-- The C compiler identification is ;GNU 5.4.0 | |||||
-- Check for working C compiler: /usr/bin/cc | |||||
-- Check for working C compiler: /usr/bin/cc -- works | |||||
... SNIPPED OUTPUT, but when you ask for help, include full output without any omissions ... | |||||
-- Searching for libsasl2 | |||||
-- Not found (specify -DCMAKE_LIBRARY_PATH=/path/to/sasl/lib for SASL support) | |||||
CMake Error at CMakeLists.txt:10 (_message): | |||||
SASL not found | |||||
Can you tell me what I need to install? Thanks! | |||||
.. _mongodb-user list: http://groups.google.com/group/mongodb-user | |||||
Security Vulnerabilities | |||||
------------------------ | |||||
If you’ve identified a security vulnerability in a driver or any other | |||||
MongoDB project, please report it according to the `instructions here | |||||
<http://docs.mongodb.org/manual/tutorial/create-a-vulnerability-report>`_. | |||||
Installation | |||||
============ | |||||
Detailed installation instructions are in the manual: | |||||
http://mongoc.org/libmongoc/current/installing.html |
@ -0,0 +1,157 @@ | |||||
The MongoDB C Driver uses third-party code distributed under different licenses. | |||||
License notice for common-b64.c | |||||
------------------------------------------------------------------------------- | |||||
ISC License | |||||
Copyright: 1996, 1998 Internet Software Consortium | |||||
1995 International Business Machines, Inc. | |||||
Permission to use, copy, modify, and/or distribute this software for any | |||||
purpose with or without fee is hereby granted, provided that the above | |||||
copyright notice and this permission notice appear in all copies. | |||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | |||||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND | |||||
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | |||||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | |||||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | |||||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | |||||
PERFORMANCE OF THIS SOFTWARE. | |||||
Portions Copyright (c) 1995 by International Business Machines, Inc. | |||||
International Business Machines, Inc. (hereinafter called IBM) grants | |||||
permission under its copyrights to use, copy, modify, and distribute this | |||||
Software with or without fee, provided that the above copyright notice and | |||||
all paragraphs of this notice appear in all copies, and that the name of IBM | |||||
not be used in connection with the marketing of any product incorporating | |||||
the Software or modifications thereof, without specific, written prior | |||||
permission. | |||||
To the extent it has a right to do so, IBM grants an immunity from suit | |||||
under its patents, if any, for the use, sale or manufacture of products to | |||||
the extent that such products are used for performing Domain Name System | |||||
dynamic updates in TCP/IP networks by means of the Software. No immunity is | |||||
granted for any product per se or for any other function of any product. | |||||
THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, | |||||
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A | |||||
PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, | |||||
DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING | |||||
OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN | |||||
IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. | |||||
License notice for taglist.py | |||||
------------------------------------------------------------------------------- | |||||
MIT License | |||||
Portions Copyright 2007-2009 by the Sphinx team. | |||||
Permission is hereby granted, free of charge, to any person obtaining | |||||
a copy of this software and associated documentation files (the | |||||
"Software"), to deal in the Software without restriction, including | |||||
without limitation the rights to use, copy, modify, merge, publish, | |||||
distribute, sublicense, and/or sell copies of the Software, and to | |||||
permit persons to whom the Software is furnished to do so, subject to | |||||
the following conditions: | |||||
The above copyright notice and this permission notice shall be | |||||
included in all copies or substantial portions of the Software. | |||||
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 OR COPYRIGHT HOLDERS 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. | |||||
License notice for mongoc.css_t | |||||
------------------------------------------------------------------------------- | |||||
MIT License | |||||
Portions Copyright 2013 by Ignacy Sokolowski. | |||||
Permission is hereby granted, free of charge, to any person obtaining | |||||
a copy of this software and associated documentation files (the | |||||
"Software"), to deal in the Software without restriction, including | |||||
without limitation the rights to use, copy, modify, merge, publish, | |||||
distribute, sublicense, and/or sell copies of the Software, and to | |||||
permit persons to whom the Software is furnished to do so, subject to | |||||
the following conditions: | |||||
The above copyright notice and this permission notice shall be | |||||
included in all copies or substantial portions of the Software. | |||||
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 OR COPYRIGHT HOLDERS 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. | |||||
License notice for zlib | |||||
------------------------------------------------------------------------------- | |||||
/* zlib.h -- interface of the 'zlib' general purpose compression library | |||||
version 1.2.11, January 15th, 2017 | |||||
Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler | |||||
This software is provided 'as-is', without any express or implied | |||||
warranty. In no event will the authors be held liable for any damages | |||||
arising from the use of this software. | |||||
Permission is granted to anyone to use this software for any purpose, | |||||
including commercial applications, and to alter it and redistribute it | |||||
freely, subject to the following restrictions: | |||||
1. The origin of this software must not be misrepresented; you must not | |||||
claim that you wrote the original software. If you use this software | |||||
in a product, an acknowledgment in the product documentation would be | |||||
appreciated but is not required. | |||||
2. Altered source versions must be plainly marked as such, and must not be | |||||
misrepresented as being the original software. | |||||
3. This notice may not be removed or altered from any source distribution. | |||||
Jean-loup Gailly Mark Adler | |||||
jloup@gzip.org madler@alumni.caltech.edu | |||||
The data format used by the zlib library is described by RFCs (Request for | |||||
Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 | |||||
(zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). | |||||
*/ | |||||
License notice for common-md5.c | |||||
------------------------------------------------------------------------------- | |||||
ZLib License | |||||
Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved. | |||||
This software is provided 'as-is', without any express or implied | |||||
warranty. In no event will the authors be held liable for any damages | |||||
arising from the use of this software. | |||||
Permission is granted to anyone to use this software for any purpose, | |||||
including commercial applications, and to alter it and redistribute it | |||||
freely, subject to the following restrictions: | |||||
1. The origin of this software must not be misrepresented; you must not | |||||
claim that you wrote the original software. If you use this software | |||||
in a product, an acknowledgment in the product documentation would be | |||||
appreciated but is not required. | |||||
2. Altered source versions must be plainly marked as such, and must not be | |||||
misrepresented as being the original software. | |||||
3. This notice may not be removed or altered from any source distribution. | |||||
L. Peter Deutsch | |||||
ghost@aladdin.com |
@ -0,0 +1 @@ | |||||
1.13.1 |
@ -0,0 +1 @@ | |||||
1.13.1 |
@ -0,0 +1,56 @@ | |||||
# Fabricate our own copy of the install manifest, since the installation has not | |||||
# generated the final version yet at this point | |||||
set (UNINSTALL_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) | |||||
if (WIN32) | |||||
string (REPLACE "/" "\\\\" CMAKE_INSTALL_PREFIX_WIN32 | |||||
"${CMAKE_INSTALL_PREFIX}" | |||||
) | |||||
install (CODE " | |||||
string(REPLACE \";\" \"\\n\" MONGOC_INSTALL_MANIFEST_CONTENT | |||||
\"\${CMAKE_INSTALL_MANIFEST_FILES}\") | |||||
string(REPLACE \"/\" \"\\\\\" MONGOC_INSTALL_MANIFEST_CONTENT_WIN32 | |||||
\"\${MONGOC_INSTALL_MANIFEST_CONTENT}\") | |||||
file(WRITE \"mongoc_install_manifest.txt\" | |||||
\"\${MONGOC_INSTALL_MANIFEST_CONTENT_WIN32}\") | |||||
execute_process ( | |||||
COMMAND | |||||
${CMAKE_COMMAND} -E env | |||||
ENABLE_MONGOC=${ENABLE_MONGOC} | |||||
cmd.exe /c | |||||
\"${PROJECT_SOURCE_DIR}/build/generate-uninstall.cmd\" | |||||
mongoc_install_manifest.txt | |||||
${CMAKE_INSTALL_PREFIX_WIN32} | |||||
OUTPUT_FILE | |||||
\"${CMAKE_CURRENT_BINARY_DIR}/${UNINSTALL_PROG}\" | |||||
) | |||||
") | |||||
install (FILES "${CMAKE_CURRENT_BINARY_DIR}/${UNINSTALL_PROG}" DESTINATION "${UNINSTALL_PROG_DIR}" PERMISSIONS ${UNINSTALL_PERMISSIONS}) | |||||
add_custom_target (uninstall | |||||
COMMAND call "${CMAKE_CURRENT_BINARY_DIR}/${UNINSTALL_PROG}" | |||||
) | |||||
else () | |||||
install (CODE " | |||||
string(REPLACE \";\" \"\\n\" MONGOC_INSTALL_MANIFEST_CONTENT | |||||
\"\${CMAKE_INSTALL_MANIFEST_FILES}\") | |||||
file(WRITE \"mongoc_install_manifest.txt\" | |||||
\"\${MONGOC_INSTALL_MANIFEST_CONTENT}\") | |||||
execute_process ( | |||||
COMMAND | |||||
${CMAKE_COMMAND} -E env | |||||
ENABLE_MONGOC=${ENABLE_MONGOC} | |||||
\"${PROJECT_SOURCE_DIR}/build/generate-uninstall.sh\" | |||||
mongoc_install_manifest.txt | |||||
${CMAKE_INSTALL_PREFIX} | |||||
OUTPUT_FILE | |||||
\"${CMAKE_CURRENT_BINARY_DIR}/${UNINSTALL_PROG}\" | |||||
) | |||||
") | |||||
install (FILES "${CMAKE_CURRENT_BINARY_DIR}/${UNINSTALL_PROG}" DESTINATION "${UNINSTALL_PROG_DIR}" PERMISSIONS ${UNINSTALL_PERMISSIONS}) | |||||
add_custom_target (uninstall | |||||
COMMAND sh "${CMAKE_CURRENT_BINARY_DIR}/${UNINSTALL_PROG}" | |||||
) | |||||
endif () |
@ -0,0 +1,9 @@ | |||||
file (GLOB_RECURSE orchestration_configs_DIST_pems RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.pem) | |||||
file (GLOB_RECURSE orchestration_configs_DIST_jsons RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.json) | |||||
set_dist_list (orchestration_configs_DIST | |||||
CMakeLists.txt | |||||
${orchestration_configs_DIST_pems} | |||||
${orchestration_configs_DIST_jsons} | |||||
) | |||||
@ -0,0 +1,57 @@ | |||||
{ | |||||
"auth_key": "secret", | |||||
"id": "repl0", | |||||
"login": "bob", | |||||
"password": "pwd123", | |||||
"members": [ | |||||
{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"journal": true, | |||||
"port": 27017, | |||||
"setParameter" : { "enableTestCommands": 1 } | |||||
}, | |||||
"rsParams": { | |||||
"tags": { | |||||
"ordinal": "one", | |||||
"dc": "ny" | |||||
} | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"journal": true, | |||||
"port": 27018, | |||||
"setParameter" : { "enableTestCommands": 1 } | |||||
}, | |||||
"rsParams": { | |||||
"tags": { | |||||
"ordinal": "two", | |||||
"dc": "pa" | |||||
} | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"journal": true, | |||||
"port": 27019, | |||||
"setParameter" : { "enableTestCommands": 1 } | |||||
}, | |||||
"rsParams": { | |||||
"arbiterOnly": true | |||||
} | |||||
} | |||||
], | |||||
"sslParams": { | |||||
"sslMode": "requireSSL", | |||||
"sslPEMKeyFile": "/tmp/orchestration-home/server.pem", | |||||
"sslCAFile": "/tmp/orchestration-home/ca.pem", | |||||
"sslAllowInvalidCertificates": true, | |||||
"sslWeakCertificateValidation" : true | |||||
} | |||||
} |
@ -0,0 +1,58 @@ | |||||
{ | |||||
"auth_key": "secret", | |||||
"id": "repl0", | |||||
"login": "bob", | |||||
"password": "pwd123", | |||||
"authSource": "thisDB", | |||||
"members": [ | |||||
{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"journal": true, | |||||
"port": 27017, | |||||
"setParameter" : { "enableTestCommands": 1 } | |||||
}, | |||||
"rsParams": { | |||||
"tags": { | |||||
"ordinal": "one", | |||||
"dc": "ny" | |||||
} | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"journal": true, | |||||
"port": 27018, | |||||
"setParameter" : { "enableTestCommands": 1 } | |||||
}, | |||||
"rsParams": { | |||||
"tags": { | |||||
"ordinal": "two", | |||||
"dc": "pa" | |||||
} | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"journal": true, | |||||
"port": 27019, | |||||
"setParameter" : { "enableTestCommands": 1 } | |||||
}, | |||||
"rsParams": { | |||||
"arbiterOnly": true | |||||
} | |||||
} | |||||
], | |||||
"sslParams": { | |||||
"sslMode": "requireSSL", | |||||
"sslPEMKeyFile": "/tmp/orchestration-home/server.pem", | |||||
"sslCAFile": "/tmp/orchestration-home/ca.pem", | |||||
"sslAllowInvalidCertificates": true, | |||||
"sslWeakCertificateValidation" : true | |||||
} | |||||
} |
@ -0,0 +1,50 @@ | |||||
{ | |||||
"auth_key": "secret", | |||||
"id": "repl0", | |||||
"login": "bob", | |||||
"members": [ | |||||
{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"journal": true, | |||||
"port": 27017, | |||||
"setParameter" : { "enableTestCommands": 1 } | |||||
}, | |||||
"rsParams": { | |||||
"tags": { | |||||
"ordinal": "one", | |||||
"dc": "ny" | |||||
} | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"journal": true, | |||||
"port": 27018, | |||||
"setParameter" : { "enableTestCommands": 1 } | |||||
}, | |||||
"rsParams": { | |||||
"tags": { | |||||
"ordinal": "two", | |||||
"dc": "pa" | |||||
} | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"journal": true, | |||||
"port": 27019, | |||||
"setParameter" : { "enableTestCommands": 1 } | |||||
}, | |||||
"rsParams": { | |||||
"arbiterOnly": true | |||||
} | |||||
} | |||||
], | |||||
"password": "pwd123" | |||||
} |
@ -0,0 +1,54 @@ | |||||
{ | |||||
"id": "repl0", | |||||
"members": [ | |||||
{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"journal": true, | |||||
"port": 27017, | |||||
"setParameter" : { "enableTestCommands": 1 } | |||||
}, | |||||
"rsParams": { | |||||
"tags": { | |||||
"ordinal": "one", | |||||
"dc": "ny" | |||||
} | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"journal": true, | |||||
"port": 27018, | |||||
"setParameter" : { "enableTestCommands": 1 } | |||||
}, | |||||
"rsParams": { | |||||
"tags": { | |||||
"ordinal": "two", | |||||
"dc": "pa" | |||||
} | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"journal": true, | |||||
"port": 27019, | |||||
"setParameter" : { "enableTestCommands": 1 } | |||||
}, | |||||
"rsParams": { | |||||
"arbiterOnly": true | |||||
} | |||||
} | |||||
], | |||||
"sslParams": { | |||||
"sslMode": "requireSSL", | |||||
"sslPEMKeyFile": "/tmp/orchestration-home/server.pem", | |||||
"sslCAFile": "/tmp/orchestration-home/ca.pem", | |||||
"sslAllowInvalidCertificates": true, | |||||
"sslWeakCertificateValidation" : true | |||||
} | |||||
} |
@ -0,0 +1,47 @@ | |||||
{ | |||||
"id": "repl0", | |||||
"members": [ | |||||
{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"journal": true, | |||||
"port": 27017, | |||||
"setParameter" : { "enableTestCommands": 1 } | |||||
}, | |||||
"rsParams": { | |||||
"tags": { | |||||
"ordinal": "one", | |||||
"dc": "ny" | |||||
} | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"journal": true, | |||||
"port": 27018, | |||||
"setParameter" : { "enableTestCommands": 1 } | |||||
}, | |||||
"rsParams": { | |||||
"tags": { | |||||
"ordinal": "two", | |||||
"dc": "pa" | |||||
} | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"journal": true, | |||||
"port": 27019, | |||||
"setParameter" : { "enableTestCommands": 1 } | |||||
}, | |||||
"rsParams": { | |||||
"arbiterOnly": true | |||||
} | |||||
} | |||||
] | |||||
} |
@ -0,0 +1,20 @@ | |||||
{ | |||||
"id" : "standalonessl", | |||||
"name": "mongod", | |||||
"login": "bob", | |||||
"password": "pwd123", | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"logappend": true, | |||||
"journal": true, | |||||
"port": 27017 | |||||
}, | |||||
"sslParams": { | |||||
"sslMode": "requireSSL", | |||||
"sslPEMKeyFile": "/tmp/orchestration-home/server.pem", | |||||
"sslCAFile": "/tmp/orchestration-home/ca.pem", | |||||
"sslAllowInvalidCertificates": true, | |||||
"sslWeakCertificateValidation" : true | |||||
} | |||||
} |
@ -0,0 +1,14 @@ | |||||
{ | |||||
"id": "standalone", | |||||
"auth_key": "secret", | |||||
"login": "bob", | |||||
"name": "mongod", | |||||
"password": "pwd123", | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"logappend": true, | |||||
"journal": true, | |||||
"port": 27017 | |||||
} | |||||
} |
@ -0,0 +1,9 @@ | |||||
{ | |||||
"name": "mongod", | |||||
"procParams": { | |||||
"ipv6": false, | |||||
"logappend": true, | |||||
"journal": true, | |||||
"port": 27017 | |||||
} | |||||
} |
@ -0,0 +1,18 @@ | |||||
{ | |||||
"id" : "standalonenoauthssl", | |||||
"name": "mongod", | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"logappend": true, | |||||
"journal": true, | |||||
"port": 27017 | |||||
}, | |||||
"sslParams": { | |||||
"sslMode": "requireSSL", | |||||
"sslPEMKeyFile": "/tmp/orchestration-home/server.pem", | |||||
"sslCAFile": "/tmp/orchestration-home/ca.pem", | |||||
"sslAllowInvalidCertificates": true, | |||||
"sslWeakCertificateValidation" : true | |||||
} | |||||
} |
@ -0,0 +1,10 @@ | |||||
{ | |||||
"name": "mongod", | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"logappend": true, | |||||
"journal": true, | |||||
"port": 27017 | |||||
} | |||||
} |
@ -0,0 +1,11 @@ | |||||
{ | |||||
"name": "mongod", | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"logappend": true, | |||||
"journal": true, | |||||
"storageEngine": "mmapv1", | |||||
"port": 27017 | |||||
} | |||||
} |
@ -0,0 +1,11 @@ | |||||
{ | |||||
"name": "mongod", | |||||
"procParams": { | |||||
"networkMessageCompressors": "snappy,zlib", | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"logappend": true, | |||||
"journal": true, | |||||
"port": 27017 | |||||
} | |||||
} |
@ -0,0 +1,11 @@ | |||||
{ | |||||
"name": "mongod", | |||||
"procParams": { | |||||
"networkMessageCompressors": "snappy", | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"logappend": true, | |||||
"journal": true, | |||||
"port": 27017 | |||||
} | |||||
} |
@ -0,0 +1,11 @@ | |||||
{ | |||||
"name": "mongod", | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"logappend": true, | |||||
"journal": true, | |||||
"storageEngine": "wiredTiger", | |||||
"port": 27017 | |||||
} | |||||
} |
@ -0,0 +1,11 @@ | |||||
{ | |||||
"name": "mongod", | |||||
"procParams": { | |||||
"networkMessageCompressors": "zlib", | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"logappend": true, | |||||
"journal": true, | |||||
"port": 27017 | |||||
} | |||||
} |
@ -0,0 +1,56 @@ | |||||
{ | |||||
"id": "shard_cluster_1", | |||||
"login": "bob", | |||||
"password": "pwd123", | |||||
"auth_key": "secret", | |||||
"shards": [ | |||||
{ | |||||
"id": "sh01", | |||||
"shardParams": { | |||||
"members": [{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"shardsvr": true, | |||||
"setParameter" : { "enableTestCommands": 1 }, | |||||
"port": 27217 | |||||
} | |||||
}] | |||||
} | |||||
}, | |||||
{ | |||||
"id": "sh02", | |||||
"shardParams": { | |||||
"members": [{ | |||||
"procParams": { | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"shardsvr": true, | |||||
"setParameter" : { "enableTestCommands": 1 }, | |||||
"port": 27218 | |||||
} | |||||
}] | |||||
} | |||||
} | |||||
], | |||||
"routers": [ | |||||
{ | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"setParameter" : { "enableTestCommands": 1 }, | |||||
"port": 27017 | |||||
}, | |||||
{ | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1", | |||||
"setParameter" : { "enableTestCommands": 1 }, | |||||
"port": 27018 | |||||
} | |||||
], | |||||
"sslParams": { | |||||
"sslOnNormalPorts": true, | |||||
"sslPEMKeyFile": "/tmp/orchestration-home/server.pem", | |||||
"sslCAFile": "/tmp/orchestration-home/ca.pem", | |||||
"sslWeakCertificateValidation" : true | |||||
} | |||||
} |
@ -0,0 +1,58 @@ | |||||
{ | |||||
"id": "shard_cluster_1", | |||||
"login": "bob", | |||||
"password": "pwd123", | |||||
"auth_key": "secret", | |||||
"shards": [ | |||||
{ | |||||
"id": "sh01", | |||||
"shardParams": { | |||||
"members": [ | |||||
{ | |||||
"procParams": { | |||||
"shardsvr": true, | |||||
"port": 27217 | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"shardsvr": true, | |||||
"port": 27218 | |||||
} | |||||
} | |||||
] | |||||
} | |||||
}, | |||||
{ | |||||
"id": "sh02", | |||||
"shardParams": { | |||||
"members": [ | |||||
{ | |||||
"procParams": { | |||||
"shardsvr": true, | |||||
"port": 27219 | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"shardsvr": true, | |||||
"port": 27220 | |||||
} | |||||
} | |||||
] | |||||
} | |||||
} | |||||
], | |||||
"routers": [ | |||||
{ | |||||
"port": 27017, | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1" | |||||
}, | |||||
{ | |||||
"port": 27018, | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1" | |||||
} | |||||
] | |||||
} |
@ -0,0 +1,62 @@ | |||||
{ | |||||
"id": "shard_cluster_1", | |||||
"shards": [ | |||||
{ | |||||
"id": "sh01", | |||||
"shardParams": { | |||||
"members": [ | |||||
{ | |||||
"procParams": { | |||||
"shardsvr": true, | |||||
"port": 27217 | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"shardsvr": true, | |||||
"port": 27218 | |||||
} | |||||
} | |||||
] | |||||
} | |||||
}, | |||||
{ | |||||
"id": "sh02", | |||||
"shardParams": { | |||||
"members": [ | |||||
{ | |||||
"procParams": { | |||||
"shardsvr": true, | |||||
"port": 27219 | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"shardsvr": true, | |||||
"port": 27220 | |||||
} | |||||
} | |||||
] | |||||
} | |||||
} | |||||
], | |||||
"routers": [ | |||||
{ | |||||
"port": 27017, | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1" | |||||
}, | |||||
{ | |||||
"port": 27018, | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1" | |||||
} | |||||
], | |||||
"sslParams": { | |||||
"sslMode": "requireSSL", | |||||
"sslPEMKeyFile": "/tmp/orchestration-home/server.pem", | |||||
"sslCAFile": "/tmp/orchestration-home/ca.pem", | |||||
"sslAllowInvalidCertificates": true, | |||||
"sslWeakCertificateValidation" : true | |||||
} | |||||
} |
@ -0,0 +1,55 @@ | |||||
{ | |||||
"id": "shard_cluster_1", | |||||
"shards": [ | |||||
{ | |||||
"id": "sh01", | |||||
"shardParams": { | |||||
"members": [ | |||||
{ | |||||
"procParams": { | |||||
"shardsvr": true, | |||||
"port": 27217 | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"shardsvr": true, | |||||
"port": 27218 | |||||
} | |||||
} | |||||
] | |||||
} | |||||
}, | |||||
{ | |||||
"id": "sh02", | |||||
"shardParams": { | |||||
"members": [ | |||||
{ | |||||
"procParams": { | |||||
"shardsvr": true, | |||||
"port": 27219 | |||||
} | |||||
}, | |||||
{ | |||||
"procParams": { | |||||
"shardsvr": true, | |||||
"port": 27220 | |||||
} | |||||
} | |||||
] | |||||
} | |||||
} | |||||
], | |||||
"routers": [ | |||||
{ | |||||
"port": 27017, | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1" | |||||
}, | |||||
{ | |||||
"port": 27018, | |||||
"ipv6": true, | |||||
"bind_ip": "127.0.0.1,::1" | |||||
} | |||||
] | |||||
} |
@ -0,0 +1,38 @@ | |||||
# sub-directory 'libbson' was already included at the top-level | |||||
# sub-directory 'libmongoc' was already included at the top-level | |||||
add_subdirectory (tools) | |||||
add_subdirectory (common) | |||||
# zconf.h is generated by configure_file() in the parent CMakeLists.txt | |||||
extra_dist_generated (zlib-1.2.11/zconf.h) | |||||
set (src_zlib_DIST | |||||
src/zlib-1.2.11/crc32.h | |||||
src/zlib-1.2.11/deflate.h | |||||
src/zlib-1.2.11/gzguts.h | |||||
src/zlib-1.2.11/inffast.h | |||||
src/zlib-1.2.11/inffixed.h | |||||
src/zlib-1.2.11/inflate.h | |||||
src/zlib-1.2.11/inftrees.h | |||||
src/zlib-1.2.11/trees.h | |||||
src/zlib-1.2.11/zconf.h.in | |||||
src/zlib-1.2.11/zlib.h | |||||
src/zlib-1.2.11/zutil.h | |||||
) | |||||
# Strip leading directory components to make the paths relative for MakeDist. | |||||
# The ZLIB_SOURCES list is set in the top-level CMakeLists.txt. | |||||
foreach (zlib_src IN LISTS ZLIB_SOURCES) | |||||
string (REPLACE "${SOURCE_DIR}/" "" zlib_src_rel ${zlib_src}) | |||||
list (APPEND src_zlib_DIST ${zlib_src_rel}) | |||||
endforeach () | |||||
set_local_dist (src_DIST_local | |||||
CMakeLists.txt | |||||
) | |||||
set (src_DIST | |||||
${src_DIST_local} | |||||
${src_tools_DIST} | |||||
${src_zlib_DIST} | |||||
${src_common_DIST} | |||||
PARENT_SCOPE | |||||
) |
@ -0,0 +1,16 @@ | |||||
set (src_common_DIST_noinst_hs | |||||
common-b64-private.h | |||||
common-md5-private.h | |||||
common-thread-private.h | |||||
) | |||||
set (src_common_DIST_cs | |||||
common-b64.c | |||||
common-md5.c | |||||
) | |||||
set_dist_list (src_common_DIST | |||||
CMakeLists.txt | |||||
${src_common_DIST_cs} | |||||
${src_common_DIST_noinst_hs} | |||||
) |
@ -0,0 +1,36 @@ | |||||
/* | |||||
* Copyright 2018-present MongoDB Inc. | |||||
* | |||||
* 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. | |||||
*/ | |||||
#ifndef COMMON_B64_PRIVATE_H | |||||
#define COMMON_B64_PRIVATE_H | |||||
#if !defined(MONGOC_COMPILATION) && !defined(BSON_COMPILATION) && \ | |||||
!defined(BSON_INSIDE) | |||||
#error "Only <mongoc/mongoc.h> or <bson/bson.h> can be included directly." | |||||
#endif | |||||
#include <bson/bson.h> | |||||
int | |||||
bson_b64_ntop (uint8_t const *src, | |||||
size_t srclength, | |||||
char *target, | |||||
size_t targsize); | |||||
int | |||||
bson_b64_pton (char const *src, uint8_t *target, size_t targsize); | |||||
#endif /* COMMON_B64_PRIVATE_H */ |
@ -0,0 +1,528 @@ | |||||
/* | |||||
* Copyright (c) 1996, 1998 by Internet Software Consortium. | |||||
* | |||||
* Permission to use, copy, modify, and distribute this software for any | |||||
* purpose with or without fee is hereby granted, provided that the above | |||||
* copyright notice and this permission notice appear in all copies. | |||||
* | |||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS | |||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES | |||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE | |||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR | |||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS | |||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS | |||||
* SOFTWARE. | |||||
*/ | |||||
/* | |||||
* Portions Copyright (c) 1995 by International Business Machines, Inc. | |||||
* | |||||
* International Business Machines, Inc. (hereinafter called IBM) grants | |||||
* permission under its copyrights to use, copy, modify, and distribute this | |||||
* Software with or without fee, provided that the above copyright notice and | |||||
* all paragraphs of this notice appear in all copies, and that the name of IBM | |||||
* not be used in connection with the marketing of any product incorporating | |||||
* the Software or modifications thereof, without specific, written prior | |||||
* permission. | |||||
* | |||||
* To the extent it has a right to do so, IBM grants an immunity from suit | |||||
* under its patents, if any, for the use, sale or manufacture of products to | |||||
* the extent that such products are used for performing Domain Name System | |||||
* dynamic updates in TCP/IP networks by means of the Software. No immunity is | |||||
* granted for any product per se or for any other function of any product. | |||||
* | |||||
* THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, | |||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A | |||||
* PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, | |||||
* DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING | |||||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN | |||||
* IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. | |||||
*/ | |||||
#include "bson/bson.h" | |||||
#include "common-b64-private.h" | |||||
#define Assert(Cond) \ | |||||
if (!(Cond)) \ | |||||
abort () | |||||
static const char Base64[] = | |||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | |||||
static const char Pad64 = '='; | |||||
/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) | |||||
* The following encoding technique is taken from RFC 1521 by Borenstein | |||||
* and Freed. It is reproduced here in a slightly edited form for | |||||
* convenience. | |||||
* | |||||
* A 65-character subset of US-ASCII is used, enabling 6 bits to be | |||||
* represented per printable character. (The extra 65th character, "=", | |||||
* is used to signify a special processing function.) | |||||
* | |||||
* The encoding process represents 24-bit groups of input bits as output | |||||
* strings of 4 encoded characters. Proceeding from left to right, a | |||||
* 24-bit input group is formed by concatenating 3 8-bit input groups. | |||||
* These 24 bits are then treated as 4 concatenated 6-bit groups, each | |||||
* of which is translated into a single digit in the base64 alphabet. | |||||
* | |||||
* Each 6-bit group is used as an index into an array of 64 printable | |||||
* characters. The character referenced by the index is placed in the | |||||
* output string. | |||||
* | |||||
* Table 1: The Base64 Alphabet | |||||
* | |||||
* Value Encoding Value Encoding Value Encoding Value Encoding | |||||
* 0 A 17 R 34 i 51 z | |||||
* 1 B 18 S 35 j 52 0 | |||||
* 2 C 19 T 36 k 53 1 | |||||
* 3 D 20 U 37 l 54 2 | |||||
* 4 E 21 V 38 m 55 3 | |||||
* 5 F 22 W 39 n 56 4 | |||||
* 6 G 23 X 40 o 57 5 | |||||
* 7 H 24 Y 41 p 58 6 | |||||
* 8 I 25 Z 42 q 59 7 | |||||
* 9 J 26 a 43 r 60 8 | |||||
* 10 K 27 b 44 s 61 9 | |||||
* 11 L 28 c 45 t 62 + | |||||
* 12 M 29 d 46 u 63 / | |||||
* 13 N 30 e 47 v | |||||
* 14 O 31 f 48 w (pad) = | |||||
* 15 P 32 g 49 x | |||||
* 16 Q 33 h 50 y | |||||
* | |||||
* Special processing is performed if fewer than 24 bits are available | |||||
* at the end of the data being encoded. A full encoding quantum is | |||||
* always completed at the end of a quantity. When fewer than 24 input | |||||
* bits are available in an input group, zero bits are added (on the | |||||
* right) to form an integral number of 6-bit groups. Padding at the | |||||
* end of the data is performed using the '=' character. | |||||
* | |||||
* Since all base64 input is an integral number of octets, only the | |||||
* following cases can arise: | |||||
* | |||||
* (1) the final quantum of encoding input is an integral | |||||
* multiple of 24 bits; here, the final unit of encoded | |||||
* output will be an integral multiple of 4 characters | |||||
* with no "=" padding, | |||||
* (2) the final quantum of encoding input is exactly 8 bits; | |||||
* here, the final unit of encoded output will be two | |||||
* characters followed by two "=" padding characters, or | |||||
* (3) the final quantum of encoding input is exactly 16 bits; | |||||
* here, the final unit of encoded output will be three | |||||
* characters followed by one "=" padding character. | |||||
*/ | |||||
int | |||||
bson_b64_ntop (uint8_t const *src, | |||||
size_t srclength, | |||||
char *target, | |||||
size_t targsize) | |||||
{ | |||||
size_t datalength = 0; | |||||
uint8_t input[3]; | |||||
uint8_t output[4]; | |||||
size_t i; | |||||
while (2 < srclength) { | |||||
input[0] = *src++; | |||||
input[1] = *src++; | |||||
input[2] = *src++; | |||||
srclength -= 3; | |||||
output[0] = input[0] >> 2; | |||||
output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); | |||||
output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); | |||||
output[3] = input[2] & 0x3f; | |||||
Assert (output[0] < 64); | |||||
Assert (output[1] < 64); | |||||
Assert (output[2] < 64); | |||||
Assert (output[3] < 64); | |||||
if (datalength + 4 > targsize) { | |||||
return -1; | |||||
} | |||||
target[datalength++] = Base64[output[0]]; | |||||
target[datalength++] = Base64[output[1]]; | |||||
target[datalength++] = Base64[output[2]]; | |||||
target[datalength++] = Base64[output[3]]; | |||||
} | |||||
/* Now we worry about padding. */ | |||||
if (0 != srclength) { | |||||
/* Get what's left. */ | |||||
input[0] = input[1] = input[2] = '\0'; | |||||
for (i = 0; i < srclength; i++) { | |||||
input[i] = *src++; | |||||
} | |||||
output[0] = input[0] >> 2; | |||||
output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); | |||||
output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); | |||||
Assert (output[0] < 64); | |||||
Assert (output[1] < 64); | |||||
Assert (output[2] < 64); | |||||
if (datalength + 4 > targsize) { | |||||
return -1; | |||||
} | |||||
target[datalength++] = Base64[output[0]]; | |||||
target[datalength++] = Base64[output[1]]; | |||||
if (srclength == 1) { | |||||
target[datalength++] = Pad64; | |||||
} else { | |||||
target[datalength++] = Base64[output[2]]; | |||||
} | |||||
target[datalength++] = Pad64; | |||||
} | |||||
if (datalength >= targsize) { | |||||
return -1; | |||||
} | |||||
target[datalength] = '\0'; /* Returned value doesn't count \0. */ | |||||
return (int) datalength; | |||||
} | |||||
/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) | |||||
The following encoding technique is taken from RFC 1521 by Borenstein | |||||
and Freed. It is reproduced here in a slightly edited form for | |||||
convenience. | |||||
A 65-character subset of US-ASCII is used, enabling 6 bits to be | |||||
represented per printable character. (The extra 65th character, "=", | |||||
is used to signify a special processing function.) | |||||
The encoding process represents 24-bit groups of input bits as output | |||||
strings of 4 encoded characters. Proceeding from left to right, a | |||||
24-bit input group is formed by concatenating 3 8-bit input groups. | |||||
These 24 bits are then treated as 4 concatenated 6-bit groups, each | |||||
of which is translated into a single digit in the base64 alphabet. | |||||
Each 6-bit group is used as an index into an array of 64 printable | |||||
characters. The character referenced by the index is placed in the | |||||
output string. | |||||
Table 1: The Base64 Alphabet | |||||
Value Encoding Value Encoding Value Encoding Value Encoding | |||||
0 A 17 R 34 i 51 z | |||||
1 B 18 S 35 j 52 0 | |||||
2 C 19 T 36 k 53 1 | |||||
3 D 20 U 37 l 54 2 | |||||
4 E 21 V 38 m 55 3 | |||||
5 F 22 W 39 n 56 4 | |||||
6 G 23 X 40 o 57 5 | |||||
7 H 24 Y 41 p 58 6 | |||||
8 I 25 Z 42 q 59 7 | |||||
9 J 26 a 43 r 60 8 | |||||
10 K 27 b 44 s 61 9 | |||||
11 L 28 c 45 t 62 + | |||||
12 M 29 d 46 u 63 / | |||||
13 N 30 e 47 v | |||||
14 O 31 f 48 w (pad) = | |||||
15 P 32 g 49 x | |||||
16 Q 33 h 50 y | |||||
Special processing is performed if fewer than 24 bits are available | |||||
at the end of the data being encoded. A full encoding quantum is | |||||
always completed at the end of a quantity. When fewer than 24 input | |||||
bits are available in an input group, zero bits are added (on the | |||||
right) to form an integral number of 6-bit groups. Padding at the | |||||
end of the data is performed using the '=' character. | |||||
Since all base64 input is an integral number of octets, only the | |||||
following cases can arise: | |||||
(1) the final quantum of encoding input is an integral | |||||
multiple of 24 bits; here, the final unit of encoded | |||||
output will be an integral multiple of 4 characters | |||||
with no "=" padding, | |||||
(2) the final quantum of encoding input is exactly 8 bits; | |||||
here, the final unit of encoded output will be two | |||||
characters followed by two "=" padding characters, or | |||||
(3) the final quantum of encoding input is exactly 16 bits; | |||||
here, the final unit of encoded output will be three | |||||
characters followed by one "=" padding character. | |||||
*/ | |||||
/* skips all whitespace anywhere. | |||||
converts characters, four at a time, starting at (or after) | |||||
src from base - 64 numbers into three 8 bit bytes in the target area. | |||||
it returns the number of data bytes stored at the target, or -1 on error. | |||||
*/ | |||||
static uint8_t mongoc_b64rmap[256]; | |||||
static const uint8_t mongoc_b64rmap_special = 0xf0; | |||||
static const uint8_t mongoc_b64rmap_end = 0xfd; | |||||
static const uint8_t mongoc_b64rmap_space = 0xfe; | |||||
static const uint8_t mongoc_b64rmap_invalid = 0xff; | |||||
/* initializing the reverse map isn't thread safe, do it in pthread_once */ | |||||
#if defined(BSON_OS_UNIX) | |||||
#include <pthread.h> | |||||
#define mongoc_common_once_t pthread_once_t | |||||
#define mongoc_common_once pthread_once | |||||
#define MONGOC_COMMON_ONCE_FUN(n) void n (void) | |||||
#define MONGOC_COMMON_ONCE_RETURN return | |||||
#define MONGOC_COMMON_ONCE_INIT PTHREAD_ONCE_INIT | |||||
#else | |||||
#define mongoc_common_once_t INIT_ONCE | |||||
#define MONGOC_COMMON_ONCE_INIT INIT_ONCE_STATIC_INIT | |||||
#define mongoc_common_once(o, c) InitOnceExecuteOnce (o, c, NULL, NULL) | |||||
#define MONGOC_COMMON_ONCE_FUN(n) \ | |||||
BOOL CALLBACK n (PINIT_ONCE _ignored_a, PVOID _ignored_b, PVOID *_ignored_c) | |||||
#define MONGOC_COMMON_ONCE_RETURN return true | |||||
#endif | |||||
static MONGOC_COMMON_ONCE_FUN (bson_b64_initialize_rmap) | |||||
{ | |||||
int i; | |||||
unsigned char ch; | |||||
/* Null: end of string, stop parsing */ | |||||
mongoc_b64rmap[0] = mongoc_b64rmap_end; | |||||
for (i = 1; i < 256; ++i) { | |||||
ch = (unsigned char) i; | |||||
/* Whitespaces */ | |||||
if (isspace (ch)) | |||||
mongoc_b64rmap[i] = mongoc_b64rmap_space; | |||||
/* Padding: stop parsing */ | |||||
else if (ch == Pad64) | |||||
mongoc_b64rmap[i] = mongoc_b64rmap_end; | |||||
/* Non-base64 char */ | |||||
else | |||||
mongoc_b64rmap[i] = mongoc_b64rmap_invalid; | |||||
} | |||||
/* Fill reverse mapping for base64 chars */ | |||||
for (i = 0; Base64[i] != '\0'; ++i) | |||||
mongoc_b64rmap[(uint8_t) Base64[i]] = i; | |||||
MONGOC_COMMON_ONCE_RETURN; | |||||
} | |||||
static int | |||||
mongoc_b64_pton_do (char const *src, uint8_t *target, size_t targsize) | |||||
{ | |||||
int tarindex, state, ch; | |||||
uint8_t ofs; | |||||
state = 0; | |||||
tarindex = 0; | |||||
while (1) { | |||||
ch = *src++; | |||||
ofs = mongoc_b64rmap[ch]; | |||||
if (ofs >= mongoc_b64rmap_special) { | |||||
/* Ignore whitespaces */ | |||||
if (ofs == mongoc_b64rmap_space) | |||||
continue; | |||||
/* End of base64 characters */ | |||||
if (ofs == mongoc_b64rmap_end) | |||||
break; | |||||
/* A non-base64 character. */ | |||||
return (-1); | |||||
} | |||||
switch (state) { | |||||
case 0: | |||||
if ((size_t) tarindex >= targsize) | |||||
return (-1); | |||||
target[tarindex] = ofs << 2; | |||||
state = 1; | |||||
break; | |||||
case 1: | |||||
if ((size_t) tarindex + 1 >= targsize) | |||||
return (-1); | |||||
target[tarindex] |= ofs >> 4; | |||||
target[tarindex + 1] = (ofs & 0x0f) << 4; | |||||
tarindex++; | |||||
state = 2; | |||||
break; | |||||
case 2: | |||||
if ((size_t) tarindex + 1 >= targsize) | |||||
return (-1); | |||||
target[tarindex] |= ofs >> 2; | |||||
target[tarindex + 1] = (ofs & 0x03) << 6; | |||||
tarindex++; | |||||
state = 3; | |||||
break; | |||||
case 3: | |||||
if ((size_t) tarindex >= targsize) | |||||
return (-1); | |||||
target[tarindex] |= ofs; | |||||
tarindex++; | |||||
state = 0; | |||||
break; | |||||
default: | |||||
abort (); | |||||
} | |||||
} | |||||
/* | |||||
* We are done decoding Base-64 chars. Let's see if we ended | |||||
* on a byte boundary, and/or with erroneous trailing characters. | |||||
*/ | |||||
if (ch == Pad64) { /* We got a pad char. */ | |||||
ch = *src++; /* Skip it, get next. */ | |||||
switch (state) { | |||||
case 0: /* Invalid = in first position */ | |||||
case 1: /* Invalid = in second position */ | |||||
return (-1); | |||||
case 2: /* Valid, means one byte of info */ | |||||
/* Skip any number of spaces. */ | |||||
for ((void) NULL; ch != '\0'; ch = *src++) | |||||
if (mongoc_b64rmap[ch] != mongoc_b64rmap_space) | |||||
break; | |||||
/* Make sure there is another trailing = sign. */ | |||||
if (ch != Pad64) | |||||
return (-1); | |||||
ch = *src++; /* Skip the = */ | |||||
/* Fall through to "single trailing =" case. */ | |||||
/* FALLTHROUGH */ | |||||
case 3: /* Valid, means two bytes of info */ | |||||
/* | |||||
* We know this char is an =. Is there anything but | |||||
* whitespace after it? | |||||
*/ | |||||
for ((void) NULL; ch != '\0'; ch = *src++) | |||||
if (mongoc_b64rmap[ch] != mongoc_b64rmap_space) | |||||
return (-1); | |||||
/* | |||||
* Now make sure for cases 2 and 3 that the "extra" | |||||
* bits that slopped past the last full byte were | |||||
* zeros. If we don't check them, they become a | |||||
* subliminal channel. | |||||
*/ | |||||
if (target[tarindex] != 0) | |||||
return (-1); | |||||
default: | |||||
break; | |||||
} | |||||
} else { | |||||
/* | |||||
* We ended by seeing the end of the string. Make sure we | |||||
* have no partial bytes lying around. | |||||
*/ | |||||
if (state != 0) | |||||
return (-1); | |||||
} | |||||
return (tarindex); | |||||
} | |||||
static int | |||||
mongoc_b64_pton_len (char const *src) | |||||
{ | |||||
int tarindex, state, ch; | |||||
uint8_t ofs; | |||||
state = 0; | |||||
tarindex = 0; | |||||
while (1) { | |||||
ch = *src++; | |||||
ofs = mongoc_b64rmap[ch]; | |||||
if (ofs >= mongoc_b64rmap_special) { | |||||
/* Ignore whitespaces */ | |||||
if (ofs == mongoc_b64rmap_space) | |||||
continue; | |||||
/* End of base64 characters */ | |||||
if (ofs == mongoc_b64rmap_end) | |||||
break; | |||||
/* A non-base64 character. */ | |||||
return (-1); | |||||
} | |||||
switch (state) { | |||||
case 0: | |||||
state = 1; | |||||
break; | |||||
case 1: | |||||
tarindex++; | |||||
state = 2; | |||||
break; | |||||
case 2: | |||||
tarindex++; | |||||
state = 3; | |||||
break; | |||||
case 3: | |||||
tarindex++; | |||||
state = 0; | |||||
break; | |||||
default: | |||||
abort (); | |||||
} | |||||
} | |||||
/* | |||||
* We are done decoding Base-64 chars. Let's see if we ended | |||||
* on a byte boundary, and/or with erroneous trailing characters. | |||||
*/ | |||||
if (ch == Pad64) { /* We got a pad char. */ | |||||
ch = *src++; /* Skip it, get next. */ | |||||
switch (state) { | |||||
case 0: /* Invalid = in first position */ | |||||
case 1: /* Invalid = in second position */ | |||||
return (-1); | |||||
case 2: /* Valid, means one byte of info */ | |||||
/* Skip any number of spaces. */ | |||||
for ((void) NULL; ch != '\0'; ch = *src++) | |||||
if (mongoc_b64rmap[ch] != mongoc_b64rmap_space) | |||||
break; | |||||
/* Make sure there is another trailing = sign. */ | |||||
if (ch != Pad64) | |||||
return (-1); | |||||
ch = *src++; /* Skip the = */ | |||||
/* Fall through to "single trailing =" case. */ | |||||
/* FALLTHROUGH */ | |||||
case 3: /* Valid, means two bytes of info */ | |||||
/* | |||||
* We know this char is an =. Is there anything but | |||||
* whitespace after it? | |||||
*/ | |||||
for ((void) NULL; ch != '\0'; ch = *src++) | |||||
if (mongoc_b64rmap[ch] != mongoc_b64rmap_space) | |||||
return (-1); | |||||
default: | |||||
break; | |||||
} | |||||
} else { | |||||
/* | |||||
* We ended by seeing the end of the string. Make sure we | |||||
* have no partial bytes lying around. | |||||
*/ | |||||
if (state != 0) | |||||
return (-1); | |||||
} | |||||
return (tarindex); | |||||
} | |||||
int | |||||
bson_b64_pton (char const *src, uint8_t *target, size_t targsize) | |||||
{ | |||||
static mongoc_common_once_t once = MONGOC_COMMON_ONCE_INIT; | |||||
mongoc_common_once (&once, bson_b64_initialize_rmap); | |||||
if (target) | |||||
return mongoc_b64_pton_do (src, target, targsize); | |||||
else | |||||
return mongoc_b64_pton_len (src); | |||||
} |
@ -0,0 +1,39 @@ | |||||
/* | |||||
* Copyright 2018-present MongoDB, Inc. | |||||
* | |||||
* 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. | |||||
*/ | |||||
#ifndef COMMON_MD5_PRIVATE_H | |||||
#define COMMON_MD5_PRIVATE_H | |||||
#if !defined(MONGOC_COMPILATION) && !defined(BSON_COMPILATION) && \ | |||||
!defined(BSON_INSIDE) | |||||
#error "Only <mongoc/mongoc.h> or <bson/bson.h> can be included directly." | |||||
#endif | |||||
#include "bson/bson.h" | |||||
BSON_BEGIN_DECLS | |||||
void | |||||
_bson_md5_init (bson_md5_t *pms); | |||||
void | |||||
_bson_md5_append (bson_md5_t *pms, const uint8_t *data, uint32_t nbytes); | |||||
void | |||||
_bson_md5_finish (bson_md5_t *pms, uint8_t digest[16]); | |||||
BSON_END_DECLS | |||||
#endif /* COMMON_MD5_PRIVATE_H */ |
@ -0,0 +1,395 @@ | |||||
/* | |||||
Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. | |||||
This software is provided 'as-is', without any express or implied | |||||
warranty. In no event will the authors be held liable for any damages | |||||
arising from the use of this software. | |||||
Permission is granted to anyone to use this software for any purpose, | |||||
including commercial applications, and to alter it and redistribute it | |||||
freely, subject to the following restrictions: | |||||
1. The origin of this software must not be misrepresented; you must not | |||||
claim that you wrote the original software. If you use this software | |||||
in a product, an acknowledgement in the product documentation would be | |||||
appreciated but is not required. | |||||
2. Altered source versions must be plainly marked as such, and must not be | |||||
misrepresented as being the original software. | |||||
3. This notice may not be removed or altered from any source distribution. | |||||
L. Peter Deutsch | |||||
ghost@aladdin.com | |||||
*/ | |||||
/* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */ | |||||
/* | |||||
Independent implementation of MD5 (RFC 1321). | |||||
This code implements the MD5 Algorithm defined in RFC 1321, whose | |||||
text is available at | |||||
http://www.ietf.org/rfc/rfc1321.txt | |||||
The code is derived from the text of the RFC, including the test suite | |||||
(section A.5) but excluding the rest of Appendix A. It does not include | |||||
any code or documentation that is identified in the RFC as being | |||||
copyrighted. | |||||
The original and principal author of md5.c is L. Peter Deutsch | |||||
<ghost@aladdin.com>. Other authors are noted in the change history | |||||
that follows (in reverse chronological order): | |||||
2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order | |||||
either statically or dynamically; added missing #include <string.h> | |||||
in library. | |||||
2002-03-11 lpd Corrected argument list for main(), and added int return | |||||
type, in test program and T value program. | |||||
2002-02-21 lpd Added missing #include <stdio.h> in test program. | |||||
2000-07-03 lpd Patched to eliminate warnings about "constant is | |||||
unsigned in ANSI C, signed in traditional"; made test program | |||||
self-checking. | |||||
1999-11-04 lpd Edited comments slightly for automatic TOC extraction. | |||||
1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). | |||||
1999-05-03 lpd Original version. | |||||
*/ | |||||
/* | |||||
* The following MD5 implementation has been modified to use types as | |||||
* specified in libbson. | |||||
*/ | |||||
#include <string.h> | |||||
#include "common-md5-private.h" | |||||
#undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */ | |||||
#if BSON_BYTE_ORDER == BSON_BIG_ENDIAN | |||||
#define BYTE_ORDER 1 | |||||
#else | |||||
#define BYTE_ORDER -1 | |||||
#endif | |||||
#define T_MASK ((uint32_t) ~0) | |||||
#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87) | |||||
#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9) | |||||
#define T3 0x242070db | |||||
#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111) | |||||
#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050) | |||||
#define T6 0x4787c62a | |||||
#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec) | |||||
#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe) | |||||
#define T9 0x698098d8 | |||||
#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850) | |||||
#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e) | |||||
#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841) | |||||
#define T13 0x6b901122 | |||||
#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c) | |||||
#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71) | |||||
#define T16 0x49b40821 | |||||
#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d) | |||||
#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf) | |||||
#define T19 0x265e5a51 | |||||
#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855) | |||||
#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2) | |||||
#define T22 0x02441453 | |||||
#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e) | |||||
#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437) | |||||
#define T25 0x21e1cde6 | |||||
#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829) | |||||
#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278) | |||||
#define T28 0x455a14ed | |||||
#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa) | |||||
#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07) | |||||
#define T31 0x676f02d9 | |||||
#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375) | |||||
#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd) | |||||
#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e) | |||||
#define T35 0x6d9d6122 | |||||
#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3) | |||||
#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb) | |||||
#define T38 0x4bdecfa9 | |||||
#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f) | |||||
#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f) | |||||
#define T41 0x289b7ec6 | |||||
#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805) | |||||
#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a) | |||||
#define T44 0x04881d05 | |||||
#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6) | |||||
#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a) | |||||
#define T47 0x1fa27cf8 | |||||
#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a) | |||||
#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb) | |||||
#define T50 0x432aff97 | |||||
#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58) | |||||
#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6) | |||||
#define T53 0x655b59c3 | |||||
#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d) | |||||
#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82) | |||||
#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e) | |||||
#define T57 0x6fa87e4f | |||||
#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f) | |||||
#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb) | |||||
#define T60 0x4e0811a1 | |||||
#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d) | |||||
#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca) | |||||
#define T63 0x2ad7d2bb | |||||
#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e) | |||||
static void | |||||
bson_md5_process (bson_md5_t *md5, const uint8_t *data) | |||||
{ | |||||
uint32_t a = md5->abcd[0]; | |||||
uint32_t b = md5->abcd[1]; | |||||
uint32_t c = md5->abcd[2]; | |||||
uint32_t d = md5->abcd[3]; | |||||
uint32_t t; | |||||
#if BYTE_ORDER > 0 | |||||
/* Define storage only for big-endian CPUs. */ | |||||
uint32_t X[16]; | |||||
#else | |||||
/* Define storage for little-endian or both types of CPUs. */ | |||||
uint32_t xbuf[16]; | |||||
const uint32_t *X; | |||||
#endif | |||||
{ | |||||
#if BYTE_ORDER == 0 | |||||
/* | |||||
* Determine dynamically whether this is a big-endian or | |||||
* little-endian machine, since we can use a more efficient | |||||
* algorithm on the latter. | |||||
*/ | |||||
static const int w = 1; | |||||
if (*((const uint8_t *) &w)) /* dynamic little-endian */ | |||||
#endif | |||||
#if BYTE_ORDER <= 0 /* little-endian */ | |||||
{ | |||||
/* | |||||
* On little-endian machines, we can process properly aligned | |||||
* data without copying it. | |||||
*/ | |||||
if (!((data - (const uint8_t *) 0) & 3)) { | |||||
/* data are properly aligned */ | |||||
#ifdef __clang__ | |||||
#pragma clang diagnostic push | |||||
#pragma clang diagnostic ignored "-Wcast-align" | |||||
#endif | |||||
X = (const uint32_t *) data; | |||||
#ifdef __clang__ | |||||
#pragma clang diagnostic pop | |||||
#endif | |||||
} else { | |||||
/* not aligned */ | |||||
memcpy (xbuf, data, sizeof (xbuf)); | |||||
X = xbuf; | |||||
} | |||||
} | |||||
#endif | |||||
#if BYTE_ORDER == 0 | |||||
else /* dynamic big-endian */ | |||||
#endif | |||||
#if BYTE_ORDER >= 0 /* big-endian */ | |||||
{ | |||||
/* | |||||
* On big-endian machines, we must arrange the bytes in the | |||||
* right order. | |||||
*/ | |||||
const uint8_t *xp = data; | |||||
int i; | |||||
#if BYTE_ORDER == 0 | |||||
X = xbuf; /* (dynamic only) */ | |||||
#else | |||||
#define xbuf X /* (static only) */ | |||||
#endif | |||||
for (i = 0; i < 16; ++i, xp += 4) | |||||
xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); | |||||
} | |||||
#endif | |||||
} | |||||
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) | |||||
/* Round 1. */ | |||||
/* Let [abcd k s i] denote the operation | |||||
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ | |||||
#define F(x, y, z) (((x) & (y)) | (~(x) & (z))) | |||||
#define SET(a, b, c, d, k, s, Ti) \ | |||||
t = a + F (b, c, d) + X[k] + Ti; \ | |||||
a = ROTATE_LEFT (t, s) + b | |||||
/* Do the following 16 operations. */ | |||||
SET (a, b, c, d, 0, 7, T1); | |||||
SET (d, a, b, c, 1, 12, T2); | |||||
SET (c, d, a, b, 2, 17, T3); | |||||
SET (b, c, d, a, 3, 22, T4); | |||||
SET (a, b, c, d, 4, 7, T5); | |||||
SET (d, a, b, c, 5, 12, T6); | |||||
SET (c, d, a, b, 6, 17, T7); | |||||
SET (b, c, d, a, 7, 22, T8); | |||||
SET (a, b, c, d, 8, 7, T9); | |||||
SET (d, a, b, c, 9, 12, T10); | |||||
SET (c, d, a, b, 10, 17, T11); | |||||
SET (b, c, d, a, 11, 22, T12); | |||||
SET (a, b, c, d, 12, 7, T13); | |||||
SET (d, a, b, c, 13, 12, T14); | |||||
SET (c, d, a, b, 14, 17, T15); | |||||
SET (b, c, d, a, 15, 22, T16); | |||||
#undef SET | |||||
/* Round 2. */ | |||||
/* Let [abcd k s i] denote the operation | |||||
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ | |||||
#define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) | |||||
#define SET(a, b, c, d, k, s, Ti) \ | |||||
t = a + G (b, c, d) + X[k] + Ti; \ | |||||
a = ROTATE_LEFT (t, s) + b | |||||
/* Do the following 16 operations. */ | |||||
SET (a, b, c, d, 1, 5, T17); | |||||
SET (d, a, b, c, 6, 9, T18); | |||||
SET (c, d, a, b, 11, 14, T19); | |||||
SET (b, c, d, a, 0, 20, T20); | |||||
SET (a, b, c, d, 5, 5, T21); | |||||
SET (d, a, b, c, 10, 9, T22); | |||||
SET (c, d, a, b, 15, 14, T23); | |||||
SET (b, c, d, a, 4, 20, T24); | |||||
SET (a, b, c, d, 9, 5, T25); | |||||
SET (d, a, b, c, 14, 9, T26); | |||||
SET (c, d, a, b, 3, 14, T27); | |||||
SET (b, c, d, a, 8, 20, T28); | |||||
SET (a, b, c, d, 13, 5, T29); | |||||
SET (d, a, b, c, 2, 9, T30); | |||||
SET (c, d, a, b, 7, 14, T31); | |||||
SET (b, c, d, a, 12, 20, T32); | |||||
#undef SET | |||||
/* Round 3. */ | |||||
/* Let [abcd k s t] denote the operation | |||||
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ | |||||
#define H(x, y, z) ((x) ^ (y) ^ (z)) | |||||
#define SET(a, b, c, d, k, s, Ti) \ | |||||
t = a + H (b, c, d) + X[k] + Ti; \ | |||||
a = ROTATE_LEFT (t, s) + b | |||||
/* Do the following 16 operations. */ | |||||
SET (a, b, c, d, 5, 4, T33); | |||||
SET (d, a, b, c, 8, 11, T34); | |||||
SET (c, d, a, b, 11, 16, T35); | |||||
SET (b, c, d, a, 14, 23, T36); | |||||
SET (a, b, c, d, 1, 4, T37); | |||||
SET (d, a, b, c, 4, 11, T38); | |||||
SET (c, d, a, b, 7, 16, T39); | |||||
SET (b, c, d, a, 10, 23, T40); | |||||
SET (a, b, c, d, 13, 4, T41); | |||||
SET (d, a, b, c, 0, 11, T42); | |||||
SET (c, d, a, b, 3, 16, T43); | |||||
SET (b, c, d, a, 6, 23, T44); | |||||
SET (a, b, c, d, 9, 4, T45); | |||||
SET (d, a, b, c, 12, 11, T46); | |||||
SET (c, d, a, b, 15, 16, T47); | |||||
SET (b, c, d, a, 2, 23, T48); | |||||
#undef SET | |||||
/* Round 4. */ | |||||
/* Let [abcd k s t] denote the operation | |||||
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ | |||||
#define I(x, y, z) ((y) ^ ((x) | ~(z))) | |||||
#define SET(a, b, c, d, k, s, Ti) \ | |||||
t = a + I (b, c, d) + X[k] + Ti; \ | |||||
a = ROTATE_LEFT (t, s) + b | |||||
/* Do the following 16 operations. */ | |||||
SET (a, b, c, d, 0, 6, T49); | |||||
SET (d, a, b, c, 7, 10, T50); | |||||
SET (c, d, a, b, 14, 15, T51); | |||||
SET (b, c, d, a, 5, 21, T52); | |||||
SET (a, b, c, d, 12, 6, T53); | |||||
SET (d, a, b, c, 3, 10, T54); | |||||
SET (c, d, a, b, 10, 15, T55); | |||||
SET (b, c, d, a, 1, 21, T56); | |||||
SET (a, b, c, d, 8, 6, T57); | |||||
SET (d, a, b, c, 15, 10, T58); | |||||
SET (c, d, a, b, 6, 15, T59); | |||||
SET (b, c, d, a, 13, 21, T60); | |||||
SET (a, b, c, d, 4, 6, T61); | |||||
SET (d, a, b, c, 11, 10, T62); | |||||
SET (c, d, a, b, 2, 15, T63); | |||||
SET (b, c, d, a, 9, 21, T64); | |||||
#undef SET | |||||
/* Then perform the following additions. (That is increment each | |||||
of the four registers by the value it had before this block | |||||
was started.) */ | |||||
md5->abcd[0] += a; | |||||
md5->abcd[1] += b; | |||||
md5->abcd[2] += c; | |||||
md5->abcd[3] += d; | |||||
} | |||||
void | |||||
_bson_md5_init (bson_md5_t *pms) | |||||
{ | |||||
pms->count[0] = pms->count[1] = 0; | |||||
pms->abcd[0] = 0x67452301; | |||||
pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476; | |||||
pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301; | |||||
pms->abcd[3] = 0x10325476; | |||||
} | |||||
void | |||||
_bson_md5_append (bson_md5_t *pms, const uint8_t *data, uint32_t nbytes) | |||||
{ | |||||
const uint8_t *p = data; | |||||
int left = nbytes; | |||||
int offset = (pms->count[0] >> 3) & 63; | |||||
uint32_t nbits = (uint32_t) (nbytes << 3); | |||||
if (nbytes <= 0) | |||||
return; | |||||
/* Update the message length. */ | |||||
pms->count[1] += nbytes >> 29; | |||||
pms->count[0] += nbits; | |||||
if (pms->count[0] < nbits) | |||||
pms->count[1]++; | |||||
/* Process an initial partial block. */ | |||||
if (offset) { | |||||
int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); | |||||
memcpy (pms->buf + offset, p, copy); | |||||
if (offset + copy < 64) | |||||
return; | |||||
p += copy; | |||||
left -= copy; | |||||
bson_md5_process (pms, pms->buf); | |||||
} | |||||
/* Process full blocks. */ | |||||
for (; left >= 64; p += 64, left -= 64) | |||||
bson_md5_process (pms, p); | |||||
/* Process a final partial block. */ | |||||
if (left) | |||||
memcpy (pms->buf, p, left); | |||||
} | |||||
void | |||||
_bson_md5_finish (bson_md5_t *pms, uint8_t digest[16]) | |||||
{ | |||||
static const uint8_t pad[64] = { | |||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | |||||
uint8_t data[8]; | |||||
int i; | |||||
/* Save the length before padding. */ | |||||
for (i = 0; i < 8; ++i) | |||||
data[i] = (uint8_t) (pms->count[i >> 2] >> ((i & 3) << 3)); | |||||
/* Pad to 56 bytes mod 64. */ | |||||
_bson_md5_append (pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); | |||||
/* Append the length. */ | |||||
_bson_md5_append (pms, data, sizeof (data)); | |||||
for (i = 0; i < 16; ++i) | |||||
digest[i] = (uint8_t) (pms->abcd[i >> 2] >> ((i & 3) << 3)); | |||||
} |
@ -0,0 +1,66 @@ | |||||
/* | |||||
* Copyright 2013-present MongoDB, Inc. | |||||
* | |||||
* 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. | |||||
*/ | |||||
#ifndef COMMON_THREAD_PRIVATE_H | |||||
#define COMMON_THREAD_PRIVATE_H | |||||
#if !defined(MONGOC_COMPILATION) && !defined(BSON_COMPILATION) && \ | |||||
!defined(BSON_INSIDE) | |||||
#error "Only <mongoc/mongoc.h> or <bson/bson.h> can be included directly." | |||||
#endif | |||||
#include "bson/bson-compat.h" | |||||
#include "bson/bson-config.h" | |||||
#include "bson/bson-macros.h" | |||||
BSON_BEGIN_DECLS | |||||
#if defined(BSON_OS_UNIX) | |||||
#include <pthread.h> | |||||
#define BSON_ONCE_FUN(n) void n (void) | |||||
#define BSON_ONCE_RETURN return | |||||
#define BSON_ONCE_INIT PTHREAD_ONCE_INIT | |||||
#define bson_mutex_destroy pthread_mutex_destroy | |||||
#define bson_mutex_init(_n) pthread_mutex_init ((_n), NULL) | |||||
#define bson_mutex_lock pthread_mutex_lock | |||||
#define bson_mutex_t pthread_mutex_t | |||||
#define bson_mutex_unlock pthread_mutex_unlock | |||||
#define bson_once pthread_once | |||||
#define bson_once_t pthread_once_t | |||||
#define bson_thread_create(_t, _f, _d) pthread_create ((_t), NULL, (_f), (_d)) | |||||
#define bson_thread_join(_n) pthread_join ((_n), NULL) | |||||
#define bson_thread_t pthread_t | |||||
#else | |||||
#define BSON_ONCE_FUN(n) \ | |||||
BOOL CALLBACK n (PINIT_ONCE _ignored_a, PVOID _ignored_b, PVOID *_ignored_c) | |||||
#define BSON_ONCE_INIT INIT_ONCE_STATIC_INIT | |||||
#define BSON_ONCE_RETURN return true | |||||
#define bson_mutex_destroy DeleteCriticalSection | |||||
#define bson_mutex_init InitializeCriticalSection | |||||
#define bson_mutex_lock EnterCriticalSection | |||||
#define bson_mutex_t CRITICAL_SECTION | |||||
#define bson_mutex_unlock LeaveCriticalSection | |||||
#define bson_once(o, c) InitOnceExecuteOnce (o, c, NULL, NULL) | |||||
#define bson_once_t INIT_ONCE | |||||
#define bson_thread_create(_t, _f, _d) \ | |||||
(!(*(_t) = CreateThread (NULL, 0, (void *) _f, _d, 0, NULL))) | |||||
#define bson_thread_join(_n) WaitForSingleObject ((_n), INFINITE) | |||||
#define bson_thread_t HANDLE | |||||
#endif | |||||
BSON_END_DECLS | |||||
#endif /* COMMON_THREAD_PRIVATE_H */ |
@ -0,0 +1,414 @@ | |||||
cmake_minimum_required (VERSION 3.1) | |||||
project (libbson C) | |||||
# In the future we may need to check whether static dependencies are | |||||
# available. For now, AUTO means ON. | |||||
if (ENABLE_TESTS AND NOT ENABLE_STATIC MATCHES "ON|AUTO") | |||||
message (FATAL_ERROR "-DENABLE_STATIC=OFF also requires -DENABLE_TESTS=OFF") | |||||
endif () | |||||
include (CheckFunctionExists) | |||||
include (CheckIncludeFile) | |||||
include (CheckStructHasMember) | |||||
include (CheckSymbolExists) | |||||
include (TestBigEndian) | |||||
include (InstallRequiredSystemLibraries) | |||||
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/build/cmake) | |||||
# Set BSON_MAJOR_VERSION, BSON_MINOR_VERSION, etc. | |||||
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/../../build/cmake) | |||||
include (LoadVersion) | |||||
LoadVersion (${PROJECT_SOURCE_DIR}/../../VERSION_CURRENT BSON) | |||||
LoadVersion (${PROJECT_SOURCE_DIR}/../../VERSION_RELEASED BSON_RELEASED) | |||||
message ("libbson version (from VERSION_CURRENT file): ${BSON_VERSION}") | |||||
if (NOT ${BSON_VERSION} STREQUAL ${BSON_RELEASED_VERSION}) | |||||
message ("libbson previous release (from VERSION_RELEASED file): ${BSON_RELEASED_VERSION}") | |||||
endif () | |||||
set (BSON_API_VERSION 1.0) | |||||
set (CPACK_PACKAGE_VERSION_MAJOR ${BSON_MAJOR_VERSION}) | |||||
set (CPACK_PACKAGE_VERSION_MINOR ${BSON_MINOR_VERSION}) | |||||
include (CPack) | |||||
TEST_BIG_ENDIAN (BSON_BIG_ENDIAN) | |||||
#librt needed on linux for clock_gettime | |||||
find_library (RT_LIBRARY rt) | |||||
if (RT_LIBRARY) | |||||
#set required libraries for CHECK_FUNCTION_EXISTS | |||||
set (CMAKE_REQUIRED_LIBRARIES ${RT_LIBRARY}) | |||||
set (BSON_LIBRARIES ${BSON_LIBRARIES} ${RT_LIBRARY}) | |||||
endif () | |||||
# See https://public.kitware.com/Bug/view.php?id=15659 | |||||
CHECK_SYMBOL_EXISTS (snprintf stdio.h BSON_HAVE_SNPRINTF) | |||||
if (NOT BSON_HAVE_SNPRINTF) | |||||
set (BSON_HAVE_SNPRINTF 0) | |||||
else () | |||||
set (BSON_HAVE_SNPRINTF 1) | |||||
endif () | |||||
CHECK_FUNCTION_EXISTS (reallocf BSON_HAVE_REALLOCF) | |||||
if (NOT BSON_HAVE_REALLOCF) | |||||
set (BSON_HAVE_REALLOCF 0) | |||||
endif () | |||||
CHECK_STRUCT_HAS_MEMBER ("struct timespec" tv_sec time.h BSON_HAVE_TIMESPEC) | |||||
if (NOT BSON_HAVE_TIMESPEC) | |||||
message (STATUS " no timespec struct") | |||||
set (BSON_HAVE_TIMESPEC 0) | |||||
else () | |||||
message (STATUS " struct timespec found") | |||||
set (BSON_HAVE_TIMESPEC 1) | |||||
endif () | |||||
CHECK_SYMBOL_EXISTS (gmtime_r time.h BSON_HAVE_GMTIME_R) | |||||
if (NOT BSON_HAVE_GMTIME_R) | |||||
set (BSON_HAVE_GMTIME_R 0) | |||||
else () | |||||
set (BSON_HAVE_GMTIME_R 1) | |||||
endif () | |||||
CHECK_FUNCTION_EXISTS (rand_r BSON_HAVE_RAND_R) | |||||
if (NOT BSON_HAVE_RAND_R) | |||||
set (BSON_HAVE_RAND_R 0) | |||||
else () | |||||
set (BSON_HAVE_RAND_R 1) | |||||
endif () | |||||
if (WIN32) | |||||
set (BSON_OS 2) | |||||
else () | |||||
set (BSON_OS 1) | |||||
endif () | |||||
include (CheckIncludeFiles) | |||||
CHECK_INCLUDE_FILE (strings.h BSON_HAVE_STRINGS_H) | |||||
if (NOT BSON_HAVE_STRINGS_H) | |||||
set (BSON_HAVE_STRINGS_H 0) | |||||
endif () | |||||
if (MSVC) | |||||
set (BSON_HAVE_CLOCK_GETTIME 0) | |||||
set (BSON_HAVE_STDBOOL_H 0) | |||||
set (BSON_HAVE_STRNLEN 0) | |||||
set (BSON_HAVE_SYSCALL_TID 0) | |||||
else () | |||||
check_symbol_exists (clock_gettime time.h BSON_HAVE_CLOCK_GETTIME) | |||||
if (NOT BSON_HAVE_CLOCK_GETTIME) | |||||
set (BSON_HAVE_CLOCK_GETTIME 0) | |||||
endif () | |||||
check_symbol_exists (strnlen string.h BSON_HAVE_STRNLEN) | |||||
if (NOT BSON_HAVE_STRNLEN) | |||||
set (BSON_HAVE_STRNLEN 0) | |||||
endif () | |||||
CHECK_INCLUDE_FILE (stdbool.h BSON_HAVE_STDBOOL_H) | |||||
if (NOT BSON_HAVE_STDBOOL_H) | |||||
set (BSON_HAVE_STDBOOL_H 0) | |||||
endif () | |||||
CHECK_SYMBOL_EXISTS (SYS_gettid sys/syscall.h BSON_HAVE_SYSCALL_TID) | |||||
check_symbol_exists (syscall unistd.h _TMP_HAVE_SYSCALL) | |||||
if (NOT BSON_HAVE_SYSCALL_TID OR NOT _TMP_HAVE_SYSCALL OR APPLE OR ANDROID) | |||||
set (BSON_HAVE_SYSCALL_TID 0) | |||||
endif () | |||||
endif () | |||||
if (BSON_BIG_ENDIAN) | |||||
set (BSON_BYTE_ORDER 4321) | |||||
else () | |||||
set (BSON_BYTE_ORDER 1234) | |||||
endif () | |||||
include (CheckAtomics) | |||||
configure_file ( | |||||
"${PROJECT_SOURCE_DIR}/src/bson/bson-config.h.in" | |||||
"${PROJECT_BINARY_DIR}/src/bson/bson-config.h" | |||||
) | |||||
configure_file ( | |||||
"${PROJECT_SOURCE_DIR}/src/bson/bson-version.h.in" | |||||
"${PROJECT_BINARY_DIR}/src/bson/bson-version.h" | |||||
) | |||||
if (ENABLE_APPLE_FRAMEWORK) | |||||
configure_file ( | |||||
"${PROJECT_SOURCE_DIR}/src/bson/modules/module.modulemap.in" | |||||
"${PROJECT_BINARY_DIR}/src/bson/modules/module.modulemap" | |||||
) | |||||
endif () | |||||
include_directories ("${PROJECT_BINARY_DIR}/src") | |||||
include_directories ("${PROJECT_SOURCE_DIR}/src") | |||||
include_directories ("${PROJECT_SOURCE_DIR}/../../src/common") | |||||
if (APPLE) | |||||
cmake_policy (SET CMP0042 OLD) | |||||
endif () | |||||
include (MaintainerFlags) | |||||
if (ENABLE_COVERAGE) | |||||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g --coverage") | |||||
endif () | |||||
set (SOURCES | |||||
${PROJECT_SOURCE_DIR}/src/bson/bcon.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-atomic.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-clock.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-context.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-decimal128.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-error.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-fnv.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-iso8601.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-iter.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-json.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-keys.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-md5.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-memory.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-oid.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-reader.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-string.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-timegm.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-utf8.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-value.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-version-functions.c | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-writer.c | |||||
${PROJECT_SOURCE_DIR}/src/jsonsl/jsonsl.c | |||||
${PROJECT_SOURCE_DIR}/../../src/common/common-b64.c | |||||
${PROJECT_SOURCE_DIR}/../../src/common/common-md5.c | |||||
) | |||||
set (HEADERS | |||||
${PROJECT_BINARY_DIR}/src/bson/bson-config.h | |||||
${PROJECT_BINARY_DIR}/src/bson/bson-version.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bcon.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-atomic.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-clock.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-compat.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-context.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-decimal128.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-endian.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-error.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-iter.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-json.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-keys.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-macros.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-md5.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-memory.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-oid.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-reader.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-string.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-types.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-utf8.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-value.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-version-functions.h | |||||
${PROJECT_SOURCE_DIR}/src/bson/bson-writer.h | |||||
) | |||||
set (HEADERS_FORWARDING | |||||
${PROJECT_SOURCE_DIR}/src/bson/forwarding/bson.h | |||||
) | |||||
add_library (bson_shared SHARED ${SOURCES} ${HEADERS} ${HEADERS_FORWARDING}) | |||||
set (CMAKE_CXX_VISIBILITY_PRESET hidden) | |||||
set_target_properties (bson_shared PROPERTIES COMPILE_DEFINITIONS "BSON_COMPILATION;JSONSL_PARSE_NAN") | |||||
set_target_properties (bson_shared PROPERTIES VERSION 0.0.0 SOVERSION 0) | |||||
set_target_properties (bson_shared PROPERTIES OUTPUT_NAME "bson-${BSON_API_VERSION}" PREFIX "lib") | |||||
if (ENABLE_APPLE_FRAMEWORK) | |||||
set_target_properties(bson_shared PROPERTIES | |||||
FRAMEWORK TRUE | |||||
MACOSX_FRAMEWORK_BUNDLE_VERSION ${MONGOC_VERSION} | |||||
MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${MONGOC_VERSION} | |||||
MACOSX_FRAMEWORK_IDENTIFIER org.mongodb.bson | |||||
OUTPUT_NAME "bson" | |||||
PUBLIC_HEADER "${HEADERS}" | |||||
) | |||||
endif () | |||||
if (RT_LIBRARY) | |||||
target_link_libraries (bson_shared ${RT_LIBRARY}) | |||||
endif () | |||||
find_library (M_LIBRARY m) | |||||
if (M_LIBRARY) | |||||
target_link_libraries (bson_shared ${M_LIBRARY}) | |||||
set (BSON_LIBRARIES ${BSON_LIBRARIES} ${M_LIBRARY}) | |||||
endif () | |||||
set (THREADS_PREFER_PTHREAD_FLAG 1) | |||||
find_package (Threads REQUIRED) | |||||
target_link_libraries (bson_shared Threads::Threads) | |||||
if (CMAKE_USE_PTHREADS_INIT) | |||||
set (BSON_LIBRARIES ${BSON_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) | |||||
endif () | |||||
if (WIN32) | |||||
# gethostbyname | |||||
target_link_libraries (bson_shared ws2_32) | |||||
# Can't find_library () system dependencies | |||||
# must be handled specially since we can't resolve them | |||||
set (BSON_SYSTEM_LIBRARIES ${BSON_SYSTEM_LIBRARIES} ws2_32) | |||||
endif () | |||||
if (ENABLE_STATIC MATCHES "ON|AUTO") | |||||
add_library (bson_static STATIC ${SOURCES} ${HEADERS} ${HEADERS_FORWARDING}) | |||||
set_target_properties (bson_static PROPERTIES COMPILE_DEFINITIONS "BSON_COMPILATION;BSON_STATIC;JSONSL_PARSE_NAN") | |||||
set_target_properties (bson_static PROPERTIES VERSION 0.0.0) | |||||
set_target_properties (bson_static PROPERTIES OUTPUT_NAME "bson-static-${BSON_API_VERSION}") | |||||
target_link_libraries (bson_static Threads::Threads) | |||||
if (RT_LIBRARY) | |||||
target_link_libraries (bson_static ${RT_LIBRARY}) | |||||
endif () | |||||
if (M_LIBRARY) | |||||
target_link_libraries (bson_static ${M_LIBRARY}) | |||||
endif () | |||||
if (NOT UNIX) | |||||
# gethostbyname | |||||
target_link_libraries (bson_static ws2_32) | |||||
endif () | |||||
endif () | |||||
function (add_example bin src) | |||||
set (BSON_EXAMPLE_SOURCES ${PROJECT_SOURCE_DIR}/${src}) | |||||
add_executable (${bin} ${BSON_EXAMPLE_SOURCES}) | |||||
# Link against the shared lib like normal apps | |||||
target_link_libraries (${bin} bson_shared) | |||||
set (EXAMPLES ${EXAMPLES} ${bin}) | |||||
endfunction () | |||||
if (ENABLE_EXAMPLES) | |||||
add_example (bcon-col-view examples/bcon-col-view.c) | |||||
add_example (bcon-speed examples/bcon-speed.c) | |||||
add_example (bson-metrics examples/bson-metrics.c) | |||||
if (NOT WIN32) | |||||
target_link_libraries (bson-metrics m) | |||||
add_example (bson-streaming-reader examples/bson-streaming-reader.c) | |||||
endif () | |||||
add_example (bson-to-json examples/bson-to-json.c) | |||||
add_example (bson-validate examples/bson-validate.c) | |||||
add_example (json-to-bson examples/json-to-bson.c) | |||||
endif () # ENABLE_EXAMPLES | |||||
set (BSON_HEADER_INSTALL_DIR | |||||
"${CMAKE_INSTALL_INCLUDEDIR}/libbson-${BSON_API_VERSION}" | |||||
) | |||||
install ( | |||||
TARGETS bson_shared ${EXAMPLES} | |||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} | |||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} | |||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} | |||||
FRAMEWORK DESTINATION ${CMAKE_INSTALL_BINDIR} | |||||
) | |||||
if (ENABLE_STATIC MATCHES "ON|AUTO") | |||||
install ( | |||||
TARGETS bson_static ${EXAMPLES} | |||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} | |||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} | |||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} | |||||
FRAMEWORK DESTINATION ${CMAKE_INSTALL_BINDIR} | |||||
) | |||||
endif () | |||||
install ( | |||||
FILES ${HEADERS} | |||||
DESTINATION "${BSON_HEADER_INSTALL_DIR}/bson" | |||||
) | |||||
install ( | |||||
FILES ${HEADERS_FORWARDING} | |||||
DESTINATION "${BSON_HEADER_INSTALL_DIR}" | |||||
) | |||||
if (ENABLE_APPLE_FRAMEWORK) | |||||
install ( | |||||
FILES "${PROJECT_BINARY_DIR}/src/bson/modules/module.modulemap" | |||||
DESTINATION "${CMAKE_INSTALL_BINDIR}/bson.framework/Modules/" | |||||
) | |||||
endif () | |||||
set (LIBBSON_LIBRARIES "") | |||||
foreach (_lib ${CMAKE_C_IMPLICIT_LINK_LIBRARIES} ${BSON_LIBRARIES}) | |||||
if (_lib MATCHES ".*/.*" OR _lib MATCHES "^-") | |||||
set (LIBBSON_LIBRARIES "${LIBBSON_LIBRARIES} ${_lib}") | |||||
else () | |||||
set (LIBBSON_LIBRARIES "${LIBBSON_LIBRARIES} -l${_lib}") | |||||
endif () | |||||
endforeach () | |||||
# System dependencies don't match the above regexs, but also don't want the -l | |||||
foreach (_lib ${BSON_SYSTEM_LIBRARIES}) | |||||
set (LIBBSON_LIBRARIES "${LIBBSON_LIBRARIES} ${_lib}") | |||||
endforeach () | |||||
set (VERSION "${BSON_VERSION}") | |||||
set (prefix "${CMAKE_INSTALL_PREFIX}") | |||||
set (libdir "\${prefix}/lib") | |||||
configure_file ( | |||||
${CMAKE_CURRENT_SOURCE_DIR}/src/libbson-1.0.pc.in | |||||
${CMAKE_CURRENT_BINARY_DIR}/src/libbson-1.0.pc | |||||
@ONLY) | |||||
install ( | |||||
FILES | |||||
${CMAKE_CURRENT_BINARY_DIR}/src/libbson-1.0.pc | |||||
DESTINATION | |||||
${CMAKE_INSTALL_LIBDIR}/pkgconfig | |||||
) | |||||
if (ENABLE_STATIC MATCHES "ON|AUTO") | |||||
configure_file ( | |||||
${CMAKE_CURRENT_SOURCE_DIR}/src/libbson-static-1.0.pc.in | |||||
${CMAKE_CURRENT_BINARY_DIR}/src/libbson-static-1.0.pc | |||||
@ONLY) | |||||
install ( | |||||
FILES | |||||
${CMAKE_CURRENT_BINARY_DIR}/src/libbson-static-1.0.pc | |||||
DESTINATION | |||||
${CMAKE_INSTALL_LIBDIR}/pkgconfig | |||||
) | |||||
endif () | |||||
include (build/cmake/BSONPackage.cmake) | |||||
if (ENABLE_MAN_PAGES STREQUAL ON OR ENABLE_HTML_DOCS STREQUAL ON) | |||||
find_package (Sphinx REQUIRED) | |||||
add_subdirectory (doc) | |||||
add_custom_target (bson-doc | |||||
ALL | |||||
DEPENDS | |||||
$<$<STREQUAL:"${ENABLE_MAN_PAGES}","ON">:bson-man> | |||||
$<$<STREQUAL:"${ENABLE_HTML_DOCS}","ON">:bson-html> | |||||
) | |||||
endif () | |||||
add_subdirectory (build) | |||||
# sub-directory 'doc' was already included above | |||||
add_subdirectory (examples) | |||||
add_subdirectory (src) | |||||
add_subdirectory (tests) | |||||
set_local_dist (src_libbson_DIST_local | |||||
CMakeLists.txt | |||||
NEWS | |||||
THIRD_PARTY_NOTICES | |||||
) | |||||
set (src_libbson_DIST | |||||
${src_libbson_DIST_local} | |||||
${src_libbson_build_DIST} | |||||
${src_libbson_doc_DIST} | |||||
${src_libbson_examples_DIST} | |||||
${src_libbson_src_DIST} | |||||
${src_libbson_tests_DIST} | |||||
PARENT_SCOPE | |||||
) |
@ -0,0 +1,45 @@ | |||||
Libbson uses third-party libraries distributed under different licenses. | |||||
License notice for jsonsl | |||||
------------------------------------------------------------------------------- | |||||
MIT License | |||||
Copyright (c) 2012-2015 M. Nunberg, mnunberg@haskalah.org | |||||
Permission is hereby granted, free of charge, to any person obtaining | |||||
a copy of this software and associated documentation files (the | |||||
"Software"), to deal in the Software without restriction, including | |||||
without limitation the rights to use, copy, modify, merge, publish, | |||||
distribute, sublicense, and/or sell copies of the Software, and to | |||||
permit persons to whom the Software is furnished to do so, subject to | |||||
the following conditions: | |||||
The above copyright notice and this permission notice shall be | |||||
included in all copies or substantial portions of the Software. | |||||
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 OR COPYRIGHT HOLDERS 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. | |||||
License notice for bson-fnv-private.h, bson-fnv.c and test-fnv.c | |||||
------------------------------------------------------------------------------- | |||||
Please do not copyright this code. This code is in the public domain. | |||||
LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, | |||||
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO | |||||
EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR | |||||
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | |||||
USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | |||||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | |||||
PERFORMANCE OF THIS SOFTWARE. | |||||
By: | |||||
chongo <Landon Curt Noll> /\oo/\ | |||||
http://www.isthe.com/chongo/ |
@ -0,0 +1,36 @@ | |||||
include (SphinxBuild) | |||||
if (ENABLE_HTML_DOCS) | |||||
sphinx_build_html (bson-html libbson) | |||||
set (src_libbson_doc_DIST_htmls ${doc_DIST_htmls}) | |||||
endif () | |||||
if (ENABLE_MAN_PAGES) | |||||
sphinx_build_man (bson-man) | |||||
set (src_libbson_doc_DIST_mans ${doc_DIST_mans}) | |||||
endif () | |||||
add_subdirectory (html) | |||||
add_subdirectory (man) | |||||
file (GLOB src_libbson_doc_DIST_rsts RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.rst) | |||||
extra_dist_generated ( | |||||
${src_libbson_doc_DIST_htmls} | |||||
${src_libbson_doc_DIST_mans} | |||||
) | |||||
set_local_dist (src_libbson_doc_DIST_local | |||||
CMakeLists.txt | |||||
${src_libbson_doc_DIST_rsts} | |||||
conf.py | |||||
) | |||||
set (src_libbson_doc_DIST | |||||
${src_libbson_doc_DIST_local} | |||||
${src_libbson_doc_html_DIST} | |||||
${src_libbson_doc_man_DIST} | |||||
${src_libbson_doc_mongoc_DIST} | |||||
${src_libbson_doc_mongoc-theme_DIST} | |||||
PARENT_SCOPE | |||||
) |
@ -0,0 +1,27 @@ | |||||
API Reference | |||||
============= | |||||
.. toctree:: | |||||
:titlesonly: | |||||
:maxdepth: 2 | |||||
bson_t | |||||
bson_context_t | |||||
bson_decimal128_t | |||||
bson_error_t | |||||
bson_iter_t | |||||
bson_json_reader_t | |||||
bson_md5_t | |||||
bson_oid_t | |||||
bson_reader_t | |||||
character_and_string_routines | |||||
bson_string_t | |||||
bson_subtype_t | |||||
bson_type_t | |||||
bson_unichar_t | |||||
bson_value_t | |||||
bson_visitor_t | |||||
bson_writer_t | |||||
bson_get_monotonic_time | |||||
bson_memory | |||||
version |
@ -0,0 +1,36 @@ | |||||
:man_page: bson_append_array | |||||
bson_append_array() | |||||
=================== | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_ARRAY(b, key, val) \ | |||||
bson_append_array (b, key, (int) strlen (key), val) | |||||
bool | |||||
bson_append_array (bson_t *bson, | |||||
const char *key, | |||||
int key_length, | |||||
const bson_t *array); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: An ASCII C string containing the name of the field. | |||||
* ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. | |||||
* ``array``: A :symbol:`bson_t`. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_array()` function shall append ``array`` to ``bson`` using the specified key. The type of the field will be an array, but it is the responsibility of the caller to ensure that the keys of ``array`` are properly formatted with string keys such as "0", "1", "2" and so forth. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function fails if appending the array grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,39 @@ | |||||
:man_page: bson_append_array_begin | |||||
bson_append_array_begin() | |||||
========================= | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_ARRAY_BEGIN(b, key, child) \ | |||||
bson_append_array_begin (b, key, (int) strlen (key), child) | |||||
bool | |||||
bson_append_array_begin (bson_t *bson, | |||||
const char *key, | |||||
int key_length, | |||||
bson_t *child); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: A string containing the name for the key. | |||||
* ``key_length``: The length of ``key`` or -1 to call ``strlen()``. | |||||
* ``child``: A :symbol:`bson_t`. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_array_begin()` function shall begin appending an array field to ``bson``. This allows for incrementally building a sub-array. Doing so will generally yield better performance as you will serialize to a single buffer. When done building the sub-array, the caller *MUST* call :symbol:`bson_append_array_end()`. | |||||
For generating array element keys, see :symbol:`bson_uint32_to_string`. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending the array grows ``bson`` larger than INT32_MAX. | |||||
@ -0,0 +1,28 @@ | |||||
:man_page: bson_append_array_end | |||||
bson_append_array_end() | |||||
======================= | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
bool | |||||
bson_append_array_end (bson_t *bson, bson_t *child); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``child``: The :symbol:`bson_t` initialized in a call to :symbol:`bson_append_array_begin()`. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_array_end()` function shall complete the appending of an array field started with :symbol:`bson_append_array_begin()`. ``child`` is invalid after calling this function. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if successful. |
@ -0,0 +1,40 @@ | |||||
:man_page: bson_append_binary | |||||
bson_append_binary() | |||||
==================== | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_BINARY(b, key, subtype, val, len) \ | |||||
bson_append_binary (b, key, (int) strlen (key), subtype, val, len) | |||||
bool | |||||
bson_append_binary (bson_t *bson, | |||||
const char *key, | |||||
int key_length, | |||||
bson_subtype_t subtype, | |||||
const uint8_t *binary, | |||||
uint32_t length); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: The key name. | |||||
* ``key_length``: The length of ``key`` in bytes or -1 to use strlen(). | |||||
* ``subtype``: A bson_subtype_t indicating the binary subtype. | |||||
* ``binary``: A buffer to embed as binary data. Must not be ``NULL``. | |||||
* ``length``: The length of ``buffer`` in bytes. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_binary()` function shall append a new element to ``bson`` containing the binary data provided. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending ``binary`` grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,33 @@ | |||||
:man_page: bson_append_bool | |||||
bson_append_bool() | |||||
================== | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_BOOL(b, key, val) \ | |||||
bson_append_bool (b, key, (int) strlen (key), val) | |||||
bool | |||||
bson_append_bool (bson_t *bson, const char *key, int key_length, bool value); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: The name of the field. | |||||
* ``key_length``: The length of ``key`` or -1 to use strlen(). | |||||
* ``value``: true or false. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_bool()` function shall append a new element to ``bson`` containing the boolean provided. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,36 @@ | |||||
:man_page: bson_append_code | |||||
bson_append_code() | |||||
================== | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_CODE(b, key, val) \ | |||||
bson_append_code (b, key, (int) strlen (key), val) | |||||
bool | |||||
bson_append_code (bson_t *bson, | |||||
const char *key, | |||||
int key_length, | |||||
const char *javascript); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: The key name. | |||||
* ``key_length``: The length of ``key`` or -1 to use strlen(). | |||||
* ``javascript``: A UTF-8 encoded string containing the javascript. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_code()` function shall append a new element to ``bson`` using the UTF-8 encoded ``javascript`` provided. ``javascript`` must be a NULL terminated C string. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending ``javascript`` grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,40 @@ | |||||
:man_page: bson_append_code_with_scope | |||||
bson_append_code_with_scope() | |||||
============================= | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_CODE_WITH_SCOPE(b, key, val, scope) \ | |||||
bson_append_code_with_scope (b, key, (int) strlen (key), val, scope) | |||||
bool | |||||
bson_append_code_with_scope (bson_t *bson, | |||||
const char *key, | |||||
int key_length, | |||||
const char *javascript, | |||||
const bson_t *scope); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: An ASCII C string containing the name of the field. | |||||
* ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. | |||||
* ``javascript``: A NULL-terminated UTF-8 encoded string containing the javascript fragment. | |||||
* ``scope``: Optional :symbol:`bson_t` containing the scope for ``javascript``. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_code_with_scope()` function shall perform like :symbol:`bson_append_code()` except it allows providing a scope to the javascript function in the form of a bson document. | |||||
If ``scope`` is NULL, this function appends an element with BSON type "code", otherwise with BSON type "code with scope". | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending ``javascript`` and ``scope`` grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,36 @@ | |||||
:man_page: bson_append_date_time | |||||
bson_append_date_time() | |||||
======================= | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_DATE_TIME(b, key, val) \ | |||||
bson_append_date_time (b, key, (int) strlen (key), val) | |||||
bool | |||||
bson_append_date_time (bson_t *bson, | |||||
const char *key, | |||||
int key_length, | |||||
int64_t value); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: An ASCII C string containing the name of the field. | |||||
* ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. | |||||
* ``value``: The date and time as specified in milliseconds since the UNIX epoch. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_date_time()` function shall append a new element to a ``bson`` document containing a date and time with no timezone information. ``value`` is assumed to be in UTC format of milliseconds since the UNIX epoch. ``value`` *MAY* be negative. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,40 @@ | |||||
:man_page: bson_append_dbpointer | |||||
bson_append_dbpointer() | |||||
======================= | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_DBPOINTER(b, key, coll, oid) \ | |||||
bson_append_dbpointer (b, key, (int) strlen (key), coll, oid) | |||||
bool | |||||
bson_append_dbpointer (bson_t *bson, | |||||
const char *key, | |||||
int key_length, | |||||
const char *collection, | |||||
const bson_oid_t *oid); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: An ASCII C string containing the name of the field. | |||||
* ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. | |||||
* ``collection``: The target collection name. | |||||
* ``oid``: The target document identifier. | |||||
Description | |||||
----------- | |||||
.. warning:: | |||||
The dbpointer field type is *DEPRECATED* and should only be used when interacting with legacy systems. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending the array grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,36 @@ | |||||
:man_page: bson_append_decimal128 | |||||
bson_append_decimal128() | |||||
======================== | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_DECIMAL128(b, key, val) \ | |||||
bson_append_decimal128 (b, key, (int) strlen (key), val) | |||||
bool | |||||
bson_append_decimal128 (bson_t *bson, | |||||
const char *key, | |||||
int key_length, | |||||
const bson_decimal128_t *value); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: An ASCII C string containing the name of the field. | |||||
* ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. | |||||
* ``value``: A :symbol:`bson_decimal128_t`. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_decimal128()` function shall append a new element to ``bson`` containing a Decimal 128. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,36 @@ | |||||
:man_page: bson_append_document | |||||
bson_append_document() | |||||
====================== | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_DOCUMENT(b, key, val) \ | |||||
bson_append_document (b, key, (int) strlen (key), val) | |||||
bool | |||||
bson_append_document (bson_t *bson, | |||||
const char *key, | |||||
int key_length, | |||||
const bson_t *value); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: An ASCII C string containing the name of the field. | |||||
* ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. | |||||
* ``value``: A :symbol:`bson_t` containing the sub-document to append. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_document()` function shall append ``child`` to ``bson`` using the specified key. The type of the field will be a document. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,38 @@ | |||||
:man_page: bson_append_document_begin | |||||
bson_append_document_begin() | |||||
============================ | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_DOCUMENT_BEGIN(b, key, child) \ | |||||
bson_append_document_begin (b, key, (int) strlen (key), child) | |||||
bool | |||||
bson_append_document_begin (bson_t *bson, | |||||
const char *key, | |||||
int key_length, | |||||
bson_t *child); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: An ASCII C string containing the name of the field. | |||||
* ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. | |||||
* ``child``: An uninitialized :symbol:`bson_t` to be initialized as the sub-document. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_document_begin()` function shall begin appending a sub-document to ``bson``. Use ``child`` to add fields to the sub-document. When completed, call :symbol:`bson_append_document_end()` to complete the element. | |||||
``child`` *MUST* be an uninitialized :symbol:`bson_t` to avoid leaking memory. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if ``bson`` must grow larger than INT32_MAX. |
@ -0,0 +1,28 @@ | |||||
:man_page: bson_append_document_end | |||||
bson_append_document_end() | |||||
========================== | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
bool | |||||
bson_append_document_end (bson_t *bson, bson_t *child); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``child``: The child :symbol:`bson_t` initialized in a call to :symbol:`bson_append_document_begin()`. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_document_end()` function shall complete the appending of a document with :symbol:`bson_append_document_begin()`. ``child`` is invalid after calling this function. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if successful. |
@ -0,0 +1,36 @@ | |||||
:man_page: bson_append_double | |||||
bson_append_double() | |||||
==================== | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_DOUBLE(b, key, val) \ | |||||
bson_append_double (b, key, (int) strlen (key), val) | |||||
bool | |||||
bson_append_double (bson_t *bson, | |||||
const char *key, | |||||
int key_length, | |||||
double value); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: An ASCII C string containing the name of the field. | |||||
* ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. | |||||
* ``value``: A double value to append. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_double()` function shall append a new element to a bson document of type ``double``. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,36 @@ | |||||
:man_page: bson_append_int32 | |||||
bson_append_int32() | |||||
=================== | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_INT32(b, key, val) \ | |||||
bson_append_int32 (b, key, (int) strlen (key), val) | |||||
bool | |||||
bson_append_int32 (bson_t *bson, | |||||
const char *key, | |||||
int key_length, | |||||
int32_t value); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: An ASCII C string containing the name of the field. | |||||
* ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. | |||||
* ``value``: An int32_t. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_int32()` function shall append a new element to ``bson`` containing a 32-bit signed integer. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,36 @@ | |||||
:man_page: bson_append_int64 | |||||
bson_append_int64() | |||||
=================== | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_INT64(b, key, val) \ | |||||
bson_append_int64 (b, key, (int) strlen (key), val) | |||||
bool | |||||
bson_append_int64 (bson_t *bson, | |||||
const char *key, | |||||
int key_length, | |||||
int64_t value); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: An ASCII C string containing the name of the field. | |||||
* ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. | |||||
* ``value``: An int64_t. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_int64()` function shall append a new element to ``bson`` containing a 64-bit signed integer. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,33 @@ | |||||
:man_page: bson_append_iter | |||||
bson_append_iter() | |||||
================== | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
bool | |||||
bson_append_iter (bson_t *bson, | |||||
const char *key, | |||||
int key_length, | |||||
const bson_iter_t *iter); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: Optional field name. If NULL, uses :symbol:`bson_iter_key(iter) <bson_iter_key>`. | |||||
* ``key_length``: The length of ``key`` or -1 to use strlen(). | |||||
* ``iter``: A :symbol:`bson_iter_t` located on the position of the element to append. | |||||
Description | |||||
----------- | |||||
Appends the value at the current position of ``iter`` to the document. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if successful; ``false`` if the operation would overflow the maximum document size or another invalid state is detected. |
@ -0,0 +1,32 @@ | |||||
:man_page: bson_append_maxkey | |||||
bson_append_maxkey() | |||||
==================== | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_MAXKEY(b, key) \ | |||||
bson_append_maxkey (b, key, (int) strlen (key)) | |||||
bool | |||||
bson_append_maxkey (bson_t *bson, const char *key, int key_length); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: An ASCII C string containing the name of the field. | |||||
* ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_maxkey()` function shall append an element of type BSON_TYPE_MAXKEY to a bson document. This is primarily used in queries and unlikely to be used when storing a document to MongoDB. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,32 @@ | |||||
:man_page: bson_append_minkey | |||||
bson_append_minkey() | |||||
==================== | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_MINKEY(b, key) \ | |||||
bson_append_minkey (b, key, (int) strlen (key)) | |||||
bool | |||||
bson_append_minkey (bson_t *bson, const char *key, int key_length); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: An ASCII C string containing the name of the field. | |||||
* ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_minkey()` function shall append an element of type BSON_TYPE_MINKEY to a bson document. This is primarily used in queries and unlikely to be used when storing a document to MongoDB. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,31 @@ | |||||
:man_page: bson_append_now_utc | |||||
bson_append_now_utc() | |||||
===================== | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
bool | |||||
bson_append_now_utc (bson_t *bson, const char *key, int key_length); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: An ASCII C string containing the name of the field. | |||||
* ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_now_utc()` function is a helper to get the current date and time in UTC and append it to ``bson`` as a BSON_TYPE_DATE_TIME element. | |||||
This function calls :symbol:`bson_append_date_time()` internally. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,31 @@ | |||||
:man_page: bson_append_null | |||||
bson_append_null() | |||||
================== | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_NULL(b, key) bson_append_null (b, key, (int) strlen (key)) | |||||
bool | |||||
bson_append_null (bson_t *bson, const char *key, int key_length); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: An ASCII C string containing the name of the field. | |||||
* ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_null()` function shall append a new element to ``bson`` of type BSON_TYPE_NULL. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. |
@ -0,0 +1,36 @@ | |||||
:man_page: bson_append_oid | |||||
bson_append_oid() | |||||
================= | |||||
Synopsis | |||||
-------- | |||||
.. code-block:: c | |||||
#define BSON_APPEND_OID(b, key, val) \ | |||||
bson_append_oid (b, key, (int) strlen (key), val) | |||||
bool | |||||
bson_append_oid (bson_t *bson, | |||||
const char *key, | |||||
int key_length, | |||||
const bson_oid_t *oid); | |||||
Parameters | |||||
---------- | |||||
* ``bson``: A :symbol:`bson_t`. | |||||
* ``key``: An ASCII C string containing the name of the field. | |||||
* ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. | |||||
* ``oid``: A bson_oid_t. | |||||
Description | |||||
----------- | |||||
The :symbol:`bson_append_oid()` function shall append a new element to ``bson`` of type BSON_TYPE_OID. ``oid`` *MUST* be a pointer to a :symbol:`bson_oid_t`. | |||||
Returns | |||||
------- | |||||
Returns ``true`` if the operation was applied successfully. The function will fail if appending ``oid`` grows ``bson`` larger than INT32_MAX. |