├── .current_gitmodules ├── .dockerignore ├── .gitattributes ├── .github ├── markdown_check_config.json └── workflows │ ├── check_bazel_tests.yml │ ├── check_error_codes.yml │ ├── check_if_submodules_head_are_ancestors_of_origin_master.yaml │ ├── check_markdown_links.yaml │ ├── check_package_diffs.yaml │ ├── oft.yaml │ ├── shellcheck.yaml │ ├── slc_ci.yml │ ├── slc_ci_build_slc.yml │ ├── slc_ci_check_for_build.yml │ ├── slc_ci_flavor.yml │ ├── slc_ci_prepare_test_container.yml │ ├── slc_ci_self_check.yml │ ├── slc_ci_test_slc.yml │ └── test_package_management_scripts.yaml ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── SECURITY.md ├── build_config.json ├── emulator ├── Dockerfile.emulator ├── LICENSE ├── MY_TEST_JAVA ├── exasolution.py ├── get_connections_script.py ├── input.csv ├── input2.csv ├── library.py ├── sc_script.py ├── sc_script2 ├── script.py ├── script2.py ├── script3.py ├── script4.py ├── script5.py ├── script_fr.1.r ├── script_fr.py ├── script_iter.py └── start_test.sh ├── exaudfclient ├── .bazelrc ├── .env.template ├── .gitignore ├── BUILD ├── MODULE.bazel ├── README.md ├── base │ ├── BUILD │ ├── base.MODULE.bazel │ ├── benchmark_container │ │ ├── BUILD │ │ ├── benchmark_container.cc │ │ └── benchmark_container.h │ ├── build_integrated.py │ ├── create_binary_wrapper.sh │ ├── create_binary_wrapper_stdout_to_bucketfs.sh │ ├── create_binary_wrapper_valgrind.sh │ ├── create_binary_wrapper_valgrind_massif.sh │ ├── exaudfclient.template.sh │ ├── exaudflib │ │ ├── BUILD │ │ ├── exascript.i │ │ ├── impl │ │ │ ├── check.cc │ │ │ ├── check.h │ │ │ ├── exaudflib_main.cc │ │ │ ├── global.cc │ │ │ ├── global.h │ │ │ ├── msg_conversion.cc │ │ │ ├── msg_conversion.h │ │ │ ├── socket_high_level.cc │ │ │ ├── socket_high_level.h │ │ │ ├── socket_info.cc │ │ │ ├── socket_info.h │ │ │ ├── socket_low_level.cc │ │ │ ├── socket_low_level.h │ │ │ └── swig │ │ │ │ ├── swig_factory.cc │ │ │ │ ├── swig_general_iterator.cc │ │ │ │ ├── swig_general_iterator.h │ │ │ │ ├── swig_meta_data.cc │ │ │ │ ├── swig_meta_data.h │ │ │ │ ├── swig_result_handler.cc │ │ │ │ ├── swig_result_handler.h │ │ │ │ ├── swig_table_iterator.cc │ │ │ │ └── swig_table_iterator.h │ │ ├── load_dynamic.h │ │ ├── swig │ │ │ ├── script_data_transfer_objects.cc │ │ │ ├── script_data_transfer_objects.h │ │ │ ├── script_data_transfer_objects_wrapper.cc │ │ │ ├── script_data_transfer_objects_wrapper.h │ │ │ ├── swig_common.cc │ │ │ ├── swig_common.h │ │ │ ├── swig_meta_data.cc │ │ │ ├── swig_meta_data.h │ │ │ ├── swig_result_handler.cc │ │ │ ├── swig_result_handler.h │ │ │ ├── swig_table_iterator.cc │ │ │ └── swig_table_iterator.h │ │ ├── test │ │ │ ├── BUILD │ │ │ └── script_data_transfer_objects_test.cpp │ │ ├── udf_plugin_interface.h │ │ ├── vm │ │ │ ├── swig_vm.cc │ │ │ └── swig_vm.h │ │ └── zmqcontainer.proto │ ├── filter_swig_code.py │ ├── java_repository.bzl │ ├── javacontainer │ │ ├── BUILD │ │ ├── ExaCompiler.java │ │ ├── ExaConnectionInformationImpl.java │ │ ├── ExaExportSpecificationImpl.java │ │ ├── ExaImportSpecificationImpl.java │ │ ├── ExaIteratorImpl.java │ │ ├── ExaMetadataImpl.java │ │ ├── ExaStackTraceCleaner.java │ │ ├── ExaUndefinedSingleCallException.java │ │ ├── ExaWrapper.java │ │ ├── exascript_java_jni_decl.h │ │ ├── javacontainer.cc │ │ ├── javacontainer.h │ │ ├── javacontainer_builder.cc │ │ ├── javacontainer_builder.h │ │ ├── javacontainer_impl.cc │ │ ├── javacontainer_impl.h │ │ ├── script_options │ │ │ ├── BUILD │ │ │ ├── checksum.cc │ │ │ ├── checksum.h │ │ │ ├── converter.cc │ │ │ ├── converter.h │ │ │ ├── converter_legacy.cc │ │ │ ├── converter_legacy.h │ │ │ ├── converter_v2.cc │ │ │ ├── converter_v2.h │ │ │ ├── extractor.h │ │ │ ├── extractor_impl.cc │ │ │ ├── extractor_impl.h │ │ │ ├── keywords.cc │ │ │ ├── keywords.h │ │ │ ├── parser.h │ │ │ ├── parser_ctpg.cc │ │ │ ├── parser_ctpg.h │ │ │ ├── parser_ctpg_jvm_options_parser.cc │ │ │ ├── parser_ctpg_jvm_options_parser.h │ │ │ ├── parser_ctpg_script_importer.cc │ │ │ ├── parser_ctpg_script_importer.h │ │ │ ├── parser_legacy.cc │ │ │ ├── parser_legacy.h │ │ │ ├── string_ops.cc │ │ │ ├── string_ops.h │ │ │ └── test │ │ │ │ ├── BUILD │ │ │ │ ├── converter_test.cc │ │ │ │ ├── ctpg_script_importer_test.cc │ │ │ │ ├── string_ops_tests.cc │ │ │ │ ├── swig_factory_test.cc │ │ │ │ └── swig_factory_test.h │ │ └── test │ │ │ ├── BUILD │ │ │ ├── cpp │ │ │ ├── exaudf_wrapper.cc │ │ │ ├── javacontainer_extractor_v2_test.cc │ │ │ ├── javacontainer_perf_test.cc │ │ │ ├── javacontainer_test.cc │ │ │ ├── javavm_test.cc │ │ │ ├── javavm_test.h │ │ │ ├── swig_factory_test.cc │ │ │ └── swig_factory_test.h │ │ │ ├── java │ │ │ └── com │ │ │ │ └── exasol │ │ │ │ └── ExaStackTraceCleanerTest.java │ │ │ ├── other_test.jar │ │ │ └── test.jar │ ├── load_dynamic.cc │ ├── protobuf_repository.bzl │ ├── python │ │ ├── BUILD │ │ ├── exascript_python_preset_core.py │ │ ├── exascript_python_wrap.py │ │ ├── extend_exascript_python_preset_py.sh │ │ ├── python3 │ │ │ ├── BUILD │ │ │ └── python_ext_dataframe.cc │ │ ├── pythoncontainer.cc │ │ └── pythoncontainer.h │ ├── python_repository.bzl │ ├── script_options_parser │ │ ├── BUILD │ │ ├── ctpg │ │ │ ├── BUILD │ │ │ ├── ctpg.hpp │ │ │ ├── script_option_lines_ctpg.cc │ │ │ ├── script_option_lines_ctpg.h │ │ │ └── test │ │ │ │ ├── BUILD │ │ │ │ └── script_option_lines_test.cpp │ │ ├── exception.h │ │ └── legacy │ │ │ ├── BUILD │ │ │ ├── script_option_lines.cc │ │ │ ├── script_option_lines.h │ │ │ └── test │ │ │ ├── BUILD │ │ │ └── script_option_lines_test.cpp │ ├── ssl_repository.bzl │ ├── streaming_container │ │ ├── BUILD │ │ ├── streamingcontainer.cc │ │ └── streamingcontainer.h │ ├── swig_factory │ │ ├── BUILD │ │ ├── swig_factory.h │ │ ├── swig_factory_impl.cc │ │ └── swig_factory_impl.h │ ├── test_udfclient.sh │ ├── utils │ │ ├── BUILD │ │ ├── debug_message.h │ │ └── exceptions.h │ └── zmq_repository.bzl ├── build.sh ├── build_local.sh ├── build_local_all.sh ├── docs │ ├── diagrams │ │ ├── CTPGParserHandler.drawio.png │ │ ├── LegacyParserHandler.drawio.png │ │ ├── OveralScriptOptionalsBuildingBlocks.drawio.png │ │ ├── ScriptOptionsExtractorInterface.drawio.png │ │ ├── ScriptOptionsParserHandlerSequence.drawio.png │ │ └── V2ImportScriptFlow.drawio.png │ ├── exaudfclient.drawio │ ├── exaudfclient.png │ ├── java_script_options_parser.drawio.png │ ├── script_options_design.md │ └── script_options_requirments.md ├── exaudfclient.cc ├── run.sh ├── run_local.sh ├── variables.bzl ├── visualize_all.sh └── visualize_deps.sh ├── ext ├── 01_nodoc ├── LICENSE ├── scripts │ ├── compare_package_lists.pl │ ├── install_scripts │ │ ├── install_batch.pl │ │ ├── install_key.pl │ │ ├── install_micromamba.sh │ │ ├── install_ppa.pl │ │ ├── install_python3.10_pip.sh │ │ ├── install_via_apt.pl │ │ ├── install_via_conda.pl │ │ ├── install_via_pip.pl │ │ ├── install_via_r_remotes.pl │ │ └── package_mgmt_utils.pm │ ├── list_installed_scripts │ │ ├── list_installed_R.sh │ │ ├── list_installed_apt.sh │ │ ├── list_installed_conda.sh │ │ └── list_installed_pip.sh │ ├── list_newest_versions │ │ ├── extract_columns_from_package_lisl.pl │ │ ├── get_versions.py │ │ ├── list_candidate_versions_for_apt.sh │ │ ├── list_candidate_versions_for_pip.sh │ │ ├── list_newest_versions_for_apt.sh │ │ ├── package_mgmt_utils.pm │ │ └── r_latest_versions.r │ ├── package_mgmt_utils.pm │ ├── security_scan │ │ ├── exec_oyster.R │ │ ├── run.sh │ │ ├── run_oyster.sh │ │ └── run_trivy.sh │ ├── tests │ │ ├── docker_all_dependencies │ │ │ └── Dockerfile │ │ ├── docker_python_only │ │ │ └── Dockerfile │ │ ├── install_scripts │ │ │ ├── assert.sh │ │ │ ├── run_apt_tests.sh │ │ │ ├── run_pip_tests.sh │ │ │ ├── run_pip_tests_base.sh │ │ │ ├── run_pip_tests_with_epheramal_build_tools.sh │ │ │ ├── run_ppa_tests.sh │ │ │ ├── run_r_remotes_tests.sh │ │ │ ├── run_tests.sh │ │ │ └── test_files │ │ │ │ ├── apt │ │ │ │ ├── github_cli │ │ │ │ ├── with_versions │ │ │ │ │ ├── all_versions_specified │ │ │ │ │ └── some_missing_versions │ │ │ │ └── without_versions │ │ │ │ ├── empty_test_file │ │ │ │ ├── install_batch_test_file │ │ │ │ ├── pip │ │ │ │ ├── empty │ │ │ │ │ ├── build_info │ │ │ │ │ │ └── packages │ │ │ │ │ │ │ └── step1 │ │ │ │ │ │ │ └── python3_pip_packages │ │ │ │ │ └── step2 │ │ │ │ ├── needs_build_tools │ │ │ │ ├── no_version_conflict │ │ │ │ │ ├── dependency_already_installed │ │ │ │ │ │ ├── build_info │ │ │ │ │ │ │ └── packages │ │ │ │ │ │ │ │ └── step1 │ │ │ │ │ │ │ │ └── python3_pip_packages │ │ │ │ │ │ └── step2 │ │ │ │ │ └── multiple_ancestors │ │ │ │ │ │ ├── build_info │ │ │ │ │ │ └── packages │ │ │ │ │ │ │ ├── step1 │ │ │ │ │ │ │ └── python3_pip_packages │ │ │ │ │ │ │ └── step2 │ │ │ │ │ │ │ └── python3_pip_packages │ │ │ │ │ │ └── step3 │ │ │ │ ├── pip_version_syntax │ │ │ │ ├── version_conflict │ │ │ │ │ ├── dependency_already_installed │ │ │ │ │ │ ├── build_info │ │ │ │ │ │ │ └── packages │ │ │ │ │ │ │ │ └── step1 │ │ │ │ │ │ │ │ └── python3_pip_packages │ │ │ │ │ │ └── step2 │ │ │ │ │ ├── other_package_with_newer_dependency_already_installed │ │ │ │ │ │ ├── build_info │ │ │ │ │ │ │ └── packages │ │ │ │ │ │ │ │ └── step1 │ │ │ │ │ │ │ │ └── python3_pip_packages │ │ │ │ │ │ └── step2 │ │ │ │ │ ├── other_package_with_older_dependency_already_installed │ │ │ │ │ │ ├── build_info │ │ │ │ │ │ │ └── packages │ │ │ │ │ │ │ │ └── step1 │ │ │ │ │ │ │ │ └── python3_pip_packages │ │ │ │ │ │ └── step2 │ │ │ │ │ └── same_pkg │ │ │ │ │ │ ├── build_info │ │ │ │ │ │ └── packages │ │ │ │ │ │ │ └── step1 │ │ │ │ │ │ │ ├── apt_packages │ │ │ │ │ │ │ └── python3_pip_packages │ │ │ │ │ │ └── step2 │ │ │ │ ├── with_versions │ │ │ │ │ ├── all_versions_specified │ │ │ │ │ ├── some_missing_versions │ │ │ │ │ ├── with_urls │ │ │ │ │ └── with_urls_some_missing_versions │ │ │ │ └── without_versions │ │ │ │ └── r │ │ │ │ └── versions │ │ │ │ ├── with_versions │ │ │ │ ├── all_versions_specified │ │ │ │ └── some_missing_versions │ │ │ │ └── without_versions │ │ ├── list_installed_scripts │ │ │ └── run_tests.sh │ │ ├── test_python_scripts_in_slim_docker.sh │ │ └── test_scripts_in_docker.sh │ └── virtual_environment │ │ └── _activate_current_conda_env.sh └── virtualschema-jdbc-adapter.jar ├── find_duplicate_error_codes.sh ├── find_error_codes.sh ├── find_highest_error_codes_per_module.sh ├── find_incomplete_error_codes.sh ├── find_next_error_code_per_module.sh ├── flavors ├── LICENSE ├── template-Exasol-8-python-3.10-cuda-conda │ ├── FLAVOR_DESCRIPTION.md │ ├── ci.json │ ├── flavor_base │ │ ├── base_test_build_run │ │ │ └── Dockerfile │ │ ├── base_test_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ │ └── apt_get_packages │ │ ├── build_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ │ ├── conda_channels │ │ │ │ └── conda_packages │ │ ├── build_run │ │ │ └── Dockerfile │ │ ├── build_steps.py │ │ ├── conda_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ │ └── apt_get_packages │ │ ├── derived_from │ │ ├── flavor_base_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ │ ├── apt_get_packages │ │ │ │ ├── conda_channels │ │ │ │ ├── conda_packages │ │ │ │ └── python3_pip_packages │ │ ├── flavor_test_build_run │ │ │ └── Dockerfile │ │ ├── language_definition │ │ ├── language_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ │ ├── conda_channels │ │ │ │ └── conda_packages │ │ ├── release │ │ │ └── Dockerfile │ │ ├── security_scan │ │ │ ├── .trivyignore │ │ │ ├── Dockerfile │ │ │ ├── packages │ │ │ │ ├── apt_get_packages │ │ │ │ └── apt_get_packages_trivy_deps │ │ │ └── trivy.rego │ │ ├── testconfig │ │ └── udfclient_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ ├── conda_channels │ │ │ └── conda_packages │ └── flavor_customization │ │ ├── Dockerfile │ │ └── packages │ │ ├── conda_channels │ │ ├── conda_packages │ │ └── python3_pip_packages ├── template-Exasol-all-python-3.10-conda │ ├── FLAVOR_DESCRIPTION.md │ ├── ci.json │ ├── flavor_base │ │ ├── base_test_build_run │ │ │ └── Dockerfile │ │ ├── base_test_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ │ └── apt_get_packages │ │ ├── build_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ │ ├── conda_channels │ │ │ │ └── conda_packages │ │ ├── build_run │ │ │ └── Dockerfile │ │ ├── build_steps.py │ │ ├── conda_deps │ │ │ ├── Dockerfile │ │ │ ├── _activate_current_env.sh │ │ │ └── packages │ │ │ │ └── apt_get_packages │ │ ├── derived_from │ │ ├── flavor_base_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ │ ├── apt_get_packages │ │ │ │ ├── conda_channels │ │ │ │ ├── conda_packages │ │ │ │ └── python3_pip_packages │ │ ├── flavor_test_build_run │ │ │ └── Dockerfile │ │ ├── language_definition │ │ ├── language_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ │ ├── conda_channels │ │ │ │ └── conda_packages │ │ ├── release │ │ │ └── Dockerfile │ │ ├── security_scan │ │ │ ├── .trivyignore │ │ │ ├── Dockerfile │ │ │ ├── packages │ │ │ │ ├── apt_get_packages │ │ │ │ └── apt_get_packages_trivy_deps │ │ │ └── trivy.rego │ │ ├── testconfig │ │ └── udfclient_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ ├── conda_channels │ │ │ └── conda_packages │ └── flavor_customization │ │ ├── Dockerfile │ │ └── packages │ │ ├── conda_channels │ │ ├── conda_packages │ │ └── python3_pip_packages ├── template-Exasol-all-python-3.10 │ ├── FLAVOR_DESCRIPTION.md │ ├── ci.json │ ├── flavor_base │ │ ├── base_test_build_run │ │ │ └── Dockerfile │ │ ├── base_test_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ │ └── apt_get_packages │ │ ├── build_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ │ └── apt_get_packages │ │ ├── build_run │ │ │ └── Dockerfile │ │ ├── build_steps.py │ │ ├── derived_from │ │ ├── flavor_base_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ │ ├── apt_get_packages │ │ │ │ └── python3_pip_packages │ │ ├── flavor_test_build_run │ │ │ └── Dockerfile │ │ ├── language_definition │ │ ├── language_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ │ ├── apt_get_packages │ │ │ │ └── python3_pip_packages │ │ ├── release │ │ │ └── Dockerfile │ │ ├── security_scan │ │ │ ├── .trivyignore │ │ │ ├── Dockerfile │ │ │ ├── packages │ │ │ │ ├── apt_get_packages │ │ │ │ └── apt_get_packages_trivy_deps │ │ │ └── trivy.rego │ │ ├── testconfig │ │ └── udfclient_deps │ │ │ ├── Dockerfile │ │ │ └── packages │ │ │ └── apt_get_packages │ └── flavor_customization │ │ ├── Dockerfile │ │ └── packages │ │ ├── apt_get_packages │ │ └── python3_pip_packages └── test-Exasol-8-cuda-ml │ ├── FLAVOR_DESCRIPTION.md │ ├── ci.json │ └── flavor_base │ ├── base_test_build_run │ └── Dockerfile │ ├── base_test_deps │ ├── Dockerfile │ └── packages │ │ └── apt_get_packages │ ├── build_deps │ ├── Dockerfile │ └── packages │ │ ├── conda_channels │ │ └── conda_packages │ ├── build_run │ └── Dockerfile │ ├── build_steps.py │ ├── conda_deps │ ├── Dockerfile │ └── packages │ │ └── apt_get_packages │ ├── derived_from │ ├── flavor_base_deps │ ├── Dockerfile │ └── packages │ │ ├── apt_get_packages │ │ ├── conda_channels │ │ ├── conda_packages │ │ └── python3_pip_packages │ ├── flavor_test_build_run │ └── Dockerfile │ ├── language_definition │ ├── language_definitions.json │ ├── language_deps │ ├── Dockerfile │ └── packages │ │ ├── conda_channels │ │ └── conda_packages │ ├── release │ └── Dockerfile │ ├── security_scan │ ├── .trivyignore │ ├── Dockerfile │ ├── packages │ │ ├── apt_get_packages │ │ └── apt_get_packages_trivy_deps │ └── trivy.rego │ ├── testconfig │ └── udfclient_deps │ ├── Dockerfile │ └── packages │ ├── conda_channels │ └── conda_packages ├── githooks ├── install.sh ├── install_recursive.sh ├── pre-commit ├── pre-push ├── prohibit_commit_to_master.sh └── update_current_submodules_file.sh ├── noxfile.py ├── poetry.lock ├── pyproject.toml ├── scripts ├── check_git_status.sh ├── check_if_submodules_head_are_ancestors_of_origin_master.sh ├── check_release.py ├── check_release.sh ├── find_apt_package_in_package_list.sh ├── generate_package_diffs_for_flavors │ ├── generate_package_diffs_for_flavors.py │ ├── poetry.lock │ └── pyproject.toml ├── installUdfClientDeps.sh ├── shellcheck.sh ├── update_apt_package_in_package_list.sh └── update_apt_packages_in_package_list.sh ├── show_code_arround_error_codes.sh ├── test_container ├── LICENSE ├── build │ ├── Dockerfile │ └── deps │ │ ├── 01_nodoc │ │ ├── install_dev_tools.sh │ │ ├── maven-toolchains.xml │ │ └── requirements.txt ├── scripts │ ├── connect_connect.sh │ ├── listen_listen.sh │ ├── test_external.sh │ └── top_exasql_udf_log.sh ├── test_data │ └── enginedb_small │ │ ├── csv │ │ ├── COMP1.csv │ │ ├── COMP2.csv │ │ ├── ENGINETABLE.csv │ │ ├── ENGINETABLEBIG1.csv │ │ ├── ENGINETABLEBIG2.csv │ │ ├── ENGINETABLEBIGJOINOPTCHAR1.csv │ │ ├── ENGINETABLEBIGJOINOPTCHAR2.csv │ │ ├── ENGINETABLEBIGJOINOPTDATE1.csv │ │ ├── ENGINETABLEBIGJOINOPTDATE2.csv │ │ ├── ENGINETABLEBIGJOINOPTDECIMAL1.csv │ │ ├── ENGINETABLEBIGJOINOPTDECIMAL2.csv │ │ ├── ENGINETABLEBIGJOINOPTFLOAT1.csv │ │ ├── ENGINETABLEBIGJOINOPTFLOAT2.csv │ │ ├── ENGINETABLEBIGJOINOPTINT1.csv │ │ ├── ENGINETABLEBIGJOINOPTINT2.csv │ │ ├── ENGINETABLEBIGJOINOPTSMALLINT1.csv │ │ ├── ENGINETABLEBIGJOINOPTSMALLINT2.csv │ │ ├── ENGINETABLEBIGJOINOPTVARCHAR1.csv │ │ ├── ENGINETABLEBIGJOINOPTVARCHAR2.csv │ │ ├── ENGINETABLEBIGUNICODE.csv │ │ ├── ENGINETABLEBIGUNICODECHAR.csv │ │ ├── ENGINETABLEBIGUNICODEVARCHAR.csv │ │ ├── ENGINETABLEJOIN1.csv │ │ ├── ENGINETABLEJOIN2.csv │ │ ├── ENGINETABLEJOINOPTCHAR1.csv │ │ ├── ENGINETABLEJOINOPTCHAR2.csv │ │ ├── ENGINETABLEJOINOPTDATE1.csv │ │ ├── ENGINETABLEJOINOPTDATE2.csv │ │ ├── ENGINETABLEJOINOPTDECIMAL1.csv │ │ ├── ENGINETABLEJOINOPTDECIMAL2.csv │ │ ├── ENGINETABLEJOINOPTFLOAT1.csv │ │ ├── ENGINETABLEJOINOPTFLOAT2.csv │ │ ├── ENGINETABLEJOINOPTINT1.csv │ │ ├── ENGINETABLEJOINOPTINT2.csv │ │ ├── ENGINETABLEJOINOPTSMALLINT1.csv │ │ ├── ENGINETABLEJOINOPTSMALLINT2.csv │ │ ├── ENGINETABLEJOINOPTTIMESTAMP1.csv │ │ ├── ENGINETABLEJOINOPTTIMESTAMP2.csv │ │ ├── ENGINETABLEJOINOPTVARCHAR1.csv │ │ ├── ENGINETABLEJOINOPTVARCHAR2.csv │ │ ├── ENGINETABLEJOINSMALL.csv │ │ ├── ENGINETABLETIMESTAMP1.csv │ │ ├── ENGINETABLETIMESTAMP2.csv │ │ ├── ENGINETABLEUNICODE.csv │ │ ├── ENGINETABLEUNICODECHAR.csv │ │ ├── ENGINETABLEUNICODEVARCHAR.csv │ │ ├── JOINTABLE10.csv │ │ ├── JOINTABLE11.csv │ │ ├── JOINTABLE12.csv │ │ ├── JOINTABLE13.csv │ │ ├── JOINTABLE14.csv │ │ ├── JOINTABLE15.csv │ │ ├── JOINTABLE16.csv │ │ ├── JOINTABLE17.csv │ │ ├── JOINTABLE18.csv │ │ ├── JOINTABLE19.csv │ │ ├── JOINTABLE20.csv │ │ ├── JOINTABLE21.csv │ │ ├── JOINTABLE22.csv │ │ ├── JOINTABLE23.csv │ │ ├── JOINTABLE24.csv │ │ ├── JOINTABLE25.csv │ │ ├── JOINTABLE26.csv │ │ ├── JOINTABLE27.csv │ │ ├── JOINTABLE28.csv │ │ └── JOINTABLE29.csv │ │ ├── export.sql │ │ ├── import.sql │ │ ├── schema.sql │ │ └── schema2.sql └── tests │ ├── eudf-pkg │ └── allinone_python_test.py │ ├── hadoop-etl │ ├── lib │ │ ├── datagen.py │ │ ├── exacsv.py │ │ ├── gss.py │ │ ├── hadoopenv.py │ │ ├── hiveodbc.py │ │ ├── utils.py │ │ └── webhdfs.py │ └── test │ │ ├── buckets.py │ │ ├── compression_types.py │ │ ├── data_types.py │ │ ├── file_compression_types.py │ │ ├── file_formats.py │ │ └── partitions.py │ ├── lang │ ├── ext-python │ │ ├── basic.sql │ │ ├── cologne_phonetic.sql │ │ ├── combinations.sql │ │ ├── dynamic_input.sql │ │ ├── dynamic_output.sql │ │ ├── metadata.sql │ │ ├── numeric_functions.sql │ │ ├── pathological_functions.sql │ │ ├── performance.sql │ │ ├── types.sql │ │ ├── unicode.sql │ │ └── vectorsize.sql │ ├── java │ │ ├── basic.sql │ │ ├── combinations.sql │ │ ├── dynamic_input.sql │ │ ├── dynamic_output.sql │ │ ├── emit.sql │ │ ├── export_alias.sql │ │ ├── get_connection.sql │ │ ├── import_alias.sql │ │ ├── metadata.sql │ │ ├── numeric_functions.sql │ │ ├── pathological_functions.sql │ │ ├── performance.sql │ │ ├── types.sql │ │ ├── unicode.sql │ │ └── vectorsize.sql │ ├── lua │ │ ├── basic.sql │ │ ├── combinations.sql │ │ ├── dynamic_input.sql │ │ ├── dynamic_output.sql │ │ ├── emit.sql │ │ ├── export_alias.sql │ │ ├── get_connection.sql │ │ ├── import_alias.sql │ │ ├── metadata.sql │ │ ├── numeric_functions.sql │ │ ├── pathological_functions.sql │ │ ├── performance.sql │ │ ├── types.sql │ │ ├── unicode.sql │ │ └── vectorsize.sql │ ├── python3 │ │ ├── basic.sql │ │ ├── cologne_phonetic.sql │ │ ├── combinations.sql │ │ ├── dynamic_input.sql │ │ ├── dynamic_output.sql │ │ ├── emit.sql │ │ ├── export_alias.sql │ │ ├── get_connection.sql │ │ ├── import_alias.sql │ │ ├── metadata.sql │ │ ├── numeric_functions.sql │ │ ├── pathological_functions.sql │ │ ├── performance.sql │ │ ├── types.sql │ │ ├── unicode.sql │ │ └── vectorsize.sql │ └── r │ │ ├── basic.sql │ │ ├── combinations.sql │ │ ├── dynamic_input.sql │ │ ├── dynamic_output.sql │ │ ├── emit.sql │ │ ├── export_alias.sql │ │ ├── get_connection.sql │ │ ├── import_alias.sql │ │ ├── metadata.sql │ │ ├── numeric_functions.sql │ │ ├── pathological_functions.sql │ │ ├── performance.sql │ │ ├── types.sql │ │ ├── unicode.sql │ │ └── vectorsize.sql │ └── test │ ├── disabled │ ├── etl_udfs.py │ ├── ldlibrarypath.py │ ├── merge_forward.py │ ├── modify_priority.py │ ├── nan.py │ ├── round.py │ ├── round_special.py │ ├── search.py │ └── view.py │ ├── generic │ ├── basic.py │ ├── combinations.py │ ├── dynamic_input.py │ ├── dynamic_output.py │ ├── emit.py │ ├── export_alias.py │ ├── generic_types.py │ ├── get_connection.py │ ├── import_alias.py │ ├── metadata.py │ ├── numeric_functions.py │ ├── pathological_functions.py │ ├── performance.py │ ├── unicode.py │ └── vectorsize.py │ ├── java │ ├── bugs.py │ ├── exceptions.py │ ├── external_jar_files.py │ ├── general.py │ ├── java_modules.py │ ├── jvm_owned_native_libs.py │ ├── network.py │ ├── resources │ │ ├── hadoop_etl_udf │ │ │ ├── hadoop-hive.env │ │ │ └── retail.sql │ │ └── java_udf │ │ │ ├── pom.xml │ │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ ├── com │ │ │ └── exasol │ │ │ │ └── slc │ │ │ │ └── testudf │ │ │ │ └── Main.java │ │ │ └── module-info.java │ ├── script_import.py │ ├── specific_types.py │ ├── test_hadoop_etl_udfs.py │ ├── timezone.py │ └── unicode.py │ ├── linker_namespace_sanity │ ├── linker_namespace_base_test.py │ └── linker_namespace_sanity.py │ ├── pandas │ ├── all │ │ ├── dataframe.py │ │ ├── dataframe_memory_leak.py │ │ ├── emit_dtypes.py │ │ └── emit_dtypes_memory_leak.py │ └── pandas2 │ │ └── pandas.py │ ├── performance │ ├── abstract_performance_test.py │ ├── abstract_python_scalar_emit_consume_columns.py │ ├── abstract_python_set_emit_start_only.py │ ├── java_scalar_emit_consume_columns.py │ ├── java_scalar_emit_consume_next_only.py │ ├── java_set_emit_consume_columns.py │ ├── java_set_emit_consume_next_only.py │ ├── java_set_emit_output_only.py │ ├── java_set_emit_start_only.py │ ├── python2_scalar_emit_consume_columns.py │ ├── python2_set_emit_start_only.py │ ├── python3_scalar_emit_consume_columns.py │ ├── python3_set_emit_start_only.py │ ├── python_scalar_emit_consume_tuple_only.py │ ├── python_set_emit_consume_columns.py │ ├── python_set_emit_consume_large_string_columns.py │ ├── python_set_emit_consume_next_only.py │ ├── python_set_emit_output_only.py │ ├── r_scalar_emit_consume_columns.py │ ├── r_scalar_emit_consume_tuple_only.py │ ├── r_set_emit_consume_columns.py │ ├── r_set_emit_consume_next_only.py │ ├── r_set_emit_output_only.py │ ├── r_set_emit_start_only.py │ └── very_large │ │ ├── abstract_python_scalar_emit_consume_columns_very_large.py │ │ ├── abstract_python_scalar_emit_consume_emit_very_large.py │ │ ├── abstract_python_scalar_emit_output_only_very_large.py │ │ ├── java_scalar_emit_consume_emit_very_large.py │ │ ├── python2_scalar_emit_consume_columns_very_large.py │ │ ├── python2_scalar_emit_consume_emit_very_large.py │ │ ├── python2_scalar_emit_output_only_very_large.py │ │ ├── python3_scalar_emit_consume_columns_very_large.py │ │ ├── python3_scalar_emit_consume_emit_very_large.py │ │ └── python3_scalar_emit_output_only_very_large.py │ ├── python3-cuda-flavor │ ├── numba.py │ └── pytorch.py │ ├── python3-no-python2 │ └── verify_python2.py │ ├── python3 │ ├── all │ │ ├── bugs.py │ │ ├── env_directive.py │ │ ├── general.py │ │ ├── getpass.py │ │ ├── linker_namespace.py │ │ ├── script_import.py │ │ ├── specific_types.py │ │ ├── sys_executable.py │ │ ├── timezone.py │ │ └── unicode.py │ ├── external_modules.py │ ├── external_modules │ │ └── external_modules.py │ ├── installed_packages.py │ └── network.py │ ├── r │ ├── general.py │ ├── network.py │ ├── scalar_returns_return_behavior.py │ ├── script_import.py │ ├── specific_types.py │ ├── timezone.py │ └── unicode.py │ ├── resources │ └── linker_namespace_test_udf.py │ └── standard-flavor │ ├── 7.1 │ └── python │ │ ├── available-packages-azure-sdk.py │ │ ├── available-packages-gcp-sdk.py │ │ └── available-packages-sagemaker-sdk.py │ ├── 8.0 │ ├── python │ │ ├── available-packages.py │ │ ├── debugpy.py │ │ └── numba.py │ └── r │ │ └── available-packages.py │ ├── all │ ├── python │ │ ├── connect_to_exasol_with_websocket_api.py │ │ ├── import_modules.py │ │ ├── network.py │ │ ├── paramiko_connection_test.py │ │ ├── pyexasol.py │ │ ├── pysftp_connection_test.py │ │ ├── row_level_security_adapter_script.txt │ │ └── row_level_security_with_websocket_api.py │ └── r │ │ └── import_r_modules.py │ └── setup │ └── language_definitions.py ├── udf-script-signature-generator └── udf-script-signature-generator.html └── visualize_task_dependencies.sh /.current_gitmodules: -------------------------------------------------------------------------------- 1 | 160000 3ea81172248f770596d81ff378772677ab5656ea 0 exaslct_src/test_environment 2 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | downloads 2 | *.tar.gz 3 | tests 4 | udf-script-signature-generator 5 | .build_output -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | poetry.lock linguist-generated=true 2 | setup.py linguist-generated=true 3 | exaslct_scripts/*.sh linguist-generated=true 4 | .github/workflows/slc_ci*.yml linguist-generated=true 5 | .github/workflows/slc_cd*.yml linguist-generated=true 6 | -------------------------------------------------------------------------------- /.github/markdown_check_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "aliveStatusCodes": [429, 200] 3 | } -------------------------------------------------------------------------------- /.github/workflows/check_error_codes.yml: -------------------------------------------------------------------------------- 1 | name: Check error codes 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v4 16 | 17 | - name: Init submodules 18 | run: git submodule update --init --recursive 19 | 20 | - name: Search for duplicated error codes 21 | run: bash find_duplicate_error_codes.sh 22 | -------------------------------------------------------------------------------- /.github/workflows/check_if_submodules_head_are_ancestors_of_origin_master.yaml: -------------------------------------------------------------------------------- 1 | name: Check if submodules heads are ancestors of origin/master 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v4 16 | 17 | - name: Init submodules 18 | run: git submodule update --init --recursive 19 | 20 | - name: Check if submodules heads are ancestors of origin/master 21 | run: bash scripts/check_if_submodules_head_are_ancestors_of_origin_master.sh 22 | 23 | -------------------------------------------------------------------------------- /.github/workflows/check_markdown_links.yaml: -------------------------------------------------------------------------------- 1 | name: Check Markdown links 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | 10 | jobs: 11 | markdown-link-check: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | - uses: gaurav-nelson/github-action-markdown-link-check@v1 16 | with: 17 | config-file: '.github/markdown_check_config.json' 18 | -------------------------------------------------------------------------------- /.github/workflows/oft.yaml: -------------------------------------------------------------------------------- 1 | name: OFT Report 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-24.04 12 | steps: 13 | - uses: actions/checkout@v4 14 | - name: Setup Python & Poetry Environment 15 | uses: exasol/python-toolbox/.github/actions/python-environment@0.12.0 16 | with: 17 | python-version: "3.10" 18 | poetry-version: "2.1.2" 19 | - name: Run HTML Report 20 | run: | 21 | poetry run nox -s run-oft-html -- -- oft_report.html || echo failed 22 | - name: Run Plaintext Report 23 | run: | 24 | poetry run nox -s run-oft 25 | - uses: actions/upload-artifact@v4 26 | if: always() 27 | with: 28 | name: "oft_report.html" 29 | path: oft_report.html 30 | -------------------------------------------------------------------------------- /.github/workflows/shellcheck.yaml: -------------------------------------------------------------------------------- 1 | name: Check bash scripts 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | jobs: 10 | shellcheck: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | 15 | - name: Run shellcheck 16 | run: ./scripts/shellcheck.sh 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *tar.gz 2 | *.pyc 3 | *log 4 | downloads/* 5 | odbc.ini 6 | .vscode/settings.json 7 | .env 8 | Pipfile.lock 9 | emulator/zmqcontainer_pb2.py 10 | .idea 11 | .build_output/ 12 | luigi.cfg 13 | *.iml 14 | /codebuild_build.sh 15 | exaudfclient/base/file.txt 16 | dist 17 | *.swp 18 | test_container/tests/test/java/resources/java_udf/target/ 19 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:18.04 2 | 3 | COPY ext/01_nodoc /etc/dpkg/dpkg.cfg.d/01_nodoc 4 | 5 | RUN apt-get -y update && \ 6 | apt-get -y install \ 7 | locales \ 8 | python3-pip \ 9 | git \ 10 | bash \ 11 | curl && \ 12 | locale-gen en_US.UTF-8 && \ 13 | update-locale LC_ALL=en_US.UTF-8 && \ 14 | apt-get -y clean && \ 15 | apt-get -y autoremove && \ 16 | ldconfig 17 | 18 | RUN pip3 install virtualenv 19 | RUN python3 -m virtualenv --python=python3 venv 20 | 21 | COPY . /test 22 | RUN rm /test/Pipfile.lock || true 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 EXASOL AG 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EXASOL Script Languages Base Repository 2 | 3 | **Please note, that this is no longer the main repository of the script-languages. Please visit the new main repository [exasol/script-languages-release](https://github.com/exasol/script-languages-release). If you find issues or have feature requests, please report them on the [issue page of the main repository](https://github.com/exasol/script-languages-release/issues) or as an open source project which is officially supported by EXASOL, you can contact our support team, as well.** 4 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security 2 | 3 | If you believe you have found a new security vulnerability in this repository, please report it to us as follows. 4 | 5 | ## Reporting Security Issues 6 | 7 | * Please do **not** report security vulnerabilities through public GitHub issues. 8 | 9 | * Please create a draft security advisory on the Github page: the reporting form is under `> Security > Advisories`. The URL is https://github.com/exasol/script-languages/security/advisories/new. 10 | 11 | * If you prefer to email, please send your report to `infosec@exasol.com`. 12 | 13 | ## Guidelines 14 | 15 | * When reporting a vulnerability, please include as much information as possible, including the complete steps to reproduce the issue. 16 | 17 | * Avoid sending us executables. 18 | 19 | * Feel free to include any script you wrote and used but avoid sending us scripts that download and run binaries. 20 | 21 | * We will prioritise reports that show how the exploits work in realistic environments. 22 | 23 | * We prefer all communications to be in English. 24 | 25 | * We do not offer financial rewards. We are happy to acknowledge your research publicly when possible. 26 | 27 | -------------------------------------------------------------------------------- /build_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "ignore_paths": [ 3 | ".gitignore", 4 | ".dockerignore", 5 | "LICENSE", 6 | "README.md", 7 | "find_duplicate_error_codes.sh", 8 | "find_error_codes.sh", 9 | "find_highest_error_codes_per_module.sh", 10 | "find_incomplete_error_codes.sh", 11 | "find_next_error_code_per_module.sh", 12 | "show_code_arround_error_codes.sh", 13 | "visualize_task_dependencies.sh", 14 | "udf-script-signature-generator", 15 | ".github", 16 | "emulator", 17 | "githooks" 18 | ], 19 | "docker_build_repository": "exadockerci4/script-languages-build-cache", 20 | "docker_release_repository": "exadockerci4/script-languages-build-cache", 21 | "test_container_folder": "test_container" 22 | } 23 | -------------------------------------------------------------------------------- /emulator/Dockerfile.emulator: -------------------------------------------------------------------------------- 1 | FROM exaudf/release_mini 2 | #FROM ubuntu:16.04 3 | 4 | RUN mkdir /exasol_emulator 5 | 6 | COPY emulator/ /exasol_emulator 7 | COPY src/zmqcontainer.proto /exasol_emulator 8 | 9 | RUN apt-get -y install python-protobuf 10 | 11 | # software-properties-common \ 12 | # coreutils \ 13 | # locales \ 14 | # python-dev \ 15 | # libzmq-dev \ 16 | # python-zmq \ 17 | # protobuf-compiler \ 18 | # python-pip \ 19 | # python-protobuf && \ 20 | # locale-gen en_US.UTF-8 && \ 21 | # update-locale LC_ALL=en_US.UTF-8 && \ 22 | # apt-get -y clean && \ 23 | # apt-get -y autoremove && \ 24 | # ldconfig 25 | 26 | RUN cd /exasol_emulator && protoc zmqcontainer.proto --python_out=. 27 | RUN ls /exasol_emulator 28 | -------------------------------------------------------------------------------- /emulator/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 EXASOL AG 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /emulator/MY_TEST_JAVA: -------------------------------------------------------------------------------- 1 | //input_column: a,int64,INT,None,None,None 2 | //input_column: b,string,VARCHAR(100),100,None,None 3 | //input_type: SET 4 | 5 | //output_column: a,int64,INT,None,None,None 6 | //output_column: b,string,VARCHAR(100),100,None,None 7 | //output_type: EMITS 8 | class MY_TEST_JAVA { 9 | static void run(ExaMetadata exa, ExaIterator ctx) throws Exception { 10 | String str = ctx.getString("b"); 11 | ctx.emit(1,str); 12 | } 13 | } -------------------------------------------------------------------------------- /emulator/get_connections_script.py: -------------------------------------------------------------------------------- 1 | #input_column: a,string,VARCHAR(100),100,None,None 2 | #input_column: b,string,VARCHAR(100),100,None,None 3 | #input_type: SCALAR 4 | 5 | #output_column: b,string,VARCHAR(100),100,None,None 6 | #output_type: EMITS 7 | def run(ctx): 8 | conn = exa.get_connection('lsajklha') 9 | ctx.emit(str(conn)) 10 | 11 | -------------------------------------------------------------------------------- /emulator/sc_script2: -------------------------------------------------------------------------------- 1 | import com.exasol.ExaMetadata; 2 | 3 | public class sc_script2 { 4 | public static String adapterCall(final ExaMetadata meta, final String input) throws Exception { 5 | return "{'schemaMetadata': {'tables': [{'name': 'table_1', 'columns': [{'dataType': {'type': 'VARCHAR', 'size': 2000000}, 'name': 'column_1'}, {'dataType': {'type': 'VARCHAR', 'size': 2000000}, 'name': 'column_2'}]}]}, 'type': 'createVirtualSchema'}".replace('\'','"'); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /emulator/script.py: -------------------------------------------------------------------------------- 1 | #input_column: a,int64,INT,None,None,None 2 | #input_column: b,string,VARCHAR(100),100,None,None 3 | #input_type: SET 4 | 5 | #output_column: a,int64,INT,None,None,None 6 | #output_column: b,string,VARCHAR(100),100,None,None 7 | #output_type: EMITS 8 | #import tensorflow as tf 9 | 10 | def run(ctx): 11 | while True: 12 | ctx.emit(ctx.a * 100, "@" + repr(ctx.b)) 13 | if not ctx.next(): break 14 | -------------------------------------------------------------------------------- /emulator/script2.py: -------------------------------------------------------------------------------- 1 | #input_column: b,string,VARCHAR(100),100,None,None 2 | #input_type: SET 3 | 4 | #output_column: b,string,VARCHAR(100),100,None,None 5 | #output_type: EMITS 6 | #!/bin/bash 7 | ls -l /tmp 8 | -------------------------------------------------------------------------------- /emulator/script3.py: -------------------------------------------------------------------------------- 1 | #input_column: b,string,VARCHAR(100),100,None,None 2 | #input_type: SET 3 | 4 | #output_column: b,string,VARCHAR(100),100,None,None 5 | #output_type: EMITS 6 | #!/bin/bash 7 | ls -l /tmp 8 | echo "This is an error message" 1>&2 9 | ls -l /tmp 10 | -------------------------------------------------------------------------------- /emulator/script4.py: -------------------------------------------------------------------------------- 1 | #input_column: b,string,VARCHAR(100),100,None,None 2 | #input_type: SET 3 | 4 | #output_column: b,string,VARCHAR(100),100,None,None 5 | #output_type: EMITS 6 | #!/bin/bash 7 | cat - 8 | -------------------------------------------------------------------------------- /emulator/script5.py: -------------------------------------------------------------------------------- 1 | #input_column: a,string,VARCHAR(100),100,None,None 2 | #input_column: b,string,VARCHAR(100),100,None,None 3 | #input_type: SET 4 | 5 | #output_column: b,string,VARCHAR(100),100,None,None 6 | #output_type: EMITS 7 | #!/usr/bin/swipl -q 8 | :- use_module(library(csv)). 9 | :- initialization(main,main). 10 | 11 | 12 | process(row(A,B),row(A)). 13 | 14 | f(O) :- csv_read_row(user_input,R,O), R \= end_of_file, !, process(R,RR), csv_write_stream(user_output, [RR], []), f(O). 15 | f(_). 16 | 17 | 18 | 19 | main(_Argv) :- prompt(_, ''), csv_options(O,[]), f(O). 20 | -------------------------------------------------------------------------------- /emulator/script_fr.1.r: -------------------------------------------------------------------------------- 1 | #input_column: a,int64,INT,None,None,None 2 | #input_column: b,string,VARCHAR(100),100,None,None 3 | #input_type: SET 4 | 5 | #output_column: a,int64,INT,None,None,None 6 | #output_column: b,string,VARCHAR(100),100,None,None 7 | #output_type: EMITS 8 | run <- function(ctx) { 9 | print("run") 10 | # end_loop = FALSE 11 | # #while (!end_loop) 12 | # print(exa$meta) 13 | for(i in 1:100) 14 | { 15 | a=ctx$a 16 | b=ctx$b 17 | print(a) 18 | print(b) 19 | ctx$emit(a,b) 20 | exist_next=ctx$next_row(1) 21 | end_loop=!exist_next 22 | print(end_loop) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /emulator/script_fr.py: -------------------------------------------------------------------------------- 1 | #input_column: a,double,double,None,None,None 2 | #input_type: SET 3 | 4 | #output_column: b,double,double,None,None,None 5 | #output_type: EMITS 6 | library(forecast) 7 | run <- function(ctx) { 8 | ctx$emit(0.0) 9 | } 10 | -------------------------------------------------------------------------------- /emulator/script_iter.py: -------------------------------------------------------------------------------- 1 | #input_column: a,int64,INT,None,None,None 2 | #input_column: b,string,VARCHAR(100),100,None,None 3 | #input_type: SET 4 | 5 | #output_column: a,int64,INT,None,None,None 6 | #output_column: b,string,VARCHAR(100),100,None,None 7 | #output_type: EMITS 8 | 9 | def run(ctx): 10 | print "run" 11 | for i in range(1,10): 12 | print "a: "+str(ctx.a) 13 | print "b: "+ctx.b 14 | is_next=ctx.next() 15 | print "is_next: "+str(is_next) 16 | -------------------------------------------------------------------------------- /emulator/start_test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | mkfifo /tmp/fff 4 | INPUT=exasol_emulator/input.csv 5 | SCRIPT=exasol_emulator/script.py 6 | LANGUAGE=python 7 | python exasol_emulator/exasolution.py unix:/tmp/fff $INPUT exasol_emulator/output.csv $SCRIPT & 8 | "$1/exaudfclient" ipc:///tmp/fff lang=$LANGUAGE 9 | -------------------------------------------------------------------------------- /exaudfclient/.env.template: -------------------------------------------------------------------------------- 1 | export JAVA_PREFIX= 2 | export PYTHON3_PREFIX= 3 | export PYTHON3_VERSION= 4 | export PROTOBUF_BIN= 5 | export PROTOBUF_LIBRARY_PREFIX= 6 | export PROTOBUF_INCLUDE_PREFIX= 7 | export OPENSSL_LIBRARY_PREFIX= 8 | export OPENSSL_INCLUDE_PREFIX= 9 | export VERBOSE_BUILD= #"--subcommands --verbose_failures" -------------------------------------------------------------------------------- /exaudfclient/.gitignore: -------------------------------------------------------------------------------- 1 | bazel-bin 2 | bazel-genfiles 3 | bazel-out 4 | bazel-src 5 | bazel-testlogs 6 | bazel-exaudfclient 7 | graph.in 8 | graph.png 9 | MODULE.bazel.lock 10 | -------------------------------------------------------------------------------- /exaudfclient/MODULE.bazel: -------------------------------------------------------------------------------- 1 | module(name="exaudfclient", version = "1.0") 2 | 3 | include("//base:base.MODULE.bazel") -------------------------------------------------------------------------------- /exaudfclient/base/benchmark_container/BUILD: -------------------------------------------------------------------------------- 1 | package(default_visibility = ["//visibility:public"]) 2 | 3 | cc_library( 4 | name = "benchmark_container", 5 | srcs = ["benchmark_container.cc","benchmark_container.h"], 6 | hdrs = ["benchmark_container.h"], 7 | deps = ["//base/exaudflib:exaudflib-deps","//base/exaudflib:header", "//base/utils:utils"]+["//base/script_options_parser:scriptoptionlines"] 8 | ) -------------------------------------------------------------------------------- /exaudfclient/base/benchmark_container/benchmark_container.h: -------------------------------------------------------------------------------- 1 | #include "base/exaudflib/vm/swig_vm.h" 2 | #include "base/exaudflib/swig/swig_meta_data.h" 3 | #include "base/exaudflib/swig/swig_result_handler.h" 4 | #include "base/exaudflib/swig/swig_table_iterator.h" 5 | 6 | using namespace SWIGVMContainers; 7 | using namespace std; 8 | 9 | 10 | class BenchmarkVM: public SWIGVM { 11 | public: 12 | struct exception: SWIGVM::exception { 13 | exception(const char *reason): SWIGVM::exception(reason) { } 14 | virtual ~exception() throw() { } 15 | }; 16 | BenchmarkVM(bool checkOnly); 17 | virtual ~BenchmarkVM() {}; 18 | virtual void shutdown(); 19 | virtual bool run(); 20 | virtual const char* singleCall(single_call_function_id_e fn, const ExecutionGraph::ScriptDTO& args); 21 | virtual bool useZmqSocketLocks() {return true;} 22 | private: 23 | SWIGMetadata meta; 24 | SWIGTableIterator inp; 25 | SWIGResultHandler outp; 26 | void importScripts(); 27 | }; -------------------------------------------------------------------------------- /exaudfclient/base/create_binary_wrapper.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -o errexit 3 | set -o pipefail 4 | CLIENT_BINARY=$1 5 | CLIENT_WRAPPER=$2 6 | WRAPPER_TEMPLATE=$3 7 | touch "$CLIENT_WRAPPER" 8 | 9 | { 10 | cat "$WRAPPER_TEMPLATE" 11 | echo 12 | echo ./"$(basename "$CLIENT_BINARY")" '$*' 13 | } >> "$CLIENT_WRAPPER" -------------------------------------------------------------------------------- /exaudfclient/base/create_binary_wrapper_stdout_to_bucketfs.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # shellcheck disable=SC2016 3 | 4 | set -o errexit 5 | set -o pipefail 6 | CLIENT_BINARY=$1 7 | CLIENT_WRAPPER=$2 8 | WRAPPER_TEMPLATE=$3 9 | touch "$CLIENT_WRAPPER" 10 | 11 | { 12 | cat "$WRAPPER_TEMPLATE" 13 | echo 14 | echo 'NAME="$1"' 15 | #Ignore shellcheck rule, change is too risky. 16 | #shellcheck disable=SC2001 17 | echo 'OUTPUT_FILE="/tmp/$(echo "$NAME" | sed s#[/:]##g)"' 18 | echo "./$(basename "$CLIENT_BINARY")" '"$@"' '&> "$OUTPUT_FILE"' 19 | echo 'UPLOAD="curl --fail -X PUT -T $OUTPUT_FILE http://w:write@localhost:6583/default$OUTPUT_FILE"' 20 | echo 'echo "$UPLOAD"' 21 | echo '"$UPLOAD"' 22 | 23 | } >> "$CLIENT_WRAPPER" -------------------------------------------------------------------------------- /exaudfclient/base/create_binary_wrapper_valgrind.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -o errexit 3 | set -o pipefail 4 | CLIENT_BINARY=$1 5 | CLIENT_WRAPPER=$2 6 | WRAPPER_TEMPLATE=$3 7 | touch "$CLIENT_WRAPPER" 8 | 9 | { 10 | cat "$WRAPPER_TEMPLATE" 11 | echo 12 | echo valgrind "./$(basename "$CLIENT_BINARY")" '$*' 13 | } >> "$CLIENT_WRAPPER" -------------------------------------------------------------------------------- /exaudfclient/base/create_binary_wrapper_valgrind_massif.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # shellcheck disable=SC2016 3 | 4 | set -o errexit 5 | set -o pipefail 6 | CLIENT_BINARY=$1 7 | CLIENT_WRAPPER=$2 8 | WRAPPER_TEMPLATE=$3 9 | touch "$CLIENT_WRAPPER" 10 | { 11 | cat "$WRAPPER_TEMPLATE" 12 | echo 13 | echo 'NAME="$1"' 14 | #Ignore shellcheck rule, change is too risky. 15 | #shellcheck disable=SC2001 16 | echo 'MASSIF_FILE="/tmp/$(echo "$NAME" | sed s#[/:]##g)"' 17 | echo valgrind --tool=massif --massif-out-file='"$MASSIF_FILE"' "./$(basename "$CLIENT_BINARY")" '"$@"' 18 | echo 'UPLOAD="curl --fail -X PUT -T $MASSIF_FILE http://w:write@localhost:6583/default$MASSIF_FILE"' 19 | echo 'echo "$UPLOAD"' 20 | echo '"$UPLOAD"' 21 | } >> "$CLIENT_WRAPPER" -------------------------------------------------------------------------------- /exaudfclient/base/exaudfclient.template.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | SCRIPT_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" 4 | echo "Changing to script directory $SCRIPT_DIR" 5 | cd "$SCRIPT_DIR" || return 1 6 | export LIBEXAUDFLIB_PATH="$SCRIPT_DIR/base/libexaudflib_complete.so" 7 | export LIBPYEXADATAFRAME_DIR="$SCRIPT_DIR/base/python/python3" 8 | export LD_LIBRARY_PATH="/opt/conda/cuda-compat/:$LD_LIBRARY_PATH" #Temporary hack for the Cuda ML flavor(s) 9 | -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/impl/check.h: -------------------------------------------------------------------------------- 1 | #ifndef EXAUDFCLIENT_EXAUDFLIB_CHECK_H 2 | #define EXAUDFCLIENT_EXAUDFLIB_CHECK_H 3 | 4 | 5 | namespace exaudflib { 6 | namespace check { 7 | void external_process_check(); 8 | void start_check_thread(); 9 | void stop_check_thread(); 10 | void cancel_check_thread(); 11 | void set_remote_client(bool value); 12 | bool get_remote_client(); 13 | } 14 | } 15 | 16 | 17 | #endif //EXAUDFCLIENT_EXAUDFLIB_CHECK_H 18 | -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/impl/global.h: -------------------------------------------------------------------------------- 1 | #ifndef EXAUDFCLIENT_EXUDFLIB_GLOBAL_H 2 | #define EXAUDFCLIENT_EXUDFLIB_GLOBAL_H 3 | 4 | #include "base/exaudflib/swig/script_data_transfer_objects.h" 5 | #include "base/exaudflib/zmqcontainer.pb.h" 6 | #include "base/exaudflib/swig/swig_common.h" 7 | #include 8 | 9 | namespace exaudflib { 10 | struct Global { 11 | Global(); 12 | void initSwigParams(); 13 | void writeScriptParams(const exascript_info &rep); 14 | SWIGVMContainers::SWIGVM_params_t * SWIGVM_params_ref; 15 | zmq::socket_t *sock; 16 | ExecutionGraph::StringDTO singleCall_StringArg; 17 | bool singleCallMode; 18 | SWIGVMContainers::single_call_function_id_e singleCallFunction; 19 | ExecutionGraph::ImportSpecification singleCall_ImportSpecificationArg; 20 | ExecutionGraph::ExportSpecification singleCall_ExportSpecificationArg; 21 | SWIGVMContainers::SWIGVMExceptionHandler exchandler; 22 | }; 23 | 24 | extern Global global; 25 | } 26 | 27 | 28 | #endif //EXAUDFCLIENT_EXUDFLIB_GLOBAL_H 29 | -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/impl/msg_conversion.h: -------------------------------------------------------------------------------- 1 | #ifndef EXAUDFCLIENT_EXAUDFLIB_MSG_CONVERSION_H 2 | #define EXAUDFCLIENT_EXAUDFLIB_MSG_CONVERSION_H 3 | 4 | #include 5 | 6 | namespace exaudflib { 7 | namespace msg_conversion { 8 | std::string convert_message_type_to_string(int message_type); 9 | std::string convert_type_to_string(int type); 10 | } 11 | } 12 | 13 | 14 | #endif //EXAUDFCLIENT_EXAUDFLIB_MSG_CONVERSION_H 15 | -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/impl/socket_high_level.h: -------------------------------------------------------------------------------- 1 | #ifndef EXAUDFLIB_SOCKET_HIGH_LEVEL_H 2 | #define EXAUDFLIB_SOCKET_HIGH_LEVEL_H 3 | 4 | #include 5 | #include 6 | 7 | namespace exaudflib { 8 | namespace socket_high_level { 9 | 10 | bool send_init(zmq::socket_t &socket, const std::string client_name); 11 | void send_close(zmq::socket_t &socket, const std::string &exmsg); 12 | bool send_run(zmq::socket_t &socket); 13 | void send_undefined_call(zmq::socket_t &socket, const std::string& fn); 14 | bool send_done(zmq::socket_t &socket); 15 | void send_finished(zmq::socket_t &socket); 16 | bool send_return(zmq::socket_t &socket, const char* result); 17 | 18 | } //socket_high_level 19 | } //exaudflib 20 | 21 | 22 | #endif //EXAUDFLIB_SOCKET_HIGH_LEVEL_H 23 | -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/impl/socket_info.cc: -------------------------------------------------------------------------------- 1 | #include "base/exaudflib/impl/socket_info.h" 2 | 3 | 4 | namespace exaudflib { 5 | namespace socket_info { 6 | static const char *socket_file_name; 7 | static const char *socket_name_url; 8 | } 9 | } 10 | 11 | 12 | void exaudflib::socket_info::set_socket_url(const char* the_socket_url) { 13 | socket_name_url = the_socket_url; 14 | } 15 | 16 | const char* exaudflib::socket_info::get_socket_url() { 17 | return socket_name_url; 18 | } 19 | 20 | void exaudflib::socket_info::set_socket_file_name(const char* the_socket_file_name) { 21 | socket_file_name = the_socket_file_name; 22 | } 23 | 24 | const char* exaudflib::socket_info::get_socket_file_name() { 25 | return socket_file_name; 26 | } 27 | -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/impl/socket_info.h: -------------------------------------------------------------------------------- 1 | #ifndef EXAUDFCLIENT_SOCKET_INFO_H 2 | #define EXAUDFCLIENT_SOCKET_INFO_H 3 | 4 | namespace exaudflib { 5 | namespace socket_info { 6 | void set_socket_url(const char*); 7 | void set_socket_file_name(const char*); 8 | const char* get_socket_file_name(); 9 | const char* get_socket_url(); 10 | } 11 | } 12 | 13 | 14 | #endif //EXAUDFCLIENT_SOCKET_INFO_H 15 | -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/impl/socket_low_level.h: -------------------------------------------------------------------------------- 1 | #ifndef EXAUDFCLIENT_EXAUDFLIB_SOCKET_LOW_LEVEL_H 2 | #define EXAUDFCLIENT_EXAUDFLIB_SOCKET_LOW_LEVEL_H 3 | 4 | #include 5 | 6 | namespace exaudflib { 7 | namespace socket_low_level { 8 | void init(bool use_zmq_socket_locks); 9 | void socket_send(zmq::socket_t &socket, zmq::message_t &zmsg); 10 | bool socket_recv(zmq::socket_t &socket, zmq::message_t &zmsg, bool return_on_error=false); 11 | } 12 | } 13 | 14 | 15 | #endif //EXAUDFCLIENT_EXAUDFLIB_SOCKET_LOW_LEVEL_H 16 | -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/impl/swig/swig_factory.cc: -------------------------------------------------------------------------------- 1 | #include "base/exaudflib/impl/swig/swig_meta_data.h" 2 | #include "base/exaudflib/impl/swig/swig_table_iterator.h" 3 | #include "base/exaudflib/impl/swig/swig_result_handler.h" 4 | 5 | extern "C" { 6 | 7 | SWIGVMContainers::SWIGMetadataIf* create_SWIGMetaData() { 8 | return new SWIGVMContainers::SWIGMetadata_Impl(); 9 | } 10 | 11 | SWIGVMContainers::AbstractSWIGTableIterator* create_SWIGTableIterator() { 12 | return new SWIGVMContainers::SWIGTableIterator_Impl(); 13 | } 14 | 15 | SWIGVMContainers::SWIGRAbstractResultHandler* create_SWIGResultHandler(SWIGVMContainers::SWIGTableIterator* table_iterator) { 16 | return new SWIGVMContainers::SWIGResultHandler_Impl(table_iterator); 17 | } 18 | 19 | } //extern "C" -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/impl/swig/swig_general_iterator.cc: -------------------------------------------------------------------------------- 1 | //Check that swig_generial_iterator.h is self-contained 2 | #include "base/exaudflib/impl/swig/swig_general_iterator.h" 3 | 4 | -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/impl/swig/swig_general_iterator.h: -------------------------------------------------------------------------------- 1 | #ifndef EXAUDFCLIENT_SWIGGENERALITERATOR_H 2 | #define EXAUDFCLIENT_SWIGGENERALITERATOR_H 3 | 4 | #include "base/exaudflib/swig/swig_common.h" 5 | #include "base/exaudflib/impl/global.h" 6 | 7 | namespace SWIGVMContainers { 8 | 9 | class SWIGGeneralIterator { 10 | protected: 11 | SWIGVMExceptionHandler *m_exch; 12 | public: 13 | // SWIGGeneralIterator(SWIGVMExceptionHandler *exch): m_exch(exch) { } 14 | SWIGGeneralIterator() 15 | : m_exch(&exaudflib::global.exchandler) 16 | {} 17 | virtual ~SWIGGeneralIterator() { } 18 | inline const char* checkException() { 19 | if (m_exch->exthrowed) { 20 | m_exch->exthrowed = false; 21 | return m_exch->exmsg.c_str(); 22 | } else return NULL; 23 | } 24 | }; 25 | 26 | } //namespace SWIGVMContainers 27 | 28 | #endif //EXAUDFCLIENT_SWIGGENERALITERATOR_H 29 | -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/impl/swig/swig_meta_data.cc: -------------------------------------------------------------------------------- 1 | //Check that swig_meta_data.h is self-contained 2 | #include "base/exaudflib/impl/swig/swig_meta_data.h" 3 | 4 | -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/impl/swig/swig_result_handler.cc: -------------------------------------------------------------------------------- 1 | //Check that swig_result_handler.h is self-contained 2 | #include "base/exaudflib/impl/swig/swig_result_handler.h" 3 | 4 | -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/impl/swig/swig_table_iterator.cc: -------------------------------------------------------------------------------- 1 | //Check that swig_table_iterator.h is self-contained 2 | #include "base/exaudflib/impl/swig/swig_table_iterator.h" 3 | 4 | -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/load_dynamic.h: -------------------------------------------------------------------------------- 1 | #ifndef EXAUDFLIB_LOAD_DYNAMIC 2 | #define EXAUDFLIB_LOAD_DYNAMIC 3 | 4 | void* load_dynamic(const char* name); 5 | 6 | extern void* handle; 7 | 8 | #endif //EXAUDFLIB_LOAD_DYNAMIC -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/swig/swig_common.cc: -------------------------------------------------------------------------------- 1 | //Check that swig_common.h is self-contained 2 | #include "base/exaudflib/swig/swig_common.h" -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/swig/swig_meta_data.cc: -------------------------------------------------------------------------------- 1 | //Check that swig_meta_data.h is self-contained 2 | #include "base/exaudflib/swig/swig_meta_data.h" -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/swig/swig_result_handler.cc: -------------------------------------------------------------------------------- 1 | //Check that swig_result_handler.h is self-contained 2 | #include "base/exaudflib/swig/swig_result_handler.h" -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/swig/swig_table_iterator.cc: -------------------------------------------------------------------------------- 1 | //Check that swig_table_iterator.h is self-contained 2 | #include "base/exaudflib/swig/swig_table_iterator.h" -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/test/BUILD: -------------------------------------------------------------------------------- 1 | cc_test( 2 | name = "exaudflib-test", 3 | srcs = ["script_data_transfer_objects_test.cpp"], 4 | deps = [ 5 | "//base/exaudflib:script_data_transfer_objects", 6 | "@googletest//:gtest_main", 7 | ], 8 | ) -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/udf_plugin_interface.h: -------------------------------------------------------------------------------- 1 | #ifndef UDF_PLUGIN_INTERFACE_H 2 | #define UDF_PLUGIN_INTERFACE_H 3 | 4 | #ifdef UDF_PLUGIN_CLIENT 5 | namespace SWIGVMContainers { 6 | class SWIGMetadata; 7 | class AbstractSWIGTableIterator; 8 | class SWIGRAbstractResultHandler; 9 | class SWIGTableIterator; 10 | } 11 | 12 | extern "C" { 13 | SWIGVMContainers::SWIGMetadataIf* create_SWIGMetaData(); 14 | SWIGVMContainers::AbstractSWIGTableIterator* create_SWIGTableIterator(); 15 | SWIGVMContainers::SWIGRAbstractResultHandler* create_SWIGResultHandler(SWIGVMContainers::SWIGTableIterator* table_iterator); 16 | } 17 | #endif // UDF_PLUGIN_CLIENT 18 | 19 | #endif // UDF_PLUGIN_INTERFACE_H 20 | -------------------------------------------------------------------------------- /exaudfclient/base/exaudflib/vm/swig_vm.cc: -------------------------------------------------------------------------------- 1 | //Check that swig_vm.h is self-contained 2 | #include "base/exaudflib/vm/swig_vm.h" -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/ExaConnectionInformationImpl.java: -------------------------------------------------------------------------------- 1 | package com.exasol; 2 | 3 | 4 | public class ExaConnectionInformationImpl implements ExaConnectionInformation { 5 | 6 | private ConnectionType type; 7 | private String address; 8 | private String user; 9 | private String password; 10 | 11 | public ExaConnectionInformationImpl(String type, String address, String user, String password) 12 | { 13 | if (type.equals("password")) { 14 | this.type = ConnectionType.PASSWORD; 15 | } else { 16 | throw new IllegalStateException("F-UDF-CL-SL-JAVA-1157: ExaConnectionInformationImpl: received unknown connection type: "+type); 17 | } 18 | this.address = address; 19 | this.user = user; 20 | this.password = password; 21 | } 22 | 23 | @Override 24 | public ConnectionType getType() {return type;} 25 | 26 | @Override 27 | public String getAddress() {return address;} 28 | 29 | @Override 30 | public String getUser() {return user;} 31 | 32 | @Override 33 | public String getPassword() {return password;} 34 | 35 | } 36 | -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/ExaUndefinedSingleCallException.java: -------------------------------------------------------------------------------- 1 | package com.exasol; 2 | 3 | /** 4 | * This class is not part of the public Java UDF API 5 | */ 6 | public class ExaUndefinedSingleCallException extends Exception { 7 | private static final long serialVersionUID = 1L; 8 | public ExaUndefinedSingleCallException(String undefinedRemoteFn) { 9 | super("Undefined single call fn: "+undefinedRemoteFn); 10 | this.undefinedRemoteFn = undefinedRemoteFn; 11 | } 12 | public String getUndefinedRemoteFn() { 13 | return undefinedRemoteFn; 14 | } 15 | private String undefinedRemoteFn; 16 | } 17 | -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/javacontainer.h: -------------------------------------------------------------------------------- 1 | #ifndef JAVACONTAINER_H 2 | #define JAVACONTAINER_H 3 | 4 | 5 | #include "base/exaudflib/vm/swig_vm.h" 6 | #include 7 | #include 8 | 9 | #ifdef ENABLE_JAVA_VM 10 | 11 | namespace SWIGVMContainers { 12 | 13 | class JavaVMImpl; 14 | 15 | namespace JavaScriptOptions { 16 | 17 | struct Extractor; 18 | 19 | } 20 | 21 | class JavaVMach: public SWIGVM { 22 | public: 23 | /* 24 | * scriptOptionsParser: JavaVMach takes ownership of ScriptOptionsParser pointer. 25 | */ 26 | JavaVMach(bool checkOnly, std::unique_ptr extractor); 27 | virtual ~JavaVMach() {} 28 | virtual void shutdown(); 29 | virtual bool run(); 30 | virtual const char* singleCall(single_call_function_id_e fn, const ExecutionGraph::ScriptDTO& args); 31 | private: 32 | JavaVMImpl *m_impl; 33 | }; 34 | 35 | } //namespace SWIGVMContainers 36 | 37 | 38 | #endif //ENABLE_JAVA_VM 39 | 40 | 41 | #endif //JAVACONTAINER_H -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/javacontainer_builder.cc: -------------------------------------------------------------------------------- 1 | #include "base/javacontainer/javacontainer_builder.h" 2 | #include "base/javacontainer/script_options/extractor_impl.h" 3 | #include "base/swig_factory/swig_factory_impl.h" 4 | 5 | #ifdef ENABLE_JAVA_VM 6 | 7 | namespace SWIGVMContainers { 8 | 9 | JavaContainerBuilder::JavaContainerBuilder() 10 | : m_useCtpgParser(false) {} 11 | 12 | JavaContainerBuilder& JavaContainerBuilder::useCtpgParser() { 13 | m_useCtpgParser = true; 14 | return *this; 15 | } 16 | 17 | JavaVMach* JavaContainerBuilder::build() { 18 | std::unique_ptr extractor; 19 | if (m_useCtpgParser) { 20 | extractor = std::make_unique(std::make_unique()); 21 | } else { 22 | extractor = std::make_unique(std::make_unique()); 23 | } 24 | return new JavaVMach(false, std::move(extractor)); 25 | } 26 | 27 | 28 | } //namespace SWIGVMContainers 29 | 30 | 31 | #endif //ENABLE_JAVA_VM 32 | -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/javacontainer_builder.h: -------------------------------------------------------------------------------- 1 | #ifndef JAVACONTAINER_BUILDER_H 2 | #define JAVACONTAINER_BUILDER_H 3 | 4 | #include 5 | #include "base/javacontainer/javacontainer.h" 6 | 7 | #ifdef ENABLE_JAVA_VM 8 | 9 | namespace SWIGVMContainers { 10 | 11 | namespace JavaScriptOptions { 12 | 13 | struct ScriptOptionsParser; 14 | 15 | } 16 | 17 | class JavaContainerBuilder { 18 | public: 19 | JavaContainerBuilder(); 20 | 21 | JavaContainerBuilder& useCtpgParser(); 22 | 23 | JavaVMach* build(); 24 | 25 | private: 26 | bool m_useCtpgParser; 27 | }; 28 | 29 | } //namespace SWIGVMContainers 30 | 31 | 32 | #endif //ENABLE_JAVA_VM 33 | 34 | 35 | #endif //JAVACONTAINER_BUILDER_H -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/script_options/checksum.cc: -------------------------------------------------------------------------------- 1 | #include "base/javacontainer/script_options/checksum.h" 2 | #include 3 | #include 4 | 5 | namespace SWIGVMContainers { 6 | 7 | namespace JavaScriptOptions { 8 | 9 | inline std::vector scriptToMd5(const char *script) { 10 | MD5_CTX ctx; 11 | unsigned char md5[MD5_DIGEST_LENGTH]; 12 | MD5_Init(&ctx); 13 | MD5_Update(&ctx, script, strlen(script)); 14 | MD5_Final(md5, &ctx); 15 | return std::vector(md5, md5 + sizeof(md5)); 16 | } 17 | 18 | 19 | bool Checksum::addScript(const char *script) { 20 | return m_importedScriptChecksums.insert(scriptToMd5(script)).second; 21 | } 22 | 23 | 24 | } //namespace JavaScriptOptions 25 | 26 | } //namespace SWIGVMContainers 27 | -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/script_options/checksum.h: -------------------------------------------------------------------------------- 1 | #ifndef SCRIPTOPTIONLINEPARSERCHECKSUM_H 2 | #define SCRIPTOPTIONLINEPARSERCHECKSUM_H 1 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | 9 | namespace SWIGVMContainers { 10 | 11 | namespace JavaScriptOptions { 12 | 13 | class Checksum { 14 | 15 | public: 16 | Checksum() = default; 17 | 18 | bool addScript(const char *script); 19 | 20 | private: 21 | std::set > m_importedScriptChecksums; 22 | }; 23 | 24 | 25 | } //namespace JavaScriptOptions 26 | 27 | } //namespace SWIGVMContainers 28 | 29 | #endif //SCRIPTOPTIONLINEPARSERCHECKSUM_H -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/script_options/converter.cc: -------------------------------------------------------------------------------- 1 | #include "base/javacontainer/script_options/converter.h" 2 | 3 | #include 4 | 5 | namespace SWIGVMContainers { 6 | 7 | namespace JavaScriptOptions { 8 | 9 | Converter::Converter() 10 | : m_jvmOptions() 11 | , m_whitespace(" \t\f\v") {} 12 | 13 | void Converter::convertScriptClassName(const std::string & value) { 14 | 15 | if (value.empty()) { 16 | return; 17 | } 18 | m_jvmOptions.push_back("-Dexasol.scriptclass=" + value); 19 | } 20 | 21 | 22 | 23 | } //namespace JavaScriptOptions 24 | 25 | } //namespace SWIGVMContainers 26 | -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/script_options/converter_v2.cc: -------------------------------------------------------------------------------- 1 | #include "base/javacontainer/script_options/converter_v2.h" 2 | #include "base/javacontainer/script_options/string_ops.h" 3 | #include "base/javacontainer/script_options/parser_ctpg_jvm_options_parser.h" 4 | #include 5 | #include 6 | #include 7 | 8 | namespace SWIGVMContainers { 9 | 10 | namespace JavaScriptOptions { 11 | 12 | ConverterV2::ConverterV2() 13 | : Converter() 14 | , m_jarPaths() {} 15 | 16 | void ConverterV2::convertExternalJar(const std::string & value) { 17 | std::istringstream stream(value); 18 | std::string jar; 19 | 20 | while (std::getline(stream, jar, ':')) { 21 | m_jarPaths.push_back(jar); 22 | } 23 | } 24 | 25 | 26 | void ConverterV2::convertJvmOption(const std::string & value) { 27 | JvmOptionsCTPG::parseJvmOptions(value, m_jvmOptions); 28 | } 29 | 30 | void ConverterV2::iterateJarPaths(Converter::tJarIteratorCallback callback) const { 31 | std::for_each(m_jarPaths.begin(), m_jarPaths.end(), callback); 32 | } 33 | 34 | 35 | } //namespace JavaScriptOptions 36 | 37 | } //namespace SWIGVMContainers 38 | -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/script_options/converter_v2.h: -------------------------------------------------------------------------------- 1 | #ifndef SCRIPTOPTIONLINEPARSERCONVERTERV2_H 2 | #define SCRIPTOPTIONLINEPARSERCONVERTERV2_H 1 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | #include "base/javacontainer/script_options/converter.h" 9 | 10 | 11 | 12 | namespace SWIGVMContainers { 13 | 14 | namespace JavaScriptOptions { 15 | 16 | /** 17 | * This class is a specialization for the generic converter class. 18 | * It implements conversion of the jar option according to the requirements in the new 19 | * parser implementation. 20 | */ 21 | class ConverterV2 : public Converter { 22 | 23 | public: 24 | ConverterV2(); 25 | 26 | void convertExternalJar(const std::string & value) override; 27 | 28 | void convertJvmOption(const std::string & value) override; 29 | 30 | void iterateJarPaths(tJarIteratorCallback callback) const override; 31 | 32 | private: 33 | 34 | std::vector m_jarPaths; 35 | 36 | }; 37 | 38 | 39 | 40 | 41 | } //namespace JavaScriptOptions 42 | 43 | } //namespace SWIGVMContainers 44 | 45 | #endif //SCRIPTOPTIONLINEPARSERCONVERTER_H -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/script_options/keywords.cc: -------------------------------------------------------------------------------- 1 | #include "base/javacontainer/script_options/keywords.h" 2 | #include 3 | 4 | namespace SWIGVMContainers { 5 | 6 | namespace JavaScriptOptions { 7 | 8 | Keywords::Keywords(bool withScriptOptionsPrefix) 9 | : m_jarKeyword() 10 | , m_scriptClassKeyword() 11 | , m_importKeyword() 12 | , m_jvmKeyword() { 13 | const std::string_view jar{"%jar"}; 14 | const std::string_view scriptClass{"%scriptclass"}; 15 | const std::string_view import{"%import"}; 16 | const std::string_view jvm{"%jvmoption"}; 17 | if (withScriptOptionsPrefix) { 18 | m_jarKeyword = jar; 19 | m_scriptClassKeyword = scriptClass; 20 | m_importKeyword = import; 21 | m_jvmKeyword = jvm; 22 | } else { 23 | m_jarKeyword.assign(jar.substr(1)); 24 | m_scriptClassKeyword.assign(scriptClass.substr(1)); 25 | m_importKeyword.assign(import.substr(1)); 26 | m_jvmKeyword.assign(jvm.substr(1)); 27 | } 28 | } 29 | 30 | } //namespace JavaScriptOptions 31 | 32 | } //namespace SWIGVMContainers 33 | 34 | -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/script_options/keywords.h: -------------------------------------------------------------------------------- 1 | #ifndef SCRIPTOPTIONLINEKEYWORDS_H 2 | #define SCRIPTOPTIONLINEKEYWORDS_H 1 3 | 4 | #include 5 | 6 | namespace SWIGVMContainers { 7 | 8 | namespace JavaScriptOptions { 9 | 10 | class Keywords { 11 | public: 12 | Keywords(bool withScriptOptionsPrefix); 13 | const std::string & scriptClassKeyword() { return m_scriptClassKeyword; } 14 | const std::string & importKeyword() { return m_importKeyword; } 15 | const std::string & jvmKeyword() { return m_jvmKeyword; } 16 | const std::string & jarKeyword() { return m_jarKeyword; } 17 | private: 18 | std::string m_jarKeyword; 19 | std::string m_scriptClassKeyword; 20 | std::string m_importKeyword; 21 | std::string m_jvmKeyword; 22 | }; 23 | 24 | } //namespace JavaScriptOptions 25 | 26 | } //namespace SWIGVMContainers 27 | 28 | 29 | #endif // SCRIPTOPTIONLINEKEYWORDS_H -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/script_options/parser_ctpg_jvm_options_parser.h: -------------------------------------------------------------------------------- 1 | #ifndef SCRIPTOPTIONLINEPARSERCTPGJVMOPTIONSPARSER_H 2 | #define SCRIPTOPTIONLINEPARSERCTPGJVMOPTIONSPARSER_H 1 3 | 4 | #include 5 | #include 6 | 7 | 8 | namespace SWIGVMContainers { 9 | 10 | namespace JavaScriptOptions { 11 | 12 | namespace JvmOptionsCTPG { 13 | 14 | typedef std::vector tJvmOptions; 15 | 16 | void parseJvmOptions(const std::string & jvmOptions, tJvmOptions& result); 17 | 18 | 19 | 20 | } //namespace CTPG 21 | 22 | } //namespace JavaScriptOptions 23 | 24 | } //namespace SWIGVMContainers 25 | 26 | #endif //SCRIPTOPTIONLINEPARSERCTPGSCRIPTIMPORTER_H 27 | -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/script_options/string_ops.h: -------------------------------------------------------------------------------- 1 | #ifndef SCRIPTOPTIONLINEPARSERSTRINGOPS_H 2 | #define SCRIPTOPTIONLINEPARSERSTRINGOPS_H 1 3 | 4 | #include 5 | #include 6 | 7 | 8 | 9 | namespace SWIGVMContainers { 10 | 11 | namespace JavaScriptOptions { 12 | 13 | namespace StringOps { 14 | 15 | //Following code is based on https://stackoverflow.com/a/217605 16 | 17 | inline void ltrim(std::string &s) { 18 | s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) { 19 | return !std::isspace(ch); 20 | })); 21 | } 22 | 23 | inline void rtrim(std::string &s) { 24 | s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) { 25 | return !std::isspace(ch); 26 | }).base(), s.end()); 27 | } 28 | 29 | inline void trim(std::string &s) { 30 | ltrim(s); 31 | rtrim(s); 32 | } 33 | 34 | void replaceTrailingEscapeWhitespaces(std::string & s); 35 | 36 | } //namespace StringOps 37 | 38 | 39 | } //namespace JavaScriptOptions 40 | 41 | } //namespace SWIGVMContainers 42 | 43 | #endif //SCRIPTOPTIONLINEPARSERSTRINGOPS_H -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/script_options/test/BUILD: -------------------------------------------------------------------------------- 1 | 2 | cc_test( 3 | name = "java-script-options-tests", 4 | srcs = ["ctpg_script_importer_test.cc", "swig_factory_test.cc", 5 | "swig_factory_test.h", "string_ops_tests.cc", "converter_test.cc"], 6 | deps = [ 7 | "//base/javacontainer/script_options:java_script_option_lines", 8 | "@googletest//:gtest_main", 9 | ], 10 | ) 11 | -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/script_options/test/swig_factory_test.h: -------------------------------------------------------------------------------- 1 | #ifndef SWIG_FACTORY_TEST_H 2 | #define SWIG_FACTORY_TEST_H 1 3 | 4 | #include 5 | #include 6 | #include "base/swig_factory/swig_factory.h" 7 | #include 8 | 9 | struct SwigFactoryTestImpl : public SWIGVMContainers::SwigFactory { 10 | 11 | SwigFactoryTestImpl(std::function callback); 12 | 13 | virtual SWIGVMContainers::SWIGMetadataIf* makeSwigMetadata() override; 14 | 15 | private: 16 | std::function m_callback; 17 | }; 18 | 19 | 20 | #endif //namespace SWIG_FACTORY_TEST_H -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/test/cpp/exaudf_wrapper.cc: -------------------------------------------------------------------------------- 1 | #include "base/exaudflib/swig/swig_common.h" 2 | 3 | //Dummy implementation to calm down the linker 4 | void* load_dynamic(const char* name) { 5 | return nullptr; 6 | } 7 | 8 | //Globalinstance of the SWIGVM_params which we used to communicate with JavaVMImpl; 9 | namespace SWIGVMContainers { 10 | SWIGVM_params_t gSWIGVM_params_t; 11 | __thread SWIGVM_params_t * SWIGVM_params = &gSWIGVM_params_t; 12 | } -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/test/cpp/javavm_test.h: -------------------------------------------------------------------------------- 1 | #ifndef JAVA_VM_TEST 2 | #define JAVA_VM_TEST 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | struct JavaVMInternalStatus { 10 | std::string m_exaJavaPath; 11 | std::string m_localClasspath; 12 | std::string m_scriptCode; 13 | std::string m_exaJarPath; 14 | std::string m_classpath; 15 | bool m_needsCompilation; 16 | std::vector m_jvmOptions; 17 | }; 18 | 19 | class SwigFactoryTestImpl; 20 | 21 | class JavaVMTest { 22 | public: 23 | JavaVMTest(std::string scriptCode); 24 | 25 | JavaVMTest(std::string scriptCode, std::unique_ptr swigFactory); 26 | 27 | const JavaVMInternalStatus& getJavaVMInternalStatus() {return javaVMInternalStatus;} 28 | 29 | private: 30 | void run(std::string scriptCode, std::unique_ptr swigFactory); 31 | private: 32 | JavaVMInternalStatus javaVMInternalStatus; 33 | }; 34 | 35 | #endif -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/test/cpp/swig_factory_test.h: -------------------------------------------------------------------------------- 1 | #ifndef SWIG_FACTORY_TEST_H 2 | #define SWIG_FACTORY_TEST_H 1 3 | 4 | #include 5 | #include 6 | #include "base/swig_factory/swig_factory.h" 7 | 8 | struct SwigFactoryTestImpl : public SWIGVMContainers::SwigFactory { 9 | 10 | SwigFactoryTestImpl(); 11 | 12 | void addModule(const std::string key, const std::string script); 13 | 14 | void setException(const std::string msg); 15 | 16 | virtual SWIGVMContainers::SWIGMetadataIf* makeSwigMetadata() override; 17 | 18 | private: 19 | std::map m_moduleContent; 20 | std::string m_exceptionMsg; 21 | }; 22 | 23 | 24 | #endif //namespace SWIG_FACTORY_TEST_H -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/test/other_test.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exasol/script-languages/00dbce10abed7137ba2af326573a6b3c19555732/exaudfclient/base/javacontainer/test/other_test.jar -------------------------------------------------------------------------------- /exaudfclient/base/javacontainer/test/test.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exasol/script-languages/00dbce10abed7137ba2af326573a6b3c19555732/exaudfclient/base/javacontainer/test/test.jar -------------------------------------------------------------------------------- /exaudfclient/base/load_dynamic.cc: -------------------------------------------------------------------------------- 1 | #ifndef UDF_PLUGIN_CLIENT 2 | #include //This is required for dynamic linking in new linker namespace, not required for plugins 3 | #endif 4 | 5 | #include 6 | #include "base/exaudflib/vm/swig_vm.h" 7 | 8 | void* handle; 9 | 10 | #ifndef UDF_PLUGIN_CLIENT 11 | void* load_dynamic(const char* name) { 12 | void* res = dlsym(handle, name); 13 | char* error; 14 | if ((error = dlerror()) != nullptr) 15 | { 16 | std::stringstream sb; 17 | sb << "Error when trying to load function '" << name << "': " << error; 18 | throw SWIGVMContainers::SWIGVM::exception(sb.str().c_str()); 19 | } 20 | return res; 21 | } 22 | #endif 23 | 24 | -------------------------------------------------------------------------------- /exaudfclient/base/python/BUILD: -------------------------------------------------------------------------------- 1 | package(default_visibility = ["//visibility:public"]) 2 | exports_files([ 3 | "exascript_python_preset_core.py", 4 | "exascript_python_wrap.py", 5 | "extend_exascript_python_preset_py.sh", 6 | "pythoncontainer.cc" 7 | ]) 8 | 9 | cc_library( 10 | name = "pythoncontainer_header", 11 | hdrs = ["pythoncontainer.h"] 12 | ) -------------------------------------------------------------------------------- /exaudfclient/base/python/extend_exascript_python_preset_py.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | INPUT=$1 5 | OUTPUT=$2 6 | PYTHON_PREFIX=$3 7 | PYTHON_VERSION=$4 8 | PYTHON_SYSPATH=$5 9 | echo "import sys, os" > extension 10 | CURRENT_SYSPATH=$("$PYTHON_PREFIX/bin/$PYTHON_VERSION" -c 'import sys; import site; print(sys.path)') 11 | echo "PYTHON_CURRENT_SYSPATH=$CURRENT_SYSPATH" 12 | 13 | echo "sys.path.extend($CURRENT_SYSPATH)" >> extension 14 | if [ ! "X$PYTHON_SYSPATH" = "X" ]; then 15 | echo "PYTHON_SYSPATH=$PYTHON_SYSPATH" 16 | echo "sys.path.extend($PYTHON_SYSPATH)" >> extension 17 | fi 18 | cat extension "$INPUT" >> "$OUTPUT" 19 | -------------------------------------------------------------------------------- /exaudfclient/base/python/pythoncontainer.h: -------------------------------------------------------------------------------- 1 | #ifndef PYTHONVM_H 2 | #define PYTHONVM_H 3 | 4 | #include "base/exaudflib/vm/swig_vm.h" 5 | 6 | #ifdef ENABLE_PYTHON_VM 7 | 8 | namespace SWIGVMContainers { 9 | 10 | class PythonVMImpl; 11 | 12 | class PythonVM: public SWIGVM { 13 | public: 14 | PythonVM(bool checkOnly); 15 | virtual ~PythonVM() {}; 16 | virtual void shutdown(); 17 | virtual bool run(); 18 | virtual const char* singleCall(single_call_function_id_e fn, const ExecutionGraph::ScriptDTO& args); 19 | private: 20 | PythonVMImpl *m_impl; 21 | }; 22 | 23 | } //namespace SWIGVMContainers 24 | 25 | #endif //ENABLE_PYTHON_VM 26 | 27 | #endif //PYTHONVM_H -------------------------------------------------------------------------------- /exaudfclient/base/script_options_parser/BUILD: -------------------------------------------------------------------------------- 1 | package(default_visibility = ["//visibility:public"]) 2 | 3 | cc_library( 4 | name = "exception", 5 | hdrs = ["exception.h"] 6 | ) 7 | -------------------------------------------------------------------------------- /exaudfclient/base/script_options_parser/ctpg/BUILD: -------------------------------------------------------------------------------- 1 | package(default_visibility = ["//visibility:public"]) 2 | 3 | cc_library( 4 | name = "script_option_lines_parser_ctpg", 5 | hdrs = ["script_option_lines_ctpg.h"], 6 | srcs = ["script_option_lines_ctpg.cc","ctpg.hpp"], 7 | deps = ["//base/script_options_parser:exception"], 8 | copts= ["-fno-lto"], 9 | ) 10 | -------------------------------------------------------------------------------- /exaudfclient/base/script_options_parser/ctpg/test/BUILD: -------------------------------------------------------------------------------- 1 | cc_test( 2 | name = "script-options-ctpg-parser-test", 3 | srcs = ["script_option_lines_test.cpp"], 4 | deps = [ 5 | "//base/script_options_parser/ctpg:script_option_lines_parser_ctpg", 6 | "@googletest//:gtest_main", 7 | ], 8 | ) -------------------------------------------------------------------------------- /exaudfclient/base/script_options_parser/exception.h: -------------------------------------------------------------------------------- 1 | #ifndef SCRIPTOPTIONLINESEXCEPTION_H 2 | #define SCRIPTOPTIONLINESEXCEPTION_H 3 | 4 | #include 5 | 6 | 7 | namespace ExecutionGraph 8 | { 9 | 10 | class OptionParserException : public std::runtime_error { 11 | using std::runtime_error::runtime_error; 12 | }; 13 | 14 | 15 | } // namespace ExecutionGraph 16 | 17 | #endif // SCRIPTOPTIONLINESEXCEPTION_H -------------------------------------------------------------------------------- /exaudfclient/base/script_options_parser/legacy/BUILD: -------------------------------------------------------------------------------- 1 | package(default_visibility = ["//visibility:public"]) 2 | 3 | cc_library( 4 | name = "script_option_lines_parser_legacy", 5 | hdrs = ["script_option_lines.h"], 6 | srcs = ["script_option_lines.cc"], 7 | deps = ["//base/script_options_parser:exception"], 8 | copts= ["-fno-lto"], 9 | ) 10 | -------------------------------------------------------------------------------- /exaudfclient/base/script_options_parser/legacy/script_option_lines.h: -------------------------------------------------------------------------------- 1 | #ifndef SCRIPTOPTIONLINES_H 2 | #define SCRIPTOPTIONLINES_H 3 | 4 | #include 5 | 6 | namespace ExecutionGraph 7 | { 8 | 9 | 10 | /*! 11 | * \brief extractOptionLine Extracts syntactically valid option lines of form %