diff --git a/README_SETUP.md b/README_SETUP.md deleted file mode 100644 index f73190cad3386518361a9d76dac2f1825d5f3f28..0000000000000000000000000000000000000000 --- a/README_SETUP.md +++ /dev/null @@ -1,142 +0,0 @@ -# How to Develop and Use Libcaosdb - -## Dependencies - -* See [DEPENDENCIES.md](Dependencies.md) - -## Build - -We use [cmake](https://cmake.org) as build tool. - -0. clone/update the subrepo `git submodule update --init proto` -1. `mkdir build && cd build` -2. `conan install .. -s "compiler.libcxx=libstdc++11"` -3. `cmake -B . ..` -4. `cmake --build .` - -You may also want to install libcaosdb system-wide to -`CMAKE_INSTALL_PREFIX/lib` by - -5. `cmake --install .` - -The default install prefix is `~/.local`. It can be set by adding -`-DCMAKE_INSTALL_PREFIX=/path/to/install/prefix` to the first cmake -command (3.). - -### How to build on MacOS - -Instead of the above conan command (2.) use - -2. `conan install .. -s "cppstd=11"` - -and continue as you would when building on a Linux system. You may -have to add `build/lib/` (or, alternatively after installation, -`CMAKE_INSTALL_PREFIX/lib`) to your `DYLD_LIBRARY_PATH` environmental -variable. - -### How to build on Windows - -We use [Visual Studio 2019](https://visualstudio.microsoft.com/de/vs/features/cplusplus/) -as compiler. We use [cmake](https://cmake.org/download/) as build tool. - -0. clone/update the subrepo `git submodule update --init proto` -1. `mkdir build` -2. `cd build` -3. `conan install .. -g visual_studio -s arch=x86_64 -s build_type=Release -s compiler.toolset=v142 -s compiler.version=16 -s compiler.runtime=MD --build=missing --update` -4. `cmake -B . ..` -5. open ` libcaosdb.sln` with Visual Studio, change the buildtype to `Release` - and build the project. (You can open Tools/Command Line/Developer Command - Prompt and execute `msbuild libcaosdb.sln /property:Configuration=Release`) - -### Creating a Local Conan Package ## - -Building and installing libcaosdb with Conan is just a single command: `make conan-install` - -For MacOS, you probably should adjust the option as mentioned above. - -### Troubleshooting - -#### `conan install` Fails Due to Missing Prebuilts - -When `conan install` fails during the installation of the dependencies because -a precompiled package is not available for your specific settings, try adding -the `--build=missing` option: `conan install .. [ other options -] --build=missing`. This should download and compile the sources of the -dependencies. - -#### cmake fails when using the Debug flag -Depending on the clang version it might be necessary to use additionally the following flag: -`-DCMAKE_CXX_FLAGS="-Wno-unused-parameter"` - -## Unit Tests - -### Build - -For the tests there is a slightly different setup required (with option `-D CMAKE_BUILD_TYPE=Debug`) - -1. `mkdir build && cd build/` -2. `conan install .. -s "compiler.libcxx=libstdc++11"` -3. `cmake -B . -D CMAKE_BUILD_TYPE=Debug ..` - * If your clang-format version is too old, formatting, linting etc. can be skipped: - `cmake -B . -D CMAKE_BUILD_TYPE=Debug -D SKIP_LINTING=ON ..` -4. `cmake --build .` - -### Run - -In the build directory, run `ctest` - -### Framework - -We use [GoogleTest](https://google.github.io/googletest/) for unit testing. - -### Coverage - -We use [gcov](https://gcc.gnu.org/onlinedocs/gcc/Gcov.html) and -[lcov](https://github.com/linux-test-project/lcov) for generating test coverage -reports. - -In the build directory, generate the coverage report by running -`cmake --build . --target unit_test_coverage`. - -Note that this special target will run the tests again. Thus it is not -necessary to run `ctest` prior to this target. - -The coverage report can be viewed in a browser by opening -`<build_directory>/unit_test_coverage/index.html`. - -## Code Formatting - -* install clang-format on your system. -* `clang-format -i --verbose $(find test/ src/ include/ -type f -iname "*.cpp" -o -iname "*.h" -o -iname "*.h.in")` - -## Naming Convention - -Please adhere to [Google's C++ naming conventions](https://google.github.io/styleguide/cppguide.html#Naming). - -## Client Configuration - -You can use a json file for the configuration of the client. See -`test/test_data/test_caosdb_client.json` for an example. You may use -`caosdb-client-configuration-schema.json` to validate your schema. -Typically, you will need to provide the path to your SSL certificate. - -The client will load the configuration file from the first existing -file in the following locations (precedence from highest to lowest): - -1. A file specified by the environment variable - `$CAOSDB_CLIENT_CONFIGURATION`. -2. `$PWD/caosdb_client.json` -3. `$PWD/caosdb-client.json` -4. `$PWD/.caosdb_client.json` -5. `$PWD/.caosdb-client.json` -6. `$HOME/caosdb_client.json` -7. `$HOME/caosdb-client.json` -8. `$HOME/.caosdb_client.json` -9. `$HOME/.caosdb-client.json` - -## Documentation - -In the build directory, run - -* `cmake --build . --target doc-doxygen` (generate Doxygen) -* `cmake --build . --target doc-sphinx` (generate Sphinx) diff --git a/README_SETUP.md b/README_SETUP.md new file mode 120000 index 0000000000000000000000000000000000000000..c5c7270fb583274df037848bfb735cdb48829d28 --- /dev/null +++ b/README_SETUP.md @@ -0,0 +1 @@ +doc/README_SETUP.md \ No newline at end of file diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 76d7dad56583120795d49f1828998315597e803c..e2b585d02150ddd2411dbf208d3358c73d4bf17f 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -81,10 +81,19 @@ if (DOXYGEN_FOUND) -c ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR} sphinx_out - DEPENDS doc-doxygen + DEPENDS doc-doxygen + Examples.rst + README_SETUP.md WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Generating API documentation with Sphinx" - VERBATIM ) + VERBATIM + ) + # Copying files is necessary: https://stackoverflow.com/a/45808534/232888 + FILE(COPY + Examples.rst + README_SETUP.md + # Tutorial.rst + DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") else () message("Sphinx need to be installed to generate the sphinx documentation") endif () diff --git a/doc/Examples.rst b/doc/Examples.rst new file mode 100644 index 0000000000000000000000000000000000000000..ea65e02cd421b880d5d748c6774798ac115d0d9a --- /dev/null +++ b/doc/Examples.rst @@ -0,0 +1,237 @@ +Examples +======== + + +Connect to a CaosDB server +-------------------------- + +See also the hints on how to :doc:`get started<README_SETUP>`, and set-up of +libcaosdb. In order to connect to a CaosDB server with libcaosdb you first have to configure the +connection via a configuration file as explained in the :ref:`configuration section <Client Configuration>`. Once the configuration is set up, connecting to the server is +as easy as + +.. code:: cpp + + const auto &connection = + caosdb::connection::ConnectionManager::GetDefaultConnection(); + +You can print the full version of the server that you are connected to (and +therby test the connection) via: + +.. code:: cpp + // get version info of the server + connection.RetrieveVersionInfo() + const auto &v_info = connection->GetVersionInfo(); + std::cout << "Server Version: " << v_info->GetMajor() << "." + << v_info->GetMinor() << "." << v_info->GetPatch() << "-" + << v_info->GetPreRelease() << "-" << v_info->GetBuild() + << std::endl; + + +Retrieve a Record +----------------- + +With libcaosdb you can create a transaction +object, fill it with sub-requests, execute it, and retrieve the +result(s) . This +is handy when you want to have several requests in the same transaction. +However, most of the time, e.g., when retrieving one or multiple +Records, this is not necessary. libcaosdb provides helper functions so +you don’t have to worry about transactions and their executions. Assume +you want to retrieve an Entity with id=123. This is done via + +.. code:: cpp + + const auto &connection = + caosdb::connection::ConnectionManager::GetDefaultConnection(); + + auto transaction(connection->CreateTransaction()); + + const auto *id = "1231"; + transaction->RetrieveById(id); + auto status = transaction->Execute(); + + const auto &result_set = transaction->GetResultSet(); + + const auto &entity = result_set.at(0) + + +You can then use the getter methods like :cpp:any:`GetId<caosdb::entity::Entity::GetId>`, +:cpp:any:`GetParents<caosdb::entity::Entity::GetParents>`, or :cpp:any:`GetProperties`<caosdb::entity::Entity::GetProperties>` to get the +name, the parents, or the properties of the retrieved entity. + +Retrieving multiple entities works in the same way. Type + +.. code:: cpp + + const std::vector<std::string> ids = {"1220", "1221", "1222"}; + transaction->RetrieveById(ids.begin(), ids.end()); + +to retrieve the entities with ids 1220, 1221 and 1222. They can then be +accessed using ``result_set.at(1)`` etc. + +The same (and more) can be achieved by building and executing the +transaction manually. This is done by + +.. code:: cpp + + const auto &connection = + caosdb::connection::ConnectionManager::GetDefaultConnection(); + auto transaction(connection->CreateTransaction()); + + transaction->RetrieveById("1231"); + transaction->RetrieveById("1233"); + auto status = transaction->Execute(); + +A result set can be obtained +via :cpp:any:`GetResultSet`<caosdb::transaction::Transaction::GetResultSet>` which contains the resulting entities +and can, e.g., be checked for length. + +Execute queries +--------------- + +Executing queries works very similar to the retrieval of entities via +ids. + +FIND and SELECT queries +~~~~~~~~~~~~~~~~~~~~~~~ + +In general, entities can be found using CaosDB’s query language like + +.. code:: cpp + + const auto &connection = + caosdb::connection::ConnectionManager::GetDefaultConnection(); + + auto query_transaction(connection->CreateTransaction()); + query_transaction->Query("FIND ENTITY WITH id = 1222"); + query_transaction->Execute(); + auto result_set = query_transaction->GetResultSet(); + std::cout << "Found " << result_set.size() + << "entity with id=" + << result_set.at(0).GetId() << std::endl; + +``result_set`` is a (possibly empty) list of entities that can be +inspected as above. + +:: + + SELECT queries haven't been implemented in the C++ client yet and + thus cannot be executed from libcaosdb right now. SELECT queries + will be added in a future release. + +COUNT queries +~~~~~~~~~~~~~ + +COUNT queries are different from FIND or SELECT queries in two ways. +Firstly, they do not return entities but a single number which is why, +secondly, they do not have a result set that could be returned. +The result of the count is +obtained using the :cpp:any:`GetCountResult<caosdb::transaction::Transaction::GetCountResult>` function: + +.. code:: cpp + + const auto &connection = + caosdb::connection::ConnectionManager::GetDefaultConnection(); + + auto query_transaction(connection->CreateTransaction()); + query_transaction->Query("COUNT RECORD person WITH NAME LIKE '*Baggins'"); + query_transaction->Execute(); + std::cout << "Found " << query_transaction->GetCountResult() + << "entities."<< std::endl; + +Insert, update, and delete entities +----------------------------------- + +Insert, update and delete operations function the same way. The respective +task is added to a transaction and the transaction is executed. + +.. code:: cpp + const auto &connection = + caosdb::connection::ConnectionManager::GetDefaultConnection(); + + + // ######## INSERT ######## + // create the entity + Entity entity; + entity.SetRole(Role::RECORD_TYPE); + entity.SetName("RT1"); + + // create the transaction, add the task and execute the transaction + auto insert_transaction(connection->CreateTransaction()); + insert_transaction->InsertEntity(&entity); + auto insert_status = insert_transaction->Execute(); + + const auto &insert_result_set = insert_transaction->GetResultSet(); + // the result is an entity with the new id + const auto &new_entity = insert_result_set.at(0); + std::cout << "The newly inserted entity has the id " + << new_entity.GetId() << std::endl; + + + // get the inserted entity + // RETRIEVE + auto retrieve_transaction(connection->CreateTransaction()); + retrieve_transaction->RetrieveById(new_entity.GetId()); + retrieve_transaction->Execute(); + // save the entity from the result set in a new variable + auto update_entity(retrieve_transaction->GetResultSet().at(0)); + + // ######## UPDATE ######## + // and change it + update_entity.SetName("RT1-Update"); + + // create update transaction + auto update_transaction(connection->CreateTransaction()); + update_transaction->UpdateEntity(&update_entity); + auto update_status = update_transaction->Execute(); + // same as with insert transaction, the update transaction returns an entity + // with the id + const auto &updated_entity = update_transaction->GetResultSet().at(0); + std::cout << "The entity with the id " + << update_entity.GetId() << "was updated." << std::endl; + + // ######## DELETE ######## + auto delete_transaction(connection->CreateTransaction()); + delete_transaction->DeleteById(updated_entity .GetId()); + auto delete_status = delete_transaction->Execute(); + + // again, the delete transaction returns a result set with entities + // with the ids that where deleted + const auto &delete_result_set = delete_transaction->GetResultSet(); + + +Up- and Download a file +--------------- + +.. code:: cpp + + const auto &connection = + caosdb::connection::ConnectionManager::GetDefaultConnection(); + + Entity file; + file.SetRole(Role::FILE); + file.SetFilePath("test.txt"); + file.SetLocalPath(test_upload_file_1); + + // in order to upload a file, the corresponding entity simply has to be + // inserted + auto insert_transaction(connection->CreateTransaction()); + insert_transaction->InsertEntity(&file); + insert_transaction->Execute(); + + // entity in the result set contains the new id + const auto &insert_results = insert_transaction->GetResultSet(); + const auto &inserted_file = insert_results.at(0); + + // for the download you need to use the RetrieveAndDownloadFilesById task and + // supply the path where the file shall be stored + test_download_file = fs::path("test_download_file_delete_me.dat"); + auto download_transaction(connection->CreateTransaction()); + download_transaction->RetrieveAndDownloadFilesById( + inserted_file.GetId(), test_download_file.string()); + download_transaction->ExecuteAsynchronously(); + download_transaction->WaitForIt().GetCode() + + const auto &download_results = download_transaction->GetResultSet(); + const auto &downloaded_file = download_results.at(0); diff --git a/doc/README_SETUP.md b/doc/README_SETUP.md new file mode 100644 index 0000000000000000000000000000000000000000..f73190cad3386518361a9d76dac2f1825d5f3f28 --- /dev/null +++ b/doc/README_SETUP.md @@ -0,0 +1,142 @@ +# How to Develop and Use Libcaosdb + +## Dependencies + +* See [DEPENDENCIES.md](Dependencies.md) + +## Build + +We use [cmake](https://cmake.org) as build tool. + +0. clone/update the subrepo `git submodule update --init proto` +1. `mkdir build && cd build` +2. `conan install .. -s "compiler.libcxx=libstdc++11"` +3. `cmake -B . ..` +4. `cmake --build .` + +You may also want to install libcaosdb system-wide to +`CMAKE_INSTALL_PREFIX/lib` by + +5. `cmake --install .` + +The default install prefix is `~/.local`. It can be set by adding +`-DCMAKE_INSTALL_PREFIX=/path/to/install/prefix` to the first cmake +command (3.). + +### How to build on MacOS + +Instead of the above conan command (2.) use + +2. `conan install .. -s "cppstd=11"` + +and continue as you would when building on a Linux system. You may +have to add `build/lib/` (or, alternatively after installation, +`CMAKE_INSTALL_PREFIX/lib`) to your `DYLD_LIBRARY_PATH` environmental +variable. + +### How to build on Windows + +We use [Visual Studio 2019](https://visualstudio.microsoft.com/de/vs/features/cplusplus/) +as compiler. We use [cmake](https://cmake.org/download/) as build tool. + +0. clone/update the subrepo `git submodule update --init proto` +1. `mkdir build` +2. `cd build` +3. `conan install .. -g visual_studio -s arch=x86_64 -s build_type=Release -s compiler.toolset=v142 -s compiler.version=16 -s compiler.runtime=MD --build=missing --update` +4. `cmake -B . ..` +5. open ` libcaosdb.sln` with Visual Studio, change the buildtype to `Release` + and build the project. (You can open Tools/Command Line/Developer Command + Prompt and execute `msbuild libcaosdb.sln /property:Configuration=Release`) + +### Creating a Local Conan Package ## + +Building and installing libcaosdb with Conan is just a single command: `make conan-install` + +For MacOS, you probably should adjust the option as mentioned above. + +### Troubleshooting + +#### `conan install` Fails Due to Missing Prebuilts + +When `conan install` fails during the installation of the dependencies because +a precompiled package is not available for your specific settings, try adding +the `--build=missing` option: `conan install .. [ other options +] --build=missing`. This should download and compile the sources of the +dependencies. + +#### cmake fails when using the Debug flag +Depending on the clang version it might be necessary to use additionally the following flag: +`-DCMAKE_CXX_FLAGS="-Wno-unused-parameter"` + +## Unit Tests + +### Build + +For the tests there is a slightly different setup required (with option `-D CMAKE_BUILD_TYPE=Debug`) + +1. `mkdir build && cd build/` +2. `conan install .. -s "compiler.libcxx=libstdc++11"` +3. `cmake -B . -D CMAKE_BUILD_TYPE=Debug ..` + * If your clang-format version is too old, formatting, linting etc. can be skipped: + `cmake -B . -D CMAKE_BUILD_TYPE=Debug -D SKIP_LINTING=ON ..` +4. `cmake --build .` + +### Run + +In the build directory, run `ctest` + +### Framework + +We use [GoogleTest](https://google.github.io/googletest/) for unit testing. + +### Coverage + +We use [gcov](https://gcc.gnu.org/onlinedocs/gcc/Gcov.html) and +[lcov](https://github.com/linux-test-project/lcov) for generating test coverage +reports. + +In the build directory, generate the coverage report by running +`cmake --build . --target unit_test_coverage`. + +Note that this special target will run the tests again. Thus it is not +necessary to run `ctest` prior to this target. + +The coverage report can be viewed in a browser by opening +`<build_directory>/unit_test_coverage/index.html`. + +## Code Formatting + +* install clang-format on your system. +* `clang-format -i --verbose $(find test/ src/ include/ -type f -iname "*.cpp" -o -iname "*.h" -o -iname "*.h.in")` + +## Naming Convention + +Please adhere to [Google's C++ naming conventions](https://google.github.io/styleguide/cppguide.html#Naming). + +## Client Configuration + +You can use a json file for the configuration of the client. See +`test/test_data/test_caosdb_client.json` for an example. You may use +`caosdb-client-configuration-schema.json` to validate your schema. +Typically, you will need to provide the path to your SSL certificate. + +The client will load the configuration file from the first existing +file in the following locations (precedence from highest to lowest): + +1. A file specified by the environment variable + `$CAOSDB_CLIENT_CONFIGURATION`. +2. `$PWD/caosdb_client.json` +3. `$PWD/caosdb-client.json` +4. `$PWD/.caosdb_client.json` +5. `$PWD/.caosdb-client.json` +6. `$HOME/caosdb_client.json` +7. `$HOME/caosdb-client.json` +8. `$HOME/.caosdb_client.json` +9. `$HOME/.caosdb-client.json` + +## Documentation + +In the build directory, run + +* `cmake --build . --target doc-doxygen` (generate Doxygen) +* `cmake --build . --target doc-sphinx` (generate Sphinx) diff --git a/doc/conf.py.in b/doc/conf.py.in index f04a7a83ac79d555d819528d3ae6d92ed63580ee..c359c11e4d785a840761e50e93c2787d86312a43 100644 --- a/doc/conf.py.in +++ b/doc/conf.py.in @@ -45,7 +45,8 @@ extensions = [ 'sphinx.ext.viewcode', 'sphinx_sitemap', 'sphinx.ext.inheritance_diagram', - 'breathe' + 'breathe', + "recommonmark" # For markdown files. ] # Add any paths that contain templates here, relative to this directory. diff --git a/doc/index.rst.in b/doc/index.rst.in index e3fac2458d21571721f412adb3c120264f14dee6..47b16c95efa3da4aee32a1c6f2b559e5295377e3 100644 --- a/doc/index.rst.in +++ b/doc/index.rst.in @@ -25,13 +25,13 @@ Welcome to |PROJECT_NAME|'s documentation! ========================================== -This is work in progress. - .. toctree:: :maxdepth: 4 :caption: Contents: Welcome <self> + Getting Started <README_SETUP> + Examples.rst cppapi/index capi/index diff --git a/doc/requirements.txt b/doc/requirements.txt index 491959d5a9d70de347b8640872f9bf190af02261..1a306c69d3e8c80b51e0a0824da0d66ca378ad11 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -2,6 +2,7 @@ alabaster==0.7.12 Babel==2.9.1 breathe==4.30.0 certifi==2020.12.5 +recommonmark chardet==4.0.0 docutils==0.16 idna==2.10