diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a8f89038e..aaf339494c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -96,6 +96,7 @@ set(ARANGODB_FRIENDLY_STRING "ArangoDB - the multi-model database") set(ARANGO_BENCH_FRIENDLY_STRING "arangobench - stress test program") set(ARANGO_DUMP_FRIENDLY_STRING "arangodump - export") set(ARANGO_RESTORE_FRIENDLY_STRING "arangrestore - importer") +set(ARANGO_EXPORT_FRIENDLY_STRING "arangoexport - dataexporter") set(ARANGO_IMP_FRIENDLY_STRING "arangoimp - TSV/CSV/JSON importer") set(ARANGOSH_FRIENDLY_STRING "arangosh - commandline client") set(ARANGO_VPACK_FRIENDLY_STRING "arangovpack - vpack printer") @@ -108,6 +109,7 @@ set(LIB_ARANGO_V8 arango_v8) set(BIN_ARANGOBENCH arangobench) set(BIN_ARANGOD arangod) set(BIN_ARANGODUMP arangodump) +set(BIN_ARANGOEXPORT arangoexport) set(BIN_ARANGOIMP arangoimp) set(BIN_ARANGORESTORE arangorestore) set(BIN_ARANGOSH arangosh) diff --git a/arangosh/CMakeLists.txt b/arangosh/CMakeLists.txt index cc96ddb79d..362ffafc08 100644 --- a/arangosh/CMakeLists.txt +++ b/arangosh/CMakeLists.txt @@ -97,6 +97,52 @@ else () add_dependencies(arangodump zlibstatic) endif () +################################################################################ +## arangoexport +################################################################################ + +if (MSVC) + generate_product_version(ProductVersionFiles_arangoexport + NAME arangoexport + FILE_DESCRIPTION ${ARANGO_EXPORT_FRIENDLY_STRING} + ICON ${ARANGO_ICON} + VERSION_MAJOR ${CPACK_PACKAGE_VERSION_MAJOR} + VERSION_MINOR ${CPACK_PACKAGE_VERSION_MINOR} + VERSION_PATCH ${CPACK_PACKAGE_VERSION_PATCH} + VERSION_REVISION ${BUILD_ID} + ) +endif () + +add_executable(${BIN_ARANGOEXPORT} + ${ProductVersionFiles_arangoexport} + ${PROJECT_SOURCE_DIR}/lib/Basics/WorkMonitorDummy.cpp + Export/ExportFeature.cpp + Export/arangoexport.cpp + Shell/ClientFeature.cpp + Shell/ConsoleFeature.cpp + V8Client/ArangoClientHelper.cpp +) + +target_link_libraries(${BIN_ARANGOEXPORT} + ${LIB_ARANGO} + ${MSVC_LIBS} + ${SYSTEM_LIBRARIES} + boost_system + boost_boost +) + +install( + TARGETS ${BIN_ARANGOEXPORT} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + +install_config(arangoexport) + +if (NOT USE_PRECOMPILED_V8) + add_dependencies(arangoexport zlibstatic v8_build) # v8_build includes ICU build +else () + add_dependencies(arangoexport zlibstatic) # v8_build includes ICU build +endif () + ################################################################################ ## arangoimp ################################################################################ diff --git a/arangosh/Export/ExportFeature.cpp b/arangosh/Export/ExportFeature.cpp new file mode 100644 index 0000000000..ddcb128f38 --- /dev/null +++ b/arangosh/Export/ExportFeature.cpp @@ -0,0 +1,121 @@ +//////////////////////////////////////////////////////////////////////////////// +/// DISCLAIMER +/// +/// Copyright 2016 ArangoDB GmbH, Cologne, Germany +/// +/// 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. +/// +/// Copyright holder is ArangoDB GmbH, Cologne, Germany +/// +/// @author Manuel Baesler +//////////////////////////////////////////////////////////////////////////////// + +#include "ExportFeature.h" + +#include "ApplicationFeatures/ApplicationServer.h" +#include "Basics/FileUtils.h" +#include "Basics/StringUtils.h" +#include "Logger/Logger.h" +#include "ProgramOptions/ProgramOptions.h" +#include "Shell/ClientFeature.h" +#include "SimpleHttpClient/GeneralClientConnection.h" +#include "SimpleHttpClient/SimpleHttpClient.h" + +using namespace arangodb; +using namespace arangodb::basics; +using namespace arangodb::httpclient; +using namespace arangodb::options; + +ExportFeature::ExportFeature(application_features::ApplicationServer* server, + int* result) + : ApplicationFeature(server, "Export"), + _result(result) { + requiresElevatedPrivileges(false); + setOptional(false); + startsAfter("Client"); + startsAfter("Config"); + startsAfter("Logger"); +} + +void ExportFeature::collectOptions( + std::shared_ptr options) { +} + +void ExportFeature::validateOptions( + std::shared_ptr options) { + auto const& positionals = options->processingResult()._positionals; + size_t n = positionals.size(); + +/* if (1 == n) { + // only take positional file name attribute into account if user + // did not specify the --file option as well + if (!options->processingResult().touched("--file")) { + _filename = positionals[0]; + } + } else if (1 < n) { + LOG(FATAL) << "expecting at most one filename, got " + + StringUtils::join(positionals, ", "); + FATAL_ERROR_EXIT(); + } */ +} + +void ExportFeature::start() { + ClientFeature* client = application_features::ApplicationServer::getFeature("Client"); + + int ret = EXIT_SUCCESS; + *_result = ret; + + std::unique_ptr httpClient; + + try { + httpClient = client->createHttpClient(); + } catch (...) { + LOG(FATAL) << "cannot create server connection, giving up!"; + FATAL_ERROR_EXIT(); + } + + httpClient->setLocationRewriter(static_cast(client), &rewriteLocation); + httpClient->setUserNamePassword("/", client->username(), client->password()); + + // must stay here in order to establish the connection + httpClient->getServerVersion(); + + if (!httpClient->isConnected()) { + LOG(ERR) << "Could not connect to endpoint '" << client->endpoint() + << "', database: '" << client->databaseName() << "', username: '" + << client->username() << "'"; + LOG(FATAL) << httpClient->getErrorMessage() << "'"; + FATAL_ERROR_EXIT(); + } + + // successfully connected + std::cout << "Connected to ArangoDB '" + << httpClient->getEndpointSpecification() << "', version " + << httpClient->getServerVersion() << ", database: '" + << client->databaseName() << "', username: '" << client->username() + << "'" << std::endl; + + + collectionExport(httpClient.get()); + graphExport(httpClient.get()); + + *_result = ret; +} + +void ExportFeature::collectionExport(SimpleHttpClient* httpClient) { + +} + +void ExportFeature::graphExport(SimpleHttpClient* httpClient) { + +} \ No newline at end of file diff --git a/arangosh/Export/ExportFeature.h b/arangosh/Export/ExportFeature.h new file mode 100644 index 0000000000..1ae8861cc9 --- /dev/null +++ b/arangosh/Export/ExportFeature.h @@ -0,0 +1,60 @@ +//////////////////////////////////////////////////////////////////////////////// +/// DISCLAIMER +/// +/// Copyright 2016 ArangoDB GmbH, Cologne, Germany +/// +/// 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. +/// +/// Copyright holder is ArangoDB GmbH, Cologne, Germany +/// +/// @author Manuel Baesler +//////////////////////////////////////////////////////////////////////////////// + +#ifndef ARANGODB_EXPORT_EXPORT_FEATURE_H +#define ARANGODB_EXPORT_EXPORT_FEATURE_H 1 + +#include "ApplicationFeatures/ApplicationFeature.h" +#include "V8Client/ArangoClientHelper.h" + +namespace arangodb { +namespace httpclient { +class GeneralClientConnection; +class SimpleHttpClient; +class SimpleHttpResult; +} + +class ExportFeature final : public application_features::ApplicationFeature, + public ArangoClientHelper { + public: + ExportFeature(application_features::ApplicationServer* server, + int* result); + + public: + void collectOptions(std::shared_ptr) override; + void validateOptions( + std::shared_ptr options) override; + void start() override; + + private: + void collectionExport(httpclient::SimpleHttpClient* httpClient); + void graphExport(httpclient::SimpleHttpClient* httpClient); + + + private: + // ... + + int* _result; +}; +} + +#endif diff --git a/arangosh/Export/arangoexport.cpp b/arangosh/Export/arangoexport.cpp new file mode 100644 index 0000000000..c75b333319 --- /dev/null +++ b/arangosh/Export/arangoexport.cpp @@ -0,0 +1,83 @@ +//////////////////////////////////////////////////////////////////////////////// +/// DISCLAIMER +/// +/// Copyright 2014-2016 ArangoDB GmbH, Cologne, Germany +/// Copyright 2004-2014 triAGENS GmbH, Cologne, Germany +/// +/// 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. +/// +/// Copyright holder is ArangoDB GmbH, Cologne, Germany +/// +/// @author Dr. Frank Celler +//////////////////////////////////////////////////////////////////////////////// + +#include "Basics/Common.h" +#include "Basics/directories.h" + +#include "ApplicationFeatures/ConfigFeature.h" +#include "ApplicationFeatures/GreetingsFeature.h" +#include "ApplicationFeatures/ShutdownFeature.h" +#include "ApplicationFeatures/TempFeature.h" +#include "ApplicationFeatures/VersionFeature.h" +#include "Basics/ArangoGlobalContext.h" +#include "Export/ExportFeature.h" +#include "Logger/Logger.h" +#include "Logger/LoggerFeature.h" +#include "ProgramOptions/ProgramOptions.h" +#include "Random/RandomFeature.h" +#include "Shell/ClientFeature.h" +#include "Ssl/SslFeature.h" + +using namespace arangodb; +using namespace arangodb::application_features; + +int main(int argc, char* argv[]) { + ArangoGlobalContext context(argc, argv, BIN_DIRECTORY); + context.installHup(); + + std::shared_ptr options(new options::ProgramOptions( + argv[0], "Usage: arangoexport []", "For more information use:", BIN_DIRECTORY)); + + ApplicationServer server(options, BIN_DIRECTORY); + + int ret; + + server.addFeature(new ClientFeature(&server)); + server.addFeature(new ConfigFeature(&server, "arangoexport")); + server.addFeature(new GreetingsFeature(&server, "arangoexport")); + server.addFeature(new ExportFeature(&server, &ret)); + server.addFeature(new LoggerFeature(&server, false)); + server.addFeature(new RandomFeature(&server)); + server.addFeature(new ShutdownFeature(&server, {"Export"})); + server.addFeature(new SslFeature(&server)); + server.addFeature(new TempFeature(&server, "arangoexport")); + server.addFeature(new VersionFeature(&server)); + + try { + server.run(argc, argv); + if (server.helpShown()) { + // --help was displayed + ret = EXIT_SUCCESS; + } + } catch (std::exception const& ex) { + LOG(ERR) << "arangoexport terminated because of an unhandled exception: " + << ex.what(); + ret = EXIT_FAILURE; + } catch (...) { + LOG(ERR) << "arangoexport terminated because of an unhandled exception of " + "unknown type"; + ret = EXIT_FAILURE; + } + + return context.exit(ret); +} diff --git a/etc/arangodb3/arangoexport.conf.in b/etc/arangodb3/arangoexport.conf.in new file mode 100644 index 0000000000..f441822235 --- /dev/null +++ b/etc/arangodb3/arangoexport.conf.in @@ -0,0 +1,10 @@ +# config file for arangoexport + +[server] +endpoint = tcp://127.0.0.1:8529 +authentication = true +# username = root +# password = + +[log] +file = - diff --git a/etc/jenkins/arangoexport.conf b/etc/jenkins/arangoexport.conf new file mode 100644 index 0000000000..e69de29bb2 diff --git a/etc/jenkins/arangoimp.conf b/etc/jenkins/arangoimp.conf new file mode 100644 index 0000000000..e69de29bb2 diff --git a/etc/relative/arangoexport.conf b/etc/relative/arangoexport.conf new file mode 100644 index 0000000000..b8433ed8f7 --- /dev/null +++ b/etc/relative/arangoexport.conf @@ -0,0 +1,7 @@ +[server] +authentication = false +# username = root +# password = + +[log] +file = - diff --git a/etc/testing/arangoexport.conf b/etc/testing/arangoexport.conf new file mode 100644 index 0000000000..e69de29bb2 diff --git a/etc/testing/arangoimp.conf b/etc/testing/arangoimp.conf new file mode 100644 index 0000000000..e69de29bb2