Compare commits
221
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f3f4397ebb | ||
|
|
6c6d91506f | ||
|
|
6cde245fa4 | ||
|
|
f1ecf5c136 | ||
|
|
4ec034c3ac | ||
|
|
d93d5d4f76 | ||
|
|
34b69404ef | ||
|
|
88ebbceec5 | ||
|
|
abde05a5b6 | ||
|
|
96660bcd44 | ||
|
|
a69b022e50 | ||
|
|
d658e31849 | ||
|
|
58f8187cab | ||
|
|
2198be05f8 | ||
|
|
55c64c744a | ||
|
|
30166c4acc | ||
|
|
fbc6622eb4 | ||
|
|
299654e9d6 | ||
|
|
8ef2d42d3d | ||
|
|
37fc4974a1 | ||
|
|
e7bc230c21 | ||
|
|
55ba3be74d | ||
|
|
b06c11d289 | ||
|
|
18794bf3c8 | ||
|
|
7c70828452 | ||
|
|
bb4805763b | ||
|
|
753006be10 | ||
|
|
50e567edda | ||
|
|
49da74d60c | ||
|
|
c66ac5b742 | ||
|
|
ecff63b090 | ||
|
|
8356d3e394 | ||
|
|
48ae662fca | ||
|
|
998d0e7133 | ||
|
|
45489850b7 | ||
|
|
5bb0c3654f | ||
|
|
fa02d00bcc | ||
|
|
079015674d | ||
|
|
4409a71fb0 | ||
|
|
06a2c814d0 | ||
|
|
ba90abf5ae | ||
|
|
e41979740a | ||
|
|
6106bc21ca | ||
|
|
6b028a2a42 | ||
|
|
7da3da74a9 | ||
|
|
9d56826797 | ||
|
|
92159c01ba | ||
|
|
8d260a979c | ||
|
|
89305eb7cf | ||
|
|
bb1e113893 | ||
|
|
28f27deb2e | ||
|
|
9a1cc9664c | ||
|
|
2e7189463a | ||
|
|
8cde5bcd41 | ||
|
|
43d0022878 | ||
|
|
65133e8a5e | ||
|
|
781bc52ea1 | ||
|
|
8de20e51d7 | ||
|
|
8e57209e52 | ||
|
|
c5eba43ace | ||
|
|
86810bb445 | ||
|
|
ae2c116840 | ||
|
|
65aeac3c73 | ||
|
|
8001c47abc | ||
|
|
e775bc19b8 | ||
|
|
a89c4a5e1e | ||
|
|
d07eff613f | ||
|
|
fc86a505ee | ||
|
|
06eaec5165 | ||
|
|
8e181a4060 | ||
|
|
7c6cbbe83c | ||
|
|
8e7552b144 | ||
|
|
52c1d17ae6 | ||
|
|
62a60267f4 | ||
|
|
f80c876df8 | ||
|
|
f59751b6e1 | ||
|
|
10e8298560 | ||
|
|
6261760e48 | ||
|
|
57d17bea3b | ||
|
|
0b4675c26d | ||
|
|
5b2a40ad7f | ||
|
|
6c453ea8aa | ||
|
|
5823bf1690 | ||
|
|
dbf941ff0e | ||
|
|
be7148dcec | ||
|
|
4baa54631e | ||
|
|
bd0d9ef88d | ||
|
|
efe6b73935 | ||
|
|
5064bbb926 | ||
|
|
25b92951d8 | ||
|
|
8389208ff0 | ||
|
|
0dfd3926ad | ||
|
|
638d46469f | ||
|
|
e6478327d6 | ||
|
|
ace5a1459e | ||
|
|
6eccd02a28 | ||
|
|
494e74e843 | ||
|
|
a1eac96356 | ||
|
|
e13b0445da | ||
|
|
368f006c04 | ||
|
|
08b9a828c5 | ||
|
|
c878fb6e1f | ||
|
|
85807846fb | ||
|
|
6c06a3f122 | ||
|
|
c0f1216fb0 | ||
|
|
e089f9228e | ||
|
|
49cafe4936 | ||
|
|
d56a35318c | ||
|
|
00e71ea9bd | ||
|
|
36f660c83d | ||
|
|
4ae95cc2c0 | ||
|
|
20e343799d | ||
|
|
893ae3bc2e | ||
|
|
7861532f76 | ||
|
|
e01f40263c | ||
|
|
85a484cb98 | ||
|
|
a8989d0469 | ||
|
|
d39bd6e88a | ||
|
|
7ce9a5a06e | ||
|
|
2425e92511 | ||
|
|
f5cd6235e7 | ||
|
|
410fabc59f | ||
|
|
150f0628bc | ||
|
|
7167f6d826 | ||
|
|
579aeeed33 | ||
|
|
08f6560885 | ||
|
|
32ee6a31f3 | ||
|
|
ee0a725131 | ||
|
|
c268dc6cba | ||
|
|
84714c0a11 | ||
|
|
54f57206e5 | ||
|
|
25f1639df7 | ||
|
|
c7c1773cd6 | ||
|
|
a2c7cd9332 | ||
|
|
b6b42db0b7 | ||
|
|
d5b2c500c8 | ||
|
|
89e060d5c2 | ||
|
|
1c0f799630 | ||
|
|
620090ad39 | ||
|
|
f6db970c9b | ||
|
|
7c7c0e8008 | ||
|
|
ebee6bd561 | ||
|
|
9a48ed02fd | ||
|
|
00d0d6ade4 | ||
|
|
b6a2b082bf | ||
|
|
599e0a20a5 | ||
|
|
6a983f99db | ||
|
|
b9b49e628a | ||
|
|
6a5300dee1 | ||
|
|
f2ad49cf51 | ||
|
|
e2a8f8bd00 | ||
|
|
ba410f194c | ||
|
|
5492f7a157 | ||
|
|
5940f55be9 | ||
|
|
84534cf469 | ||
|
|
ca95964ef8 | ||
|
|
2fa46d9f46 | ||
|
|
78730ef4c9 | ||
|
|
44110e43aa | ||
|
|
51ba34b7c0 | ||
|
|
ea2d9441cd | ||
|
|
18ee4724fe | ||
|
|
96e0823811 | ||
|
|
3bda3d1b08 | ||
|
|
87f656a489 | ||
|
|
91ccbc138e | ||
|
|
5cab7f11b8 | ||
|
|
6f34a014ed | ||
|
|
2a6fb6340c | ||
|
|
913578a2d7 | ||
|
|
572d058817 | ||
|
|
79b984f575 | ||
|
|
a8808a043e | ||
|
|
1cc8e901e7 | ||
|
|
c29eaa1a53 | ||
|
|
252fea8466 | ||
|
|
4ac1382751 | ||
|
|
8ceaffe488 | ||
|
|
cef5a636c6 | ||
|
|
334b9fd6b8 | ||
|
|
58b4266a27 | ||
|
|
0ba85cdf3d | ||
|
|
dcd534e3e5 | ||
|
|
a214edd44f | ||
|
|
23c687d3d9 | ||
|
|
7445a1777f | ||
|
|
8a81d44818 | ||
|
|
22fbc0001f | ||
|
|
3ec863f02c | ||
|
|
c43151a28c | ||
|
|
7d2e7e4665 | ||
|
|
0ffc1a1a47 | ||
|
|
6c4364989c | ||
|
|
3095253aa9 | ||
|
|
8227304aab | ||
|
|
4e022a8a12 | ||
|
|
450773f588 | ||
|
|
f09d6badaf | ||
|
|
6b054e0718 | ||
|
|
5e2789d16e | ||
|
|
9ebdb2e460 | ||
|
|
d7bf82722b | ||
|
|
e1526e25a7 | ||
|
|
089ba9b369 | ||
|
|
567976043f | ||
|
|
2fd3382939 | ||
|
|
a96f1c8f17 | ||
|
|
6f623f9a37 | ||
|
|
827189cdb4 | ||
|
|
123f12ab88 | ||
|
|
f51ba8fb56 | ||
|
|
2506fb4f2b | ||
|
|
f92964114e | ||
|
|
baa0f1430b | ||
|
|
7104bd787a | ||
|
|
5db92d1f7d | ||
|
|
eb0fcf0b84 | ||
|
|
a52b187313 | ||
|
|
669b059eb2 | ||
|
|
36ab8492d3 | ||
|
|
54f37b2401 |
No files matched your search
@@ -9,7 +9,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"fable": {
|
"fable": {
|
||||||
"version": "4.24.0",
|
"version": "4.0.6",
|
||||||
"commands": [
|
"commands": [
|
||||||
"fable"
|
"fable"
|
||||||
]
|
]
|
||||||
@@ -25,12 +25,6 @@
|
|||||||
"commands": [
|
"commands": [
|
||||||
"fake"
|
"fake"
|
||||||
]
|
]
|
||||||
},
|
|
||||||
"dotnet-t4": {
|
|
||||||
"version": "3.0.0",
|
|
||||||
"commands": [
|
|
||||||
"t4"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+14
-35
@@ -55,19 +55,17 @@ RUN \
|
|||||||
clangd-$clang_major
|
clangd-$clang_major
|
||||||
|
|
||||||
# CMake
|
# CMake
|
||||||
RUN set -eux \
|
RUN \
|
||||||
&& apt-get update \
|
curl -fsSL https://apt.kitware.com/keys/kitware-archive-latest.asc 2> /dev/null \
|
||||||
&& apt-get install -y --no-install-recommends ca-certificates curl gpg \
|
| gpg --dearmor - \
|
||||||
&& curl -fsSL https://apt.kitware.com/keys/kitware-archive-latest.asc \
|
| tee /usr/share/keyrings/kitware-archive-keyring.gpg > /dev/null \
|
||||||
| gpg --dearmor -o /usr/share/keyrings/kitware-archive-keyring.gpg \
|
&& echo "deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" \
|
||||||
&& echo "deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" \
|
| tee /etc/apt/sources.list.d/kitware.list > /dev/null \
|
||||||
> /etc/apt/sources.list.d/kitware.list \
|
&& apt-get update \
|
||||||
&& apt-get update \
|
&& apt-get install -y cmake
|
||||||
&& apt-get install -y --no-install-recommends cmake \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Dotnet
|
# Dotnet
|
||||||
RUN apt-get update && apt-get install -y dotnet8
|
RUN apt-get update && apt-get install -y dotnet7
|
||||||
|
|
||||||
# Node
|
# Node
|
||||||
ARG node_major=18
|
ARG node_major=18
|
||||||
@@ -82,34 +80,13 @@ RUN mkdir -p /etc/apt/keyrings \
|
|||||||
# Emumba (deps)
|
# Emumba (deps)
|
||||||
RUN apt-get update && apt-get -y install rapidjson-dev
|
RUN apt-get update && apt-get -y install rapidjson-dev
|
||||||
# Emumba
|
# Emumba
|
||||||
ARG EMUMBA_DERIBIT_CONNECTOR_DEB_URL="https://api.bitbucket.org/2.0/repositories/bluetradesys/spark/downloads/emumba-deribit-connector-3.3.1-Linux.LICENSE_DISABLED.deb"
|
COPY emumba /emumba
|
||||||
RUN --mount=type=secret,id=bitbucket_access_token \
|
RUN dpkg -i /emumba/emumba-deribit-connector-3.3.1-Linux.LICENSE_DISABLED.deb \
|
||||||
set -eux \
|
&& rm -r /emumba
|
||||||
&& apt-get update \
|
|
||||||
&& TOKEN="$(cat /run/secrets/bitbucket_access_token)" \
|
|
||||||
&& curl -fL -H "Authorization: Bearer ${TOKEN}" $EMUMBA_DERIBIT_CONNECTOR_DEB_URL -o /tmp/emumba-deribit-connector.deb \
|
|
||||||
&& apt-get install -y /tmp/emumba-deribit-connector.deb \
|
|
||||||
&& rm -f /tmp/emumba-deribit-connector.deb
|
|
||||||
|
|
||||||
# Pcap
|
# Pcap
|
||||||
RUN apt-get update && apt-get install -y libpcap0.8-dev
|
RUN apt-get update && apt-get install -y libpcap0.8-dev
|
||||||
|
|
||||||
# Databento (deps)
|
|
||||||
RUN apt-get update && apt-get -y install libzstd-dev
|
|
||||||
|
|
||||||
# Rakurai
|
|
||||||
ARG RAKURAI_DEB_URL="https://api.bitbucket.org/2.0/repositories/bluetradesys/spark/downloads/rakurai-dex-connector_0.0.5_amd64.deb"
|
|
||||||
RUN --mount=type=secret,id=bitbucket_access_token \
|
|
||||||
set -eux \
|
|
||||||
&& apt-get update \
|
|
||||||
&& TOKEN="$(cat /run/secrets/bitbucket_access_token)" \
|
|
||||||
&& curl -fL -H "Authorization: Bearer ${TOKEN}" $RAKURAI_DEB_URL -o /tmp/rakurai.deb \
|
|
||||||
# Need --force-overwrite because rakuirai and emumba-deribit-connector both include the same
|
|
||||||
# spdlog headers.
|
|
||||||
&& apt-get install -y -o Dpkg::Options::="--force-overwrite" /tmp/rakurai.deb \
|
|
||||||
&& rm -f /tmp/rakuirai.deb
|
|
||||||
|
|
||||||
# Docker in Docker
|
|
||||||
RUN apt-get update && apt-get install -y \
|
RUN apt-get update && apt-get install -y \
|
||||||
docker.io \
|
docker.io \
|
||||||
docker-compose \
|
docker-compose \
|
||||||
@@ -148,3 +125,5 @@ RUN \
|
|||||||
-G sudo \
|
-G sudo \
|
||||||
--password "$(openssl passwd -1 "$docker_pass")" \
|
--password "$(openssl passwd -1 "$docker_pass")" \
|
||||||
"$docker_user"
|
"$docker_user"
|
||||||
|
|
||||||
|
RUN usermod -aG docker "$docker_user"
|
||||||
@@ -1,16 +1,15 @@
|
|||||||
{
|
{
|
||||||
"build": {
|
"dockerFile": "Dockerfile",
|
||||||
"dockerfile": "../docker/images/bluetradingsystems/linux_dotnet8_dev/Dockerfile",
|
// Creates local dir to mount to HOME in docker
|
||||||
"options": [
|
"initializeCommand": "mkdir -p ${localEnv:HOME}/.bts/devcontainer-mounts/${devcontainerId}",
|
||||||
"--secret",
|
|
||||||
"id=bitbucket_access_token,src=${localWorkspaceFolder}/.secrets/bitbucket_access_token.txt"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"hostRequirements": {
|
"hostRequirements": {
|
||||||
"memory": "8gb",
|
"memory": "4gb",
|
||||||
"storage": "10gb"
|
"storage": "6gb"
|
||||||
},
|
},
|
||||||
|
"postCreateCommand": "/home/bts/spark/docker/sparkd/dev/devcontainer_post_create.sh",
|
||||||
"containerUser": "bts",
|
"containerUser": "bts",
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/bts/spark,type=bind",
|
||||||
|
"workspaceFolder": "/home/bts/spark",
|
||||||
"updateRemoteUserUID": true,
|
"updateRemoteUserUID": true,
|
||||||
"shutdownAction": "none",
|
"shutdownAction": "none",
|
||||||
// Note: If running multiple containers on the same host, each must use a
|
// Note: If running multiple containers on the same host, each must use a
|
||||||
@@ -18,20 +17,26 @@
|
|||||||
// example, if 8000-8003 is taken, go with 9000-9003, then 10000-10003, etc.
|
// example, if 8000-8003 is taken, go with 9000-9003, then 10000-10003, etc.
|
||||||
"runArgs": [
|
"runArgs": [
|
||||||
"--shm-size",
|
"--shm-size",
|
||||||
"8gb"
|
"2gb",
|
||||||
|
"--network",
|
||||||
|
"host"
|
||||||
],
|
],
|
||||||
"mounts": [
|
"mounts": [
|
||||||
|
"source=${localEnv:HOME}/.bts/devcontainer-mounts/${devcontainerId},target=/home/bts,type=bind",
|
||||||
"source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind"
|
"source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind"
|
||||||
],
|
],
|
||||||
"customizations": {
|
"customizations": {
|
||||||
"vscode": {
|
"vscode": {
|
||||||
|
"settings": {
|
||||||
|
"clangd.arguments": [
|
||||||
|
"--compile-commands-dir=${workspaceFolder}/build/clang/debug"
|
||||||
|
]
|
||||||
|
},
|
||||||
"extensions": [
|
"extensions": [
|
||||||
"eamodio.gitlens",
|
"eamodio.gitlens",
|
||||||
"llvm-vs-code-extensions.vscode-clangd",
|
"llvm-vs-code-extensions.vscode-clangd",
|
||||||
"ms-python.python",
|
|
||||||
"ms-vscode.cmake-tools",
|
"ms-vscode.cmake-tools",
|
||||||
"ms-vscode.cpptools",
|
"ms-vscode.cpptools"
|
||||||
"xaver.clang-format"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
this_dir="$(realpath "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")")"
|
||||||
|
sudo dpkg -i "$this_dir/emumba-deribit-connector-3.3.1-Linux.LICENSE_DISABLED.deb"
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
# This file defines the global default configuration for docker deployments.
|
|
||||||
# It is tracked in source control. For temporary modifications, please create
|
|
||||||
# a separate file called ".env.local" (it's in .gitignore, so won't be tracked).
|
|
||||||
# If a variable is defined in both files, the value in .env.local will be used.
|
|
||||||
#
|
|
||||||
# About the deployment procedure:
|
|
||||||
# We use Docker Compose to build images and launch containers for various services
|
|
||||||
# that make up our software suite:
|
|
||||||
# - sparkd
|
|
||||||
# - TODO: pubsub
|
|
||||||
# - TODO: md-publisher
|
|
||||||
# - TODO: webapp (DSQA on the web)
|
|
||||||
# - TODO: api-server (websocket based)
|
|
||||||
# From inside a devcontainer, you can launch all services in separate containers
|
|
||||||
# on your machine by running:
|
|
||||||
#
|
|
||||||
# tools/deploy.sh
|
|
||||||
#
|
|
||||||
# This script builds release versions for each service, packaged (generally) in
|
|
||||||
# self-contained directories. Next, it runs a few "docker compose" commands to
|
|
||||||
# build docker images loaded with the self-contained binaries from the previous
|
|
||||||
# step, and start containers with those images to run each service. To view the
|
|
||||||
# commands that deploy.sh runs internally (without actually running them), run:
|
|
||||||
#
|
|
||||||
# tools/deploy.sh --dry-run
|
|
||||||
#
|
|
||||||
# For additional information/help, run:
|
|
||||||
#
|
|
||||||
# tools/deploy.sh --help
|
|
||||||
#
|
|
||||||
|
|
||||||
### Host/Runtime ###
|
|
||||||
TZ=Etc/UTC
|
|
||||||
|
|
||||||
### Sparkd ###
|
|
||||||
# The internal image for sparkd to use. For more info, view:
|
|
||||||
# src/server/sparkd/Dockerfile
|
|
||||||
SPARKD__IMAGE=sparkd
|
|
||||||
# The config dir for this service to use
|
|
||||||
SPARKD__CONFIG_DIR=src/app_sparkd/configurations/dev
|
|
||||||
# Mount a specific volume or dir to "~/sparkdata/data" inside the docker.
|
|
||||||
# Defaults to a volume named "sparkd_<config_port>" (e.g., sparkd_8000).
|
|
||||||
# SPARKD__DATA_DIR=/home/bts/sparkdata/data
|
|
||||||
# Mount volume or dir to "/md_recording" inside the docker. Defaults to volume
|
|
||||||
# "sparkd_md_recording_<config_port>" (e.g., sparkd_md_recording_8000).
|
|
||||||
# SPARKD__MD_RECORDING_DIR=/home/bts/md_recording
|
|
||||||
SPARKD__SOURCE_DIR=install/sparkd-release-gcc
|
|
||||||
SPARKD__RUNTIME_CONF_DIR=/home/ubuntu/8000/sparkdata/conf/
|
|
||||||
SPARKD__CONFIG_PORT=8000
|
|
||||||
SPARKD__QUICKBUS_PORT=8001
|
|
||||||
SPARKD__SIM_FIX_PORT=8002
|
|
||||||
SPARKD__SHM_SIZE=4gb
|
|
||||||
SPARKD__PYTHON_REQUIREMENTS=requirements.txt
|
|
||||||
SPARKD__SPARKD_ENTRYPOINT=src/app_sparkd/sparkd-entrypoint.sh
|
|
||||||
SPARKD__MAIN_ENTRYPOINT=./sparkd-entrypoint.sh
|
|
||||||
|
|
||||||
### PubSubServer ###
|
|
||||||
PUBSUB__CONFIG_DIR=src/DataStreamSuite/PubSubServer/Configurations/Development
|
|
||||||
PUBSUB__SOURCE_DIR=build/Release/bin/net8.0/linux-x64/publish
|
|
||||||
|
|
||||||
### MdPublisher ###
|
|
||||||
MD_PUBLISHER__CONFIG_DIR=src/DataStreamSuite/DataStreamPublisher/Configurations/ReplayMarketData
|
|
||||||
MD_PUBLISHER__SOURCE_DIR=build/Release/bin/net8.0/linux-x64/publish
|
|
||||||
# TODO: add config for other services (pubsub, md-publisher, webapp, api-server, etc.)
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
*.cmd text=auto eol=crlf
|
*.cmd text=auto eol=crlf
|
||||||
*.cs text=auto eol=crlf
|
*.cs text=auto eol=crlf
|
||||||
*.sh text=auto eol=lf
|
*.sh text=auto eol=lf
|
||||||
|
*.py text=auto eol=lf
|
||||||
@@ -11,7 +11,6 @@ cmake-build-debug/
|
|||||||
**.vscode/*
|
**.vscode/*
|
||||||
!.vscode/launch.json
|
!.vscode/launch.json
|
||||||
!.vscode/tasks.json
|
!.vscode/tasks.json
|
||||||
!.vscode/*.env
|
|
||||||
.vs
|
.vs
|
||||||
obj/
|
obj/
|
||||||
*.csproj.user
|
*.csproj.user
|
||||||
@@ -55,12 +54,8 @@ trace_data/
|
|||||||
.cache/
|
.cache/
|
||||||
/src/Spark.Admin.WebApp/tsconfig.*.g.json
|
/src/Spark.Admin.WebApp/tsconfig.*.g.json
|
||||||
/src/Spark.Admin.WebApp/src/bin/
|
/src/Spark.Admin.WebApp/src/bin/
|
||||||
/src/**/*appsettings.Local.json
|
|
||||||
/src/**/*/Configurations/Local/
|
|
||||||
**/CMakeDeps.cmake
|
**/CMakeDeps.cmake
|
||||||
**/CMakeDeps_win.cmake
|
**/CMakeDeps_win.cmake
|
||||||
.devcontainer/
|
.devcontainer/
|
||||||
*.Generated.cs
|
*.Generated.cs
|
||||||
*.lst
|
*.lst
|
||||||
.env.local
|
|
||||||
.secrets
|
|
||||||
Vendored
+81
-268
@@ -1,14 +1,6 @@
|
|||||||
{
|
{
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
{
|
|
||||||
"name": "Python Debugger: Current File with Arguments",
|
|
||||||
"type": "debugpy",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${file}",
|
|
||||||
"console": "integratedTerminal",
|
|
||||||
"args": "${command:pickArgs}"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": ".NET Core Attach",
|
"name": ".NET Core Attach",
|
||||||
"type": "coreclr",
|
"type": "coreclr",
|
||||||
@@ -19,19 +11,15 @@
|
|||||||
"type": "coreclr",
|
"type": "coreclr",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"program": "",
|
"program": "",
|
||||||
"preLaunchTask": "Build Api Server (Debug)",
|
|
||||||
"windows": {
|
"windows": {
|
||||||
|
"preLaunchTask": "Build Api Server (Debug)",
|
||||||
"program": "spark_api_server.exe",
|
"program": "spark_api_server.exe",
|
||||||
},
|
"args": [
|
||||||
"linux": {
|
"run",
|
||||||
"program": "spark_api_server",
|
"--sparkd",
|
||||||
},
|
"http://127.0.0.1:8000/config"
|
||||||
"args": [
|
],
|
||||||
"run",
|
"cwd": "build/Debug/bin/net7.0",
|
||||||
],
|
|
||||||
"cwd": "build/Debug/bin/net8.0",
|
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:apiServerEnvironment}",
|
|
||||||
},
|
},
|
||||||
"stopAtEntry": false,
|
"stopAtEntry": false,
|
||||||
"console": "integratedTerminal"
|
"console": "integratedTerminal"
|
||||||
@@ -43,20 +31,43 @@
|
|||||||
"program": "",
|
"program": "",
|
||||||
"windows": {
|
"windows": {
|
||||||
"program": "spark_api_server.exe",
|
"program": "spark_api_server.exe",
|
||||||
},
|
"args": [
|
||||||
"linux": {
|
"run",
|
||||||
"program": "spark_api_server",
|
"--sparkd",
|
||||||
},
|
"http://127.0.0.1:8000/config"
|
||||||
"args": [
|
],
|
||||||
"run",
|
"cwd": "build/Debug/bin/net7.0",
|
||||||
],
|
|
||||||
"cwd": "build/Debug/bin/net8.0",
|
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:apiServerEnvironment}",
|
|
||||||
},
|
},
|
||||||
"stopAtEntry": false,
|
"stopAtEntry": false,
|
||||||
"console": "integratedTerminal"
|
"console": "integratedTerminal"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Bts.DataStreamWebApp.Server",
|
||||||
|
"type": "coreclr",
|
||||||
|
"request": "launch",
|
||||||
|
"preLaunchTask": "Build DataStream WebApp (Debug)",
|
||||||
|
"program": "${workspaceFolder}/build/Debug/bin/net7.0/Bts.DataStreamWebApp.Server.dll",
|
||||||
|
"cwd": "${workspaceFolder}/build/Debug/bin/net7.0",
|
||||||
|
"env": {
|
||||||
|
"ASPNETCORE_HTTP_PORT": "8080",
|
||||||
|
"ASPNETCORE_HTTPS_PORT": "8443",
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "${input:dataStreamWebAppServerEnvironment}",
|
||||||
|
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Bts.DataStreamWebApp.Server (Skip Build)",
|
||||||
|
"type": "coreclr",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/build/Debug/bin/net7.0/Bts.DataStreamWebApp.Server.dll",
|
||||||
|
"cwd": "${workspaceFolder}/build/Debug/bin/net7.0",
|
||||||
|
"env": {
|
||||||
|
"ASPNETCORE_HTTP_PORT": "8080",
|
||||||
|
"ASPNETCORE_HTTPS_PORT": "8443",
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "${input:dataStreamWebAppServerEnvironment}",
|
||||||
|
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy",
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "DataStreamPublisher",
|
"name": "DataStreamPublisher",
|
||||||
"type": "coreclr",
|
"type": "coreclr",
|
||||||
@@ -69,10 +80,10 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"program": "DataStreamPublisher.exe",
|
"program": "DataStreamPublisher.exe",
|
||||||
},
|
},
|
||||||
"cwd": "build/Debug/bin/net8.0",
|
|
||||||
"env": {
|
"env": {
|
||||||
"DOTNET_ENVIRONMENT": "${input:dataStreamPublisherEnvironment}",
|
"DOTNET_ENVIRONMENT": "${input:dataStreamPublisherEnvironment}",
|
||||||
},
|
},
|
||||||
|
"cwd": "${workspaceFolder}/build/Debug/bin/net7.0",
|
||||||
"stopAtEntry": false,
|
"stopAtEntry": false,
|
||||||
"console": "integratedTerminal"
|
"console": "integratedTerminal"
|
||||||
},
|
},
|
||||||
@@ -87,85 +98,28 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"program": "DataStreamPublisher.exe",
|
"program": "DataStreamPublisher.exe",
|
||||||
},
|
},
|
||||||
"cwd": "${workspaceFolder}/build/Debug/bin/net8.0",
|
|
||||||
"env": {
|
"env": {
|
||||||
"DOTNET_ENVIRONMENT": "${input:dataStreamPublisherEnvironment}",
|
"DOTNET_ENVIRONMENT": "${input:dataStreamPublisherEnvironment}",
|
||||||
},
|
},
|
||||||
|
"cwd": "${workspaceFolder}/build/Debug/bin/net7.0",
|
||||||
"stopAtEntry": false,
|
"stopAtEntry": false,
|
||||||
"console": "integratedTerminal"
|
"console": "integratedTerminal"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "(gdb) Launch",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "/home/bts/spark/build/sparkd-debug-clang/server/sparkd",
|
|
||||||
"args": [
|
|
||||||
"run"
|
|
||||||
],
|
|
||||||
"stopAtEntry": false,
|
|
||||||
"cwd": "/home/bts/spark/build/sparkd-debug-clang/server",
|
|
||||||
"environment": [],
|
|
||||||
"externalConsole": false,
|
|
||||||
"MIMode": "gdb",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "spreader tests2",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "/home/bts/spark/build/sparkd-debug-clang/server/sparkd",
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"[spreader2]"
|
|
||||||
],
|
|
||||||
"stopAtEntry": false,
|
|
||||||
"cwd": "/home/bts/spark/build/sparkd-debug-clang/server",
|
|
||||||
"environment": [],
|
|
||||||
"externalConsole": false,
|
|
||||||
"MIMode": "gdb",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "spreader tests",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "/home/bts/spark/build/sparkd-debug-clang/server/sparkd",
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"[spreader]"
|
|
||||||
],
|
|
||||||
"stopAtEntry": false,
|
|
||||||
"cwd": "/home/bts/spark/build/sparkd-debug-clang/server",
|
|
||||||
"environment": [],
|
|
||||||
"externalConsole": false,
|
|
||||||
"MIMode": "gdb",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "DataStreamQueryAnalyzer",
|
"name": "DataStreamQueryAnalyzer",
|
||||||
"type": "coreclr",
|
"type": "coreclr",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"preLaunchTask": "Build DataStream (Debug)",
|
"preLaunchTask": "Build DataStreamQueryAnalyzer (Debug)",
|
||||||
"program": "",
|
"program": "",
|
||||||
"windows": {
|
"windows": {
|
||||||
"program": "DataStreamQueryAnalyzer.exe",
|
"program": "DataStreamQueryAnalyzer.exe",
|
||||||
"cwd": "build/Debug/bin/net8.0-windows",
|
"args": [
|
||||||
|
"--config",
|
||||||
|
"${workspaceFolder}/src/DataStreamSuite/DataStreamQueryAnalyzer/Configurations/DataStreamQueryAnalyzer.json"
|
||||||
|
],
|
||||||
|
"cwd": "build/Debug/bin/net7.0-windows",
|
||||||
"env": {
|
"env": {
|
||||||
"PYTHON_EXE": "${workspaceFolder}/.venv/Scripts/python.exe",
|
"PYTHON_EXE": "${workspaceFolder}/.venv/Scripts/python.exe"
|
||||||
"DOTNET_ENVIRONMENT": "${input:dataStreamQueryAnalyzerEnvironment}",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"stopAtEntry": false,
|
|
||||||
"console": "integratedTerminal",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "DataStreamQueryAnalyzer (Skip Build)",
|
|
||||||
"type": "coreclr",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "",
|
|
||||||
"windows": {
|
|
||||||
"program": "DataStreamQueryAnalyzer.exe",
|
|
||||||
"cwd": "build/Debug/bin/net8.0-windows",
|
|
||||||
"env": {
|
|
||||||
"PYTHON_EXE": "${workspaceFolder}/.venv/Scripts/python.exe",
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:dataStreamQueryAnalyzerEnvironment}",
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"stopAtEntry": false,
|
"stopAtEntry": false,
|
||||||
@@ -183,7 +137,7 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"program": "PubSubServer.exe",
|
"program": "PubSubServer.exe",
|
||||||
},
|
},
|
||||||
"cwd": "build/Debug/bin/net8.0",
|
"cwd": "build/Debug/bin/net7.0",
|
||||||
"env": {
|
"env": {
|
||||||
"DOTNET_ENVIRONMENT": "${input:pubSubServerEnvironment}",
|
"DOTNET_ENVIRONMENT": "${input:pubSubServerEnvironment}",
|
||||||
},
|
},
|
||||||
@@ -201,50 +155,13 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"program": "PubSubServer.exe",
|
"program": "PubSubServer.exe",
|
||||||
},
|
},
|
||||||
"cwd": "build/Debug/bin/net8.0",
|
"cwd": "build/Debug/bin/net7.0",
|
||||||
"env": {
|
"env": {
|
||||||
"DOTNET_ENVIRONMENT": "${input:pubSubServerEnvironment}",
|
"DOTNET_ENVIRONMENT": "${input:pubSubServerEnvironment}",
|
||||||
},
|
},
|
||||||
"stopAtEntry": false,
|
"stopAtEntry": false,
|
||||||
"console": "integratedTerminal"
|
"console": "integratedTerminal"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Sdk Demo",
|
|
||||||
"type": "coreclr",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "",
|
|
||||||
"preLaunchTask": "Build Spark Sdk (Debug)",
|
|
||||||
"windows": {
|
|
||||||
"program": "Bts.Spark.Sdk.Demo.exe",
|
|
||||||
},
|
|
||||||
"linux": {
|
|
||||||
"program": "Bts.Spark.Sdk.Demo",
|
|
||||||
},
|
|
||||||
"cwd": "build/Debug/bin/net8.0",
|
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:sdkDemoEnvironment}",
|
|
||||||
},
|
|
||||||
"stopAtEntry": false,
|
|
||||||
"console": "integratedTerminal"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Sdk Demo (Skip Build)",
|
|
||||||
"type": "coreclr",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "",
|
|
||||||
"windows": {
|
|
||||||
"program": "Bts.Spark.Sdk.Demo.exe",
|
|
||||||
},
|
|
||||||
"linux": {
|
|
||||||
"program": "Bts.Spark.Sdk.Demo.exe",
|
|
||||||
},
|
|
||||||
"cwd": "build/Debug/bin/net8.0",
|
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:sdkDemoEnvironment}",
|
|
||||||
},
|
|
||||||
"stopAtEntry": false,
|
|
||||||
"console": "integratedTerminal"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Spark",
|
"name": "Spark",
|
||||||
"type": "coreclr",
|
"type": "coreclr",
|
||||||
@@ -253,25 +170,11 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"preLaunchTask": "Build Spark (Debug)",
|
"preLaunchTask": "Build Spark (Debug)",
|
||||||
"program": "Spark.exe",
|
"program": "Spark.exe",
|
||||||
"cwd": "build/Debug/bin/net8.0-windows",
|
"args": [
|
||||||
"env": {
|
"--sparkd",
|
||||||
"DOTNET_ENVIRONMENT": "${input:sparkEnvironment}",
|
"http://127.0.0.1:8000/config"
|
||||||
}
|
],
|
||||||
},
|
"cwd": "build/Debug/bin/net7.0-windows",
|
||||||
"stopAtEntry": false,
|
|
||||||
"console": "integratedTerminal"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Spark (Skip Build)",
|
|
||||||
"type": "coreclr",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "",
|
|
||||||
"windows": {
|
|
||||||
"program": "Spark.exe",
|
|
||||||
"cwd": "build/Debug/bin/net8.0-windows",
|
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:sparkEnvironment}",
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"stopAtEntry": false,
|
"stopAtEntry": false,
|
||||||
"console": "integratedTerminal"
|
"console": "integratedTerminal"
|
||||||
@@ -285,43 +188,10 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"program": "Spark.exe",
|
"program": "Spark.exe",
|
||||||
"args": [
|
"args": [
|
||||||
"--Spark:ConfigServer",
|
"--sparkd",
|
||||||
"${input:sparkConfigServer}"
|
"${input:sparkConfigServer}"
|
||||||
],
|
],
|
||||||
"cwd": "build/Debug/bin/net8.0-windows",
|
"cwd": "build/Debug/bin/net7.0-windows",
|
||||||
},
|
|
||||||
"stopAtEntry": false,
|
|
||||||
"console": "integratedTerminal"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Spark Test",
|
|
||||||
"type": "coreclr",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "",
|
|
||||||
"windows": {
|
|
||||||
"preLaunchTask": "Build Spark (Debug)",
|
|
||||||
"program": "Spark.Console.exe",
|
|
||||||
"cwd": "build/Debug/bin/net8.0",
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"${input:sparkTest}"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"stopAtEntry": false,
|
|
||||||
"console": "integratedTerminal"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Spark Test (Skip Build)",
|
|
||||||
"type": "coreclr",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "",
|
|
||||||
"windows": {
|
|
||||||
"program": "Spark.Console.exe",
|
|
||||||
"cwd": "build/Debug/bin/net8.0",
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"${input:sparkTest}"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"stopAtEntry": false,
|
"stopAtEntry": false,
|
||||||
"console": "integratedTerminal"
|
"console": "integratedTerminal"
|
||||||
@@ -330,10 +200,10 @@
|
|||||||
"name": "Sparkd",
|
"name": "Sparkd",
|
||||||
"type": "cppdbg",
|
"type": "cppdbg",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
|
"preLaunchTask": "Build Sparkd (Debug | Clang)",
|
||||||
"program": "",
|
"program": "",
|
||||||
"linux": {
|
"linux": {
|
||||||
"program": "${workspaceFolder}/build/sparkd-debug-clang/src/app_sparkd/sparkd",
|
"program": "${workspaceFolder}/build/sparkd-debug-clang/src/app_sparkd/sparkd",
|
||||||
"preLaunchTask": "Build Sparkd (Debug | Clang)",
|
|
||||||
},
|
},
|
||||||
"args": [
|
"args": [
|
||||||
"run"
|
"run"
|
||||||
@@ -364,7 +234,7 @@
|
|||||||
"program": "${workspaceFolder}/build/sparkd-debug-clang/src/app_sparkd/sparkd",
|
"program": "${workspaceFolder}/build/sparkd-debug-clang/src/app_sparkd/sparkd",
|
||||||
},
|
},
|
||||||
"args": [
|
"args": [
|
||||||
"run"
|
"test-py-md-provider"
|
||||||
],
|
],
|
||||||
"cwd": "${workspaceFolder}/build/sparkd-debug-clang/src/app_sparkd",
|
"cwd": "${workspaceFolder}/build/sparkd-debug-clang/src/app_sparkd",
|
||||||
"stopAtEntry": false,
|
"stopAtEntry": false,
|
||||||
@@ -383,91 +253,44 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Sparkd Attach",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "attach",
|
|
||||||
"program": "${workspaceFolder}/build/sparkd-debug-clang/src/app_sparkd/sparkd",
|
|
||||||
"MIMode": "gdb",
|
|
||||||
"setupCommands": [
|
|
||||||
{
|
|
||||||
"description": "Enable pretty-printing for gdb",
|
|
||||||
"text": "-enable-pretty-printing",
|
|
||||||
"ignoreFailures": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"description": "Set Disassembly Flavor to Intel",
|
|
||||||
"text": "-gdb-set disassembly-flavor intel",
|
|
||||||
"ignoreFailures": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"id": "apiServerEnvironment",
|
"id": "dataStreamPublisherEnvironment",
|
||||||
"type": "pickString",
|
|
||||||
"description": "Api Server Configuration",
|
|
||||||
"options": [
|
|
||||||
"Development",
|
|
||||||
"Local",
|
|
||||||
"Staging",
|
|
||||||
],
|
|
||||||
"default": "Development",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dataStreamPublisherConfig",
|
|
||||||
"type": "pickString",
|
"type": "pickString",
|
||||||
"description": "Publisher Configuration",
|
"description": "Publisher Configuration",
|
||||||
"options": [
|
"options": [
|
||||||
"MarketDataPublisher",
|
"Development",
|
||||||
"SimpleEchoClient",
|
"MarketData",
|
||||||
"SimpleTestDataPublisher",
|
"Production",
|
||||||
"TestDataPublisher",
|
"ProductionAws",
|
||||||
|
"Staging",
|
||||||
],
|
],
|
||||||
"default": "MarketDataPublisher",
|
"default": "MarketDataPublisher",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "dataStreamQueryAnalyzerEnvironment",
|
|
||||||
"type": "pickString",
|
|
||||||
"description": "DataStreamQueryAnalyzer Configuration",
|
|
||||||
"options": [
|
|
||||||
"Development",
|
|
||||||
"Local",
|
|
||||||
],
|
|
||||||
"default": "Development",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "dataStreamPublisherEnvironment",
|
|
||||||
"type": "pickString",
|
|
||||||
"description": "DataStreamPublisher Configuration",
|
|
||||||
"options": [
|
|
||||||
"Local",
|
|
||||||
"ReplayMarketData",
|
|
||||||
],
|
|
||||||
"default": "Local",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "pubSubServerEnvironment",
|
"id": "pubSubServerEnvironment",
|
||||||
"type": "pickString",
|
"type": "pickString",
|
||||||
"description": "PubSubServer Configuration",
|
"description": "PubSub Configuration",
|
||||||
"options": [
|
"options": [
|
||||||
"Development",
|
"Development",
|
||||||
"EchoServer",
|
"EchoServer",
|
||||||
"Local",
|
"Production",
|
||||||
|
"ProductionAws",
|
||||||
|
"Staging",
|
||||||
],
|
],
|
||||||
"default": "Development",
|
"default": "Development",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "sdkDemoEnvironment",
|
"id": "dataStreamWebAppServerEnvironment",
|
||||||
"type": "pickString",
|
"type": "pickString",
|
||||||
"description": "Sdk Demo Configuration",
|
"description": "DataStream WebApp Environment",
|
||||||
"options": [
|
"options": [
|
||||||
"Development",
|
"Development",
|
||||||
"Local",
|
"Production",
|
||||||
|
"ProductionAws",
|
||||||
"Staging",
|
"Staging",
|
||||||
],
|
]
|
||||||
"default": "Development",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "sparkConfigServer",
|
"id": "sparkConfigServer",
|
||||||
@@ -476,24 +299,14 @@
|
|||||||
"default": "http://localhost:8000/config",
|
"default": "http://localhost:8000/config",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "sparkEnvironment",
|
"id": "isSparkApiEnabled",
|
||||||
"type": "pickString",
|
"type": "pickString",
|
||||||
"description": "Spark Configuration",
|
"description": "Enable Spark Api (connect to sparkd)",
|
||||||
"options": [
|
"options": [
|
||||||
"Development",
|
"True",
|
||||||
"Local",
|
"False",
|
||||||
],
|
],
|
||||||
"default": "Development",
|
"default": "True",
|
||||||
},
|
}
|
||||||
{
|
|
||||||
"id": "sparkTest",
|
|
||||||
"type": "promptString",
|
|
||||||
"description": "Test to run",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "sparkdTest",
|
|
||||||
"type": "promptString",
|
|
||||||
"description": "Test to run",
|
|
||||||
},
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
Vendored
-1
@@ -1 +0,0 @@
|
|||||||
PYTHONPATH=/workspaces/spark/build/sparkd-debug-clang/src/lib_python_interop;/workspaces/spark/src/lib_python_interop/python_interop_plugins;/workspaces/spark/tools/py
|
|
||||||
Vendored
+281
-370
@@ -121,6 +121,117 @@
|
|||||||
"color": "terminal.ansiCyan"
|
"color": "terminal.ansiCyan"
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"label": "Build DataStreamQueryAnalyzer",
|
||||||
|
"group": "build",
|
||||||
|
"type": "process",
|
||||||
|
"command": "",
|
||||||
|
"windows": {
|
||||||
|
"command": "tools/build_data_stream_query_analyzer.cmd",
|
||||||
|
},
|
||||||
|
"args": [
|
||||||
|
"--configuration",
|
||||||
|
"${input:buildConfiguration}",
|
||||||
|
],
|
||||||
|
"icon": {
|
||||||
|
"id": "terminal",
|
||||||
|
"color": "terminal.ansiCyan"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Build DataStreamQueryAnalyzer (Debug)",
|
||||||
|
"group": "build",
|
||||||
|
"type": "process",
|
||||||
|
"command": "",
|
||||||
|
"windows": {
|
||||||
|
"command": "tools/build_data_stream_query_analyzer.cmd",
|
||||||
|
},
|
||||||
|
"args": [
|
||||||
|
"--configuration",
|
||||||
|
"Debug",
|
||||||
|
],
|
||||||
|
"icon": {
|
||||||
|
"id": "terminal",
|
||||||
|
"color": "terminal.ansiCyan"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Build DataStreamQueryAnalyzer (Release)",
|
||||||
|
"group": "build",
|
||||||
|
"type": "process",
|
||||||
|
"command": "",
|
||||||
|
"windows": {
|
||||||
|
"command": "tools/build_data_stream_query_analyzer.cmd",
|
||||||
|
},
|
||||||
|
"args": [
|
||||||
|
"--configuration",
|
||||||
|
"Release",
|
||||||
|
],
|
||||||
|
"icon": {
|
||||||
|
"id": "terminal",
|
||||||
|
"color": "terminal.ansiCyan"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Build DataStream WebApp",
|
||||||
|
"group": "build",
|
||||||
|
"type": "process",
|
||||||
|
"command": "",
|
||||||
|
"linux": {
|
||||||
|
"command": "tools/build_data_stream_web_app.sh",
|
||||||
|
},
|
||||||
|
"windows": {
|
||||||
|
"command": "tools/build_data_stream_web_app.cmd",
|
||||||
|
},
|
||||||
|
"args": [
|
||||||
|
"--configuration",
|
||||||
|
"${input:buildConfiguration}",
|
||||||
|
],
|
||||||
|
"icon": {
|
||||||
|
"id": "terminal",
|
||||||
|
"color": "terminal.ansiCyan"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Build DataStream WebApp (Debug)",
|
||||||
|
"group": "build",
|
||||||
|
"type": "process",
|
||||||
|
"command": "",
|
||||||
|
"linux": {
|
||||||
|
"command": "tools/build_data_stream_web_app.sh",
|
||||||
|
},
|
||||||
|
"windows": {
|
||||||
|
"command": "tools/build_data_stream_web_app.cmd",
|
||||||
|
},
|
||||||
|
"args": [
|
||||||
|
"--configuration",
|
||||||
|
"Debug",
|
||||||
|
],
|
||||||
|
"icon": {
|
||||||
|
"id": "terminal",
|
||||||
|
"color": "terminal.ansiCyan"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Build DataStream WebApp (Release)",
|
||||||
|
"group": "build",
|
||||||
|
"type": "process",
|
||||||
|
"command": "",
|
||||||
|
"linux": {
|
||||||
|
"command": "tools/build_data_stream_web_app.sh",
|
||||||
|
},
|
||||||
|
"windows": {
|
||||||
|
"command": "tools/build_data_stream_web_app.cmd",
|
||||||
|
},
|
||||||
|
"args": [
|
||||||
|
"--configuration",
|
||||||
|
"Release",
|
||||||
|
],
|
||||||
|
"icon": {
|
||||||
|
"id": "terminal",
|
||||||
|
"color": "terminal.ansiCyan"
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"label": "Build Spark",
|
"label": "Build Spark",
|
||||||
"group": "build",
|
"group": "build",
|
||||||
@@ -172,66 +283,6 @@
|
|||||||
"color": "terminal.ansiCyan"
|
"color": "terminal.ansiCyan"
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"label": "Build Spark Sdk",
|
|
||||||
"group": "build",
|
|
||||||
"type": "process",
|
|
||||||
"command": "",
|
|
||||||
"linux": {
|
|
||||||
"command": "tools/build_spark_sdk.sh",
|
|
||||||
},
|
|
||||||
"windows": {
|
|
||||||
"command": "tools/build_spark_sdk.cmd",
|
|
||||||
},
|
|
||||||
"args": [
|
|
||||||
"--configuration",
|
|
||||||
"${input:buildConfiguration}",
|
|
||||||
],
|
|
||||||
"icon": {
|
|
||||||
"id": "terminal",
|
|
||||||
"color": "terminal.ansiCyan"
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Build Spark Sdk (Debug)",
|
|
||||||
"group": "build",
|
|
||||||
"type": "process",
|
|
||||||
"command": "",
|
|
||||||
"linux": {
|
|
||||||
"command": "tools/build_spark_sdk.sh",
|
|
||||||
},
|
|
||||||
"windows": {
|
|
||||||
"command": "tools/build_spark_sdk.cmd",
|
|
||||||
},
|
|
||||||
"args": [
|
|
||||||
"--configuration",
|
|
||||||
"Debug",
|
|
||||||
],
|
|
||||||
"icon": {
|
|
||||||
"id": "terminal",
|
|
||||||
"color": "terminal.ansiCyan"
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Build Spark Sdk (Release)",
|
|
||||||
"group": "build",
|
|
||||||
"type": "process",
|
|
||||||
"command": "",
|
|
||||||
"windows": {
|
|
||||||
"command": "tools/build_spark_sdk.cmd",
|
|
||||||
},
|
|
||||||
"linux": {
|
|
||||||
"command": "tools/build_spark_sdk.sh",
|
|
||||||
},
|
|
||||||
"args": [
|
|
||||||
"--configuration",
|
|
||||||
"Release",
|
|
||||||
],
|
|
||||||
"icon": {
|
|
||||||
"id": "terminal",
|
|
||||||
"color": "terminal.ansiCyan"
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"label": "Build Sparkd",
|
"label": "Build Sparkd",
|
||||||
"group": "build",
|
"group": "build",
|
||||||
@@ -363,6 +414,22 @@
|
|||||||
"color": "terminal.ansiCyan"
|
"color": "terminal.ansiCyan"
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"label": "Publish DataStreamWebApp",
|
||||||
|
"group": "build",
|
||||||
|
"type": "process",
|
||||||
|
"command": "",
|
||||||
|
"linux": {
|
||||||
|
"command": "tools/publish_data_stream_web_app.sh",
|
||||||
|
},
|
||||||
|
"windows": {
|
||||||
|
"command": "tools/publish_data_stream_web_app.cmd",
|
||||||
|
},
|
||||||
|
"icon": {
|
||||||
|
"id": "terminal",
|
||||||
|
"color": "terminal.ansiCyan"
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"label": "Edit DataStream Config",
|
"label": "Edit DataStream Config",
|
||||||
"type": "process",
|
"type": "process",
|
||||||
@@ -411,141 +478,19 @@
|
|||||||
"id": "wrench"
|
"id": "wrench"
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"label": "Run Api Server",
|
|
||||||
"dependsOn": "Build Api Server",
|
|
||||||
"type": "process",
|
|
||||||
"command": "",
|
|
||||||
"windows": {
|
|
||||||
"command": "spark_api_server.exe",
|
|
||||||
},
|
|
||||||
"linux": {
|
|
||||||
"command": "spark_api_server",
|
|
||||||
},
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
],
|
|
||||||
"options": {
|
|
||||||
"cwd": "${workspaceFolder}/build/${input:buildConfiguration}/bin/net8.0",
|
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:apiServerEnvironment}",
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"icon": {
|
|
||||||
"id": "run",
|
|
||||||
"color": "terminal.ansiGreen",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Run Api Server (Debug)",
|
|
||||||
"dependsOn": "Build Api Server (Debug)",
|
|
||||||
"type": "process",
|
|
||||||
"command": "",
|
|
||||||
"windows": {
|
|
||||||
"command": "spark_api_server.exe",
|
|
||||||
},
|
|
||||||
"linux": {
|
|
||||||
"command": "spark_api_server",
|
|
||||||
},
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
],
|
|
||||||
"options": {
|
|
||||||
"cwd": "${workspaceFolder}/build/Debug/bin/net8.0",
|
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:apiServerEnvironment}",
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"icon": {
|
|
||||||
"id": "run",
|
|
||||||
"color": "terminal.ansiGreen",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Run Api Server (Release)",
|
|
||||||
"dependsOn": "Build Api Server (Release)",
|
|
||||||
"type": "process",
|
|
||||||
"command": "",
|
|
||||||
"windows": {
|
|
||||||
"command": "spark_api_server.exe",
|
|
||||||
},
|
|
||||||
"linux": {
|
|
||||||
"command": "spark_api_server",
|
|
||||||
},
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
],
|
|
||||||
"options": {
|
|
||||||
"cwd": "${workspaceFolder}/build/Release/bin/net8.0",
|
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:apiServerEnvironment}",
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"icon": {
|
|
||||||
"id": "run",
|
|
||||||
"color": "terminal.ansiGreen",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Run Api Server (Debug | Skip Build)",
|
|
||||||
"type": "process",
|
|
||||||
"command": "",
|
|
||||||
"windows": {
|
|
||||||
"command": "spark_api_server.exe",
|
|
||||||
},
|
|
||||||
"linux": {
|
|
||||||
"command": "spark_api_server",
|
|
||||||
},
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
],
|
|
||||||
"options": {
|
|
||||||
"cwd": "${workspaceFolder}/build/Debug/bin/net8.0",
|
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:apiServerEnvironment}",
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"icon": {
|
|
||||||
"id": "run",
|
|
||||||
"color": "terminal.ansiGreen",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Run Api Server (Release | Skip Build)",
|
|
||||||
"type": "process",
|
|
||||||
"command": "",
|
|
||||||
"windows": {
|
|
||||||
"command": "spark_api_server.exe",
|
|
||||||
},
|
|
||||||
"linux": {
|
|
||||||
"command": "spark_api_server",
|
|
||||||
},
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
],
|
|
||||||
"options": {
|
|
||||||
"cwd": "${workspaceFolder}/build/Release/bin/net8.0",
|
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:apiServerEnvironment}",
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"icon": {
|
|
||||||
"id": "run",
|
|
||||||
"color": "terminal.ansiGreen",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"label": "Run DataStreamQueryAnalyzer",
|
"label": "Run DataStreamQueryAnalyzer",
|
||||||
"dependsOn": "Build DataStream",
|
"dependsOn": "Build DataStreamQueryAnalyzer",
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"command": "",
|
"command": "",
|
||||||
"windows": {
|
"windows": {
|
||||||
"command": "DataStreamQueryAnalyzer.exe",
|
"command": "DataStreamQueryAnalyzer.exe",
|
||||||
|
"args": [
|
||||||
|
"--config",
|
||||||
|
"${workspaceFolder}/src/DataStreamSuite/DataStreamQueryAnalyzer/Configurations/DataStreamQueryAnalyzer.json",
|
||||||
|
],
|
||||||
"options": {
|
"options": {
|
||||||
"cwd": "${workspaceFolder}/build/${input:buildConfiguration}/bin/net8.0-windows",
|
"cwd": "${workspaceFolder}/build/${input:buildConfiguration}/bin/net7.0-windows"
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:dataStreamQueryAnalyzerEnvironment}",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"icon": {
|
"icon": {
|
||||||
@@ -555,16 +500,17 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Run DataStreamQueryAnalyzer (Debug)",
|
"label": "Run DataStreamQueryAnalyzer (Debug)",
|
||||||
"dependsOn": "Build DataStream (Debug)",
|
"dependsOn": "Build DataStreamQueryAnalyzer (Debug)",
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"command": "",
|
"command": "",
|
||||||
"windows": {
|
"windows": {
|
||||||
"command": "DataStreamQueryAnalyzer.exe",
|
"command": "DataStreamQueryAnalyzer.exe",
|
||||||
|
"args": [
|
||||||
|
"--config",
|
||||||
|
"${workspaceFolder}/src/DataStreamSuite/DataStreamQueryAnalyzer/Configurations/DataStreamQueryAnalyzer.json",
|
||||||
|
],
|
||||||
"options": {
|
"options": {
|
||||||
"cwd": "${workspaceFolder}/build/Debug/bin/net8.0-windows",
|
"cwd": "${workspaceFolder}/build/Debug/bin/net7.0-windows"
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:dataStreamQueryAnalyzerEnvironment}",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"icon": {
|
"icon": {
|
||||||
@@ -574,16 +520,17 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Run DataStreamQueryAnalyzer (Release)",
|
"label": "Run DataStreamQueryAnalyzer (Release)",
|
||||||
"dependsOn": "Build DataStream (Release)",
|
"dependsOn": "Build DataStreamQueryAnalyzer (Release)",
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"command": "",
|
"command": "",
|
||||||
"windows": {
|
"windows": {
|
||||||
"command": "DataStreamQueryAnalyzer.exe",
|
"command": "DataStreamQueryAnalyzer.exe",
|
||||||
|
"args": [
|
||||||
|
"--config",
|
||||||
|
"${workspaceFolder}/src/DataStreamSuite/DataStreamQueryAnalyzer/Configurations/DataStreamQueryAnalyzer.json",
|
||||||
|
],
|
||||||
"options": {
|
"options": {
|
||||||
"cwd": "${workspaceFolder}/build/Release/bin/net8.0-windows",
|
"cwd": "${workspaceFolder}/build/Release/bin/net7.0-windows"
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:dataStreamQueryAnalyzerEnvironment}",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"icon": {
|
"icon": {
|
||||||
@@ -602,11 +549,12 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"command": "DataStreamPublisher.exe",
|
"command": "DataStreamPublisher.exe",
|
||||||
},
|
},
|
||||||
|
"args": [
|
||||||
|
"--config",
|
||||||
|
"${workspaceFolder}/src/DataStreamSuite/DataStreamPublisher/Configurations/${input:dataStreamPublisherConfig}.json",
|
||||||
|
],
|
||||||
"options": {
|
"options": {
|
||||||
"cwd": "${workspaceFolder}/build/${input:buildConfiguration}/bin/net8.0",
|
"cwd": "${workspaceFolder}/build/${input:buildConfiguration}/bin/net7.0"
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:dataStreamPublisherEnvironment}",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
"icon": {
|
"icon": {
|
||||||
"id": "run",
|
"id": "run",
|
||||||
@@ -624,11 +572,12 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"command": "DataStreamPublisher.exe",
|
"command": "DataStreamPublisher.exe",
|
||||||
},
|
},
|
||||||
|
"args": [
|
||||||
|
"--config",
|
||||||
|
"${workspaceFolder}/src/DataStreamSuite/DataStreamPublisher/Configurations/${input:dataStreamPublisherConfig}.json",
|
||||||
|
],
|
||||||
"options": {
|
"options": {
|
||||||
"cwd": "${workspaceFolder}/build/Debug/bin/net8.0",
|
"cwd": "${workspaceFolder}/build/Debug/bin/net7.0"
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:dataStreamPublisherEnvironment}",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
"icon": {
|
"icon": {
|
||||||
"id": "run",
|
"id": "run",
|
||||||
@@ -646,11 +595,95 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"command": "DataStreamPublisher.exe",
|
"command": "DataStreamPublisher.exe",
|
||||||
},
|
},
|
||||||
|
"args": [
|
||||||
|
"--config",
|
||||||
|
"${workspaceFolder}/src/DataStreamSuite/DataStreamPublisher/Configurations/${input:dataStreamPublisherConfig}.json",
|
||||||
|
],
|
||||||
"options": {
|
"options": {
|
||||||
"cwd": "${workspaceFolder}/build/Release/bin/net8.0",
|
"cwd": "${workspaceFolder}/build/Release/bin/net7.0"
|
||||||
|
},
|
||||||
|
"icon": {
|
||||||
|
"id": "run",
|
||||||
|
"color": "terminal.ansiGreen",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Run DataStream WebApp (Debug)",
|
||||||
|
"dependsOn": "Build DataStream WebApp (Debug)",
|
||||||
|
"command": "",
|
||||||
|
"linux": {
|
||||||
|
"command": "Bts.DataStreamWebApp.Server",
|
||||||
|
},
|
||||||
|
"windows": {
|
||||||
|
"command": "Bts.DataStreamWebApp.Server.exe",
|
||||||
|
},
|
||||||
|
"args": [
|
||||||
|
"--config",
|
||||||
|
"${workspaceFolder}/src/DataStreamSuite/Bts.DataStreamWebApp.Server/Configurations/DevServer.json",
|
||||||
|
],
|
||||||
|
"options": {
|
||||||
|
"cwd": "${workspaceFolder}/build/Debug/bin/net7.0",
|
||||||
"env": {
|
"env": {
|
||||||
"DOTNET_ENVIRONMENT": "${input:dataStreamPublisherEnvironment}",
|
"ASPNETCORE_HTTP_PORT": "8080",
|
||||||
},
|
"ASPNETCORE_HTTPS_PORT": "8443",
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development",
|
||||||
|
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"icon": {
|
||||||
|
"id": "run",
|
||||||
|
"color": "terminal.ansiGreen",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Run DataStream WebApp (Release)",
|
||||||
|
"dependsOn": "Build DataStream WebApp (Release)",
|
||||||
|
"command": "",
|
||||||
|
"linux": {
|
||||||
|
"command": "Bts.DataStreamWebApp.Server",
|
||||||
|
},
|
||||||
|
"windows": {
|
||||||
|
"command": "Bts.DataStreamWebApp.Server.exe",
|
||||||
|
},
|
||||||
|
"args": [
|
||||||
|
"--config",
|
||||||
|
"${workspaceFolder}/src/DataStreamSuite/Bts.DataStreamWebApp.Server/Configurations/DevServer.json",
|
||||||
|
],
|
||||||
|
"options": {
|
||||||
|
"cwd": "${workspaceFolder}/build/Release/bin/net7.0",
|
||||||
|
"env": {
|
||||||
|
"ASPNETCORE_HTTP_PORT": "8080",
|
||||||
|
"ASPNETCORE_HTTPS_PORT": "8443",
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Production",
|
||||||
|
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"icon": {
|
||||||
|
"id": "run",
|
||||||
|
"color": "terminal.ansiGreen",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Run DataStream WebApp (Release | Skip Build)",
|
||||||
|
"command": "",
|
||||||
|
"linux": {
|
||||||
|
"command": "Bts.DataStreamWebApp.Server",
|
||||||
|
},
|
||||||
|
"windows": {
|
||||||
|
"command": "Bts.DataStreamWebApp.Server.exe",
|
||||||
|
},
|
||||||
|
"args": [
|
||||||
|
"--config",
|
||||||
|
"${workspaceFolder}/src/DataStreamSuite/Bts.DataStreamWebApp.Server/Configurations/DevServer.json",
|
||||||
|
],
|
||||||
|
"options": {
|
||||||
|
"cwd": "${workspaceFolder}/build/Release/bin/net7.0",
|
||||||
|
"env": {
|
||||||
|
"ASPNETCORE_HTTP_PORT": "8080",
|
||||||
|
"ASPNETCORE_HTTPS_PORT": "8443",
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Production",
|
||||||
|
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy",
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"icon": {
|
"icon": {
|
||||||
"id": "run",
|
"id": "run",
|
||||||
@@ -668,11 +701,12 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"command": "PubSubServer.exe",
|
"command": "PubSubServer.exe",
|
||||||
},
|
},
|
||||||
|
"args": [
|
||||||
|
"--config",
|
||||||
|
"${workspaceFolder}/src/DataStreamSuite/PubSubServer/Configurations/${input:pubSubServerConfig}.json",
|
||||||
|
],
|
||||||
"options": {
|
"options": {
|
||||||
"cwd": "${workspaceFolder}/build/${input:buildConfiguration}/bin/net8.0",
|
"cwd": "${workspaceFolder}/build/${input:buildConfiguration}/bin/net7.0"
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:pubSubServerEnvironment}",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
"icon": {
|
"icon": {
|
||||||
"id": "run",
|
"id": "run",
|
||||||
@@ -690,11 +724,12 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"command": "PubSubServer.exe",
|
"command": "PubSubServer.exe",
|
||||||
},
|
},
|
||||||
|
"args": [
|
||||||
|
"--config",
|
||||||
|
"${workspaceFolder}/src/DataStreamSuite/PubSubServer/Configurations/${input:pubSubServerConfig}.json",
|
||||||
|
],
|
||||||
"options": {
|
"options": {
|
||||||
"cwd": "${workspaceFolder}/build/Debug/bin/net8.0",
|
"cwd": "${workspaceFolder}/build/Debug/bin/net7.0"
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:pubSubServerEnvironment}",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
"icon": {
|
"icon": {
|
||||||
"id": "run",
|
"id": "run",
|
||||||
@@ -711,11 +746,12 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"command": "PubSubServer.exe",
|
"command": "PubSubServer.exe",
|
||||||
},
|
},
|
||||||
|
"args": [
|
||||||
|
"--config",
|
||||||
|
"${workspaceFolder}/src/DataStreamSuite/PubSubServer/Configurations/${input:pubSubServerConfig}.json",
|
||||||
|
],
|
||||||
"options": {
|
"options": {
|
||||||
"cwd": "${workspaceFolder}/build/Debug/bin/net8.0",
|
"cwd": "${workspaceFolder}/build/Debug/bin/net7.0"
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:pubSubServerEnvironment}",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
"icon": {
|
"icon": {
|
||||||
"id": "run",
|
"id": "run",
|
||||||
@@ -733,11 +769,12 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"command": "PubSubServer.exe",
|
"command": "PubSubServer.exe",
|
||||||
},
|
},
|
||||||
|
"args": [
|
||||||
|
"--config",
|
||||||
|
"${workspaceFolder}/src/DataStreamSuite/PubSubServer/Configurations/${input:pubSubServerConfig}.json",
|
||||||
|
],
|
||||||
"options": {
|
"options": {
|
||||||
"cwd": "${workspaceFolder}/build/Release/bin/net8.0",
|
"cwd": "${workspaceFolder}/build/Release/bin/net7.0"
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:pubSubServerEnvironment}",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
"icon": {
|
"icon": {
|
||||||
"id": "run",
|
"id": "run",
|
||||||
@@ -754,11 +791,12 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"command": "PubSubServer.exe",
|
"command": "PubSubServer.exe",
|
||||||
},
|
},
|
||||||
|
"args": [
|
||||||
|
"--config",
|
||||||
|
"${workspaceFolder}/src/DataStreamSuite/PubSubServer/Configurations/${input:pubSubServerConfig}.json",
|
||||||
|
],
|
||||||
"options": {
|
"options": {
|
||||||
"cwd": "${workspaceFolder}/build/Release/bin/net8.0",
|
"cwd": "${workspaceFolder}/build/Release/bin/net7.0"
|
||||||
"env": {
|
|
||||||
"DOTNET_ENVIRONMENT": "${input:pubSubServerEnvironment}",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
"icon": {
|
"icon": {
|
||||||
"id": "run",
|
"id": "run",
|
||||||
@@ -773,7 +811,7 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"command": "Spark.exe",
|
"command": "Spark.exe",
|
||||||
"options": {
|
"options": {
|
||||||
"cwd": "${workspaceFolder}/build/${input:buildConfiguration}/bin/net8.0-windows"
|
"cwd": "${workspaceFolder}/build/${input:buildConfiguration}/bin/net7.0-windows"
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"icon": {
|
"icon": {
|
||||||
@@ -789,7 +827,7 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"command": "Spark.exe",
|
"command": "Spark.exe",
|
||||||
"options": {
|
"options": {
|
||||||
"cwd": "${workspaceFolder}/build/Debug/bin/net8.0-windows"
|
"cwd": "${workspaceFolder}/build/Debug/bin/net7.0-windows"
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"icon": {
|
"icon": {
|
||||||
@@ -805,22 +843,7 @@
|
|||||||
"windows": {
|
"windows": {
|
||||||
"command": "Spark.exe",
|
"command": "Spark.exe",
|
||||||
"options": {
|
"options": {
|
||||||
"cwd": "${workspaceFolder}/build/Release/bin/net8.0-windows"
|
"cwd": "${workspaceFolder}/build/Release/bin/net7.0-windows"
|
||||||
},
|
|
||||||
},
|
|
||||||
"icon": {
|
|
||||||
"id": "run",
|
|
||||||
"color": "terminal.ansiGreen",
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Run Spark (Skip Build)",
|
|
||||||
"type": "process",
|
|
||||||
"command": "",
|
|
||||||
"windows": {
|
|
||||||
"command": "Spark.exe",
|
|
||||||
"options": {
|
|
||||||
"cwd": "${workspaceFolder}/build/${input:buildConfiguration}/bin/net8.0-windows"
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"icon": {
|
"icon": {
|
||||||
@@ -845,7 +868,7 @@
|
|||||||
"${input:sparkConfigQuery}",
|
"${input:sparkConfigQuery}",
|
||||||
],
|
],
|
||||||
"options": {
|
"options": {
|
||||||
"cwd": "${workspaceFolder}/build/${input:buildConfiguration}/bin/net8.0"
|
"cwd": "${workspaceFolder}/build/${input:buildConfiguration}/bin/net7.0"
|
||||||
},
|
},
|
||||||
"icon": {
|
"icon": {
|
||||||
"id": "run",
|
"id": "run",
|
||||||
@@ -871,24 +894,6 @@
|
|||||||
"color": "terminal.ansiGreen",
|
"color": "terminal.ansiGreen",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"label": "Run Sparkd (Skip Build)",
|
|
||||||
"type": "process",
|
|
||||||
"command": "",
|
|
||||||
"linux": {
|
|
||||||
"command": "sparkd",
|
|
||||||
},
|
|
||||||
"args": [
|
|
||||||
"run"
|
|
||||||
],
|
|
||||||
"options": {
|
|
||||||
"cwd": "${workspaceFolder}/build/${input:sparkdCmakePreset}/server"
|
|
||||||
},
|
|
||||||
"icon": {
|
|
||||||
"id": "run",
|
|
||||||
"color": "terminal.ansiGreen",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"label": "Run Sparkd Config Query",
|
"label": "Run Sparkd Config Query",
|
||||||
"dependsOn": "Build Sparkd",
|
"dependsOn": "Build Sparkd",
|
||||||
@@ -910,65 +915,6 @@
|
|||||||
"color": "terminal.ansiGreen",
|
"color": "terminal.ansiGreen",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"label": "Test Spark (Debug)",
|
|
||||||
"dependsOn": "Build Spark (Debug)",
|
|
||||||
"type": "process",
|
|
||||||
"icon": {
|
|
||||||
"id": "coverage",
|
|
||||||
"color": "terminal.ansiYellow",
|
|
||||||
},
|
|
||||||
"command": "",
|
|
||||||
"windows": {
|
|
||||||
"command": "Spark.Console.exe",
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"${input:sparkTest}"
|
|
||||||
],
|
|
||||||
"options": {
|
|
||||||
"cwd": "${workspaceFolder}/build/Debug/bin/net8.0",
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Test Sparkd",
|
|
||||||
"dependsOn": "Build Sparkd",
|
|
||||||
"type": "process",
|
|
||||||
"command": "",
|
|
||||||
"linux": {
|
|
||||||
"command": "sparkd",
|
|
||||||
},
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"${input:sparkdTest}",
|
|
||||||
],
|
|
||||||
"options": {
|
|
||||||
"cwd": "${workspaceFolder}/build/${input:sparkdCmakePreset}/server"
|
|
||||||
},
|
|
||||||
"icon": {
|
|
||||||
"id": "coverage",
|
|
||||||
"color": "terminal.ansiYellow",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Test Sparkd (Skip Build)",
|
|
||||||
"type": "process",
|
|
||||||
"command": "",
|
|
||||||
"linux": {
|
|
||||||
"command": "sparkd",
|
|
||||||
},
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"${input:sparkdTest}",
|
|
||||||
],
|
|
||||||
"options": {
|
|
||||||
"cwd": "${workspaceFolder}/build/${input:sparkdCmakePreset}/server"
|
|
||||||
},
|
|
||||||
"icon": {
|
|
||||||
"id": "coverage",
|
|
||||||
"color": "terminal.ansiYellow",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"label": "View DataStreamQueryAnalyzer Logs (Last Run)",
|
"label": "View DataStreamQueryAnalyzer Logs (Last Run)",
|
||||||
"type": "process",
|
"type": "process",
|
||||||
@@ -1024,17 +970,6 @@
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
|
||||||
"id": "apiServerEnvironment",
|
|
||||||
"type": "pickString",
|
|
||||||
"description": "Api Server Configuration",
|
|
||||||
"options": [
|
|
||||||
"Development",
|
|
||||||
"Local",
|
|
||||||
"Staging",
|
|
||||||
],
|
|
||||||
"default": "Development",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "buildConfiguration",
|
"id": "buildConfiguration",
|
||||||
"type": "pickString",
|
"type": "pickString",
|
||||||
@@ -1045,16 +980,6 @@
|
|||||||
],
|
],
|
||||||
"default": "Debug",
|
"default": "Debug",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "dataStreamQueryAnalyzerEnvironment",
|
|
||||||
"type": "pickString",
|
|
||||||
"description": "DataStreamQueryAnalyzer Configuration",
|
|
||||||
"options": [
|
|
||||||
"Development",
|
|
||||||
"Local",
|
|
||||||
],
|
|
||||||
"default": "Development",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "sparkdCmakePreset",
|
"id": "sparkdCmakePreset",
|
||||||
"type": "pickString",
|
"type": "pickString",
|
||||||
@@ -1078,30 +1003,26 @@
|
|||||||
"default": "sparkd-debug-clang",
|
"default": "sparkd-debug-clang",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "dataStreamPublisherEnvironment",
|
"id": "dataStreamPublisherConfig",
|
||||||
"type": "pickString",
|
"type": "pickString",
|
||||||
"description": "Publisher Configuration",
|
"description": "Publisher Configuration",
|
||||||
"options": [
|
"options": [
|
||||||
"Development",
|
"MarketDataPublisher",
|
||||||
"MarketData",
|
"SimpleEchoClient",
|
||||||
"Production",
|
"SimpleTestDataPublisher",
|
||||||
"ProductionAws",
|
"TestDataPublisher",
|
||||||
"Staging",
|
|
||||||
],
|
],
|
||||||
"default": "MarketDataPublisher",
|
"default": "MarketDataPublisher",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "pubSubServerEnvironment",
|
"id": "pubSubServerConfig",
|
||||||
"type": "pickString",
|
"type": "pickString",
|
||||||
"description": "PubSub Configuration",
|
"description": "PubSub Configuration",
|
||||||
"options": [
|
"options": [
|
||||||
"Development",
|
"PubSubServer",
|
||||||
"EchoServer",
|
"SimpleEchoClient",
|
||||||
"Production",
|
|
||||||
"ProductionAws",
|
|
||||||
"Staging",
|
|
||||||
],
|
],
|
||||||
"default": "Development",
|
"default": "PubSubServer",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "sparkConfigQuery",
|
"id": "sparkConfigQuery",
|
||||||
@@ -1112,16 +1033,6 @@
|
|||||||
"id": "sparkdConfigQuery",
|
"id": "sparkdConfigQuery",
|
||||||
"type": "promptString",
|
"type": "promptString",
|
||||||
"description": "Config Type(s)"
|
"description": "Config Type(s)"
|
||||||
},
|
}
|
||||||
{
|
|
||||||
"id": "sparkTest",
|
|
||||||
"type": "promptString",
|
|
||||||
"description": "Test to run",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "sparkdTest",
|
|
||||||
"type": "promptString",
|
|
||||||
"description": "Test to run",
|
|
||||||
},
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio Version 17
|
|
||||||
VisualStudioVersion = 17.0.31903.59
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cs", "cs", "{C5A3B5EA-BE9F-76E5-E9B8-8A22B289B295}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.Spark.Core", "src\cs\Bts.Spark.Core\Bts.Spark.Core.csproj", "{E3BF9514-CB1A-4E07-A8DD-73300FD9726C}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.Spark.Api", "src\cs\Bts.Spark.Api\Bts.Spark.Api.csproj", "{8949AF88-F1D3-4BC4-827F-B088B555F7B9}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.Extensions.Hosting", "src\cs\Bts.Extensions.Hosting\Bts.Extensions.Hosting.csproj", "{37E4E890-D025-4729-90F9-6F95862F47BC}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.Spark.Sdk", "src\cs\Bts.Spark.Sdk\Bts.Spark.Sdk.csproj", "{A5FF3FAF-43CB-496B-AF4B-F61EFD645579}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.Spark.Sdk.Demo", "src\cs\Bts.Spark.Sdk.Demo\Bts.Spark.Sdk.Demo.csproj", "{FCFDBDBE-74B0-41C4-9011-C651B21056D4}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Any CPU = Debug|Any CPU
|
|
||||||
Debug|x64 = Debug|x64
|
|
||||||
Debug|x86 = Debug|x86
|
|
||||||
Release|Any CPU = Release|Any CPU
|
|
||||||
Release|x64 = Release|x64
|
|
||||||
Release|x86 = Release|x86
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{E3BF9514-CB1A-4E07-A8DD-73300FD9726C}.Debug|Any CPU.ActiveCfg = Debug|x64
|
|
||||||
{E3BF9514-CB1A-4E07-A8DD-73300FD9726C}.Debug|Any CPU.Build.0 = Debug|x64
|
|
||||||
{E3BF9514-CB1A-4E07-A8DD-73300FD9726C}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{E3BF9514-CB1A-4E07-A8DD-73300FD9726C}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{E3BF9514-CB1A-4E07-A8DD-73300FD9726C}.Debug|x86.ActiveCfg = Debug|x64
|
|
||||||
{E3BF9514-CB1A-4E07-A8DD-73300FD9726C}.Debug|x86.Build.0 = Debug|x64
|
|
||||||
{E3BF9514-CB1A-4E07-A8DD-73300FD9726C}.Release|Any CPU.ActiveCfg = Release|x64
|
|
||||||
{E3BF9514-CB1A-4E07-A8DD-73300FD9726C}.Release|Any CPU.Build.0 = Release|x64
|
|
||||||
{E3BF9514-CB1A-4E07-A8DD-73300FD9726C}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{E3BF9514-CB1A-4E07-A8DD-73300FD9726C}.Release|x64.Build.0 = Release|x64
|
|
||||||
{E3BF9514-CB1A-4E07-A8DD-73300FD9726C}.Release|x86.ActiveCfg = Release|x64
|
|
||||||
{E3BF9514-CB1A-4E07-A8DD-73300FD9726C}.Release|x86.Build.0 = Release|x64
|
|
||||||
{8949AF88-F1D3-4BC4-827F-B088B555F7B9}.Debug|Any CPU.ActiveCfg = Debug|x64
|
|
||||||
{8949AF88-F1D3-4BC4-827F-B088B555F7B9}.Debug|Any CPU.Build.0 = Debug|x64
|
|
||||||
{8949AF88-F1D3-4BC4-827F-B088B555F7B9}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{8949AF88-F1D3-4BC4-827F-B088B555F7B9}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{8949AF88-F1D3-4BC4-827F-B088B555F7B9}.Debug|x86.ActiveCfg = Debug|x64
|
|
||||||
{8949AF88-F1D3-4BC4-827F-B088B555F7B9}.Debug|x86.Build.0 = Debug|x64
|
|
||||||
{8949AF88-F1D3-4BC4-827F-B088B555F7B9}.Release|Any CPU.ActiveCfg = Release|x64
|
|
||||||
{8949AF88-F1D3-4BC4-827F-B088B555F7B9}.Release|Any CPU.Build.0 = Release|x64
|
|
||||||
{8949AF88-F1D3-4BC4-827F-B088B555F7B9}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{8949AF88-F1D3-4BC4-827F-B088B555F7B9}.Release|x64.Build.0 = Release|x64
|
|
||||||
{8949AF88-F1D3-4BC4-827F-B088B555F7B9}.Release|x86.ActiveCfg = Release|x64
|
|
||||||
{8949AF88-F1D3-4BC4-827F-B088B555F7B9}.Release|x86.Build.0 = Release|x64
|
|
||||||
{37E4E890-D025-4729-90F9-6F95862F47BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{37E4E890-D025-4729-90F9-6F95862F47BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{37E4E890-D025-4729-90F9-6F95862F47BC}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{37E4E890-D025-4729-90F9-6F95862F47BC}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{37E4E890-D025-4729-90F9-6F95862F47BC}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{37E4E890-D025-4729-90F9-6F95862F47BC}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{37E4E890-D025-4729-90F9-6F95862F47BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{37E4E890-D025-4729-90F9-6F95862F47BC}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{37E4E890-D025-4729-90F9-6F95862F47BC}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{37E4E890-D025-4729-90F9-6F95862F47BC}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{37E4E890-D025-4729-90F9-6F95862F47BC}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{37E4E890-D025-4729-90F9-6F95862F47BC}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{A5FF3FAF-43CB-496B-AF4B-F61EFD645579}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{A5FF3FAF-43CB-496B-AF4B-F61EFD645579}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{A5FF3FAF-43CB-496B-AF4B-F61EFD645579}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{A5FF3FAF-43CB-496B-AF4B-F61EFD645579}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{A5FF3FAF-43CB-496B-AF4B-F61EFD645579}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{A5FF3FAF-43CB-496B-AF4B-F61EFD645579}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{A5FF3FAF-43CB-496B-AF4B-F61EFD645579}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{A5FF3FAF-43CB-496B-AF4B-F61EFD645579}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{A5FF3FAF-43CB-496B-AF4B-F61EFD645579}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{A5FF3FAF-43CB-496B-AF4B-F61EFD645579}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{A5FF3FAF-43CB-496B-AF4B-F61EFD645579}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{A5FF3FAF-43CB-496B-AF4B-F61EFD645579}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{FCFDBDBE-74B0-41C4-9011-C651B21056D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{FCFDBDBE-74B0-41C4-9011-C651B21056D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{FCFDBDBE-74B0-41C4-9011-C651B21056D4}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{FCFDBDBE-74B0-41C4-9011-C651B21056D4}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{FCFDBDBE-74B0-41C4-9011-C651B21056D4}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{FCFDBDBE-74B0-41C4-9011-C651B21056D4}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{FCFDBDBE-74B0-41C4-9011-C651B21056D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{FCFDBDBE-74B0-41C4-9011-C651B21056D4}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{FCFDBDBE-74B0-41C4-9011-C651B21056D4}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{FCFDBDBE-74B0-41C4-9011-C651B21056D4}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{FCFDBDBE-74B0-41C4-9011-C651B21056D4}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{FCFDBDBE-74B0-41C4-9011-C651B21056D4}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(NestedProjects) = preSolution
|
|
||||||
{C5A3B5EA-BE9F-76E5-E9B8-8A22B289B295} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
|
|
||||||
{E3BF9514-CB1A-4E07-A8DD-73300FD9726C} = {C5A3B5EA-BE9F-76E5-E9B8-8A22B289B295}
|
|
||||||
{8949AF88-F1D3-4BC4-827F-B088B555F7B9} = {C5A3B5EA-BE9F-76E5-E9B8-8A22B289B295}
|
|
||||||
{37E4E890-D025-4729-90F9-6F95862F47BC} = {C5A3B5EA-BE9F-76E5-E9B8-8A22B289B295}
|
|
||||||
{A5FF3FAF-43CB-496B-AF4B-F61EFD645579} = {C5A3B5EA-BE9F-76E5-E9B8-8A22B289B295}
|
|
||||||
{FCFDBDBE-74B0-41C4-9011-C651B21056D4} = {C5A3B5EA-BE9F-76E5-E9B8-8A22B289B295}
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
||||||
+8
-18
@@ -1,10 +1,7 @@
|
|||||||
cmake_minimum_required(VERSION 3.12)
|
cmake_minimum_required(VERSION 3.12)
|
||||||
project(spark)
|
project(spark_root)
|
||||||
include(GNUInstallDirs)
|
|
||||||
include(${CMAKE_SOURCE_DIR}/cmake/GitVersion.cmake)
|
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
|
|
||||||
get_version_from_git()
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set(platform "windows")
|
set(platform "windows")
|
||||||
else()
|
else()
|
||||||
@@ -85,15 +82,9 @@ else()
|
|||||||
add_compile_definitions(BINANCE_US_PRICE_STATS_PATH="/api/v3/ticker/24hr")
|
add_compile_definitions(BINANCE_US_PRICE_STATS_PATH="/api/v3/ticker/24hr")
|
||||||
|
|
||||||
# ** Binance USDS Futures **
|
# ** Binance USDS Futures **
|
||||||
add_compile_definitions(CCAPI_BINANCE_USDS_FUTURES_URL_REST_BASE="https://fapi.binance.com")
|
add_compile_definitions(CCAPI_BINANCE_USDS_FUTURES_URL_REST_BASE="https://dapi.binance.com")
|
||||||
add_compile_definitions(BINANCE_USDS_FUTURES_INSTRUMENTS_PATH="/fapi/v1/exchangeInfo")
|
add_compile_definitions(BINANCE_USDS_FUTURES_INSTRUMENTS_PATH="/dapi/v1/exchangeInfo")
|
||||||
add_compile_definitions(BINANCE_USDS_FUTURES_PRICE_STATS_PATH="/fapi/v1/ticker/24hr")
|
add_compile_definitions(BINANCE_USDS_FUTURES_PRICE_STATS_PATH="/dapi/v1/ticker/24hr")
|
||||||
add_compile_definitions(BINANCE_USDS_FUTURES_USER_DATA_PATH="/api/v3/userDataStream")
|
|
||||||
|
|
||||||
# ** Binance Coin Futures **
|
|
||||||
add_compile_definitions(CCAPI_BINANCE_COIN_FUTURES_URL_REST_BASE="https://dapi.binance.com")
|
|
||||||
add_compile_definitions(BINANCE_COIN_FUTURES_INSTRUMENTS_PATH="/dapi/v1/exchangeInfo")
|
|
||||||
add_compile_definitions(BINANCE_COIN_FUTURES_PRICE_STATS_PATH="/dapi/v1/ticker/24hr")
|
|
||||||
|
|
||||||
# ** Deribit **
|
# ** Deribit **
|
||||||
add_compile_definitions(DERIBIT_INSTRUMENT_PATH="/api/v2/public/get_instrument")
|
add_compile_definitions(DERIBIT_INSTRUMENT_PATH="/api/v2/public/get_instrument")
|
||||||
@@ -112,15 +103,14 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# subdirs
|
# subdirs
|
||||||
add_subdirectory(src/lib_spark)
|
|
||||||
if (BUILD_SPARKD)
|
if (BUILD_SPARKD)
|
||||||
add_subdirectory(src/lib_python_interop)
|
add_subdirectory(src/lib_system)
|
||||||
add_subdirectory(src/lib_onixs_fix)
|
add_subdirectory(src/lib_domain)
|
||||||
add_subdirectory(src/lib_binance)
|
add_subdirectory(src/lib_python_md)
|
||||||
add_subdirectory(src/lib_okx_execution)
|
|
||||||
add_subdirectory(src/app_sparkd)
|
add_subdirectory(src/app_sparkd)
|
||||||
add_subdirectory(src/data_files)
|
add_subdirectory(src/data_files)
|
||||||
endif()
|
endif()
|
||||||
|
add_subdirectory(src/lib_spark)
|
||||||
if (BUILD_ADMIN_WEB_APP)
|
if (BUILD_ADMIN_WEB_APP)
|
||||||
add_subdirectory(src/Spark.Admin.WebApp)
|
add_subdirectory(src/Spark.Admin.WebApp)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
+161
-69
@@ -8,31 +8,14 @@
|
|||||||
|
|
||||||
"configurePresets": [
|
"configurePresets": [
|
||||||
{
|
{
|
||||||
"name": "spark-base",
|
"name": "spark",
|
||||||
"hidden": true,
|
|
||||||
"binaryDir": "${sourceDir}/build/${presetName}",
|
|
||||||
"cacheVariables": {
|
|
||||||
"CMAKE_CXX_STANDARD": "20",
|
|
||||||
"CMAKE_INSTALL_PREFIX": "${sourceDir}/install/${presetName}",
|
|
||||||
"CMAKE_TOOLCHAIN_FILE": "${sourceDir}/vcpkg/scripts/buildsystems/vcpkg.cmake",
|
|
||||||
"CONFIG_DEFAULTS_PATH": "spark/config/profiles/default/*.conf",
|
|
||||||
"EXPORT_MD_CONSUMER": {
|
|
||||||
"type": "BOOL",
|
|
||||||
"value": "ON"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"name": "spark-windows",
|
|
||||||
"inherits": "spark-base",
|
|
||||||
"displayName": "Spark",
|
|
||||||
"condition": {
|
"condition": {
|
||||||
"type": "equals",
|
"type": "equals",
|
||||||
"lhs": "${hostSystemName}",
|
"lhs": "${hostSystemName}",
|
||||||
"rhs": "Windows"
|
"rhs": "Windows"
|
||||||
},
|
},
|
||||||
"generator": "Visual Studio 17 2022",
|
"generator": "Visual Studio 17 2022",
|
||||||
|
"binaryDir": "${sourceDir}/build/${presetName}",
|
||||||
"environment": {
|
"environment": {
|
||||||
"SPARK_CMAKE_CXX_FLAGS": "/MP /WX /wd4250 /wd4251 /wd4244 /wd4267 /wd4355 /wd4275 /wd4345 /bigobj /EHsc /DCURL_STATICLIB /D_WINSOCK_DEPRECATED_NO_WARNINGS /D__TBB_NO_IMPLICIT_LINKAGE /DBOOST_ALL_NO_LIB /std:c++20 /D_SCL_SECURE_NO_WARNINGS /D_CRT_SECURE_NO_WARNINGS /D_WIN32_WINNT=0x0600"
|
"SPARK_CMAKE_CXX_FLAGS": "/MP /WX /wd4250 /wd4251 /wd4244 /wd4267 /wd4355 /wd4275 /wd4345 /bigobj /EHsc /DCURL_STATICLIB /D_WINSOCK_DEPRECATED_NO_WARNINGS /D__TBB_NO_IMPLICIT_LINKAGE /DBOOST_ALL_NO_LIB /std:c++20 /D_SCL_SECURE_NO_WARNINGS /D_CRT_SECURE_NO_WARNINGS /D_WIN32_WINNT=0x0600"
|
||||||
},
|
},
|
||||||
@@ -40,9 +23,17 @@
|
|||||||
"CMAKE_CXX_FLAGS": "$env{SPARK_CMAKE_CXX_FLAGS}",
|
"CMAKE_CXX_FLAGS": "$env{SPARK_CMAKE_CXX_FLAGS}",
|
||||||
"CMAKE_CXX_FLAGS_DEBUG": "$env{SPARK_CMAKE_CXX_FLAGS} /MTd",
|
"CMAKE_CXX_FLAGS_DEBUG": "$env{SPARK_CMAKE_CXX_FLAGS} /MTd",
|
||||||
"CMAKE_CXX_FLAGS_RELEASE": "$env{SPARK_CMAKE_CXX_FLAGS} /MT",
|
"CMAKE_CXX_FLAGS_RELEASE": "$env{SPARK_CMAKE_CXX_FLAGS} /MT",
|
||||||
|
"CMAKE_CXX_STANDARD": "20",
|
||||||
"CMAKE_SHARED_LINKER_FLAGS_DEBUG": "/DEBUG",
|
"CMAKE_SHARED_LINKER_FLAGS_DEBUG": "/DEBUG",
|
||||||
"CMAKE_SHARED_LINKER_FLAGS_RELEASE": "/OPT:REF /OPT:ICF /LTCG",
|
"CMAKE_SHARED_LINKER_FLAGS_RELEASE": "/OPT:REF /OPT:ICF /LTCG",
|
||||||
"EXTERNALS_ROOT": "${sourceDir}/externals/windows"
|
"CMAKE_TOOLCHAIN_FILE": "${sourceDir}/vcpkg/scripts/buildsystems/vcpkg.cmake",
|
||||||
|
"EXTERNALS_ROOT": "${sourceDir}/externals/windows",
|
||||||
|
"CONFIG_DEFAULTS_PATH": "config/profiles/default/*.conf",
|
||||||
|
"DOTNET_BINARY_DIR": "${sourceDir}/build/$<CONFIG>/bin/net7.0;${sourceDir}/build/$<CONFIG>/bin/net7.0-windows",
|
||||||
|
"EXPORT_MD_CONSUMER": {
|
||||||
|
"type": "BOOL",
|
||||||
|
"value": "ON"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -58,20 +49,10 @@
|
|||||||
"binaryDir": "${sourceDir}/build/${presetName}",
|
"binaryDir": "${sourceDir}/build/${presetName}",
|
||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
"platform": "",
|
"platform": "",
|
||||||
"CMAKE_BUILD_WITH_INSTALL_RPATH": {
|
|
||||||
"type": "BOOL",
|
|
||||||
"value": "OFF"
|
|
||||||
},
|
|
||||||
"CMAKE_CXX_STANDARD": "20",
|
"CMAKE_CXX_STANDARD": "20",
|
||||||
"CMAKE_INSTALL_RPATH": ".",
|
|
||||||
"CMAKE_INSTALL_PREFIX": "${sourceDir}/install/${presetName}",
|
"CMAKE_INSTALL_PREFIX": "${sourceDir}/install/${presetName}",
|
||||||
"CMAKE_PREFIX_PATH": "${sourceDir}/cmake/;${sourceDir}/.venv/lib/python3.10/site-packages/pybind11/share/cmake/pybind11",
|
"CMAKE_PREFIX_PATH": "${sourceDir}/cmake/;${sourceDir}/.venv/lib/python3.10/site-packages/pybind11/share/cmake/pybind11",
|
||||||
"CMAKE_EXE_LINKER_FLAGS": "-Wno-undef",
|
"CMAKE_EXE_LINKER_FLAGS": "-Wno-undef",
|
||||||
"CMAKE_TOOLCHAIN_FILE": "${sourceDir}/vcpkg/scripts/buildsystems/vcpkg.cmake",
|
|
||||||
"DATABENTO_USE_EXTERNAL_JSON": {
|
|
||||||
"type": "BOOL",
|
|
||||||
"value": "ON"
|
|
||||||
},
|
|
||||||
"EXTERNALS_ROOT": "${sourceDir}/externals/linux",
|
"EXTERNALS_ROOT": "${sourceDir}/externals/linux",
|
||||||
"BUILD_SDK": {
|
"BUILD_SDK": {
|
||||||
"type": "BOOL",
|
"type": "BOOL",
|
||||||
@@ -95,7 +76,7 @@
|
|||||||
"value": "ON"
|
"value": "ON"
|
||||||
},
|
},
|
||||||
"CCAPI_LOG_LEVEL": "Info",
|
"CCAPI_LOG_LEVEL": "Info",
|
||||||
"CONFIG_DEFAULTS_PATH": "spark/config/profiles/md_dev/*.conf;spark/config/profiles/default/*.conf"
|
"CONFIG_DEFAULTS_PATH": "config/profiles/md_dev/*.conf;config/profiles/default/*.conf"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -106,7 +87,7 @@
|
|||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
"CMAKE_BUILD_TYPE": "Release",
|
"CMAKE_BUILD_TYPE": "Release",
|
||||||
"CCAPI_LOG_LEVEL": "Warn",
|
"CCAPI_LOG_LEVEL": "Warn",
|
||||||
"CONFIG_DEFAULTS_PATH": "spark/config/profiles/md_prod/*.conf;spark/config/profiles/default/*.conf"
|
"CONFIG_DEFAULTS_PATH": "config/profiles/md_prod/*.conf;config/profiles/default/*.conf"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -159,17 +140,17 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "spark-linux",
|
"name": "spark-api-server-windows",
|
||||||
"inherits": "spark-base",
|
"inherits": "spark",
|
||||||
"displayName": "Spark",
|
"displayName": "Spark Api Server (Windows)"
|
||||||
"condition": {
|
},
|
||||||
"type": "equals",
|
|
||||||
"lhs": "${hostSystemName}",
|
{
|
||||||
"rhs": "Linux"
|
"name": "spark-api-server-linux",
|
||||||
},
|
"inherits": "sparkd",
|
||||||
|
"displayName": "Spark Api Server (Linux)",
|
||||||
"generator": "Ninja Multi-Config",
|
"generator": "Ninja Multi-Config",
|
||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
"platform": "linux",
|
|
||||||
"BUILD_ADMIN_WEB_APP": {
|
"BUILD_ADMIN_WEB_APP": {
|
||||||
"type": "BOOL",
|
"type": "BOOL",
|
||||||
"value": "OFF"
|
"value": "OFF"
|
||||||
@@ -178,26 +159,20 @@
|
|||||||
"type": "BOOL",
|
"type": "BOOL",
|
||||||
"value": "OFF"
|
"value": "OFF"
|
||||||
},
|
},
|
||||||
"CMAKE_BUILD_WITH_INSTALL_RPATH": {
|
|
||||||
"type": "BOOL",
|
|
||||||
"value": "OFF"
|
|
||||||
},
|
|
||||||
"CMAKE_C_COMPILER": "clang",
|
"CMAKE_C_COMPILER": "clang",
|
||||||
"CMAKE_CXX_COMPILER": "clang++",
|
"CMAKE_CXX_COMPILER": "clang++",
|
||||||
"CMAKE_CXX_FLAGS_DEBUG": "-g -fPIC -Wall -pedantic -Wextra -Werror -Wno-missing-braces -Wno-ignored-qualifiers --std=c++20 -fdiagnostics-color -DDEBUG",
|
"CMAKE_CXX_FLAGS_DEBUG": "-g -fPIC -Wall -pedantic -Wextra -Werror -Wno-missing-braces -Wno-ignored-qualifiers --std=c++20 -fdiagnostics-color -DDEBUG",
|
||||||
"CMAKE_CXX_FLAGS_RELEASE": "-fPIC -Wall -pedantic -Wextra -Werror -Wno-missing-braces -Wno-ignored-qualifiers --std=c++20 -fdiagnostics-color -fno-omit-frame-pointer -DNDEBUG -O3",
|
"CMAKE_CXX_FLAGS_RELEASE": "-fPIC -Wall -pedantic -Wextra -Werror -Wno-missing-braces -Wno-ignored-qualifiers --std=c++20 -fdiagnostics-color -fno-omit-frame-pointer -DNDEBUG -O3",
|
||||||
"CMAKE_EXE_LINKER_FLAGS": "-Wno-undef",
|
|
||||||
"CMAKE_EXPORT_COMPILE_COMMANDS": {
|
"CMAKE_EXPORT_COMPILE_COMMANDS": {
|
||||||
"type": "BOOL",
|
"type": "BOOL",
|
||||||
"value": "ON"
|
"value": "ON"
|
||||||
},
|
},
|
||||||
"CMAKE_INSTALL_RPATH": ".",
|
"CONFIG_DEFAULTS_PATH": "config/profiles/default/*.conf",
|
||||||
"CMAKE_PREFIX_PATH": "${sourceDir}/cmake/;${sourceDir}/.venv/lib/python3.10/site-packages/pybind11/share/cmake/pybind11",
|
"DOTNET_BINARY_DIR": "${sourceDir}/build/Spark.Api.Server/$<CONFIG>/bin/net7.0",
|
||||||
"DATABENTO_USE_EXTERNAL_JSON": {
|
"EXPORT_MD_CONSUMER": {
|
||||||
"type": "BOOL",
|
"type": "BOOL",
|
||||||
"value": "ON"
|
"value": "ON"
|
||||||
},
|
}
|
||||||
"EXTERNALS_ROOT": "${sourceDir}/externals/linux"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -217,32 +192,88 @@
|
|||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
"CCAPI_LOG_LEVEL": "Trace"
|
"CCAPI_LOG_LEVEL": "Trace"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
],
|
|
||||||
|
|
||||||
"buildPresets": [
|
|
||||||
{
|
{
|
||||||
"name": "spark-windows",
|
"name": "data-stream-suite-windows",
|
||||||
"condition": {
|
"condition": {
|
||||||
"type": "equals",
|
"type": "equals",
|
||||||
"lhs": "${hostSystemName}",
|
"lhs": "${hostSystemName}",
|
||||||
"rhs": "Windows"
|
"rhs": "Windows"
|
||||||
},
|
},
|
||||||
"hidden": true,
|
"inherits": "spark",
|
||||||
"configurePreset": "spark-windows"
|
"displayName": "Data Stream Suite (Windows)",
|
||||||
|
"description": "Data Stream utils ported over from Edge",
|
||||||
|
"binaryDir": "${sourceDir}/build/${presetName}",
|
||||||
|
"cacheVariables": {
|
||||||
|
"CONFIG_DEFAULTS_PATH": "config/profiles/default/*.conf;config/profiles/data_stream/*.conf",
|
||||||
|
"DOTNET_BINARY_DIR": "${sourceDir}/build/$<CONFIG>/bin/net7.0;${sourceDir}/build/$<CONFIG>/bin/net7.0-windows"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "spark-windows-debug",
|
"name": "data-stream-suite-linux",
|
||||||
|
"displayName": "Data Stream Suite (Linux)",
|
||||||
|
"description": "Data Stream utils ported over from Edge",
|
||||||
|
"condition": {
|
||||||
|
"type": "equals",
|
||||||
|
"lhs": "${hostSystemName}",
|
||||||
|
"rhs": "Linux"
|
||||||
|
},
|
||||||
|
"inherits": "sparkd",
|
||||||
|
"generator": "Ninja Multi-Config",
|
||||||
|
"cacheVariables": {
|
||||||
|
"BUILD_ADMIN_WEB_APP": {
|
||||||
|
"type": "BOOL",
|
||||||
|
"value": "OFF"
|
||||||
|
},
|
||||||
|
"BUILD_SDK": {
|
||||||
|
"type": "BOOL",
|
||||||
|
"value": "OFF"
|
||||||
|
},
|
||||||
|
"BUILD_SPARKD": {
|
||||||
|
"type": "BOOL",
|
||||||
|
"value": "OFF"
|
||||||
|
},
|
||||||
|
"CMAKE_C_COMPILER": "clang",
|
||||||
|
"CMAKE_CXX_COMPILER": "clang++",
|
||||||
|
"CMAKE_CXX_FLAGS_DEBUG": "-g -fPIC -Wall -pedantic -Wextra -Werror -Wno-missing-braces -Wno-ignored-qualifiers --std=c++20 -fdiagnostics-color -DDEBUG",
|
||||||
|
"CMAKE_CXX_FLAGS_RELEASE": "-fPIC -Wall -pedantic -Wextra -Werror -Wno-missing-braces -Wno-ignored-qualifiers --std=c++20 -fdiagnostics-color -fno-omit-frame-pointer -DNDEBUG -O3",
|
||||||
|
"CONFIG_DEFAULTS_PATH": "config/profiles/default/*.conf;config/profiles/data_stream/*.conf",
|
||||||
|
"CONFIG_PROFILES": "default;data_stream",
|
||||||
|
"DOTNET_BINARY_DIR": "${sourceDir}/build/$<CONFIG>/bin/net7.0;${sourceDir}/build/$<CONFIG>/bin/net8.0",
|
||||||
|
"EXPORT_MD_CONSUMER": {
|
||||||
|
"type": "BOOL",
|
||||||
|
"value": "ON"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
"buildPresets": [
|
||||||
|
{
|
||||||
|
"name": "spark",
|
||||||
|
"condition": {
|
||||||
|
"type": "equals",
|
||||||
|
"lhs": "${hostSystemName}",
|
||||||
|
"rhs": "Windows"
|
||||||
|
},
|
||||||
|
"hidden": true
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "spark-debug",
|
||||||
"displayName": "Spark (Debug)",
|
"displayName": "Spark (Debug)",
|
||||||
"inherits": "spark-windows",
|
"inherits": "spark",
|
||||||
|
"configurePreset": "spark",
|
||||||
"configuration": "Debug"
|
"configuration": "Debug"
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "spark-windows-release",
|
"name": "spark-release",
|
||||||
"displayName": "Spark (Release)",
|
"displayName": "Spark (Release)",
|
||||||
"inherits": "spark-windows",
|
"inherits": "spark",
|
||||||
|
"configurePreset": "spark",
|
||||||
"configuration": "Release"
|
"configuration": "Release"
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -263,6 +294,14 @@
|
|||||||
"inherits": "sparkd"
|
"inherits": "sparkd"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "sparkd-debug-clang-j6",
|
||||||
|
"configurePreset": "sparkd-debug-clang",
|
||||||
|
"displayName": "Sparkd (Debug | Clang | jobs=6)",
|
||||||
|
"inherits": "sparkd",
|
||||||
|
"jobs": 6
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "sparkd-debug-gcc",
|
"name": "sparkd-debug-gcc",
|
||||||
"configurePreset": "sparkd-debug-gcc",
|
"configurePreset": "sparkd-debug-gcc",
|
||||||
@@ -285,27 +324,52 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "spark-linux",
|
"name": "spark-api-server-windows",
|
||||||
|
"condition": {
|
||||||
|
"type": "equals",
|
||||||
|
"lhs": "${hostSystemName}",
|
||||||
|
"rhs": "Windows"
|
||||||
|
},
|
||||||
|
"hidden": true,
|
||||||
|
"configurePreset": "spark-api-server-windows"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "spark-api-server-windows-debug",
|
||||||
|
"displayName": "Spark Api Server (Windows | Debug)",
|
||||||
|
"inherits": "spark-api-server-windows",
|
||||||
|
"configuration": "Debug"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "spark-api-server-windows-release",
|
||||||
|
"displayName": "Spark Api Server (Windows | Release)",
|
||||||
|
"inherits": "spark-api-server-windows",
|
||||||
|
"configuration": "Release"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "spark-api-server-linux",
|
||||||
"condition": {
|
"condition": {
|
||||||
"type": "equals",
|
"type": "equals",
|
||||||
"lhs": "${hostSystemName}",
|
"lhs": "${hostSystemName}",
|
||||||
"rhs": "Linux"
|
"rhs": "Linux"
|
||||||
},
|
},
|
||||||
"hidden": true,
|
"hidden": true,
|
||||||
"configurePreset": "spark-linux"
|
"configurePreset": "spark-api-server-linux"
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "spark-linux-debug",
|
"name": "spark-api-server-linux-debug",
|
||||||
"inherits": "spark-linux",
|
"inherits": "spark-api-server-linux",
|
||||||
"displayName": "Spark (Linux | Debug)",
|
"displayName": "Spark Api Server (Linux | Debug)",
|
||||||
"configuration": "Debug"
|
"configuration": "Debug"
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "spark-linux-release",
|
"name": "spark-api-server-linux-release",
|
||||||
"inherits": "spark-linux",
|
"inherits": "spark-api-server-linux",
|
||||||
"displayName": "Spark (Linux | Release)",
|
"displayName": "Spark Api Server (Linux | Release)",
|
||||||
"configuration": "Release"
|
"configuration": "Release"
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -322,6 +386,34 @@
|
|||||||
"configurePreset": "sparkd-ccapi-diag",
|
"configurePreset": "sparkd-ccapi-diag",
|
||||||
"displayName": "Debug (ccapi diag)",
|
"displayName": "Debug (ccapi diag)",
|
||||||
"inherits": "sparkd"
|
"inherits": "sparkd"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "data-stream-suite-windows-debug",
|
||||||
|
"displayName": "Data Stream Suite (Windows | Debug)",
|
||||||
|
"configurePreset": "data-stream-suite-windows",
|
||||||
|
"configuration": "Debug"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "data-stream-suite-windows-release",
|
||||||
|
"displayName": "Data Stream Suite (Windows | Release)",
|
||||||
|
"configurePreset": "data-stream-suite-windows",
|
||||||
|
"configuration": "Release"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "data-stream-suite-linux-debug",
|
||||||
|
"displayName": "Data Stream Suite (Linux | Debug)",
|
||||||
|
"configurePreset": "data-stream-suite-linux",
|
||||||
|
"configuration": "Debug"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "data-stream-suite-linux-release",
|
||||||
|
"displayName": "Data Stream Suite (Linux | Release)",
|
||||||
|
"configurePreset": "data-stream-suite-linux",
|
||||||
|
"configuration": "Release"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
+3
-522
@@ -1,11 +1,10 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio Version 17
|
# Visual Studio Version 17
|
||||||
VisualStudioVersion = 17.3.32922.545
|
VisualStudioVersion = 17.3.32922.545
|
||||||
MinimumVisualStudioVersion = 15.0.26124.0
|
MinimumVisualStudioVersion = 15.0.26124.0
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bts.Spark.Api", "src\cs\Bts.Spark.Api\Bts.Spark.Api.csproj", "{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_api", "src\client\spark_api\spark_api.csproj", "{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bts.Spark.Core", "src\cs\Bts.Spark.Core\Bts.Spark.Core.csproj", "{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_core", "src\client\spark_core\spark_core.csproj", "{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_websocket", "src\client\spark_websocket\spark_websocket.csproj", "{3201359D-C071-4089-9EDE-B04D759F1508}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_websocket", "src\client\spark_websocket\spark_websocket.csproj", "{3201359D-C071-4089-9EDE-B04D759F1508}"
|
||||||
EndProject
|
EndProject
|
||||||
@@ -15,584 +14,66 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "spark_test", "src\client\sp
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spark.Console", "src\client\Spark.Console\Spark.Console.csproj", "{89D666E6-B500-498F-B026-4D167F68ADFC}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spark.Console", "src\client\Spark.Console\Spark.Console.csproj", "{89D666E6-B500-498F-B026-4D167F68ADFC}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{267F81EF-A8AB-49FD-9F56-D7EC3C1F7C7C}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DataStreamSuite", "DataStreamSuite", "{C09ED521-D2DF-40BC-A76F-EB3CB870B2F6}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataStreamCore", "src\DataStreamSuite\DataStreamCore\DataStreamCore.csproj", "{EF26A475-6101-4C9C-A717-D60BB92A2302}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedStreams", "src\DataStreamSuite\SharedStreams\SharedStreams.csproj", "{911B08A3-515A-441D-84C8-8A43740B5FC1}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PubSub", "src\DataStreamSuite\PubSub\PubSub.csproj", "{14140310-2233-430A-821B-F3058A25234B}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BaseUtilities", "src\DataStreamSuite\BaseUtilities\BaseUtilities.csproj", "{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExpressionCore", "src\DataStreamSuite\ExpressionCore\ExpressionCore.csproj", "{6F22DB96-6EAB-4034-99D9-287021C36F01}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArithmeticExpressions", "src\DataStreamSuite\ArithmeticExpressions\ArithmeticExpressions.csproj", "{A5C33956-A41F-49B3-A41D-1082CBA59D02}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataStreamExpressions", "src\DataStreamSuite\DataStreamExpressions\DataStreamExpressions.csproj", "{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.ColumnSortExpressions", "src\DataStreamSuite\Bts.ColumnSortExpressions\Bts.ColumnSortExpressions.csproj", "{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ColumnMapExpressions", "src\DataStreamSuite\ColumnMapExpressions\ColumnMapExpressions.csproj", "{B945A183-2174-4ACB-B289-8A5C546656FE}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooleanExpressions", "src\DataStreamSuite\BooleanExpressions\BooleanExpressions.csproj", "{9F6D7DE8-185B-4C1D-B809-3314D092DF28}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.ColumnExpressions", "src\DataStreamSuite\Bts.ColumnExpressions\Bts.ColumnExpressions.csproj", "{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataStream", "src\DataStreamSuite\DataStream\DataStream.csproj", "{39AEA075-6457-46C0-8821-1158BE6EFA57}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.Extensions.Hosting", "src\cs\Bts.Extensions.Hosting\Bts.Extensions.Hosting.csproj", "{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cs", "cs", "{385C4948-E080-56A6-E29E-8B0F4913175C}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.Net", "src\cs\Bts.Net\Bts.Net.csproj", "{43FB297B-7A4D-4835-A878-E6DF345B580C}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.IO.Compression", "src\cs\Bts.IO.Compression\Bts.IO.Compression.csproj", "{BC277499-8215-4F9F-B9AB-07B6391110BF}"
|
|
||||||
EndProject
|
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|x64 = Debug|x64
|
Debug|x64 = Debug|x64
|
||||||
Debug|Any CPU = Debug|Any CPU
|
|
||||||
Debug|x86 = Debug|x86
|
|
||||||
MinSizeRel|x64 = MinSizeRel|x64
|
MinSizeRel|x64 = MinSizeRel|x64
|
||||||
MinSizeRel|Any CPU = MinSizeRel|Any CPU
|
|
||||||
MinSizeRel|x86 = MinSizeRel|x86
|
|
||||||
Release|x64 = Release|x64
|
Release|x64 = Release|x64
|
||||||
Release|Any CPU = Release|Any CPU
|
|
||||||
Release|x86 = Release|x86
|
|
||||||
RelWithDebInfo|x64 = RelWithDebInfo|x64
|
RelWithDebInfo|x64 = RelWithDebInfo|x64
|
||||||
RelWithDebInfo|Any CPU = RelWithDebInfo|Any CPU
|
|
||||||
RelWithDebInfo|x86 = RelWithDebInfo|x86
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|x64.ActiveCfg = Debug|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|x64.Build.0 = Debug|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|x64.Build.0 = Debug|x64
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|x64.ActiveCfg = Release|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|x64.ActiveCfg = Release|x64
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|x64.Build.0 = Release|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|x64.Build.0 = Release|x64
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|x64.ActiveCfg = Release|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|x64.ActiveCfg = Release|x64
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|x64.Build.0 = Release|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|x64.Build.0 = Release|x64
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|x64.Build.0 = Release|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|x64.ActiveCfg = Debug|x64
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|x64.Build.0 = Debug|x64
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|x64.Build.0 = Debug|x64
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|x64.ActiveCfg = Release|x64
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|x64.ActiveCfg = Release|x64
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|x64.Build.0 = Release|x64
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|x64.Build.0 = Release|x64
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|x64.ActiveCfg = Release|x64
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|x64.ActiveCfg = Release|x64
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|x64.Build.0 = Release|x64
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|x64.Build.0 = Release|x64
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|x64.Build.0 = Release|x64
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.Debug|x64.ActiveCfg = Debug|x64
|
{3201359D-C071-4089-9EDE-B04D759F1508}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.Debug|x64.Build.0 = Debug|x64
|
{3201359D-C071-4089-9EDE-B04D759F1508}.Debug|x64.Build.0 = Debug|x64
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.MinSizeRel|x64.ActiveCfg = Debug|x64
|
{3201359D-C071-4089-9EDE-B04D759F1508}.MinSizeRel|x64.ActiveCfg = Debug|x64
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.MinSizeRel|x64.Build.0 = Debug|x64
|
{3201359D-C071-4089-9EDE-B04D759F1508}.MinSizeRel|x64.Build.0 = Debug|x64
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.Release|x64.ActiveCfg = Release|x64
|
{3201359D-C071-4089-9EDE-B04D759F1508}.Release|x64.ActiveCfg = Release|x64
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.Release|x64.Build.0 = Release|x64
|
{3201359D-C071-4089-9EDE-B04D759F1508}.Release|x64.Build.0 = Release|x64
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
{3201359D-C071-4089-9EDE-B04D759F1508}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.RelWithDebInfo|x64.Build.0 = Release|x64
|
{3201359D-C071-4089-9EDE-B04D759F1508}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{3201359D-C071-4089-9EDE-B04D759F1508}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Debug|x64.ActiveCfg = Debug|x64
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Debug|x64.Build.0 = Debug|x64
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Debug|x64.Build.0 = Debug|x64
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.MinSizeRel|x64.ActiveCfg = Debug|x64
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.MinSizeRel|x64.ActiveCfg = Debug|x64
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.MinSizeRel|x64.Build.0 = Debug|x64
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.MinSizeRel|x64.Build.0 = Debug|x64
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Release|x64.ActiveCfg = Release|x64
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Release|x64.ActiveCfg = Release|x64
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Release|x64.Build.0 = Release|x64
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Release|x64.Build.0 = Release|x64
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.RelWithDebInfo|x64.Build.0 = Release|x64
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Debug|x64.ActiveCfg = Debug|x64
|
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Debug|x64.Build.0 = Debug|x64
|
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Debug|x64.Build.0 = Debug|x64
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.MinSizeRel|x64.ActiveCfg = Debug|x64
|
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.MinSizeRel|x64.ActiveCfg = Debug|x64
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.MinSizeRel|x64.Build.0 = Debug|x64
|
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.MinSizeRel|x64.Build.0 = Debug|x64
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Release|x64.ActiveCfg = Release|x64
|
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Release|x64.ActiveCfg = Release|x64
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Release|x64.Build.0 = Release|x64
|
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Release|x64.Build.0 = Release|x64
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.RelWithDebInfo|x64.ActiveCfg = Debug|x64
|
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.RelWithDebInfo|x64.ActiveCfg = Debug|x64
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.RelWithDebInfo|x64.Build.0 = Debug|x64
|
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.RelWithDebInfo|x64.Build.0 = Debug|x64
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{EFC9FC4D-E92B-4C6D-9B97-26D38EAA118D}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.Debug|x64.ActiveCfg = Debug|x64
|
{89D666E6-B500-498F-B026-4D167F68ADFC}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.Debug|x64.Build.0 = Debug|x64
|
{89D666E6-B500-498F-B026-4D167F68ADFC}.Debug|x64.Build.0 = Debug|x64
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.MinSizeRel|x64.ActiveCfg = Debug|x64
|
{89D666E6-B500-498F-B026-4D167F68ADFC}.MinSizeRel|x64.ActiveCfg = Debug|x64
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.MinSizeRel|x64.Build.0 = Debug|x64
|
{89D666E6-B500-498F-B026-4D167F68ADFC}.MinSizeRel|x64.Build.0 = Debug|x64
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.Release|x64.ActiveCfg = Release|x64
|
{89D666E6-B500-498F-B026-4D167F68ADFC}.Release|x64.ActiveCfg = Release|x64
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.Release|x64.Build.0 = Release|x64
|
{89D666E6-B500-498F-B026-4D167F68ADFC}.Release|x64.Build.0 = Release|x64
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.RelWithDebInfo|x64.ActiveCfg = Debug|x64
|
{89D666E6-B500-498F-B026-4D167F68ADFC}.RelWithDebInfo|x64.ActiveCfg = Debug|x64
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.RelWithDebInfo|x64.Build.0 = Debug|x64
|
{89D666E6-B500-498F-B026-4D167F68ADFC}.RelWithDebInfo|x64.Build.0 = Debug|x64
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{89D666E6-B500-498F-B026-4D167F68ADFC}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.MinSizeRel|Any CPU.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.MinSizeRel|x86.ActiveCfg = MinSizeRel|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.MinSizeRel|x86.Build.0 = MinSizeRel|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.MinSizeRel|x86.Build.0 = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.RelWithDebInfo|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{F3DC52D7-8C59-4EC0-86D9-0E5732EAFCF7}.RelWithDebInfo|x86.Build.0 = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.MinSizeRel|x86.Build.0 = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.RelWithDebInfo|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C}.RelWithDebInfo|x86.Build.0 = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.MinSizeRel|x64.Build.0 = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.MinSizeRel|x86.Build.0 = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.RelWithDebInfo|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF}.RelWithDebInfo|x86.Build.0 = Debug|Any CPU
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(NestedProjects) = preSolution
|
|
||||||
{C09ED521-D2DF-40BC-A76F-EB3CB870B2F6} = {267F81EF-A8AB-49FD-9F56-D7EC3C1F7C7C}
|
|
||||||
{EF26A475-6101-4C9C-A717-D60BB92A2302} = {C09ED521-D2DF-40BC-A76F-EB3CB870B2F6}
|
|
||||||
{911B08A3-515A-441D-84C8-8A43740B5FC1} = {C09ED521-D2DF-40BC-A76F-EB3CB870B2F6}
|
|
||||||
{14140310-2233-430A-821B-F3058A25234B} = {C09ED521-D2DF-40BC-A76F-EB3CB870B2F6}
|
|
||||||
{43146EA8-6FCC-46B8-88B0-42F9BB5E6E0A} = {C09ED521-D2DF-40BC-A76F-EB3CB870B2F6}
|
|
||||||
{6F22DB96-6EAB-4034-99D9-287021C36F01} = {C09ED521-D2DF-40BC-A76F-EB3CB870B2F6}
|
|
||||||
{A5C33956-A41F-49B3-A41D-1082CBA59D02} = {C09ED521-D2DF-40BC-A76F-EB3CB870B2F6}
|
|
||||||
{2FE745C3-1EDF-4421-8CD7-A63EE0C1AE43} = {C09ED521-D2DF-40BC-A76F-EB3CB870B2F6}
|
|
||||||
{FDA791E0-2B91-4AD5-B91D-CF920A4C4E38} = {C09ED521-D2DF-40BC-A76F-EB3CB870B2F6}
|
|
||||||
{B945A183-2174-4ACB-B289-8A5C546656FE} = {C09ED521-D2DF-40BC-A76F-EB3CB870B2F6}
|
|
||||||
{9F6D7DE8-185B-4C1D-B809-3314D092DF28} = {C09ED521-D2DF-40BC-A76F-EB3CB870B2F6}
|
|
||||||
{6BD3F6D8-B6FC-44E8-B8FE-06352F638B9B} = {C09ED521-D2DF-40BC-A76F-EB3CB870B2F6}
|
|
||||||
{39AEA075-6457-46C0-8821-1158BE6EFA57} = {C09ED521-D2DF-40BC-A76F-EB3CB870B2F6}
|
|
||||||
{385C4948-E080-56A6-E29E-8B0F4913175C} = {267F81EF-A8AB-49FD-9F56-D7EC3C1F7C7C}
|
|
||||||
{43FB297B-7A4D-4835-A878-E6DF345B580C} = {385C4948-E080-56A6-E29E-8B0F4913175C}
|
|
||||||
{BC277499-8215-4F9F-B9AB-07B6391110BF} = {385C4948-E080-56A6-E29E-8B0F4913175C}
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {422D1620-0166-4C26-9A81-CA8A2EB1AB58}
|
SolutionGuid = {422D1620-0166-4C26-9A81-CA8A2EB1AB58}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
include_guard(GLOBAL)
|
|
||||||
|
|
||||||
macro(export_to_parent)
|
macro(export_to_parent)
|
||||||
foreach(var IN ITEMS ${ARGN})
|
foreach(var IN ITEMS ${ARGN})
|
||||||
set(${var} ${${var}} PARENT_SCOPE)
|
set(${var} ${${var}} PARENT_SCOPE)
|
||||||
|
|||||||
@@ -1,48 +0,0 @@
|
|||||||
include_guard(GLOBAL)
|
|
||||||
|
|
||||||
function(get_version_from_git)
|
|
||||||
find_package(Git QUIET)
|
|
||||||
if(NOT Git_FOUND)
|
|
||||||
message(WARNING "Git not found")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${GIT_EXECUTABLE} describe --tags --always
|
|
||||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE GIT_TAG
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
RESULT_VARIABLE GIT_RESULT
|
|
||||||
)
|
|
||||||
|
|
||||||
if(NOT GIT_RESULT EQUAL 0)
|
|
||||||
message(WARNING "Failed to get git tag")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${GIT_EXECUTABLE} rev-parse --short=7 HEAD
|
|
||||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE GIT_COMMIT_SHORT_HASH
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
set(PROJECT_VERSION_BUILD_METADATA ${GIT_COMMIT_SHORT_HASH})
|
|
||||||
set(PROJECT_VERSION_BUILD_METADATA ${GIT_COMMIT_SHORT_HASH} PARENT_SCOPE)
|
|
||||||
|
|
||||||
string(REGEX REPLACE "^v" "" CLEAN_TAG "${GIT_TAG}")
|
|
||||||
if(CLEAN_TAG MATCHES "^([0-9]+)\\.([0-9]+)\\.([0-9]+)(-.*)?$")
|
|
||||||
set(PROJECT_VERSION_MAJOR ${CMAKE_MATCH_1})
|
|
||||||
set(PROJECT_VERSION_MAJOR ${CMAKE_MATCH_1} PARENT_SCOPE)
|
|
||||||
set(PROJECT_VERSION_MINOR ${CMAKE_MATCH_2})
|
|
||||||
set(PROJECT_VERSION_MINOR ${CMAKE_MATCH_2} PARENT_SCOPE)
|
|
||||||
set(PROJECT_VERSION_PATCH ${CMAKE_MATCH_3})
|
|
||||||
set(PROJECT_VERSION_PATCH ${CMAKE_MATCH_3} PARENT_SCOPE)
|
|
||||||
|
|
||||||
set(PROJECT_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}")
|
|
||||||
set(PROJECT_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}" PARENT_SCOPE)
|
|
||||||
set(PROJECT_VERSION_FULL "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}+${GIT_COMMIT_SHORT_HASH}")
|
|
||||||
set(PROJECT_VERSION_FULL "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}+${GIT_COMMIT_SHORT_HASH}" PARENT_SCOPE)
|
|
||||||
else()
|
|
||||||
message(WARNING "Tag '${CLEAN_TAG}' does not match semver format")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
+23
-99
@@ -1,142 +1,66 @@
|
|||||||
include_guard(DIRECTORY)
|
include_guard(DIRECTORY)
|
||||||
include(${CMAKE_SOURCE_DIR}/cmake/ExportToParent.cmake)
|
include(${CMAKE_SOURCE_DIR}/cmake/ExportToParent.cmake)
|
||||||
include(${CMAKE_SOURCE_DIR}/cmake/InstallBasic.cmake)
|
include(${CMAKE_SOURCE_DIR}/cmake/TernaryOperator.cmake)
|
||||||
include(${CMAKE_SOURCE_DIR}/cmake/ProtobufGenerateCpp.cmake)
|
|
||||||
include(${CMAKE_SOURCE_DIR}/cmake/SetFirstDefined.cmake)
|
|
||||||
include(${CMAKE_SOURCE_DIR}/cmake/safe_dep_glob.cmake)
|
|
||||||
|
|
||||||
function(init_library)
|
function(init_library)
|
||||||
set(_options SHARED STATIC)
|
set(_options SHARED STATIC)
|
||||||
set(_one_value_args
|
set(_one_value_args SOURCE_DIR)
|
||||||
NAME
|
|
||||||
SOURCE_DIR
|
|
||||||
INCLUDE_DIR
|
|
||||||
)
|
|
||||||
set(_multi_value_args)
|
set(_multi_value_args)
|
||||||
cmake_parse_arguments(_ARGS "${_options}" "${_one_value_args}" "${_multi_value_args}" ${ARGN})
|
cmake_parse_arguments(_ARGS "${_options}" "${_one_value_args}" "${_multi_value_args}" ${ARGN})
|
||||||
|
|
||||||
if (_ARGS_SHARED AND _ARGS_STATIC)
|
if (_ARGS_SHARED AND _ARGS_STATIC)
|
||||||
message(FATAL_ERROR "Invalid args passed to init_library: cannot specify STATIC and SHARED")
|
message(FATAL_ERROR "Invalid args passed to init_library: cannot specify STATIC and SHARED")
|
||||||
endif()
|
endif()
|
||||||
set_first_defined(_name _ARGS_NAME PROJECT_NAME)
|
|
||||||
set_first_defined(_source_dir _ARGS_SOURCE_DIR _name)
|
|
||||||
set_first_defined(_include_dir _ARGS_INCLUDE_DIR _source_dir)
|
|
||||||
|
|
||||||
# Cpp sources
|
set_ternary(_source_dir _ARGS_SOURCE_DIR _ARGS_SOURCE_DIR ${PROJECT_NAME})
|
||||||
|
# Glob cpp sources
|
||||||
file(
|
file(
|
||||||
GLOB_RECURSE ${_name}_SOURCES
|
GLOB_RECURSE ${PROJECT_NAME}_SOURCES
|
||||||
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
|
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
${_source_dir}/*.cpp
|
${_source_dir}/*.cpp
|
||||||
)
|
)
|
||||||
# Note: cpp files inside 'tests' dir(s) are considered tests.
|
# Note: cpp files inside 'tests' dir(s) are considered tests.
|
||||||
# Remove tests from main sources, and add them to test sources
|
# Remove tests from main sources, and add them to test sources
|
||||||
foreach(item ${${_name}_SOURCES})
|
foreach(item ${${PROJECT_NAME}_SOURCES})
|
||||||
if(${item} MATCHES "tests/.*\.cpp$")
|
if(${item} MATCHES "tests/*.cpp")
|
||||||
list(APPEND ${_name}_TEST_SOURCES ${item})
|
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${item})
|
||||||
|
list(APPEND ${PROJECT_NAME}_TEST_SOURCES ${item})
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
foreach(item ${${_name}_TEST_SOURCES})
|
|
||||||
list(REMOVE_ITEM ${_name}_SOURCES ${item})
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
# Proto sources
|
|
||||||
file(
|
|
||||||
GLOB_RECURSE ${_name}_PROTO_SOURCES
|
|
||||||
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
${_source_dir}/protobufs/*.proto
|
|
||||||
)
|
|
||||||
update_deps_file("${${_name}_PROTO_SOURCES};")
|
|
||||||
protobuf_generate_cpp(
|
|
||||||
CXX_SOURCES ${_name}_CXX_PROTO_SOURCES
|
|
||||||
CXX_HEADERS ${_name}_CXX_PROTO_HEADERS
|
|
||||||
CXX_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
PROTO_INCLUDE_DIRS
|
|
||||||
${EXTERNALS_INCLUDE}
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
PROTO_SOURCES
|
|
||||||
${${_name}_PROTO_SOURCES}
|
|
||||||
)
|
|
||||||
|
|
||||||
export_to_parent(
|
export_to_parent(
|
||||||
${_name}_SOURCES
|
${PROJECT_NAME}_SOURCES
|
||||||
${_name}_TEST_SOURCES
|
${PROJECT_NAME}_TEST_SOURCES
|
||||||
${_name}_PROTO_SOURCES
|
|
||||||
${_name}_CXX_PROTO_SOURCES
|
|
||||||
${_name}_CXX_PROTO_HEADERS
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Add main lib
|
# Add main library
|
||||||
if (_ARGS_STATIC)
|
if (_ARGS_STATIC)
|
||||||
add_library(${_name} STATIC ${${_name}_SOURCES} ${${_name}_CXX_PROTO_SOURCES})
|
add_library(${PROJECT_NAME} STATIC ${${PROJECT_NAME}_SOURCES})
|
||||||
elseif(_ARGS_SHARED)
|
elseif(_ARGS_SHARED)
|
||||||
add_library(${_name} SHARED ${${_name}_SOURCES} ${${_name}_CXX_PROTO_SOURCES})
|
add_library(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SOURCES})
|
||||||
else()
|
else()
|
||||||
add_library(${_name} ${${_name}_SOURCES} ${${_name}_CXX_PROTO_SOURCES})
|
add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SOURCES})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
${_name}
|
${PROJECT_NAME}
|
||||||
SYSTEM
|
|
||||||
BEFORE
|
|
||||||
PUBLIC
|
|
||||||
$<BUILD_INTERFACE:${EXTERNALS_ROOT}/include>
|
|
||||||
$<BUILD_INTERFACE:${EXTERNALS_ROOT}/include/zlib>
|
|
||||||
)
|
|
||||||
target_include_directories(
|
|
||||||
${_name}
|
|
||||||
PUBLIC
|
PUBLIC
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||||
)
|
)
|
||||||
# Include protos (if any)
|
|
||||||
if (${_name}_PROTO_SOURCES)
|
|
||||||
target_include_directories(
|
|
||||||
${_name}
|
|
||||||
PUBLIC
|
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
target_link_directories(
|
target_link_directories(
|
||||||
${_name}
|
${PROJECT_NAME}
|
||||||
PUBLIC
|
PUBLIC
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
|
||||||
$<BUILD_INTERFACE:${EXTERNALS_ROOT}/lib/$<CONFIG>>
|
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_LIBDIR}>
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_LIBDIR}>
|
||||||
)
|
)
|
||||||
# Install main lib
|
|
||||||
foreach(_hdr ${${_name}_CXX_PROTO_HEADERS})
|
|
||||||
file(RELATIVE_PATH _relative_path ${CMAKE_CURRENT_BINARY_DIR} ${_hdr})
|
|
||||||
install(FILES ${_hdr} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${_relative_path})
|
|
||||||
endforeach()
|
|
||||||
install_basic(
|
|
||||||
NAME ${_name}
|
|
||||||
INCLUDE_DIR ${_include_dir}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Add tests executable (if there are any)
|
# Add tests executable (if there are any)
|
||||||
if (${_name}_TEST_SOURCES AND NOT WIN32)
|
if (${PROJECT_NAME}_TEST_SOURCES)
|
||||||
add_executable(${_name}-tests ${${_name}_TEST_SOURCES})
|
add_executable(${PROJECT_NAME}-tests ${${PROJECT_NAME}_TEST_SOURCES})
|
||||||
|
target_link_libraries(${PROJECT_NAME}-tests PRIVATE ${PROJECT_NAME})
|
||||||
get_target_property(_lib_type ${_name} TYPE)
|
|
||||||
if (_lib_type STREQUAL "SHARED_LIBRARY")
|
|
||||||
# Set RPATH so the tests exe knows where to find the shared lib.
|
|
||||||
set_target_properties(
|
|
||||||
${_name}-tests
|
|
||||||
PROPERTIES
|
|
||||||
BUILD_RPATH "$ORIGIN"
|
|
||||||
INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Link main lib
|
|
||||||
target_link_directories(
|
|
||||||
${_name}-tests
|
|
||||||
PRIVATE
|
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
|
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_LIBDIR}>
|
|
||||||
)
|
|
||||||
target_link_libraries(${_name}-tests PRIVATE ${_name})
|
|
||||||
|
|
||||||
# Catch2
|
# Catch2
|
||||||
find_package(Catch2 CONFIG REQUIRED COMPONENTS Catch2WithMain)
|
find_package(Catch2 CONFIG REQUIRED COMPONENTS Catch2WithMain)
|
||||||
target_link_libraries(${_name}-tests PRIVATE Catch2::Catch2WithMain)
|
target_link_libraries(${PROJECT_NAME}-tests PRIVATE Catch2::Catch2WithMain)
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
include_guard(DIRECTORY)
|
|
||||||
include(GNUInstallDirs)
|
|
||||||
include(${CMAKE_SOURCE_DIR}/cmake/ExportToParent.cmake)
|
|
||||||
include(${CMAKE_SOURCE_DIR}/cmake/SetFirstDefined.cmake)
|
|
||||||
|
|
||||||
function(init_python_module)
|
|
||||||
set(_options)
|
|
||||||
set(_one_value_args
|
|
||||||
NAME
|
|
||||||
)
|
|
||||||
set(_multi_value_args
|
|
||||||
SOURCES
|
|
||||||
)
|
|
||||||
cmake_parse_arguments(_ARGS "${_options}" "${_one_value_args}" "${_multi_value_args}" ${ARGN})
|
|
||||||
set_first_defined(_name _ARGS_NAME PROJECT_NAME)
|
|
||||||
set_first_defined(_sources _ARGS_SOURCES ${_name}_SOURCES)
|
|
||||||
|
|
||||||
set(module_proj ${_name}_module)
|
|
||||||
set(${module_proj}_SOURCES ${_sources})
|
|
||||||
pybind11_add_module(${module_proj} SHARED ${_sources})
|
|
||||||
target_link_libraries(
|
|
||||||
${module_proj}
|
|
||||||
PUBLIC
|
|
||||||
pybind11::embed
|
|
||||||
spark
|
|
||||||
${_name}
|
|
||||||
)
|
|
||||||
target_include_directories(
|
|
||||||
${module_proj}
|
|
||||||
PRIVATE
|
|
||||||
$<BUILD_INTERFACE:${pybind11_INCLUDE_DIRS}>
|
|
||||||
)
|
|
||||||
target_include_directories(
|
|
||||||
${module_proj}
|
|
||||||
PUBLIC
|
|
||||||
${Python3_INCLUDE_DIRS}
|
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
|
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
|
||||||
)
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/stubs/${_name}.pyi
|
|
||||||
DEPENDS ${_name} ${module_proj}
|
|
||||||
COMMAND PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR} pybind11-stubgen --numpy-array-use-type-var --ignore-invalid-expressions '.*' ${_name}_module
|
|
||||||
COMMENT "Generating py stubs"
|
|
||||||
)
|
|
||||||
add_custom_target(
|
|
||||||
"${_name}_py_stubs"
|
|
||||||
ALL
|
|
||||||
DEPENDS
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/stubs/${_name}.pyi
|
|
||||||
)
|
|
||||||
install(
|
|
||||||
TARGETS ${module_proj}
|
|
||||||
EXPORT ${module_proj}Targets
|
|
||||||
RUNTIME
|
|
||||||
DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
||||||
LIBRARY
|
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
||||||
ARCHIVE
|
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
||||||
)
|
|
||||||
foreach(dir ${pybind11_INCLUDE_DIRS})
|
|
||||||
install(DIRECTORY ${dir} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
|
||||||
endforeach()
|
|
||||||
install(
|
|
||||||
EXPORT ${module_proj}Targets
|
|
||||||
FILE ${module_proj}Targets.cmake
|
|
||||||
NAMESPACE ${_name}::
|
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${_name}
|
|
||||||
)
|
|
||||||
endfunction()
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
include_guard(DIRECTORY)
|
|
||||||
include(GNUInstallDirs)
|
|
||||||
|
|
||||||
function(init_python_plugin)
|
|
||||||
set(_options)
|
|
||||||
set(_one_value_args NAME PLUGIN_NAME)
|
|
||||||
set(_multi_value_args SOURCES)
|
|
||||||
cmake_parse_arguments(_ARGS "${_options}" "${_one_value_args}" "${_multi_value_args}" ${ARGN})
|
|
||||||
set_first_defined(_name _ARGS_NAME PROJECT_NAME)
|
|
||||||
set(_plugin_name ${_ARGS_PLUGIN_NAME})
|
|
||||||
if (NOT DEFINED _ARGS_PLUGIN_NAME)
|
|
||||||
set(_plugin_name ${_name}_plugins)
|
|
||||||
endif()
|
|
||||||
set(${_plugin_name}_SOURCES ${_ARGS_SOURCES})
|
|
||||||
if (NOT DEFINED _ARGS_SOURCES)
|
|
||||||
file(
|
|
||||||
GLOB_RECURSE ${_plugin_name}_SOURCES
|
|
||||||
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
${_plugin_name}/*.py)
|
|
||||||
endif()
|
|
||||||
set(src_outs)
|
|
||||||
foreach(_src ${${_plugin_name}_SOURCES})
|
|
||||||
set(_src_in ${CMAKE_CURRENT_SOURCE_DIR}/${_src})
|
|
||||||
set(_src_out ${CMAKE_CURRENT_BINARY_DIR}/${_src})
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${_src_out}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy ${_src_in} ${_src_out}
|
|
||||||
DEPENDS ${_src_in}
|
|
||||||
COMMENT "Copying ${_plugin_name} plugin ${_src} to ${_src_out}"
|
|
||||||
)
|
|
||||||
list(APPEND src_outs ${_src_out})
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
add_custom_target(copy_${_plugin_name} ALL DEPENDS ${src_outs})
|
|
||||||
|
|
||||||
add_library(${_plugin_name} INTERFACE)
|
|
||||||
add_library(${_name}::${_plugin_name} ALIAS ${_plugin_name})
|
|
||||||
|
|
||||||
set_target_properties(
|
|
||||||
${_plugin_name}
|
|
||||||
PROPERTIES
|
|
||||||
INTERFACE_PYTHON_SCRIPTS_DIR
|
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/${_plugin_name}>$<INSTALL_INTERFACE:${CMAKE_INSTALL_BINDIR}/${_plugin_name}>
|
|
||||||
)
|
|
||||||
|
|
||||||
set_target_properties(
|
|
||||||
${_plugin_name}
|
|
||||||
PROPERTIES
|
|
||||||
INTERFACE_PYTHON_SCRIPTS $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/${${_plugin_name}_SOURCES}>$<INSTALL_INTERFACE:${CMAKE_INSTALL_BINDIR}/${${_plugin_name}_SOURCES}>
|
|
||||||
)
|
|
||||||
|
|
||||||
install(
|
|
||||||
TARGETS ${_plugin_name}
|
|
||||||
EXPORT ${_plugin_name}Targets
|
|
||||||
DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
||||||
)
|
|
||||||
|
|
||||||
install(
|
|
||||||
EXPORT ${_plugin_name}Targets
|
|
||||||
FILE ${_plugin_name}Targets.cmake
|
|
||||||
NAMESPACE ${_name}::
|
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${_name}
|
|
||||||
)
|
|
||||||
install(DIRECTORY ${_plugin_name} DESTINATION ${CMAKE_INSTALL_BINDIR})
|
|
||||||
endfunction()
|
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
function(init_shared_library)
|
||||||
|
include(${CMAKE_SOURCE_DIR}/cmake/ExportToParent.cmake)
|
||||||
|
set(source_dir)
|
||||||
|
if (${ARGC} EQUAL 0)
|
||||||
|
set(source_dir ${PROJECT_NAME})
|
||||||
|
elseif(${ARGC} GREATER 1)
|
||||||
|
message(FATAL_ERROR "init_shared_library received invalid arguments. Usage: init_shared_library(<OPTIONAL:source_dir>)")
|
||||||
|
else()
|
||||||
|
set(source_dir ${ARGV})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Glob cpp sources
|
||||||
|
file(
|
||||||
|
GLOB_RECURSE ${PROJECT_NAME}_SOURCES
|
||||||
|
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
${source_dir}/*.cpp
|
||||||
|
)
|
||||||
|
# Note: cpp files inside 'tests' dir(s) are considered tests.
|
||||||
|
# Remove tests from main sources, and add them to test sources
|
||||||
|
foreach(item ${${PROJECT_NAME}_SOURCES})
|
||||||
|
if(${item} MATCHES "tests/*.cpp")
|
||||||
|
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${item})
|
||||||
|
list(APPEND ${PROJECT_NAME}_TEST_SOURCES ${item})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
export_to_parent(
|
||||||
|
${PROJECT_NAME}_SOURCES
|
||||||
|
${PROJECT_NAME}_TEST_SOURCES
|
||||||
|
)
|
||||||
|
|
||||||
|
# Add main library
|
||||||
|
add_library(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SOURCES})
|
||||||
|
target_include_directories(
|
||||||
|
${PROJECT_NAME}
|
||||||
|
PUBLIC
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
|
||||||
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||||
|
)
|
||||||
|
target_link_directories(
|
||||||
|
${PROJECT_NAME}
|
||||||
|
PUBLIC
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
|
||||||
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_LIBDIR}>
|
||||||
|
)
|
||||||
|
|
||||||
|
# Add tests executable (if there are any)
|
||||||
|
if (${PROJECT_NAME}_TEST_SOURCES)
|
||||||
|
add_executable(${PROJECT_NAME}-tests ${${PROJECT_NAME}_TEST_SOURCES})
|
||||||
|
target_link_libraries(${PROJECT_NAME}-tests PRIVATE ${PROJECT_NAME})
|
||||||
|
# Catch2
|
||||||
|
find_package(Catch2 CONFIG REQUIRED COMPONENTS Catch2WithMain)
|
||||||
|
target_link_libraries(${PROJECT_NAME}-tests PRIVATE Catch2::Catch2WithMain)
|
||||||
|
endif()
|
||||||
|
endfunction(init_shared_library)
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
include_guard(DIRECTORY)
|
|
||||||
include(GNUInstallDirs)
|
|
||||||
include(${CMAKE_SOURCE_DIR}/cmake/PackBasic.cmake)
|
|
||||||
include(${CMAKE_SOURCE_DIR}/cmake/SetFirstDefined.cmake)
|
|
||||||
|
|
||||||
function(install_basic)
|
|
||||||
set(_options)
|
|
||||||
set(_one_value_args NAME INCLUDE_DIR)
|
|
||||||
set(_multi_value_args)
|
|
||||||
cmake_parse_arguments(_ARGS "${_options}" "${_one_value_args}" "${_multi_value_args}" ${ARGN})
|
|
||||||
set_first_defined(_name _ARGS_NAME PROJECT_NAME)
|
|
||||||
set_first_defined(_include_dir _ARGS_INCLUDE_DIR _name)
|
|
||||||
|
|
||||||
file(
|
|
||||||
GLOB_RECURSE ${_name}_HEADERS
|
|
||||||
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
${_include_dir}/*.h)
|
|
||||||
|
|
||||||
target_sources(${_name}
|
|
||||||
PUBLIC
|
|
||||||
FILE_SET HEADERS FILES ${${_name}_HEADERS})
|
|
||||||
|
|
||||||
install(
|
|
||||||
TARGETS ${_name}
|
|
||||||
EXPORT ${_name}Targets
|
|
||||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
||||||
FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
||||||
)
|
|
||||||
|
|
||||||
install(
|
|
||||||
EXPORT ${_name}Targets
|
|
||||||
FILE ${_name}Targets.cmake
|
|
||||||
NAMESPACE ${_name}::
|
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${_name})
|
|
||||||
|
|
||||||
pack_basic()
|
|
||||||
endfunction()
|
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
include(${CMAKE_SOURCE_DIR}/cmake/PackBasic.cmake)
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
|
function(install_basic_config)
|
||||||
|
file(
|
||||||
|
GLOB_RECURSE ${PROJECT_NAME}_HEADERS
|
||||||
|
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
*.h)
|
||||||
|
|
||||||
|
target_sources(${PROJECT_NAME}
|
||||||
|
PUBLIC
|
||||||
|
FILE_SET HEADERS FILES ${${PROJECT_NAME}_HEADERS})
|
||||||
|
|
||||||
|
install(
|
||||||
|
TARGETS ${PROJECT_NAME}
|
||||||
|
EXPORT ${PROJECT_NAME}Targets
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
install(
|
||||||
|
EXPORT ${PROJECT_NAME}Targets
|
||||||
|
FILE ${PROJECT_NAME}Targets.cmake
|
||||||
|
NAMESPACE ${PROJECT_NAME}::
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
|
||||||
|
|
||||||
|
pack_basic()
|
||||||
|
endfunction()
|
||||||
+6
-14
@@ -1,14 +1,6 @@
|
|||||||
include_guard(DIRECTORY)
|
|
||||||
include(CMakePackageConfigHelpers)
|
include(CMakePackageConfigHelpers)
|
||||||
include(${CMAKE_SOURCE_DIR}/cmake/SetFirstDefined.cmake)
|
|
||||||
|
|
||||||
function(pack_basic)
|
function(pack_basic)
|
||||||
set(_options)
|
|
||||||
set(_one_value_args NAME)
|
|
||||||
set(_multi_value_args)
|
|
||||||
cmake_parse_arguments(_ARGS "${_options}" "${_one_value_args}" "${_multi_value_args}" ${ARGN})
|
|
||||||
set_first_defined(_name _ARGS_NAME PROJECT_NAME)
|
|
||||||
|
|
||||||
find_package(Git QUIET)
|
find_package(Git QUIET)
|
||||||
|
|
||||||
if(GIT_FOUND)
|
if(GIT_FOUND)
|
||||||
@@ -25,20 +17,20 @@ function(pack_basic)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
write_basic_package_version_file(
|
write_basic_package_version_file(
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/${_name}ConfigVersion.cmake"
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
|
||||||
VERSION ${PROJECT_VERSION}
|
VERSION ${PROJECT_VERSION}
|
||||||
COMPATIBILITY AnyNewerVersion
|
COMPATIBILITY AnyNewerVersion
|
||||||
)
|
)
|
||||||
|
|
||||||
configure_package_config_file(
|
configure_package_config_file(
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in"
|
"${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in"
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/${_name}Config.cmake"
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
|
||||||
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${_name}
|
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
|
||||||
)
|
)
|
||||||
|
|
||||||
install(
|
install(
|
||||||
FILES
|
FILES
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/${_name}Config.cmake"
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/${_name}ConfigVersion.cmake"
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${_name})
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
|
||||||
endfunction()
|
endfunction()
|
||||||
@@ -2,24 +2,12 @@ include_guard(GLOBAL)
|
|||||||
|
|
||||||
function(protobuf_generate_cpp)
|
function(protobuf_generate_cpp)
|
||||||
set(_options)
|
set(_options)
|
||||||
set(_one_value_args
|
set(_one_value_args CXX_SOURCES CXX_HEADERS CXX_OUT_DIR PROTOC)
|
||||||
CXX_SOURCES
|
set(_multi_value_args PROTO_INCLUDE_DIRS PROTO_SOURCES)
|
||||||
CXX_HEADERS
|
|
||||||
CXX_OUT_DIR
|
|
||||||
PROTOC
|
|
||||||
)
|
|
||||||
set(_multi_value_args
|
|
||||||
PROTO_INCLUDE_DIRS
|
|
||||||
PROTO_SOURCES
|
|
||||||
)
|
|
||||||
cmake_parse_arguments(_ARGS "${_options}" "${_one_value_args}" "${_multi_value_args}" ${ARGN})
|
cmake_parse_arguments(_ARGS "${_options}" "${_one_value_args}" "${_multi_value_args}" ${ARGN})
|
||||||
|
|
||||||
if (NOT DEFINED _ARGS_PROTOC)
|
if (NOT DEFINED _ARGS_PROTOC)
|
||||||
if (WIN32)
|
set(_ARGS_PROTOC "${EXTERNALS_BIN}/protoc")
|
||||||
set(_ARGS_PROTOC "${EXTERNALS_BIN}/protoc.exe")
|
|
||||||
else()
|
|
||||||
set(_ARGS_PROTOC "${EXTERNALS_BIN}/protoc")
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
set(${_ARGS_CXX_SOURCES})
|
set(${_ARGS_CXX_SOURCES})
|
||||||
set(${_ARGS_CXX_HEADERS})
|
set(${_ARGS_CXX_HEADERS})
|
||||||
@@ -38,9 +26,6 @@ function(protobuf_generate_cpp)
|
|||||||
endif()
|
endif()
|
||||||
list(APPEND ${_ARGS_CXX_SOURCES} "${_ARGS_CXX_OUT_DIR}/${_fil_we}.pb.cc")
|
list(APPEND ${_ARGS_CXX_SOURCES} "${_ARGS_CXX_OUT_DIR}/${_fil_we}.pb.cc")
|
||||||
list(APPEND ${_ARGS_CXX_HEADERS} "${_ARGS_CXX_OUT_DIR}/${_fil_we}.pb.h")
|
list(APPEND ${_ARGS_CXX_HEADERS} "${_ARGS_CXX_OUT_DIR}/${_fil_we}.pb.h")
|
||||||
message(STATUS "add_custom_command for ${_fil} -> ${_ARGS_CXX_OUT_DIR}/${_fil_we}.pb.h")
|
|
||||||
# TODO: Pass proto sources by relative path (so this fn can be called from
|
|
||||||
# arbitrary subdirs).
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT
|
OUTPUT
|
||||||
"${_ARGS_CXX_OUT_DIR}/${_fil_we}.pb.cc"
|
"${_ARGS_CXX_OUT_DIR}/${_fil_we}.pb.cc"
|
||||||
@@ -80,4 +65,3 @@ function(protobuf_generate_cpp)
|
|||||||
set(${_ARGS_CXX_SOURCES} ${${_ARGS_CXX_SOURCES}} PARENT_SCOPE)
|
set(${_ARGS_CXX_SOURCES} ${${_ARGS_CXX_SOURCES}} PARENT_SCOPE)
|
||||||
set(${_ARGS_CXX_HEADERS} ${${_ARGS_CXX_HEADERS}} PARENT_SCOPE)
|
set(${_ARGS_CXX_HEADERS} ${${_ARGS_CXX_HEADERS}} PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
include_guard(GLOBAL)
|
|
||||||
|
|
||||||
function(protobuf_generate_cpp_config)
|
|
||||||
set(_options)
|
|
||||||
set(_one_value_args
|
|
||||||
PROTO_SOURCES_HEADER
|
|
||||||
PROTO_DEFAULTS_HEADER
|
|
||||||
)
|
|
||||||
set(_multi_value_args
|
|
||||||
PROTO_SOURCES
|
|
||||||
PROTO_DEFAULTS
|
|
||||||
)
|
|
||||||
cmake_parse_arguments(_ARGS "${_options}" "${_one_value_args}" "${_multi_value_args}" ${ARGN})
|
|
||||||
|
|
||||||
# Configure the 'config_proto_files' header. It provides an array of strings populated with the
|
|
||||||
# files in PROTO_SOURCES. At runtime, we use this array to generate a special 'config' proto
|
|
||||||
# message with fields for each message defined in said files. A global instance of this 'config'
|
|
||||||
# proto is then constructed, and populated with [compile-time] defaults, and [runtime] overrides
|
|
||||||
# (i.e., in spark.conf). Calls to `bts::config::get<T>()` retrieve the value from the field
|
|
||||||
# associated with type `T` in this global instance.
|
|
||||||
message(STATUS "PROTO_SOURCES: ${_ARGS_PROTO_SOURCES}")
|
|
||||||
message(STATUS "PROTO_SOURCES_HEADER: ${_ARGS_PROTO_SOURCES_HEADER}")
|
|
||||||
message(STATUS "PROTO_DEFAULTS_HEADER: ${_ARGS_PROTO_DEFAULTS_HEADER}")
|
|
||||||
if (_ARGS_PROTO_SOURCES_HEADER)
|
|
||||||
set(PROTO_SOURCES)
|
|
||||||
set(PROTO_SOURCES_CXX_ARRAY_ITEMS "")
|
|
||||||
foreach(_proto_path ${_ARGS_PROTO_SOURCES})
|
|
||||||
list(APPEND PROTO_SOURCES ${_proto_path})
|
|
||||||
string(APPEND PROTO_SOURCES_CXX_ARRAY_ITEMS "\"${_proto_path}\",\n")
|
|
||||||
endforeach()
|
|
||||||
list(LENGTH PROTO_SOURCES PROTO_SOURCES_LENGTH)
|
|
||||||
message(STATUS "CONFIGURING PROTO_SOURCES_HEADER): ${_ARGS_PROTO_SOURCES_HEADER}")
|
|
||||||
configure_file(${CMAKE_SOURCE_DIR}/cmake/config_proto_files.h.in ${_ARGS_PROTO_SOURCES_HEADER})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Generate static defaults. Ideally, this would be a single string, but we use an array because
|
|
||||||
# the compiler complains if the string is longer than 65k.
|
|
||||||
set(_cfg_defaults_str "inline const char * config_static_defaults[] = { ")
|
|
||||||
|
|
||||||
foreach(_cfg_file_path ${_ARGS_PROTO_DEFAULTS})
|
|
||||||
file(READ ${_cfg_file_path} _cfg_file_content)
|
|
||||||
string(REPLACE "\"" "\\\"" _cfg_file_content_escaped ${_cfg_file_content})
|
|
||||||
string(REPLACE "\n" ";" _cfg_lines ${_cfg_file_content_escaped})
|
|
||||||
|
|
||||||
foreach(_line ${_cfg_lines})
|
|
||||||
string(APPEND _cfg_defaults_str "\n \"${_line}\",")
|
|
||||||
endforeach(_line)
|
|
||||||
endforeach(_cfg_file_path)
|
|
||||||
|
|
||||||
string(APPEND _cfg_defaults_str "};")
|
|
||||||
set(_old_cfg_defaults_str "")
|
|
||||||
|
|
||||||
if(EXISTS ${_ARGS_PROTO_DEFAULTS_HEADER})
|
|
||||||
file(READ ${_ARGS_PROTO_DEFAULTS_HEADER} _old_cfg_defaults_str)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT _cfg_defaults_str STREQUAL _old_cfg_defaults_str)
|
|
||||||
file(WRITE "${_ARGS_PROTO_DEFAULTS_HEADER}" "${_cfg_defaults_str}")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
include_guard(GLOBAL)
|
|
||||||
|
|
||||||
macro(set_first_defined RESULT)
|
|
||||||
foreach(_arg ${ARGN})
|
|
||||||
if (DEFINED ${_arg})
|
|
||||||
set(${RESULT} ${${_arg}})
|
|
||||||
break()
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
endmacro()
|
|
||||||
+8
-6
@@ -20,14 +20,16 @@ endfunction()
|
|||||||
|
|
||||||
function(sym_link_file)
|
function(sym_link_file)
|
||||||
set(_options)
|
set(_options)
|
||||||
set(_one_value_args SOURCE DEST INSTALL_DEST)
|
set(_one_value_args TARGET_NAME SOURCE DEST INSTALL_DEST)
|
||||||
set(_multi_value_args)
|
set(_multi_value_args)
|
||||||
cmake_parse_arguments(_ARGS "${_options}" "${_one_value_args}" "${_multi_value_args}" ${ARGN})
|
cmake_parse_arguments(_ARGS "${_options}" "${_one_value_args}" "${_multi_value_args}" ${ARGN})
|
||||||
file(
|
add_custom_command(
|
||||||
CREATE_LINK
|
OUTPUT ${_ARGS_DEST}
|
||||||
${_ARGS_SOURCE}
|
COMMAND ln ARGS -s ${_ARGS_SOURCE} ${_ARGS_DEST}
|
||||||
${_ARGS_DEST}
|
)
|
||||||
SYMBOLIC
|
add_custom_target(
|
||||||
|
${_ARGS_TARGET_NAME} ALL
|
||||||
|
DEPENDS ${_ARGS_DEST}
|
||||||
)
|
)
|
||||||
if (DEFINED _ARGS_INSTALL_DEST)
|
if (DEFINED _ARGS_INSTALL_DEST)
|
||||||
install(
|
install(
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
include_guard(DIRECTORY)
|
|
||||||
include(${CMAKE_SOURCE_DIR}/cmake/SymLink.cmake)
|
|
||||||
|
|
||||||
function(sym_link_python_module)
|
|
||||||
set(_options)
|
|
||||||
set(_one_value_args LIB_NAME MODULE_NAME PLUGIN_NAME)
|
|
||||||
set(_multi_value_args)
|
|
||||||
cmake_parse_arguments(_ARGS "${_options}" "${_one_value_args}"
|
|
||||||
"${_multi_value_args}" ${ARGN})
|
|
||||||
if(NOT DEFINED _ARGS_LIB_NAME)
|
|
||||||
message(
|
|
||||||
FATAL_ERROR "LIB_NAME must be specified for sym_link_python_module()")
|
|
||||||
endif()
|
|
||||||
set(_lib_name ${_ARGS_LIB_NAME})
|
|
||||||
set(_module_name ${_ARGS_MODULE_NAME})
|
|
||||||
if(NOT DEFINED _ARGS_MODULE_NAME)
|
|
||||||
set(_module_name ${_lib_name}_module)
|
|
||||||
endif()
|
|
||||||
set(_plugin_name ${_ARGS_PLUGIN_NAME})
|
|
||||||
set(_deps ${_lib_name} ${_module_name})
|
|
||||||
if(DEFINED _ARGS_PLUGIN_NAME)
|
|
||||||
list(APPEND _deps ${_plugin_name} copy_${_plugin_name})
|
|
||||||
endif()
|
|
||||||
add_dependencies(${PROJECT_NAME} ${_deps})
|
|
||||||
sym_link_local_lib(${_lib_name})
|
|
||||||
set(_module_suffix cpython-310-x86_64-linux-gnu.so)
|
|
||||||
sym_link_file(
|
|
||||||
SOURCE
|
|
||||||
${CMAKE_BINARY_DIR}/src/lib_${_lib_name}/${_module_name}.${_module_suffix}
|
|
||||||
DEST
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/${_module_name}.${_module_suffix}
|
|
||||||
INSTALL_DEST
|
|
||||||
${CMAKE_INSTALL_BINDIR}/)
|
|
||||||
if(DEFINED _ARGS_PLUGIN_NAME)
|
|
||||||
get_target_property(plugins ${_plugin_name} INTERFACE_PYTHON_SCRIPTS_DIR)
|
|
||||||
sym_link_dir(TARGET_NAME ${PROJECT_NAME}_link_${_plugin_name} SOURCE
|
|
||||||
${plugins} DEST ${CMAKE_CURRENT_BINARY_DIR}/${_plugin_name})
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <array>
|
|
||||||
|
|
||||||
namespace bts::@PROJECT_NAME@::protobufs {
|
|
||||||
|
|
||||||
inline std::array<const char *, @PROTO_SOURCES_LENGTH@> config_proto_files = {
|
|
||||||
@PROTO_SOURCES_CXX_ARRAY_ITEMS@
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace bts::@PROJECT_NAME@::protobufs
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#ifndef BTS_SPARK_VERSION_H
|
|
||||||
#define BTS_SPARK_VERSION_H
|
|
||||||
|
|
||||||
#define BTS_SPARK_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
|
|
||||||
#define BTS_SPARK_VERSION_MINOR @PROJECT_VERSION_MINOR@
|
|
||||||
#define BTS_SPARK_VERSION_PATCH @PROJECT_VERSION_PATCH@
|
|
||||||
#define BTS_SPARK_VERSION_BUILD_METADATA @PROJECT_VERSION_BUILD_METADATA@
|
|
||||||
#define BTS_SPARK_VERSION "@PROJECT_VERSION@"
|
|
||||||
#define BTS_SPARK_VERSION_FULL "@PROJECT_VERSION_FULL@"
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
|
||||||
|
# Explicitly set policy to convert relative paths to absolute (although this is a default policy,
|
||||||
|
# setting it explicitly prevents a compile-warning)
|
||||||
|
cmake_policy(SET CMP0076 NEW)
|
||||||
|
|
||||||
|
# add protos to the library to facilitate source_group
|
||||||
|
target_sources(libspark PUBLIC ${Config_Protos} ${NonConfig_Protos} ${Service_Protos})
|
||||||
|
|
||||||
|
function(assign_source_group)
|
||||||
|
foreach(_source IN ITEMS ${ARGN})
|
||||||
|
if(IS_ABSOLUTE "${_source}")
|
||||||
|
file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}")
|
||||||
|
else()
|
||||||
|
set(_source_rel "${_source}")
|
||||||
|
endif()
|
||||||
|
get_filename_component(_source_path "${_source_rel}" PATH)
|
||||||
|
string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")
|
||||||
|
source_group("${_source_path_msvc}" FILES "${_source}")
|
||||||
|
set(SOURCE_FILES "${_source}")
|
||||||
|
endforeach()
|
||||||
|
endfunction(assign_source_group)
|
||||||
|
|
||||||
|
assign_source_group(${SparkLib_Sources} ${Config_Protos} ${NonConfig_Protos} ${Service_Protos})
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
services:
|
||||||
|
sparkd:
|
||||||
|
build:
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
context: ./sparkd
|
||||||
|
command: [ "./sparkd", "run" ]
|
||||||
|
ports: [ "8000:8000", "8001:8001", "8002:8002" ]
|
||||||
|
|
||||||
|
pubsub:
|
||||||
|
build:
|
||||||
|
dockerfile: pubsub.Dockerfile
|
||||||
|
context: ./DataStream
|
||||||
|
command: [ "./PubSubServer" ]
|
||||||
|
environment:
|
||||||
|
- DOTNET_ENVIRONMENT=Production
|
||||||
|
ports:
|
||||||
|
- 22019:22019
|
||||||
|
|
||||||
|
md-publisher:
|
||||||
|
build:
|
||||||
|
dockerfile: md-publisher.Dockerfile
|
||||||
|
context: ./DataStream
|
||||||
|
depends_on:
|
||||||
|
- pubsub
|
||||||
|
- sparkd
|
||||||
|
command:
|
||||||
|
[
|
||||||
|
"dockerize",
|
||||||
|
"-wait",
|
||||||
|
"tcp://pubsub:22019",
|
||||||
|
"-wait",
|
||||||
|
"tcp://sparkd:8000",
|
||||||
|
"-timeout",
|
||||||
|
"10s",
|
||||||
|
"./DataStreamPublisher"
|
||||||
|
]
|
||||||
|
environment:
|
||||||
|
- DOTNET_ENVIRONMENT=MarketData
|
||||||
|
|
||||||
|
webapp:
|
||||||
|
ports:
|
||||||
|
- 8080:8080
|
||||||
|
- 8443:8443
|
||||||
|
build:
|
||||||
|
dockerfile: webapp.Dockerfile
|
||||||
|
context: ./DataStream
|
||||||
|
command: [ "./Bts.DataStreamWebApp.Server" ]
|
||||||
|
environment:
|
||||||
|
- ASPNETCORE_HTTP_PORT=8080
|
||||||
|
- ASPNETCORE_HTTPS_PORT=8443
|
||||||
|
- ASPNETCORE_ENVIRONMENT=Staging
|
||||||
+48
-230
@@ -1,154 +1,62 @@
|
|||||||
services:
|
services:
|
||||||
sparkd:
|
sparkd:
|
||||||
volumes:
|
|
||||||
- ${SPARKD__DATA_DIR:-sparkd_data}:/home/bts/.local/share/bts/sparkd/data
|
|
||||||
- ${SPARKD__MD_RECORDING_DIR:-md_recording}:/md_recording
|
|
||||||
build:
|
build:
|
||||||
dockerfile: src/app_sparkd/Dockerfile
|
dockerfile: src/server/sparkd/Dockerfile
|
||||||
args:
|
command: [ "./sparkd", "run" ]
|
||||||
- IMAGE=${SPARKD__IMAGE}
|
ports: [ "8000:8000", "8001:8001", "8002:8002" ]
|
||||||
- SOURCE_DIR=${SPARKD__SOURCE_DIR}
|
|
||||||
- CONFIG_DIR=${SPARKD__CONFIG_DIR}
|
|
||||||
- PYTHON_REQUIREMENTS=${SPARKD__PYTHON_REQUIREMENTS}
|
|
||||||
- SPARKD_ENTRYPOINT=${SPARKD__SPARKD_ENTRYPOINT}
|
|
||||||
shm_size: "${SPARKD__SHM_SIZE:-512mb}"
|
|
||||||
env_file:
|
|
||||||
- .env
|
|
||||||
- ${SPARKD__CONFIG_DIR}/.env
|
|
||||||
ports:
|
|
||||||
- "${SPARKD__CONFIG_PORT}:${SPARKD__CONFIG_PORT}"
|
|
||||||
- "${SPARKD__QUICKBUS_PORT}:${SPARKD__QUICKBUS_PORT}"
|
|
||||||
- "${SPARKD__SIM_FIX_PORT}:${SPARKD__SIM_FIX_PORT}"
|
|
||||||
entrypoint: ${SPARKD__MAIN_ENTRYPOINT}
|
|
||||||
deploy:
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
memory: "${SPARKD__MEMORY:-4gb}"
|
|
||||||
|
|
||||||
sparkd-shell:
|
pubsub:
|
||||||
volumes:
|
environment:
|
||||||
- ${SPARKD__DATA_DIR:-sparkd_data}:/home/bts/.local/share/bts/sparkd/data
|
- DOTNET_ENVIRONMENT=Staging
|
||||||
- ${SPARKD__MD_RECORDING_DIR:-md_recording}:/md_recording
|
|
||||||
build:
|
build:
|
||||||
dockerfile: docker/images/bluetradingsystems/linux_shell/Dockerfile
|
dockerfile: src/DataStreamSuite/PubSubServer/Dockerfile
|
||||||
args:
|
|
||||||
- IMAGE=${SPARKD__IMAGE}
|
|
||||||
- SOURCE_DIR=${SPARKD__SOURCE_DIR}
|
|
||||||
- CONFIG_DIR=${SPARKD__CONFIG_DIR}
|
|
||||||
- PYTHON_REQUIREMENTS=${SPARKD__PYTHON_REQUIREMENTS}
|
|
||||||
- SPARKD_ENTRYPOINT=${SPARKD__SPARKD_ENTRYPOINT}
|
|
||||||
shm_size: "${SPARKD__SHM_SIZE:-512mb}"
|
|
||||||
command: "do sleep 1; done"
|
|
||||||
env_file:
|
|
||||||
- .env
|
|
||||||
- ${SPARKD__CONFIG_DIR}/.env
|
|
||||||
ports:
|
ports:
|
||||||
- "${SPARKD__CONFIG_PORT}:${SPARKD__CONFIG_PORT}"
|
- 22019:22019
|
||||||
- "${SPARKD__QUICKBUS_PORT}:${SPARKD__QUICKBUS_PORT}"
|
command: [ "./PubSubServer" ]
|
||||||
- "${SPARKD__SIM_FIX_PORT}:${SPARKD__SIM_FIX_PORT}"
|
|
||||||
deploy:
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
memory: "${SPARKD__MEMORY:-4gb}"
|
|
||||||
|
|
||||||
sparkd-symbols:
|
md-publisher:
|
||||||
volumes:
|
|
||||||
- ${SPARKD__DATA_DIR:-sparkd_data}:/home/bts/.local/share/bts/sparkd/data
|
|
||||||
- ${SPARKD__MD_RECORDING_DIR:-md_recording}:/md_recording
|
|
||||||
- ${SPARKD__RUNTIME_CONF_DIR:-sparkd_conf}:/home/bts/.local/share/bts/sparkd/conf
|
|
||||||
build:
|
build:
|
||||||
dockerfile: src/app_sparkd/Dockerfile
|
dockerfile: src/DataStreamSuite/DataStreamPublisher/Dockerfile
|
||||||
args:
|
depends_on:
|
||||||
- IMAGE=${SPARKD__IMAGE}
|
- pubsub
|
||||||
- SOURCE_DIR=${SPARKD__SOURCE_DIR}
|
- sparkd
|
||||||
- CONFIG_DIR=${SPARKD__CONFIG_DIR}
|
command:
|
||||||
- PYTHON_REQUIREMENTS=${SPARKD__PYTHON_REQUIREMENTS}
|
[
|
||||||
- SPARKD_ENTRYPOINT=${SPARKD__SPARKD_ENTRYPOINT}
|
"dockerize",
|
||||||
shm_size: "${SPARKD__SHM_SIZE:-512mb}"
|
"-wait",
|
||||||
env_file:
|
"tcp://pubsub:22019",
|
||||||
- .env
|
"-wait",
|
||||||
- ${SPARKD__CONFIG_DIR}/.env
|
"tcp://sparkd:8000",
|
||||||
|
"-timeout",
|
||||||
|
"10s",
|
||||||
|
"./DataStreamPublisher"
|
||||||
|
]
|
||||||
|
environment:
|
||||||
|
- DOTNET_ENVIRONMENT=MarketData
|
||||||
|
|
||||||
|
webapp:
|
||||||
ports:
|
ports:
|
||||||
- "${SPARKD__CONFIG_PORT}:${SPARKD__CONFIG_PORT}"
|
- 8080:8080
|
||||||
- "${SPARKD__QUICKBUS_PORT}:${SPARKD__QUICKBUS_PORT}"
|
- 8443:8443
|
||||||
- "${SPARKD__SIM_FIX_PORT}:${SPARKD__SIM_FIX_PORT}"
|
|
||||||
entrypoint: ${SPARKD__MAIN_ENTRYPOINT}
|
|
||||||
deploy:
|
|
||||||
restart_policy:
|
|
||||||
condition: any
|
|
||||||
delay: 3s
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
memory: "${SPARKD__MEMORY:-4gb}"
|
|
||||||
sparkd-multicast:
|
|
||||||
environment:
|
|
||||||
- TZ=America/Chicago
|
|
||||||
volumes:
|
|
||||||
- ${SPARKD__DATA_DIR:-sparkd_data}:/home/bts/.local/share/bts/sparkd/data
|
|
||||||
- ${SPARKD__MD_RECORDING_DIR:-md_recording}:/md_recording
|
|
||||||
- ${SPARKD__RUNTIME_CONF_DIR:-sparkd_conf}:/home/bts/.local/share/bts/sparkd/conf
|
|
||||||
build:
|
build:
|
||||||
dockerfile: src/app_sparkd/Dockerfile
|
dockerfile: src/DataStreamSuite/Bts.DataStreamWebApp.Server/Dockerfile
|
||||||
args:
|
command: [ "./Bts.DataStreamWebApp.Server" ]
|
||||||
- IMAGE=${SPARKD__IMAGE}
|
|
||||||
- SOURCE_DIR=${SPARKD__SOURCE_DIR}
|
|
||||||
- CONFIG_DIR=${SPARKD__CONFIG_DIR}
|
|
||||||
- PYTHON_REQUIREMENTS=${SPARKD__PYTHON_REQUIREMENTS}
|
|
||||||
- SPARKD_ENTRYPOINT=${SPARKD__SPARKD_ENTRYPOINT}
|
|
||||||
shm_size: "${SPARKD__SHM_SIZE:-8192mb}"
|
|
||||||
env_file:
|
|
||||||
- .env
|
|
||||||
- ${SPARKD__CONFIG_DIR}/.env
|
|
||||||
network_mode: "host"
|
|
||||||
entrypoint: ${SPARKD__MAIN_ENTRYPOINT}
|
|
||||||
deploy:
|
|
||||||
restart_policy:
|
|
||||||
condition: any
|
|
||||||
delay: 3s
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
memory: "${SPARKD__MEMORY:-16gb}"
|
|
||||||
|
|
||||||
|
|
||||||
sparkd-multicast-cert:
|
|
||||||
environment:
|
environment:
|
||||||
- TZ=America/Chicago
|
- ASPNETCORE_ENVIRONMENT=Staging
|
||||||
volumes:
|
|
||||||
- ${SPARKD__DATA_DIR:-sparkd_data}:/home/bts/.local/share/bts/sparkd/data
|
api-server:
|
||||||
- ${SPARKD__MD_RECORDING_DIR:-md_recording}:/md_recording
|
profiles:
|
||||||
- ${SPARKD__RUNTIME_CONF_DIR:-sparkd_conf}:/home/bts/.local/share/bts/sparkd/conf
|
- api-server
|
||||||
|
depends_on:
|
||||||
|
- sparkd
|
||||||
|
ports:
|
||||||
|
- 8008:8008
|
||||||
|
- 9443:9443
|
||||||
build:
|
build:
|
||||||
dockerfile: src/app_sparkd/Dockerfile
|
dockerfile: src/client/spark_api_server/Dockerfile
|
||||||
args:
|
command: [ "./spark_api_server", "run" ]
|
||||||
- IMAGE=${SPARKD__IMAGE}
|
environment:
|
||||||
- SOURCE_DIR=${SPARKD__SOURCE_DIR}
|
- ASPNETCORE_ENVIRONMENT=Staging
|
||||||
- CONFIG_DIR=${SPARKD__CONFIG_DIR}
|
|
||||||
- PYTHON_REQUIREMENTS=${SPARKD__PYTHON_REQUIREMENTS}
|
|
||||||
- SPARKD_ENTRYPOINT=${SPARKD__SPARKD_ENTRYPOINT}
|
|
||||||
shm_size: "${SPARKD__SHM_SIZE:-8192mb}"
|
|
||||||
env_file:
|
|
||||||
- .env
|
|
||||||
- ${SPARKD__CONFIG_DIR}/.env
|
|
||||||
network_mode: "host"
|
|
||||||
entrypoint: ${SPARKD__MAIN_ENTRYPOINT}
|
|
||||||
deploy:
|
|
||||||
restart_policy:
|
|
||||||
condition: any
|
|
||||||
delay: 3s
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
memory: "${SPARKD__MEMORY:-16gb}"
|
|
||||||
|
|
||||||
sparkd-tail:
|
|
||||||
image: bluetradingsystems/linux_dotnet8
|
|
||||||
volumes:
|
|
||||||
- type: volume
|
|
||||||
read_only: true
|
|
||||||
source: sparkd_data
|
|
||||||
target: /home/bts/.local/share/bts/sparkd/data/logging.sparkd
|
|
||||||
volume:
|
|
||||||
subpath: logging.sparkd
|
|
||||||
command: ["tail", "-f", "/home/bts/.local/share/bts/sparkd/data/logging.sparkd/log"]
|
|
||||||
|
|
||||||
sparkd-ping-test:
|
sparkd-ping-test:
|
||||||
depends_on:
|
depends_on:
|
||||||
@@ -158,97 +66,7 @@ services:
|
|||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile_inline: |
|
dockerfile_inline: |
|
||||||
FROM bluetradingsystems/linux_dotnet8
|
FROM bluetradingsystems/linux_dotnet7
|
||||||
USER "root"
|
USER "root"
|
||||||
RUN apt-get update && apt-get -y install iputils-ping
|
RUN apt-get update && apt-get -y install iputils-ping
|
||||||
command: [ "ping", "sparkd" ]
|
command: [ "ping", "sparkd" ]
|
||||||
|
|
||||||
pubsub:
|
|
||||||
volumes:
|
|
||||||
- ${PUBSUB__DATA_DIR:-pubsub_data}:/home/bts/.local/share/bts/pubsub/data
|
|
||||||
build:
|
|
||||||
dockerfile: src/DataStreamSuite/PubSubServer/Dockerfile
|
|
||||||
args:
|
|
||||||
- SOURCE_DIR=${PUBSUB__SOURCE_DIR}
|
|
||||||
- CONFIG_DIR=${PUBSUB__CONFIG_DIR}
|
|
||||||
ports:
|
|
||||||
- 22019:22019
|
|
||||||
command: >
|
|
||||||
sh -c "
|
|
||||||
echo bts | sudo -S chown -R bts:bts /home/bts/.local/share/bts/pubsub/data
|
|
||||||
if [ -e "/home/bts/.local/share/bts/pubsub/data/logging.PubSubServer/log" ]; then
|
|
||||||
mv "/home/bts/.local/share/bts/pubsub/data/logging.PubSubServer/log" "/home/bts/.local/share/bts/pubsub/data/logging.PubSubServer/log_$(date '+%Y%m%d-%H%M')"
|
|
||||||
fi
|
|
||||||
if [ -e "/home/bts/.local/share/bts/pubsub/conf/.env" ]; then
|
|
||||||
echo 'Sourcing /home/bts/.local/share/bts/pubsub/conf/.env'
|
|
||||||
set -a
|
|
||||||
. /home/bts/.local/share/bts/pubsub/conf/.env
|
|
||||||
set +a
|
|
||||||
fi
|
|
||||||
if [ -e "/home/bts/.local/share/bts/pubsub/conf/.env.local" ]; then
|
|
||||||
echo 'Sourcing /home/bts/.local/share/bts/pubsub/conf/.env.local'
|
|
||||||
set -a
|
|
||||||
. /home/bts/.local/share/bts/pubsub/conf/.env.local
|
|
||||||
set +a
|
|
||||||
fi
|
|
||||||
./PubSubServer"
|
|
||||||
env_file:
|
|
||||||
- .env
|
|
||||||
- ${PUBSUB__CONFIG_DIR}/.env
|
|
||||||
|
|
||||||
md-publisher:
|
|
||||||
volumes:
|
|
||||||
- ${MD_PUBLISHER__DATA_DIR:-md_publisher_data}:/home/bts/.local/share/bts/md_publisher/data
|
|
||||||
- historic_md:/home/bts/.local/share/bts/md_publisher/data/databento
|
|
||||||
build:
|
|
||||||
dockerfile: src/DataStreamSuite/DataStreamPublisher/Dockerfile
|
|
||||||
args:
|
|
||||||
- SOURCE_DIR=${MD_PUBLISHER__SOURCE_DIR}
|
|
||||||
- CONFIG_DIR=${MD_PUBLISHER__CONFIG_DIR}
|
|
||||||
command: >
|
|
||||||
sh -c "
|
|
||||||
echo bts | sudo -S chown -R bts:bts /home/bts/.local/share/bts/md_publisher/data
|
|
||||||
if [ -e "/home/bts/.local/share/bts/md_publisher/data/logging.DataStreamPublisher/log" ]; then
|
|
||||||
mv "/home/bts/.local/share/bts/md_publisher/data/logging.DataStreamPublisher/log" "/home/bts/.local/share/bts/md_publisher/data/logging.DataStreamPublisher/log_$(date '+%Y%m%d-%H%M')"
|
|
||||||
fi
|
|
||||||
if [ -e "/home/bts/.local/share/bts/md_publisher/conf/.env" ]; then
|
|
||||||
echo 'Sourcing /home/bts/.local/share/bts/md_publisher/conf/.env'
|
|
||||||
set -a
|
|
||||||
. /home/bts/.local/share/bts/md_publisher/conf/.env
|
|
||||||
set +a
|
|
||||||
fi
|
|
||||||
if [ -e "/home/bts/.local/share/bts/md_publisher/conf/.env.local" ]; then
|
|
||||||
echo 'Sourcing /home/bts/.local/share/bts/md_publisher/conf/.env.local'
|
|
||||||
set -a
|
|
||||||
. /home/bts/.local/share/bts/md_publisher/conf/.env.local
|
|
||||||
set +a
|
|
||||||
fi
|
|
||||||
dockerize -wait tcp://pubsub:22019 -timeout 10s ./DataStreamPublisher"
|
|
||||||
env_file:
|
|
||||||
- .env
|
|
||||||
- ${MD_PUBLISHER__CONFIG_DIR}/.env
|
|
||||||
|
|
||||||
api-server:
|
|
||||||
depends_on:
|
|
||||||
- sparkd
|
|
||||||
ports:
|
|
||||||
- 8008:8008
|
|
||||||
- 9443:9443
|
|
||||||
build:
|
|
||||||
dockerfile: src/client/spark_api_server/Dockerfile
|
|
||||||
command: [ "dockerize", "-wait", "tcp://sparkd:8000", "-timeout", "10s", "./spark_api_server", "run" ]
|
|
||||||
environment:
|
|
||||||
- ASPNETCORE_ENVIRONMENT=Staging
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
sparkd_data:
|
|
||||||
name: "sparkd_${SPARKD__CONFIG_PORT:-8000}"
|
|
||||||
pubsub_data:
|
|
||||||
name: "pubsub_22019"
|
|
||||||
md_publisher_data:
|
|
||||||
name: "md_publisher_22019"
|
|
||||||
historic_md:
|
|
||||||
name: "historic_md"
|
|
||||||
md_recording:
|
|
||||||
name: "sparkd_md_recording_${SPARKD__CONFIG_PORT:-8000}"
|
|
||||||
external: true
|
|
||||||
@@ -124,8 +124,8 @@ service OrderService {
|
|||||||
```
|
```
|
||||||
### C++ Example
|
### C++ Example
|
||||||
```cpp
|
```cpp
|
||||||
#include "spark/api/public/ServiceContext.h"
|
#include "lib/api/public/ServiceContext.h"
|
||||||
#include "spark/api/services/OrderService.client.pb.h"
|
#include "lib/api/services/OrderService.client.pb.h"
|
||||||
using namespace bts::api;
|
using namespace bts::api;
|
||||||
ServiceContext ctx;
|
ServiceContext ctx;
|
||||||
auto orders = ctx.locate<orderman::OrderService>();
|
auto orders = ctx.locate<orderman::OrderService>();
|
||||||
|
|||||||
@@ -29,9 +29,9 @@ namespace sample {
|
|||||||
```
|
```
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
#include "spark/api/public/ServiceContext.h"
|
#include "lib/api/public/ServiceContext.h"
|
||||||
#include "spark/domain_model/Security.h"
|
#include "spark/lib/domain_model/Security.h"
|
||||||
#include "spark/api/services/MarketDataService.client.pb.h"
|
#include "lib/api/services/MarketDataService.client.pb.h"
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
using namespace bts::api;
|
using namespace bts::api;
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ The status callback is called when the market for this security opens, closes, o
|
|||||||
// Subscribe to security trading status
|
// Subscribe to security trading status
|
||||||
void IAlgoServices::subscribe_status(SecurityKey);
|
void IAlgoServices::subscribe_status(SecurityKey);
|
||||||
// You implement
|
// You implement
|
||||||
virtual void on_status(SecurityKey, co2::TradingStatus) override;
|
virtual void on_status(SecurityKey, domain::protobufs::TradingStatus) override;
|
||||||
```
|
```
|
||||||
|
|
||||||
# Child Orders
|
# Child Orders
|
||||||
|
|||||||
@@ -1,942 +0,0 @@
|
|||||||
# Security ID handling in `sparkd`
|
|
||||||
|
|
||||||
This document traces how security identifiers are created, translated, persisted,
|
|
||||||
indexed, and published by the `sparkd` market-data paths. It focuses on the
|
|
||||||
legacy CME MDP3/OnixS pipeline and the newer generalized market-data pipeline.
|
|
||||||
|
|
||||||
## Executive summary
|
|
||||||
|
|
||||||
`sparkd` uses two identifiers that must not be confused:
|
|
||||||
|
|
||||||
| Identifier | Meaning | Typical field | Lifetime |
|
|
||||||
|---|---|---|---|
|
|
||||||
| Exchange/feed ID | The venue's identifier used to route incoming definitions, books, and trades | `FixedSecurity::numeric_id`, `ExchangeKey`, or `domain::Security::security_common.exchange_sec_id` | Feed/session-specific unless the source guarantees stability |
|
|
||||||
| Spark security key | Spark's internal non-zero identifier used in shared memory, APIs, orders, positions, and downstream services | `FixedSecurity::key`, `api::Security::id()`, `SecurityKey`; historically also called `security_id` | Intended to be stable across restarts |
|
|
||||||
|
|
||||||
`invalid_security_key` is `0`; a security with key `0` is not yet publicly
|
|
||||||
discoverable through the shared-memory consumer path.
|
|
||||||
|
|
||||||
The two principal paths differ:
|
|
||||||
|
|
||||||
- **MDP3/OnixS:** the definition callback sets only the CME ID in
|
|
||||||
`numeric_id`. `MDProducer::add_security()` allocates the shared-memory entry
|
|
||||||
with key `0`. `SecurityIDRecorder`, driven by a 200 ms dispatcher timer,
|
|
||||||
resolves or inserts a stable key in `key_ids.sqlite`; its callback finally
|
|
||||||
calls `MDProducerHandle::set_key()`.
|
|
||||||
- **Generalized/newer pipeline:** `GeneralMarketDataListener::on_securities()`
|
|
||||||
currently uses the ID already present on the incoming domain security
|
|
||||||
(`use_given_sec_key == true`). Live adapters normally obtain that ID
|
|
||||||
synchronously from `IDGenerator` first. `_copy_security_common()` then copies
|
|
||||||
it to both `FixedSecurity::key` and `numeric_id`, so
|
|
||||||
`MDProducer::add_security()` publishes it synchronously. Only the listener's
|
|
||||||
own fallback `IDGenerator` call is bypassed by the current constant.
|
|
||||||
|
|
||||||
## End-to-end diagrams
|
|
||||||
|
|
||||||
### CME MDP3 / OnixS
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
sequenceDiagram
|
|
||||||
participant FE as OnixS feed-engine thread
|
|
||||||
participant L as MDP3Listener
|
|
||||||
participant P as MDProducer / shared memory
|
|
||||||
participant Q as SecurityIDRecorder queues
|
|
||||||
participant D as sparkd dispatcher thread
|
|
||||||
participant DB as key_ids.sqlite
|
|
||||||
|
|
||||||
FE->>L: instrument definition (CME SecurityID)
|
|
||||||
L->>L: set_security_common() - numeric_id = CME SecurityID, key remains 0
|
|
||||||
L->>P: add_security(FixedSecurity)
|
|
||||||
P->>P: allocate hot + cold entries with key 0
|
|
||||||
P->>Q: ensure_key(handle)
|
|
||||||
L->>L: index[CME SecurityID] = handle
|
|
||||||
Note over FE,L: Books can route by CME ID while the Spark key is pending
|
|
||||||
D->>Q: every 200 ms - work_spreads(), work_handles(), work_db()
|
|
||||||
Q->>DB: find (namespace, descriptor), or insert a new row
|
|
||||||
DB-->>Q: SQLite rowid = Spark security key
|
|
||||||
Q->>P: handle.set_key(rowid)
|
|
||||||
P->>P: hot.key first, then cold security.key, then increment security_count
|
|
||||||
Note over P: The security is now public to shared-memory consumers
|
|
||||||
```
|
|
||||||
|
|
||||||
### Generalized/newer pipeline (current behavior)
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
sequenceDiagram
|
|
||||||
participant A as Venue adapter / plugin
|
|
||||||
participant DB as IDGenerator / key_ids.sqlite
|
|
||||||
participant G as GeneralMarketDataListener
|
|
||||||
participant I as GeneralSecurityIndex
|
|
||||||
participant P as MDProducer / shared memory
|
|
||||||
|
|
||||||
A->>DB: get_or_add(venue, type, adapter key)
|
|
||||||
DB-->>A: SQLite rowid as domain SecurityID
|
|
||||||
A->>G: on_securities(domain Security list with ID)
|
|
||||||
G->>G: _find_sec() - use incoming security_common.id
|
|
||||||
G->>G: _copy_security_common() - key = id, numeric_id = id
|
|
||||||
G->>P: add_security(FixedSecurity with non-zero key)
|
|
||||||
P->>P: set_key() during add_security()
|
|
||||||
G->>I: index[id] = handle
|
|
||||||
Note over G,P: No asynchronous ID assignment in the current configuration
|
|
||||||
```
|
|
||||||
|
|
||||||
## Data-flow charts
|
|
||||||
|
|
||||||
The sequence diagrams above emphasize timing and thread transitions. These
|
|
||||||
flowcharts emphasize which identifier is carried through each representation
|
|
||||||
and where data is retained.
|
|
||||||
|
|
||||||
### MDP3 / legacy data flow
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
flowchart TD
|
|
||||||
CME["CME MDP3 packets<br/>CME SecurityID"] --> ONIXS["OnixS feed engine<br/>decode definition and updates"]
|
|
||||||
|
|
||||||
ONIXS --> DEF["MDP3Listener definition callback"]
|
|
||||||
DEF --> FIXED["FixedSecurity<br/>numeric_id = CME SecurityID<br/>key = 0"]
|
|
||||||
|
|
||||||
FIXED --> PRODUCER["MDProducer::add_security"]
|
|
||||||
PRODUCER --> PENDING["Hot and cold shared memory<br/>allocated but not public<br/>key = 0"]
|
|
||||||
PRODUCER --> QUEUE["SecurityIDRecorder<br/>pending_handle queue"]
|
|
||||||
|
|
||||||
FIXED --> CMEINDEX["CMESecurityIndex<br/>CME SecurityID to handle"]
|
|
||||||
|
|
||||||
QUEUE --> TIMER["Dispatcher timer<br/>every 200 ms"]
|
|
||||||
TIMER --> LEGS{"Spread legs<br/>all resolved?"}
|
|
||||||
LEGS -- No --> UNRESOLVED["unresolved_legs<br/>exchange IDs awaiting keys"]
|
|
||||||
UNRESOLVED --> CMEINDEX
|
|
||||||
CMEINDEX --> LEGS
|
|
||||||
LEGS -- Yes or outright --> LOGICAL["Logical identity<br/>venue + type + security_desc"]
|
|
||||||
|
|
||||||
LOGICAL --> SELECT["SQLite SELECT<br/>key_ids.sqlite"]
|
|
||||||
SELECT -- Existing row --> ROWID["SQLite rowid<br/>Spark security key"]
|
|
||||||
SELECT -- Missing row --> INSERT["Batched SQLite INSERT"]
|
|
||||||
INSERT --> ROWID
|
|
||||||
|
|
||||||
ROWID --> SETKEY["MDProducerHandle::set_key"]
|
|
||||||
SETKEY --> HOT["Write hot-entry key"]
|
|
||||||
HOT --> COLD["Write cold security key"]
|
|
||||||
COLD --> COUNT["Increment security_count"]
|
|
||||||
COUNT --> PUBLIC["Public security<br/>visible to MDConsumer"]
|
|
||||||
|
|
||||||
ONIXS --> UPDATE["Book, trade, status, or RFQ<br/>carrying CME SecurityID"]
|
|
||||||
UPDATE --> CMEINDEX
|
|
||||||
CMEINDEX --> HANDLE["MDProducerHandle"]
|
|
||||||
HANDLE --> LIVE["Update live shared-memory data"]
|
|
||||||
PUBLIC --> LIVE
|
|
||||||
```
|
|
||||||
|
|
||||||
The CME index is usable before the Spark key is assigned, so feed updates can
|
|
||||||
reach the internal handle while the security is still hidden from consumers.
|
|
||||||
The persistent rowid crosses the publication boundary only at `set_key()`.
|
|
||||||
|
|
||||||
### Generalized/newer data flow
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
flowchart TD
|
|
||||||
FEED["Venue feed, Databento,<br/>Python plugin, or replay"] --> ADAPTER["Source adapter<br/>build domain::Security"]
|
|
||||||
|
|
||||||
ADAPTER --> IDTYPE{"Live definition or<br/>recorded/pre-keyed input?"}
|
|
||||||
IDTYPE -- Live --> IDINPUT["Logical identity<br/>venue + type + adapter-chosen name"]
|
|
||||||
IDINPUT --> MUTEX["IDGenerator global mutex"]
|
|
||||||
MUTEX --> SELECT["Synchronous SQLite SELECT<br/>key_ids.sqlite"]
|
|
||||||
SELECT -- Existing row --> ROWID["SQLite rowid"]
|
|
||||||
SELECT -- Missing row --> INSERT["Synchronous SQLite INSERT<br/>autocommit"]
|
|
||||||
INSERT --> ROWID
|
|
||||||
ROWID --> DOMAINID["domain::SecurityID<br/>used as Spark ID"]
|
|
||||||
IDTYPE -- Recorded or pre-keyed --> DOMAINID
|
|
||||||
|
|
||||||
DOMAINID --> DOMAINSEC["SecurityCommon::id = Spark ID"]
|
|
||||||
DOMAINSEC --> LISTENER["GeneralMarketDataListener::on_securities"]
|
|
||||||
LISTENER --> CCMAP["cc_sec_id_map<br/>incoming ID to Spark ID"]
|
|
||||||
LISTENER --> CONVERT["_copy_security_common<br/>FixedSecurity.key = ID<br/>numeric_id = ID"]
|
|
||||||
|
|
||||||
CONVERT --> PRODUCER["MDProducer::add_security"]
|
|
||||||
PRODUCER --> SETKEY["Immediate set_key<br/>no recorder timer"]
|
|
||||||
SETKEY --> SHM["Hot and cold shared memory<br/>immediately public"]
|
|
||||||
CONVERT --> GENERALINDEX["GeneralSecurityIndex<br/>ID to handle"]
|
|
||||||
|
|
||||||
FEED --> EVENT["Book, trade, or statistics<br/>with exchange/source identity"]
|
|
||||||
EVENT --> EVENTMAP["Adapter map<br/>source identity to domain::SecurityID"]
|
|
||||||
EVENTMAP --> EVENTID["Event carries domain::SecurityID"]
|
|
||||||
EVENT --> PYHOT["Python bridge only<br/>synchronous IDGenerator lookup"]
|
|
||||||
PYHOT --> EVENTID
|
|
||||||
PYHOT -. uses same mutex and SQLite path .-> MUTEX
|
|
||||||
EVENTID --> CCMAP
|
|
||||||
CCMAP --> GENERALINDEX
|
|
||||||
GENERALINDEX --> HANDLE["MDProducerHandle"]
|
|
||||||
HANDLE --> SHMUPDATE["Update book, trade,<br/>statistics, or status"]
|
|
||||||
SHM --> SHMUPDATE
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
In the normal newer live path, persistence occurs before the definition enters
|
|
||||||
the generalized listener. The DB call therefore adds synchronous adapter-side
|
|
||||||
latency, but publication needs no later timer. Most adapters use an in-memory
|
|
||||||
map for subsequent events; the dotted Python path is the documented exception.
|
|
||||||
|
|
||||||
## The publication boundary
|
|
||||||
|
|
||||||
`MDProducerHandle::set_key()` is the definitive publication point for the
|
|
||||||
legacy shared-memory representation. Its write ordering is intentional:
|
|
||||||
|
|
||||||
1. Write the key into the hot book entry (`HotEntry` or `HotDepthEntry`).
|
|
||||||
2. Write the key into the cold security entry.
|
|
||||||
3. Increment the cold header's public `security_count`.
|
|
||||||
|
|
||||||
The cold security key is written last because consumers treat a non-zero cold
|
|
||||||
key as visibility. At that moment the corresponding hot entry must already be
|
|
||||||
addressable. `set_key()` only permits the transition from `0` to one key; it is
|
|
||||||
not a key-update mechanism.
|
|
||||||
|
|
||||||
## Identifier representations
|
|
||||||
|
|
||||||
The names are historically inconsistent. In particular, many protobuf fields
|
|
||||||
named `security_id` contain the **Spark key**, not the exchange's ID.
|
|
||||||
|
|
||||||
| Layer | Exchange/feed identifier | Spark identifier |
|
|
||||||
|---|---|---|
|
|
||||||
| MDP3 wire/OnixS | `securityId()` | not present |
|
|
||||||
| Legacy fixed security | `FixedSecurity::numeric_id` (`uint64_t`) | `FixedSecurity::key` / `security_key` (`uint32_t`) |
|
|
||||||
| Legacy API security | venue-specific `exchange_id` | top-level `Security.id()` |
|
|
||||||
| New domain model | `SecurityCommon::exchange_sec_id` (string) is descriptive; `SecurityCommon::id` is also used to correlate source events | `domain::SecurityID` (`uint64_t`), currently copied into the Spark key |
|
|
||||||
| Shared-memory hot book | none | `HotEntry::key` or `HotDepthEntry::key` |
|
|
||||||
| Shared-memory cold metadata | `FixedSecurity::numeric_id` | `FixedSecurity::key` |
|
|
||||||
| CME runtime lookup | `CMESecurityIndex` key | `SecurityData::handle.key()` |
|
|
||||||
| General runtime lookup | incoming/canonical `domain::SecurityID` | `GeneralSecurityIndex` key and `handle.key()` (currently the same value) |
|
|
||||||
|
|
||||||
The generalized model declares `domain::SecurityID` as 64-bit, but the legacy
|
|
||||||
shared-memory `security_key` remains 32-bit. `_copy_security_common()` assigns a
|
|
||||||
64-bit value to both `numeric_id` and the 32-bit `key`. This is safe only while
|
|
||||||
allocated IDs fit in 32 bits; unlike the legacy lookup path, this assignment has
|
|
||||||
no explicit checked conversion.
|
|
||||||
|
|
||||||
## Which parts use exchange IDs, descriptors, or Spark security IDs?
|
|
||||||
|
|
||||||
The three identifier classes serve different jobs:
|
|
||||||
|
|
||||||
- **Exchange/external ID:** routes data inside a venue or vendor feed adapter.
|
|
||||||
- **Descriptor/natural key:** recognizes a definition logically at the
|
|
||||||
persistence, discovery, or human-facing boundary.
|
|
||||||
- **Spark security ID/key:** joins the instrument to books, orders, fills,
|
|
||||||
positions, and services after publication.
|
|
||||||
|
|
||||||
The core downstream system does not repeatedly identify a security from its
|
|
||||||
description. The description is primarily used to obtain a Spark key; after
|
|
||||||
that boundary, most joins use the numeric Spark key.
|
|
||||||
|
|
||||||
### Component-level usage matrix
|
|
||||||
|
|
||||||
| Component or data path | Exchange/external ID | Descriptor or name | Spark security ID/key |
|
|
||||||
|---|---|---|---|
|
|
||||||
| CME MDP3 definition decoder | Reads `securityId()` and stores it in `FixedSecurity::numeric_id` | Copies definition symbol/tag 55 into `security_desc` | Leaves `FixedSecurity::key` at `0` initially |
|
|
||||||
| `CMESecurityIndex` | Primary map key; CME ID resolves to a handle | Not used for update routing | Returns `handle.key()` when the Spark key has been assigned |
|
|
||||||
| MDP3 books, trades, status, statistics, and RFQs | Incoming CME ID selects the handle through `CMESecurityIndex` | Not used to locate each update | The selected handle writes keyed shared-memory/trade data after publication |
|
|
||||||
| MDP3 spread definitions | Each leg initially contains `legSecurityId()` as `exchange_key` | Parent `security_desc` identifies the spread's DB row | Each leg's Spark key and then the parent Spark key must be resolved before publication |
|
|
||||||
| Legacy ICE OnixS | Uses ICE `marketId` as `numeric_id` and index key | ICE security description becomes the logical lookup name | Uses the same recorder-assigned Spark key pattern as MDP3 |
|
|
||||||
| `SecurityIDRecorder` | Does not allocate from the external ID | Uses `(venue, security type, securities::descriptor())` to find/create a row | Treats the SQLite rowid as the resulting Spark key |
|
|
||||||
| Native generalized adapters | Use exchange strings/numeric IDs to parse definitions and correlate updates | Usually pass a description or exchange instrument name to `IDGenerator` | Put the returned ID into `SecurityCommon::id` and later events |
|
|
||||||
| Databento adapter | Uses `msg.hd.instrument_id` for feed correlation and its in-memory map | Uses the decimal instrument ID string—not the human description—as the `IDGenerator` name | Caches `instrument_id -> domain::SecurityID` and places that ID on books/trades |
|
|
||||||
| Python bridge | Reads `exchange_security_id` from definitions, books, and trades | Uses that external-ID string as the `IDGenerator` name | Resolves it to `domain::SecurityID`; currently performs this lookup for every event |
|
|
||||||
| `IDGenerator` | Does not interpret whether `name` came from an exchange ID | Uses exactly `(venue, type, caller-supplied name)` | Returns the SQLite rowid as a 64-bit ID |
|
|
||||||
| `GeneralMarketDataListener` | Does not route on `exchange_sec_id` directly | Copies `sec.desc()` into fixed metadata; its disabled fallback allocator would use `sec.desc()` | Uses incoming `SecurityCommon::id`, maps events through `cc_sec_id_map`, and copies the value into both `key` and `numeric_id` |
|
|
||||||
| `GeneralSecurityIndex` | No separate external-ID concept in the current use-given path | Not used | Maps the generalized ID/Spark key to `MDProducerHandle` |
|
|
||||||
| `MDProducer` / shared memory | Retains `numeric_id`; in legacy feeds this is the exchange ID, but in the generalized path it is currently the Spark ID | Stores `security_desc` in the cold definition | Uses the key in hot/cold entries; non-zero key is the visibility boundary |
|
|
||||||
| `MDConsumer` | Not normally used to find live books | Can enumerate/filter converted security definitions | Finds handles and book data by `security_key` |
|
|
||||||
| `SecurityCache` / `securities.sqlite` | Preserves venue-specific exchange data inside the serialized security blob | Maintains descriptor/name lookup indexes and supports venue/type/name queries | Primary persisted definition key is `api::Security.id()` |
|
|
||||||
| MBO processor and MBO service | May retain exchange **order** IDs, which are separate from security exchange IDs | Not used to find the instrument | Indexes snapshots and requests by `SecurityKey`; MBO protobuf `security_id` means Spark key |
|
|
||||||
| Order manager and algorithms | Execution gateways eventually use venue-specific fields from the resolved security to encode orders | Descriptions appear in logs and errors, not as the primary join | Order definitions, subscriptions, book events, native orders, spread legs, and fills use `security_key` / `Security.id()` |
|
|
||||||
| Position, PNL, and risk services | Not used as their position join | May resolve metadata for display/reporting | Positions, fills, overrides, and PNL handles are keyed by Spark security ID |
|
|
||||||
| Relay and market-data recordings | Serialized security definitions may preserve venue exchange IDs | Preserve full descriptors in recorded definitions | Books, updates, trades, and replay correlation preserve the recorded Spark key |
|
|
||||||
| Synthetic security service | No venue exchange ID; synthetics use `VENUE_BTS` | Synthetic name is the recorder's logical descriptor | Recorder assigns the SQLite rowid and synthetic metadata is keyed by it |
|
|
||||||
|
|
||||||
### Exchange/external IDs: where they stop
|
|
||||||
|
|
||||||
In MDP3 the separation is explicit:
|
|
||||||
|
|
||||||
```text
|
|
||||||
CME SecurityID
|
|
||||||
-> FixedSecurity.numeric_id
|
|
||||||
-> CMESecurityIndex lookup
|
|
||||||
-> MDProducerHandle
|
|
||||||
-> Spark security_key for downstream publication
|
|
||||||
```
|
|
||||||
|
|
||||||
The external CME ID continues to route feed messages but does not become the
|
|
||||||
order/position key. This permits the same downstream Spark key to survive a
|
|
||||||
restart as long as the logical descriptor mapping remains in
|
|
||||||
`key_ids.sqlite`, even if the feed must rediscover the CME routing ID.
|
|
||||||
|
|
||||||
The generalized path collapses more of these roles:
|
|
||||||
|
|
||||||
```text
|
|
||||||
exchange/vendor identity
|
|
||||||
-> adapter calls IDGenerator
|
|
||||||
-> domain::SecurityID
|
|
||||||
-> FixedSecurity.key and FixedSecurity.numeric_id
|
|
||||||
-> GeneralSecurityIndex and downstream Spark key
|
|
||||||
```
|
|
||||||
|
|
||||||
`SecurityCommon::exchange_sec_id` may still contain the original textual
|
|
||||||
external identifier, but `GeneralMarketDataListener` does not use it to route
|
|
||||||
events and does not put it in `numeric_id`. The adapter must translate later
|
|
||||||
events to `domain::SecurityID` before invoking the listener.
|
|
||||||
|
|
||||||
### Descriptor/name users
|
|
||||||
|
|
||||||
Descriptors are used in three main places:
|
|
||||||
|
|
||||||
1. **Key allocation:** `SecurityIDRecorder` uses the legacy venue-specific
|
|
||||||
descriptor, while `IDGenerator` uses its caller-provided `name`.
|
|
||||||
2. **Definition lookup and discovery:** `SecurityCache` supports
|
|
||||||
venue/type/name lookup; symbol filters and administrative tools use security
|
|
||||||
metadata to select or display instruments.
|
|
||||||
3. **Diagnostics:** logs include symbols and descriptions so humans can
|
|
||||||
understand a numeric key.
|
|
||||||
|
|
||||||
Descriptions generally do not drive the high-rate book, trade, order, fill, or
|
|
||||||
position paths. Those paths use numeric IDs after definition resolution.
|
|
||||||
|
|
||||||
It is important that “descriptor” does not mean one universal canonical field:
|
|
||||||
|
|
||||||
- Legacy CME uses Globex `security_desc` from tag 55.
|
|
||||||
- Many generalized adapters use `sec.desc()` or an exchange instrument name.
|
|
||||||
- Databento uses its numeric instrument ID converted to a string.
|
|
||||||
- Python uses `exchange_security_id`.
|
|
||||||
|
|
||||||
Therefore, two adapters may describe the same economic contract but request
|
|
||||||
different logical rows and receive different Spark IDs.
|
|
||||||
|
|
||||||
### Spark security-ID users
|
|
||||||
|
|
||||||
Once a security is published, its Spark key is the dominant system identifier:
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
flowchart LR
|
|
||||||
KEY["Spark security key"] --> SHM["Hot/cold shared memory"]
|
|
||||||
KEY --> MDC["MDConsumer and book subscriptions"]
|
|
||||||
KEY --> MBO["MBO snapshots and queries"]
|
|
||||||
KEY --> OMS["Orders, algorithms, and spread legs"]
|
|
||||||
KEY --> FILLS["Fills and execution records"]
|
|
||||||
KEY --> POS["Positions, PNL, and risk"]
|
|
||||||
KEY --> API["Services and client APIs"]
|
|
||||||
KEY --> REC["Relay and market-data recordings"]
|
|
||||||
KEY --> SECDB["Serialized security definitions"]
|
|
||||||
```
|
|
||||||
|
|
||||||
Fields named `security_id`, `security_key`, or top-level `Security.id()` in
|
|
||||||
these downstream areas almost always mean the Spark key. They should not be
|
|
||||||
compared directly with CME `SecurityID`, Databento `instrument_id`, or another
|
|
||||||
venue/vendor identifier without going through the relevant adapter/index
|
|
||||||
mapping.
|
|
||||||
|
|
||||||
## Persistence and allocation
|
|
||||||
|
|
||||||
### The authoritative key mapping: `key_ids.sqlite`
|
|
||||||
|
|
||||||
Both allocators use `SqliteStore("key_ids")`. With the normal configuration the
|
|
||||||
file is:
|
|
||||||
|
|
||||||
```text
|
|
||||||
<SystemConfig.data_path>/databases/key_ids/key_ids.sqlite
|
|
||||||
```
|
|
||||||
|
|
||||||
The database contains one table and two indexes:
|
|
||||||
|
|
||||||
```sql
|
|
||||||
CREATE TABLE store (ns TEXT, key TEXT, value TEXT);
|
|
||||||
CREATE UNIQUE INDEX key_index ON store(ns, key);
|
|
||||||
CREATE INDEX ns_index ON store(ns);
|
|
||||||
```
|
|
||||||
|
|
||||||
The SQLite `rowid` is the generated Spark key. `ns` is normally
|
|
||||||
`<VENUE>.<SECURITY_TYPE>` (for example `GLBX.FUTURE`), and `key` is the security
|
|
||||||
descriptor chosen by the caller. `value` is normally empty. Therefore ID
|
|
||||||
stability depends on all three of these remaining stable:
|
|
||||||
|
|
||||||
- the configured `data_path` and preservation of this database;
|
|
||||||
- the venue/type namespace;
|
|
||||||
- the descriptor supplied by the feed adapter.
|
|
||||||
|
|
||||||
The two allocator implementations share the file and convention:
|
|
||||||
|
|
||||||
- `SecurityIDRecorder` (legacy): derives the namespace from legacy API enums and
|
|
||||||
uses `securities::descriptor()`. For CME this is the Globex
|
|
||||||
`security_desc`, populated from the definition's symbol/tag 55.
|
|
||||||
- `IDGenerator` (newer): derives the namespace from new domain enums and uses
|
|
||||||
the caller's `name`. Most adapters pass `sec.desc()` or an exchange instrument
|
|
||||||
identifier; Databento deliberately passes the decimal instrument ID, and the
|
|
||||||
Python bridge uses the exchange security ID.
|
|
||||||
|
|
||||||
### Logical-row examples
|
|
||||||
|
|
||||||
The following names are illustrative. Production uses the exact string emitted
|
|
||||||
by the selected feed/adapter, including its case, spacing, and weekly-series
|
|
||||||
notation.
|
|
||||||
|
|
||||||
#### Legacy `SecurityIDRecorder`
|
|
||||||
|
|
||||||
For CME, `set_security_common()` copies the MDP3 definition's symbol/tag 55 into
|
|
||||||
Globex `security_desc`. After converting the fixed security to
|
|
||||||
`api::Security`, `securities::descriptor()` returns that same
|
|
||||||
`glbx.security_desc()` string.
|
|
||||||
|
|
||||||
| Instrument | Legacy enums | Example descriptor from `security_desc` | Row searched/inserted in `store` |
|
|
||||||
|---|---|---|---|
|
|
||||||
| Future | `VENUE_GLBX`, `SECURITYTYPE_FUTURE` | `ESZ6` | `ns='GLBX.FUTURE', key='ESZ6'` |
|
|
||||||
| Standard option | `VENUE_GLBX`, `SECURITYTYPE_OPTION` | `ESZ6 C6500` | `ns='GLBX.OPTION', key='ESZ6 C6500'` |
|
|
||||||
| Weekly option | `VENUE_GLBX`, `SECURITYTYPE_OPTION` | `ESZ6-W1 C6500` | `ns='GLBX.OPTION', key='ESZ6-W1 C6500'` |
|
|
||||||
| Spot from a legacy-compatible venue path | `VENUE_COINBASE`, `SECURITYTYPE_SPOT` | `BTC-USD` | `ns='COINBASE.SPOT', key='BTC-USD'` |
|
|
||||||
|
|
||||||
A weekly option does not get a special namespace. Standard and weekly options
|
|
||||||
are both `SECURITYTYPE_OPTION`, so both live in `GLBX.OPTION`; the exact
|
|
||||||
`security_desc` distinguishes the weekly series. For example, if the database
|
|
||||||
assigned rowids `42001` through `42004` to the rows above, those integers—not
|
|
||||||
the descriptor strings—would be the Spark security keys.
|
|
||||||
|
|
||||||
Conceptually, legacy allocation is:
|
|
||||||
|
|
||||||
```text
|
|
||||||
future: lookup_or_insert("GLBX.FUTURE", "ESZ6")
|
|
||||||
option: lookup_or_insert("GLBX.OPTION", "ESZ6 C6500")
|
|
||||||
weekly option: lookup_or_insert("GLBX.OPTION", "ESZ6-W1 C6500")
|
|
||||||
spot: lookup_or_insert("COINBASE.SPOT", "BTC-USD")
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Newer `IDGenerator`
|
|
||||||
|
|
||||||
The namespace result is similar, but the third argument is chosen by the
|
|
||||||
adapter. Examples using a description-oriented adapter are:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
get_or_add(VENUE_GLBX, SECURITY_TYPE_FUTURE, "ESZ6");
|
|
||||||
// store: ns="GLBX.FUTURE", key="ESZ6"
|
|
||||||
|
|
||||||
get_or_add(VENUE_GLBX, SECURITY_TYPE_OPTION, "ESZ6 C6500");
|
|
||||||
// store: ns="GLBX.OPTION", key="ESZ6 C6500"
|
|
||||||
|
|
||||||
get_or_add(VENUE_GLBX, SECURITY_TYPE_OPTION, "ESZ6-W1 C6500");
|
|
||||||
// store: ns="GLBX.OPTION", key="ESZ6-W1 C6500"
|
|
||||||
|
|
||||||
get_or_add(VENUE_COINBASE, SECURITY_TYPE_SPOT, "BTC-USD");
|
|
||||||
// store: ns="COINBASE.SPOT", key="BTC-USD"
|
|
||||||
```
|
|
||||||
|
|
||||||
Databento intentionally produces a different logical row even when the human
|
|
||||||
description is `ESZ6`. If its instrument ID were `12345678`, it would call the
|
|
||||||
equivalent of:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
get_or_add(VENUE_GLBX, SECURITY_TYPE_FUTURE, "12345678");
|
|
||||||
// store: ns="GLBX.FUTURE", key="12345678"
|
|
||||||
```
|
|
||||||
|
|
||||||
Likewise, the Python bridge uses `exchange_security_id`. A spot definition with
|
|
||||||
`exchange_security_id="BTC-USD"` produces the `COINBASE.SPOT / BTC-USD` row,
|
|
||||||
while a provider that sends `exchange_security_id="BTCUSD"` produces a
|
|
||||||
different row and therefore a different Spark key.
|
|
||||||
|
|
||||||
These examples show why the tuple is only logical when the adapter's naming
|
|
||||||
contract is also known. `GLBX.FUTURE / ESZ6` and `GLBX.FUTURE / 12345678` may
|
|
||||||
describe the same contract to a human but are distinct rows to `key_ids.sqlite`.
|
|
||||||
|
|
||||||
Both enum-prefix removals currently produce the same namespace spelling (for
|
|
||||||
example, `GLBX.OPTION`), so both mechanisms allocate from one global SQLite
|
|
||||||
rowid space. Live rows cannot share a rowid. The table does not declare
|
|
||||||
`AUTOINCREMENT`, however, so deleting rows—especially the highest row—can allow
|
|
||||||
SQLite to reuse a number later. Security-key rows should therefore be treated
|
|
||||||
as append-only operational data.
|
|
||||||
|
|
||||||
`SqliteStore` uses WAL mode and `PRAGMA synchronous = 0`. This favors startup
|
|
||||||
and feed latency over maximum durability against a host/power failure. The
|
|
||||||
unique `(ns, key)` index prevents two different rows for the same logical
|
|
||||||
security.
|
|
||||||
|
|
||||||
### Other places the key is stored
|
|
||||||
|
|
||||||
| Location | Purpose | Authoritative for allocation? |
|
|
||||||
|---|---|---|
|
|
||||||
| Hot and cold shared-memory segments | Live publication and fast consumer lookup | No; rebuilt at process startup |
|
|
||||||
| `CMESecurityIndex` / `GeneralSecurityIndex` and adapter maps | In-process routing from an incoming ID to a producer handle | No; in-memory only |
|
|
||||||
| `<data_path>/databases/md/securities.sqlite` | Serialized legacy `api::Security` definitions keyed by Spark key; used by security cache and MDP3 Sunday preload | No; it stores metadata after a key exists |
|
|
||||||
| Relay/market-data recordings | Preserve the key embedded in recorded securities, books, and trades for deterministic replay | No; replay normally reuses the recorded value |
|
|
||||||
| Orders, fills, positions, APIs | Reference a security by the published Spark key | No |
|
|
||||||
|
|
||||||
The `SecurityIDRecorder::work_db()` comment says a published security is also
|
|
||||||
recorded in the security database, but that function does **not** write
|
|
||||||
`securities.sqlite` in the current code. Full security definitions are persisted
|
|
||||||
separately by `SecurityCache::flush_to_disk()` through
|
|
||||||
`db::insert_or_replace()`.
|
|
||||||
|
|
||||||
## CME MDP3 / OnixS pipeline in detail
|
|
||||||
|
|
||||||
### 1. Construction and thread setup
|
|
||||||
|
|
||||||
`MDP3Main::PImpl` owns one `CMESecurityIndex`, one `SecurityIDRecorder`, and one
|
|
||||||
`MDProducer`. It constructs the recorder with:
|
|
||||||
|
|
||||||
- a lookup callback that maps `ExchangeKey` through the CME index to the
|
|
||||||
handle's current Spark key; and
|
|
||||||
- `Dispatcher::current()`, which drives a 200 ms recorder timer.
|
|
||||||
|
|
||||||
In the current `MarketDataGateway` route, `OnixsGlbxSubscription` creates a
|
|
||||||
dedicated `dispatcher_thread`, constructs and starts `MDP3Main` on that thread,
|
|
||||||
then calls that thread's dispatcher `run()`. The older `md run onixs` command
|
|
||||||
uses its command/dispatcher thread similarly.
|
|
||||||
|
|
||||||
The OnixS feed engine has its own configured thread pool. Instrument and market
|
|
||||||
data callbacks therefore originate on OnixS feed-engine threads, while recorder
|
|
||||||
database work and final key assignment execute on the MDP3 dispatcher thread.
|
|
||||||
|
|
||||||
| MDP3 stage | Executing thread | DB call? |
|
|
||||||
|---|---|---|
|
|
||||||
| Decode definition and set CME `numeric_id` | OnixS feed-engine callback thread | No |
|
|
||||||
| Allocate hot/cold entry and queue handle | Same OnixS callback thread | No |
|
|
||||||
| Add CME-ID index entry | Same OnixS callback thread | No |
|
|
||||||
| Resolve spread legs | MDP3 dispatcher thread, on 200 ms timer | No |
|
|
||||||
| Select/insert Spark key | MDP3 dispatcher thread, on 200 ms timer | Yes |
|
|
||||||
| `handle.set_key()` and public visibility | MDP3 dispatcher thread, in DB callback | No additional call |
|
|
||||||
|
|
||||||
### 2. Definition callback: exchange ID is set, Spark key is not
|
|
||||||
|
|
||||||
For futures, options, and spreads, `MDP3Listener::set_security_common()` does:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
fsec.numeric_id = def.securityId();
|
|
||||||
```
|
|
||||||
|
|
||||||
It also copies symbol/descriptor/venue and pricing fields. A newly constructed
|
|
||||||
`FixedSecurity` already has `key == invalid_security_key` (`0`), and this helper
|
|
||||||
does not change it.
|
|
||||||
|
|
||||||
For a spread, every leg starts with:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
leg.exchange_key = ExchangeKey(definition_leg.legSecurityId());
|
|
||||||
leg.key = invalid_security_key;
|
|
||||||
```
|
|
||||||
|
|
||||||
Thus both the parent and legs initially carry exchange-routing identity, but no
|
|
||||||
Spark identity.
|
|
||||||
|
|
||||||
### 3. Shared-memory allocation and exchange indexing
|
|
||||||
|
|
||||||
`MDP3Listener::add_security()` performs these operations in order:
|
|
||||||
|
|
||||||
1. `_producer.add_security(security)` allocates a hot entry and a variable-sized
|
|
||||||
cold entry and copies the security into the cold segment.
|
|
||||||
2. Because the key is `0`, `MDProducer` queues the handle through
|
|
||||||
`SecurityIDRecorder::ensure_key()`.
|
|
||||||
3. `_index.add_security(security.numeric_id, handle)` immediately creates the
|
|
||||||
CME-ID-to-handle mapping.
|
|
||||||
4. The initial exchange status is written through the handle.
|
|
||||||
|
|
||||||
This ordering means incoming books can already be routed by CME ID while the
|
|
||||||
Spark key is pending. Shared-memory consumers cannot discover the security yet.
|
|
||||||
Also, `MDProducerHandle::add_trade()` only appends to the public trade queue
|
|
||||||
when `key() != 0`, so a trade received in this short window updates the cold
|
|
||||||
last-trade state but is not added to the keyed trade log.
|
|
||||||
|
|
||||||
### 4. Recorder tick: spreads, handles, then database
|
|
||||||
|
|
||||||
Every 200 ms the recorder calls, in this exact order:
|
|
||||||
|
|
||||||
1. `work_spreads()` tries to fill previously unresolved spread leg keys by
|
|
||||||
asking `CMESecurityIndex` for each leg exchange ID.
|
|
||||||
2. `work_handles()` drains new handles. Outrights are converted to an API
|
|
||||||
security and queued for DB lookup immediately. A spread without all leg keys
|
|
||||||
is retained in `pending_handle` and its leg pointers are registered in
|
|
||||||
`unresolved_legs`.
|
|
||||||
3. `work_db()` resolves queued `(venue, type, descriptor)` requests.
|
|
||||||
|
|
||||||
Because spread work precedes new-handle work, a newly seen unresolved spread
|
|
||||||
normally waits until at least the next timer tick to resolve legs. It waits
|
|
||||||
longer if any outright leg has not yet received its Spark key. A spread's own
|
|
||||||
key is not requested until every leg key is non-zero.
|
|
||||||
|
|
||||||
### 5. Lookup or generation
|
|
||||||
|
|
||||||
`work_db()` first queries `(ns, key)`:
|
|
||||||
|
|
||||||
- Existing row: use its `rowid` as the key and invoke the callback.
|
|
||||||
- Missing row: batch it into `insert_many_resolve_ids()`. SQLite assigns a new
|
|
||||||
rowid inside a transaction, the row object receives that ID, and the callback
|
|
||||||
runs after the transaction completes.
|
|
||||||
|
|
||||||
New inserts are throttled to roughly 200 per timer pass (the current `> 200`
|
|
||||||
check can admit 201) to avoid delaying heartbeats during startup. The queues are
|
|
||||||
TBB concurrent queues, but all SQLite access is serialized onto the recorder's
|
|
||||||
dispatcher thread. `check_access()` asserts this single-thread rule after the
|
|
||||||
first work pass records the dispatcher thread ID.
|
|
||||||
|
|
||||||
### 6. Final assignment and visibility
|
|
||||||
|
|
||||||
The queued callback captures a copy of `MDProducerHandle` and calls
|
|
||||||
`handle.set_key(id)` on the dispatcher thread. `set_key()` writes hot, then cold,
|
|
||||||
then increments `security_count`. From this point:
|
|
||||||
|
|
||||||
- shared-memory scans report the security;
|
|
||||||
- `CMESecurityIndex::get_key(CME_ID)` returns the Spark key;
|
|
||||||
- trades and RFQs can be emitted with a non-zero key;
|
|
||||||
- resolved spreads can copy this key into their leg structures.
|
|
||||||
|
|
||||||
### 7. Sunday preload is a fast path
|
|
||||||
|
|
||||||
For configured symbols on Sunday, `MDP3Main::prepare_listener()` loads stored
|
|
||||||
definitions from `securities.sqlite`. It converts them with
|
|
||||||
`set_security_key=true`, so both the security key and spread leg keys come from
|
|
||||||
the serialized API security. `MDProducer::add_security()` calls `set_key()`
|
|
||||||
immediately, and no recorder lookup is required for that preloaded handle. The
|
|
||||||
CME exchange ID is still restored into `numeric_id`, allowing the normal CME
|
|
||||||
index to be built.
|
|
||||||
|
|
||||||
## Generalized/newer pipeline in detail
|
|
||||||
|
|
||||||
### 1. Topology and ownership
|
|
||||||
|
|
||||||
`Run::run()` starts a detached thread named `MarketDataGateway`. On that thread,
|
|
||||||
`run_md_gwy()` obtains the process-wide `IDGenerator`, constructs
|
|
||||||
`MarketDataGateway`, and starts the configured providers. For each `(venue,
|
|
||||||
source)` returned by a provider, the gateway creates an `MdSink` containing:
|
|
||||||
|
|
||||||
- a venue-local `GeneralSecurityIndex`;
|
|
||||||
- a default `MDProducer` (not wired to a `SecurityIDRecorder`); and
|
|
||||||
- a `GeneralMarketDataListener` connecting the source to that producer/index.
|
|
||||||
|
|
||||||
The source decides its callback thread. Some sources call the listener while
|
|
||||||
starting; others own network or replay threads. The generalized listener calls
|
|
||||||
the producer inline on that source thread. The process-wide `IDGenerator`
|
|
||||||
serializes its own calls with a mutex, but the listener's transient
|
|
||||||
`cc_sec_id_map` is an ordinary `unordered_map`, so each source/listener pair is
|
|
||||||
expected to serialize security/event callbacks.
|
|
||||||
|
|
||||||
| Generalized stage | Executing thread | DB call? |
|
|
||||||
|---|---|---|
|
|
||||||
| Build/parse domain definition | Source/adaptor thread | No |
|
|
||||||
| `IDGenerator::get_or_add()` | Same source/adaptor thread | Yes, synchronously |
|
|
||||||
| `GeneralMarketDataListener::on_securities()` | Same source callback thread | No in current use-given mode |
|
|
||||||
| Copy ID to `FixedSecurity::key` and `numeric_id` | Same source callback thread | No |
|
|
||||||
| `MDProducer::add_security()` / `set_key()` | Same source callback thread | No additional call |
|
|
||||||
| Add `GeneralSecurityIndex` entry | Same source callback thread | No |
|
|
||||||
|
|
||||||
There are two important compatibility exceptions inside the provider framework:
|
|
||||||
|
|
||||||
- `OnixsGlbxSubscription::start()` ignores the supplied generalized listener
|
|
||||||
and starts `MDP3Main`; CME/OnixS therefore still follows the asynchronous
|
|
||||||
legacy flow documented above.
|
|
||||||
- `EmumbaDeribitSubscription::start()` also ignores that listener and uses
|
|
||||||
`EmMDListener`, which allocates via `IDGenerator` and writes through its own
|
|
||||||
producer/index. Its assignment is still synchronous and pre-populated, so it
|
|
||||||
resembles the newer ID flow even though it does not pass through
|
|
||||||
`GeneralMarketDataListener`.
|
|
||||||
|
|
||||||
### 2. How a new ID is constructed
|
|
||||||
|
|
||||||
For a normal live generalized adapter, ID creation happens **in the adapter,
|
|
||||||
before** `GeneralMarketDataListener::on_securities()`:
|
|
||||||
|
|
||||||
```text
|
|
||||||
logical identity = (domain venue, domain security type, adapter-chosen name)
|
|
||||||
Spark ID = SQLite rowid for that identity in key_ids.sqlite
|
|
||||||
```
|
|
||||||
|
|
||||||
`IDGenerator::get_or_add(venue, type, name)` formats a namespace by stripping
|
|
||||||
the enum prefixes:
|
|
||||||
|
|
||||||
```text
|
|
||||||
VENUE_TAIFEX + SECURITY_TYPE_FUTURE -> TAIFEX.FUTURE
|
|
||||||
```
|
|
||||||
|
|
||||||
It then calls `retrieve_one(ns, name)`. If the row exists, it returns that
|
|
||||||
row's `rowid`. If absent, it inserts `(ns, name, "")`, and SQLite assigns the
|
|
||||||
next rowid. That integer is wrapped in `domain::SecurityID` and placed in
|
|
||||||
`SecurityCommon::id`.
|
|
||||||
|
|
||||||
The third identity component is adapter-specific, and this matters when trying
|
|
||||||
to reproduce a mapping:
|
|
||||||
|
|
||||||
| Source/adaptor family | Typical `name` sent to `IDGenerator` |
|
|
||||||
|---|---|
|
|
||||||
| Binance, Coinbase, Deribit, OKX and similar native/CCAPI paths | Usually `sec.desc()` / exchange instrument name |
|
|
||||||
| Taifex | product/instrument ID string |
|
|
||||||
| Databento | `std::to_string(msg.hd.instrument_id)`, not the human-readable description |
|
|
||||||
| Python bridge | `exchange_security_id` (and it asserts Python supplied ID is zero for definitions) |
|
|
||||||
| Emumba Deribit | extracted Emumba security descriptor |
|
|
||||||
| Replay | no new allocation for a recorded definition; it reuses the recorded `SecurityCommon::id` |
|
|
||||||
|
|
||||||
So “security name” alone is not a universal logical key. Reproduction requires
|
|
||||||
the exact venue enum, exact security-type enum, and the exact adapter-specific
|
|
||||||
name used at insertion time.
|
|
||||||
|
|
||||||
### 3. What `GeneralMarketDataListener` does with that ID
|
|
||||||
|
|
||||||
`on_securities()` first calls `_find_sec(sec, true)`. Its current, compile-time
|
|
||||||
behavior is controlled by:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
const bool use_given_sec_key = true;
|
|
||||||
```
|
|
||||||
|
|
||||||
Consequently, for a newly seen incoming `domain::SecurityID` it does **not**
|
|
||||||
call the DB. It copies `security_common.id.value()` into its transient
|
|
||||||
`cc_sec_id_map`. `_add_future()`, `_add_option()`, `_add_spread()`, or
|
|
||||||
`_add_spot()` then calls `_copy_security_common()`, which sets:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
to.key = incoming_id;
|
|
||||||
to.numeric_id = incoming_id;
|
|
||||||
```
|
|
||||||
|
|
||||||
This collapses the generalized source/correlation ID and Spark shared-memory
|
|
||||||
key into the same number. The source's text `exchange_sec_id` remains on the
|
|
||||||
domain security but is not copied into `FixedSecurity::numeric_id` by this
|
|
||||||
path.
|
|
||||||
|
|
||||||
`_commit_security()` then:
|
|
||||||
|
|
||||||
1. calls `MDProducer::add_security()` with an already non-zero key;
|
|
||||||
2. causes `MDProducerHandle::set_key()` to run immediately during that call;
|
|
||||||
3. inserts the handle in `GeneralSecurityIndex` under `numeric_id` (the same
|
|
||||||
number); and
|
|
||||||
4. returns with the security already visible in shared memory.
|
|
||||||
|
|
||||||
Because the sink's producer has no recorder, supplying `id == 0` would allocate
|
|
||||||
the shared-memory entry but never assign or publish its key. Generalized live
|
|
||||||
sources must therefore provide a valid non-zero ID before `on_securities()`.
|
|
||||||
|
|
||||||
The listener contains an alternative branch for `use_given_sec_key == false`.
|
|
||||||
That branch would call `IDGenerator::get_or_add(me->venue, sec.type(),
|
|
||||||
sec.desc())` itself. It is currently disabled, and `_generate_security_key()` is
|
|
||||||
also effectively unused. Turning the flag off is not a mechanical change: an
|
|
||||||
adapter such as Databento allocates using numeric instrument ID while the
|
|
||||||
listener branch would use `sec.desc()`, potentially creating a second key for
|
|
||||||
the same instrument.
|
|
||||||
|
|
||||||
There is also a spread failure edge case. `_find_sec(sec, true)` records the
|
|
||||||
parent ID in `cc_sec_id_map` before `_add_spread()` resolves its legs. If any leg
|
|
||||||
ID is absent, `_add_spread()` logs and returns without committing the spread. A
|
|
||||||
later repeat of the parent definition is then classified as a duplicate and
|
|
||||||
ignored, so definition ordering is a hard requirement in the current code.
|
|
||||||
|
|
||||||
### 4. How later books, trades, and statistics find the security
|
|
||||||
|
|
||||||
Every later domain event carries a `domain::SecurityID`:
|
|
||||||
|
|
||||||
- `Book::security_id()`;
|
|
||||||
- `TradeRecord::sec_id`; or
|
|
||||||
- `SecurityMarketDataStatistics::security_id`.
|
|
||||||
|
|
||||||
The listener first uses `cc_sec_id_map` to translate that event ID to the value
|
|
||||||
stored in `GeneralSecurityIndex`, then obtains the `MDProducerHandle`. With
|
|
||||||
`use_given_sec_key == true`, this mapping is numerically identity-to-identity,
|
|
||||||
but it still serves as the admission check that the definition was seen.
|
|
||||||
|
|
||||||
Most high-throughput adapters avoid SQLite on market-data events:
|
|
||||||
|
|
||||||
- Databento allocates on the definition and caches
|
|
||||||
`instrument_id -> domain::SecurityID` in `sec_id_map` for books/trades.
|
|
||||||
- Taifex keeps the resolved ID in its security-details mapper.
|
|
||||||
- Other native subscriptions maintain comparable descriptor/ID maps.
|
|
||||||
|
|
||||||
The Python bridge is a notable exception: `to_bts_security_()`,
|
|
||||||
`to_bts_trade_()`, and `to_book_()` all call `get_sec_id_()`, which calls
|
|
||||||
`IDGenerator::get_id(..., add_if_new=true)`. As written, that performs at least
|
|
||||||
one SQLite `SELECT` for each converted Python definition, trade, or book. It
|
|
||||||
returns the existing ID after the first insert, but it is still a DB call and
|
|
||||||
takes the global `IDGenerator` mutex on every event.
|
|
||||||
|
|
||||||
### 5. Persistence timing and latency
|
|
||||||
|
|
||||||
The newer allocator is synchronous:
|
|
||||||
|
|
||||||
- Existing security: mutex acquisition plus one SQLite `SELECT` on the caller's
|
|
||||||
thread.
|
|
||||||
- New security: mutex acquisition, one `SELECT`, then one SQLite `INSERT`
|
|
||||||
(SQLite autocommit), also on the caller's thread.
|
|
||||||
- Listener publication: no further DB call under the current
|
|
||||||
`use_given_sec_key` setting.
|
|
||||||
|
|
||||||
The ID therefore exists in `key_ids.sqlite` before the adapter sends the
|
|
||||||
definition to the listener. There is no intentional 200 ms publication delay,
|
|
||||||
but the source callback/startup path directly pays DB and mutex latency. Bulk
|
|
||||||
definition discovery performs one lookup and possibly one insert per security;
|
|
||||||
`IDGenerator` does not batch those operations.
|
|
||||||
|
|
||||||
WAL mode helps concurrency, while `synchronous=0` reduces fsync cost. It does
|
|
||||||
not eliminate SQL parsing/stepping, mutex contention, page-cache misses, or
|
|
||||||
occasional file-system work. The impact is usually a startup/definition cost
|
|
||||||
when adapters cache the result, but it becomes hot-path latency for code such as
|
|
||||||
the current Python bridge that resolves every event through the DB.
|
|
||||||
|
|
||||||
`GeneralMarketDataListener` itself does not persist the full contract definition
|
|
||||||
to `securities.sqlite`; that remains the separate security-cache/metadata
|
|
||||||
persistence path described earlier.
|
|
||||||
|
|
||||||
## Comparison: MDP3 recorder vs generalized allocator
|
|
||||||
|
|
||||||
| Property | MDP3 / `SecurityIDRecorder` | Generalized / `IDGenerator` |
|
|
||||||
|---|---|---|
|
|
||||||
| Logical input | venue + type + legacy `security_desc` | venue + type + adapter-chosen name |
|
|
||||||
| Numeric output | SQLite rowid, checked/read as 32-bit `security_key` | SQLite rowid returned as 64-bit `domain::SecurityID`, then narrowed into 32-bit shared-memory key |
|
|
||||||
| Allocation point | After definition is copied to shared memory | Normally inside adapter before listener sees definition |
|
|
||||||
| DB execution | Asynchronous on dispatcher timer | Synchronous on caller/source thread |
|
|
||||||
| Existing ID cost | One deferred `SELECT` | One immediate `SELECT` per call |
|
|
||||||
| New ID cost | Deferred, batched transaction (about 200/pass) | Immediate `SELECT` + individual autocommit `INSERT` |
|
|
||||||
| Time until public | Usually 0–200+ ms; spreads may take extra ticks | Immediate after synchronous lookup/insert completes |
|
|
||||||
| Feed callback blocking | Queue push only for ID work | Yes, if the adapter invokes `IDGenerator` there |
|
|
||||||
| Spread legs | Parent waits asynchronously until all leg keys resolve by exchange ID | Definition processing requires every leg's incoming ID already exist in `cc_sec_id_map`; otherwise the spread is aborted |
|
|
||||||
| Runtime ID relationship | Exchange ID and Spark key remain distinct | Incoming/canonical ID, `numeric_id`, index ID, and Spark key are currently the same number |
|
|
||||||
| Persistence database | `key_ids.sqlite` | The same `key_ids.sqlite` |
|
|
||||||
| Batching | Yes for new rows | No |
|
|
||||||
| Failure behavior | Security has an internal handle with key 0 while normal queued work is pending; DB work does not block the feed callback | DB errors/zero results occur in the synchronous source path; a zero ID can leave an unpublishable entry, with no pending-key state machine |
|
|
||||||
|
|
||||||
Neither algorithm generates a UUID or a content hash. Both ultimately use an
|
|
||||||
opaque, database-assigned SQLite rowid. It is normally increasing and looks like
|
|
||||||
a sequence, but this schema does not request SQLite `AUTOINCREMENT`. The tuple
|
|
||||||
used to *look up* the row is logical; the resulting number is not derivable from
|
|
||||||
that tuple.
|
|
||||||
|
|
||||||
## Can another system reconstruct the same keys?
|
|
||||||
|
|
||||||
Not from `(venue, type, name)` alone. Another system can reconstruct the
|
|
||||||
**logical lookup tuple**, but it cannot calculate the numeric Spark key because
|
|
||||||
the key depends on the historical insertion order of every row in
|
|
||||||
`key_ids.sqlite`.
|
|
||||||
|
|
||||||
For example, two empty systems can insert the exact same `GLBX.FUTURE / ESZ6`
|
|
||||||
row and receive different IDs if other securities were inserted before it on
|
|
||||||
one system. They are sequential opaque IDs, not deterministic hashes and not
|
|
||||||
UUIDs.
|
|
||||||
|
|
||||||
Ways to preserve cross-system identity are:
|
|
||||||
|
|
||||||
1. Copy/replicate `key_ids.sqlite` (including rowids) and keep descriptor rules
|
|
||||||
identical. This preserves existing numeric keys but requires coordinated
|
|
||||||
allocation for new ones.
|
|
||||||
2. Export an explicit mapping of `(namespace, adapter key) -> Spark key`, then
|
|
||||||
import rows with their original rowids before either system allocates new
|
|
||||||
securities.
|
|
||||||
3. Treat a stable external identity (venue + type + exchange instrument ID, or
|
|
||||||
another canonical instrument identifier) as the cross-system key and carry a
|
|
||||||
translation table to each system's local Spark key.
|
|
||||||
4. Introduce a deterministic ID scheme only as a versioned migration. A hash can
|
|
||||||
be computed independently, but collision handling, descriptor
|
|
||||||
canonicalization, aliases/renames, the existing 32-bit ABI, and compatibility
|
|
||||||
with orders/recordings/databases all need explicit design.
|
|
||||||
|
|
||||||
Copying only `securities.sqlite` is insufficient as an allocator strategy. It
|
|
||||||
contains security blobs keyed by already-assigned IDs, but `key_ids.sqlite` is
|
|
||||||
the mapping used to find or allocate those IDs. Conversely, copying only
|
|
||||||
`key_ids.sqlite` preserves the numbers but not all contract metadata.
|
|
||||||
|
|
||||||
## Other assignment paths in `sparkd`
|
|
||||||
|
|
||||||
The two main pipelines reduce to four ways a producer handle can acquire a key:
|
|
||||||
|
|
||||||
1. **Already keyed input.** `MDProducer::add_security()` sees a non-zero
|
|
||||||
`FixedSecurity::key` and calls `set_key()` immediately. Generalized feeds,
|
|
||||||
Sunday preload, relay playback, and other replay paths use this mechanism.
|
|
||||||
2. **Recorder-backed live input.** The input key is zero and the producer owns a
|
|
||||||
`SecurityIDRecorder`; `ensure_key()` queues asynchronous assignment. CME
|
|
||||||
MDP3 and legacy OnixS ICE use this mechanism. ICE uses `marketId` as
|
|
||||||
`numeric_id` and otherwise follows the same recorder/index design.
|
|
||||||
3. **Service assignment.** `SyntheticSecurityService` calls
|
|
||||||
`SecurityIDRecorder::assign_key()` directly on a background dispatcher. The
|
|
||||||
callback receives a copied `api::Security` with its top-level `id` set, then
|
|
||||||
publishes it to synthetic subscribers. It uses the same `key_ids.sqlite`
|
|
||||||
rowid allocator.
|
|
||||||
4. **Unkeyed input with no recorder.** The entry is allocated with key zero and
|
|
||||||
never becomes public. This is not a valid production assignment path, but it
|
|
||||||
is the failure mode if a generalized source omits its ID.
|
|
||||||
|
|
||||||
Relay and replay deserve care when reasoning about persistence:
|
|
||||||
|
|
||||||
- The generalized `MDReplayer` forwards the recorded domain security ID and
|
|
||||||
emits later books/statistics with the recorded `sec_key`, so the listener's
|
|
||||||
current use-given mode preserves the recording's numeric identity.
|
|
||||||
- The legacy relay producer converts a recorded `api::Security` with
|
|
||||||
`set_security_key=true`, so its shared-memory publication also preserves the
|
|
||||||
embedded key.
|
|
||||||
- The legacy relay recorder additionally calls `bulk_insert(..., "REPLAY: ")`
|
|
||||||
for logical mappings. Those rows use a `REPLAY: ` namespace prefix; this is a
|
|
||||||
separate mapping population step, not a deterministic derivation of the key.
|
|
||||||
|
|
||||||
## Operational implications
|
|
||||||
|
|
||||||
- Back up `key_ids.sqlite` and `securities.sqlite` together if numeric ID and
|
|
||||||
definition continuity matter.
|
|
||||||
- Do not delete/rebuild `key_ids.sqlite` on one host and assume IDs will match
|
|
||||||
another host, even when all instruments are identical.
|
|
||||||
- Before moving a feed between adapters, compare the exact `name` each adapter
|
|
||||||
supplies to `IDGenerator`. Matching venue/type is insufficient.
|
|
||||||
- Cache generated IDs in the source after definition processing. Avoid calling
|
|
||||||
`IDGenerator` from book/trade hot paths; the Python bridge currently violates
|
|
||||||
this guideline.
|
|
||||||
- Keep generated rowids below the 32-bit shared-memory ceiling until the
|
|
||||||
`security_key` ABI is widened or explicit bounds checking is added to the
|
|
||||||
generalized path.
|
|
||||||
- Ensure spread legs are announced before generalized spread parents.
|
|
||||||
- Treat `synchronous=0` as a durability decision. A copied DB should be taken
|
|
||||||
with SQLite-aware backup/checkpoint handling rather than by casually copying
|
|
||||||
active WAL files.
|
|
||||||
|
|
||||||
Useful inspection queries (run against the configured DB path) are:
|
|
||||||
|
|
||||||
```sql
|
|
||||||
SELECT rowid AS spark_key, ns, key
|
|
||||||
FROM store
|
|
||||||
ORDER BY rowid;
|
|
||||||
|
|
||||||
SELECT rowid AS spark_key, ns, key
|
|
||||||
FROM store
|
|
||||||
WHERE ns = 'GLBX.FUTURE' AND key = '<exact-adapter-key>';
|
|
||||||
```
|
|
||||||
|
|
||||||
## Source map
|
|
||||||
|
|
||||||
- [`SecurityIDRecorder.cpp`](../src/lib_spark/spark/md/SecurityIDRecorder.cpp):
|
|
||||||
legacy queues, 200 ms work ordering, logical row construction, DB callbacks,
|
|
||||||
and spread-leg resolution.
|
|
||||||
- [`IDGenerator.cpp`](../src/lib_spark/spark/persistence/IDGenerator.cpp):
|
|
||||||
synchronous generalized lookup/allocation and process-wide mutex.
|
|
||||||
- [`SqliteStore.cpp`](../src/lib_spark/spark/persistence/SqliteStore.cpp): DB
|
|
||||||
location, schema, WAL/synchronous pragmas, individual inserts, and batch
|
|
||||||
inserts.
|
|
||||||
- [`MDProducer.cpp`](../src/lib_spark/spark/md/MDProducer.cpp) and
|
|
||||||
[`MDProducerHandle.cpp`](../src/lib_spark/spark/md/MDProducerHandle.cpp):
|
|
||||||
shared-memory allocation, recorder handoff, and ordered publication.
|
|
||||||
- [`FixedSecurity.h`](../src/lib_spark/spark/md/Shm/FixedSecurity.h) and
|
|
||||||
[`MDStructure.h`](../src/lib_spark/spark/md/Shm/MDStructure.h): identifier
|
|
||||||
widths and hot/cold storage fields.
|
|
||||||
- [`MDP3Main.cpp`](../src/app_sparkd/sparkd/md/platforms/mdp3_onixs/MDP3Main.cpp)
|
|
||||||
and
|
|
||||||
[`MDP3Listener.h`](../src/app_sparkd/sparkd/md/platforms/mdp3_onixs/MDP3Listener.h):
|
|
||||||
MDP3 construction, definition callbacks, CME ID extraction, and spread legs.
|
|
||||||
- [`MDP3Listener.cpp`](../src/app_sparkd/sparkd/md/platforms/mdp3_onixs/MDP3Listener.cpp):
|
|
||||||
producer/index insertion order.
|
|
||||||
- [`OnixsGlbxSubscription.cpp`](../src/app_sparkd/sparkd/md/glbx/OnixsGlbxSubscription.cpp):
|
|
||||||
current dedicated MDP3 dispatcher-thread ownership.
|
|
||||||
- [`MarketDataGateway.cpp`](../src/app_sparkd/sparkd/md/MarketDataGateway.cpp)
|
|
||||||
and
|
|
||||||
[`GeneralMarketDataListener.cpp`](../src/lib_spark/spark/md/GeneralMarketDataListener.cpp):
|
|
||||||
generalized source/sink topology, incoming-ID mapping, fixed-security
|
|
||||||
conversion, and publication.
|
|
||||||
- [`DatabentoDataHandler.cpp`](../src/app_sparkd/sparkd/md/databento/DatabentoDataHandler.cpp),
|
|
||||||
[`TaifexDataProcessors.h`](../src/app_sparkd/sparkd/md/taifex/TaifexDataProcessors.h),
|
|
||||||
and
|
|
||||||
[`PyMarketDataSubscription.cpp`](../src/app_sparkd/sparkd/md/PyMarketDataSubscription.cpp):
|
|
||||||
representative adapter-side allocation and caching behavior.
|
|
||||||
- [`SecurityDB.cpp`](../src/lib_spark/spark/md/SecurityDB.cpp) and
|
|
||||||
[`SecurityCache.cpp`](../src/lib_spark/spark/md/SecurityCache.cpp): separate
|
|
||||||
persistence of full security definitions.
|
|
||||||
- [`SecurityIndex.h`](../src/lib_spark/spark/md/SecurityIndex.h),
|
|
||||||
[`MBOServiceServer.cpp`](../src/lib_spark/spark/md/MBOServiceServer.cpp), and
|
|
||||||
[`MDConsumer.cpp`](../src/lib_spark/spark/md/MDConsumer.cpp): exchange-index
|
|
||||||
translation followed by Spark-keyed market-data consumption and MBO access.
|
|
||||||
- [`OrderFactory.cpp`](../src/lib_spark/spark/orderman/order_factory/OrderFactory.cpp),
|
|
||||||
[`FillStore.cpp`](../src/lib_spark/spark/orderman/actors/FillStore.cpp), and
|
|
||||||
[`PositionMap.cpp`](../src/app_sparkd/sparkd/position/PositionMap.cpp):
|
|
||||||
representative downstream use of Spark security keys.
|
|
||||||
- [`MDReplayer.cpp`](../src/app_sparkd/sparkd/md/recording/MDReplayer.cpp) and
|
|
||||||
[`RelayClient.cpp`](../src/lib_spark/spark/md/relay/RelayClient.cpp): recorded
|
|
||||||
ID reuse.
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
FROM ubuntu:22.04
|
|
||||||
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y pkg-config
|
|
||||||
RUN apt-get update && apt-get install -y locales
|
|
||||||
RUN apt-get update && apt-get install -y ca-certificates
|
|
||||||
RUN apt-get update && apt-get install -y libssh2-1-dev
|
|
||||||
RUN apt-get update && apt-get install -y software-properties-common
|
|
||||||
RUN apt-get update && apt-get install -y sudo
|
|
||||||
RUN apt-get update && apt-get install -y tzdata
|
|
||||||
|
|
||||||
# GCC
|
|
||||||
ARG gcc_major=13
|
|
||||||
RUN add-apt-repository ppa:ubuntu-toolchain-r/test \
|
|
||||||
&& apt-get update \
|
|
||||||
&& apt-get install -y g++-$gcc_major
|
|
||||||
|
|
||||||
RUN apt-get update \
|
|
||||||
&& apt-get install -y dotnet8
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y gdb
|
|
||||||
RUN apt-get update && apt-get install -y fish
|
|
||||||
RUN apt-get update && apt-get install -y vim
|
|
||||||
RUN apt-get update && apt-get install -y less
|
|
||||||
|
|
||||||
RUN locale-gen en_US.UTF-8
|
|
||||||
|
|
||||||
ARG docker_user="bts"
|
|
||||||
ARG docker_uid="1000"
|
|
||||||
ARG docker_pass="bts"
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
groupadd -g "$docker_uid" "$docker_user" \
|
|
||||||
&& useradd \
|
|
||||||
-m \
|
|
||||||
-u "$docker_uid" \
|
|
||||||
-g "$docker_uid" \
|
|
||||||
-G sudo \
|
|
||||||
--password "$(openssl passwd -1 "$docker_pass")" \
|
|
||||||
"$docker_user"
|
|
||||||
|
|
||||||
USER bts
|
|
||||||
WORKDIR /home/bts
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
FROM ubuntu:24.04
|
|
||||||
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
fish \
|
|
||||||
less \
|
|
||||||
vim
|
|
||||||
|
|
||||||
USER bts
|
|
||||||
WORKDIR /home/bts
|
|
||||||
+8
-6
@@ -2,12 +2,13 @@ FROM ubuntu:22.04
|
|||||||
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y pkg-config
|
RUN apt-get update \
|
||||||
RUN apt-get update && apt-get install -y locales
|
&& apt-get install -y pkg-config \
|
||||||
RUN apt-get update && apt-get install -y ca-certificates
|
&& apt-get install -y locales \
|
||||||
RUN apt-get update && apt-get install -y libssh2-1-dev
|
&& apt-get install -y ca-certificates \
|
||||||
RUN apt-get update && apt-get install -y software-properties-common
|
&& apt-get install -y libssh2-1-dev \
|
||||||
RUN apt-get update && apt-get install -y sudo
|
&& apt-get install -y software-properties-common \
|
||||||
|
&& apt-get install -y sudo
|
||||||
|
|
||||||
# GCC
|
# GCC
|
||||||
ARG gcc_major=13
|
ARG gcc_major=13
|
||||||
@@ -23,6 +24,7 @@ RUN locale-gen en_US.UTF-8
|
|||||||
ARG docker_user="bts"
|
ARG docker_user="bts"
|
||||||
ARG docker_uid="1000"
|
ARG docker_uid="1000"
|
||||||
ARG docker_pass="bts"
|
ARG docker_pass="bts"
|
||||||
|
# ARG entrypoint
|
||||||
|
|
||||||
RUN \
|
RUN \
|
||||||
groupadd -g "$docker_uid" "$docker_user" \
|
groupadd -g "$docker_uid" "$docker_user" \
|
||||||
+1
-1
Submodule externals updated: 2755fd6b8f...cae5fd20da.
+1
-21
@@ -1,42 +1,22 @@
|
|||||||
astroid==2.7.3
|
astroid==2.7.3
|
||||||
autopep8==1.5.7
|
autopep8==1.5.7
|
||||||
blinker==1.9.0
|
|
||||||
boto3==1.37.9
|
|
||||||
botocore==1.37.9
|
|
||||||
certifi==2023.5.7
|
certifi==2023.5.7
|
||||||
charset-normalizer==3.1.0
|
charset-normalizer==3.1.0
|
||||||
click==8.1.8
|
|
||||||
colorama==0.4.4
|
colorama==0.4.4
|
||||||
Flask==3.1.0
|
|
||||||
idna==3.4
|
idna==3.4
|
||||||
isort==5.9.3
|
isort==5.9.3
|
||||||
itsdangerous==2.2.0
|
|
||||||
Jinja2==3.1.6
|
|
||||||
jmespath==1.0.1
|
|
||||||
lazy-object-proxy==1.6.0
|
lazy-object-proxy==1.6.0
|
||||||
MarkupSafe==3.0.2
|
|
||||||
mccabe==0.6.1
|
mccabe==0.6.1
|
||||||
numpy==2.2.6
|
|
||||||
platformdirs==2.3.0
|
platformdirs==2.3.0
|
||||||
protobuf==6.33.4
|
protobuf==4.21.12
|
||||||
pybars3==0.9.7
|
pybars3==0.9.7
|
||||||
pybind11==3.0.1
|
|
||||||
pybind11-stubgen==2.5.5
|
|
||||||
pybit==5.11.0
|
|
||||||
pycodestyle==2.7.0
|
pycodestyle==2.7.0
|
||||||
pycparser==2.20
|
pycparser==2.20
|
||||||
pycryptodome==3.23.0
|
|
||||||
pylint==2.10.2
|
pylint==2.10.2
|
||||||
PyMeta3==0.5.1
|
PyMeta3==0.5.1
|
||||||
python-dateutil==2.9.0.post0
|
|
||||||
python-dotenv==1.0.1
|
|
||||||
requests==2.31.0
|
requests==2.31.0
|
||||||
s3transfer==0.11.4
|
|
||||||
six==1.17.0
|
|
||||||
termcolor==1.1.0
|
termcolor==1.1.0
|
||||||
toml==0.10.2
|
toml==0.10.2
|
||||||
urllib3==2.0.3
|
urllib3==2.0.3
|
||||||
websocket-client==1.8.0
|
|
||||||
Werkzeug==3.1.3
|
|
||||||
wrapt==1.12.1
|
wrapt==1.12.1
|
||||||
yapf==0.31.0
|
yapf==0.31.0
|
||||||
+82
-285
@@ -1,306 +1,103 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio Version 17
|
# Visual Studio Version 17
|
||||||
VisualStudioVersion = 17.0.31903.59
|
VisualStudioVersion = 17.3.32922.545
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 15.0.26124.0
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_api", "src\client\spark_api\spark_api.csproj", "{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cs", "cs", "{D7C6B9C7-1058-B1EA-FEE6-34C56B05AEDB}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spark", "src\client\spark\Spark.csproj", "{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.Spark.Core", "src\cs\Bts.Spark.Core\Bts.Spark.Core.csproj", "{684863A1-3396-4D31-A731-C0725CF07F4E}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spark.Console", "src\client\Spark.Console\Spark.Console.csproj", "{387566C6-C6F6-412C-A30C-9855BBCB4816}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.Spark.Api", "src\cs\Bts.Spark.Api\Bts.Spark.Api.csproj", "{45292808-4EF3-4D4A-B3F5-B75C42EE5870}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_core", "src\client\spark_core\spark_core.csproj", "{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.Extensions.Hosting", "src\cs\Bts.Extensions.Hosting\Bts.Extensions.Hosting.csproj", "{AA57F8D9-7BD6-4161-881B-AD2CEF9A30F6}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_sdk", "src\client\spark_sdk\spark_sdk.csproj", "{6963C314-83C4-4667-B0D0-C2F7AE208C29}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.IO.Compression", "src\cs\Bts.IO.Compression\Bts.IO.Compression.csproj", "{28A26DF7-5F7A-43A2-A548-B55FEBCC3958}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_test", "src\client\spark_test\spark_test.csproj", "{ECD78CC5-138F-4809-A764-2358C2AC2E82}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.Net", "src\cs\Bts.Net\Bts.Net.csproj", "{7543386A-5EBA-4AF0-9E0F-35657B58557D}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_websocket", "src\client\spark_websocket\spark_websocket.csproj", "{3201359D-C071-4089-9EDE-B04D759F1508}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DataStreamSuite", "DataStreamSuite", "{60E0D592-FFB3-0D0A-C4AA-E88919B48F9D}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_api_server", "src\client\spark_api_server\spark_api_server.csproj", "{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}"
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PubSub", "src\DataStreamSuite\PubSub\PubSub.csproj", "{C13A5ABD-F739-4BE8-A2FE-511E989A5B43}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataStreamCore", "src\DataStreamSuite\DataStreamCore\DataStreamCore.csproj", "{F7C6F079-67BA-4899-9B43-D3F8C121D264}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArithmeticExpressions", "src\DataStreamSuite\ArithmeticExpressions\ArithmeticExpressions.csproj", "{E60C119D-2919-4E2F-9D39-90DB1A8FF9A7}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BaseUtilities", "src\DataStreamSuite\BaseUtilities\BaseUtilities.csproj", "{ECBAA198-EC93-4174-8156-BDA5F5E95042}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooleanExpressions", "src\DataStreamSuite\BooleanExpressions\BooleanExpressions.csproj", "{F54AE5C0-2ECA-4151-82E6-0D7EFE88FF40}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.ColumnExpressions", "src\DataStreamSuite\Bts.ColumnExpressions\Bts.ColumnExpressions.csproj", "{A898C6C3-F134-4AF0-AFB3-3834C58CC0D7}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bts.ColumnSortExpressions", "src\DataStreamSuite\Bts.ColumnSortExpressions\Bts.ColumnSortExpressions.csproj", "{1E296FB3-D185-4A95-A1EB-AA5B37B85C60}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataStreamExpressions", "src\DataStreamSuite\DataStreamExpressions\DataStreamExpressions.csproj", "{B6070F41-8759-448B-B56D-A7D15D489569}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataStream", "src\DataStreamSuite\DataStream\DataStream.csproj", "{B2D721AB-920C-4CD6-8DBF-6778A115A449}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedStreams", "src\DataStreamSuite\SharedStreams\SharedStreams.csproj", "{38EE36C6-892C-4C94-8BB0-1ACB164E1F20}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "client", "client", "{C5A3B5EA-BE9F-76E5-E9B8-8A22B289B295}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "spark", "spark", "{42C014A0-00C5-0620-8552-38912E891A7F}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spark", "src\client\spark\Spark.csproj", "{D432F3E9-3D2F-4623-B7B9-CEBA6701FFC3}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "spark_test", "src\client\spark_test\spark_test.csproj", "{DD00F5D5-6C2F-4FDA-AE3D-25CF01A9A224}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spark.Console", "src\client\Spark.Console\Spark.Console.csproj", "{2B8243FF-60C6-4607-8AAE-7762D29B0A48}"
|
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
|
||||||
Debug|x64 = Debug|x64
|
Debug|x64 = Debug|x64
|
||||||
Debug|x86 = Debug|x86
|
MinSizeRel|x64 = MinSizeRel|x64
|
||||||
Release|Any CPU = Release|Any CPU
|
|
||||||
Release|x64 = Release|x64
|
Release|x64 = Release|x64
|
||||||
Release|x86 = Release|x86
|
RelWithDebInfo|x64 = RelWithDebInfo|x64
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{684863A1-3396-4D31-A731-C0725CF07F4E}.Debug|Any CPU.ActiveCfg = Debug|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{684863A1-3396-4D31-A731-C0725CF07F4E}.Debug|Any CPU.Build.0 = Debug|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|x64.Build.0 = Debug|x64
|
||||||
{684863A1-3396-4D31-A731-C0725CF07F4E}.Debug|x64.ActiveCfg = Debug|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|x64.ActiveCfg = Release|x64
|
||||||
{684863A1-3396-4D31-A731-C0725CF07F4E}.Debug|x64.Build.0 = Debug|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|x64.Build.0 = Release|x64
|
||||||
{684863A1-3396-4D31-A731-C0725CF07F4E}.Debug|x86.ActiveCfg = Debug|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|x64.ActiveCfg = Release|x64
|
||||||
{684863A1-3396-4D31-A731-C0725CF07F4E}.Debug|x86.Build.0 = Debug|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|x64.Build.0 = Release|x64
|
||||||
{684863A1-3396-4D31-A731-C0725CF07F4E}.Release|Any CPU.ActiveCfg = Release|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||||
{684863A1-3396-4D31-A731-C0725CF07F4E}.Release|Any CPU.Build.0 = Release|x64
|
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||||
{684863A1-3396-4D31-A731-C0725CF07F4E}.Release|x64.ActiveCfg = Release|x64
|
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{684863A1-3396-4D31-A731-C0725CF07F4E}.Release|x64.Build.0 = Release|x64
|
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Debug|x64.Build.0 = Debug|x64
|
||||||
{684863A1-3396-4D31-A731-C0725CF07F4E}.Release|x86.ActiveCfg = Release|x64
|
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.MinSizeRel|x64.ActiveCfg = Release|x64
|
||||||
{684863A1-3396-4D31-A731-C0725CF07F4E}.Release|x86.Build.0 = Release|x64
|
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.MinSizeRel|x64.Build.0 = Release|x64
|
||||||
{45292808-4EF3-4D4A-B3F5-B75C42EE5870}.Debug|Any CPU.ActiveCfg = Debug|x64
|
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Release|x64.ActiveCfg = Release|x64
|
||||||
{45292808-4EF3-4D4A-B3F5-B75C42EE5870}.Debug|Any CPU.Build.0 = Debug|x64
|
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Release|x64.Build.0 = Release|x64
|
||||||
{45292808-4EF3-4D4A-B3F5-B75C42EE5870}.Debug|x64.ActiveCfg = Debug|x64
|
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||||
{45292808-4EF3-4D4A-B3F5-B75C42EE5870}.Debug|x64.Build.0 = Debug|x64
|
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||||
{45292808-4EF3-4D4A-B3F5-B75C42EE5870}.Debug|x86.ActiveCfg = Debug|x64
|
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{45292808-4EF3-4D4A-B3F5-B75C42EE5870}.Debug|x86.Build.0 = Debug|x64
|
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Debug|x64.Build.0 = Debug|x64
|
||||||
{45292808-4EF3-4D4A-B3F5-B75C42EE5870}.Release|Any CPU.ActiveCfg = Release|x64
|
{387566C6-C6F6-412C-A30C-9855BBCB4816}.MinSizeRel|x64.ActiveCfg = Debug|x64
|
||||||
{45292808-4EF3-4D4A-B3F5-B75C42EE5870}.Release|Any CPU.Build.0 = Release|x64
|
{387566C6-C6F6-412C-A30C-9855BBCB4816}.MinSizeRel|x64.Build.0 = Debug|x64
|
||||||
{45292808-4EF3-4D4A-B3F5-B75C42EE5870}.Release|x64.ActiveCfg = Release|x64
|
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Release|x64.ActiveCfg = Release|x64
|
||||||
{45292808-4EF3-4D4A-B3F5-B75C42EE5870}.Release|x64.Build.0 = Release|x64
|
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Release|x64.Build.0 = Release|x64
|
||||||
{45292808-4EF3-4D4A-B3F5-B75C42EE5870}.Release|x86.ActiveCfg = Release|x64
|
{387566C6-C6F6-412C-A30C-9855BBCB4816}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||||
{45292808-4EF3-4D4A-B3F5-B75C42EE5870}.Release|x86.Build.0 = Release|x64
|
{387566C6-C6F6-412C-A30C-9855BBCB4816}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||||
{AA57F8D9-7BD6-4161-881B-AD2CEF9A30F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{AA57F8D9-7BD6-4161-881B-AD2CEF9A30F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|x64.Build.0 = Debug|x64
|
||||||
{AA57F8D9-7BD6-4161-881B-AD2CEF9A30F6}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|x64.ActiveCfg = Release|x64
|
||||||
{AA57F8D9-7BD6-4161-881B-AD2CEF9A30F6}.Debug|x64.Build.0 = Debug|Any CPU
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|x64.Build.0 = Release|x64
|
||||||
{AA57F8D9-7BD6-4161-881B-AD2CEF9A30F6}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|x64.ActiveCfg = Release|x64
|
||||||
{AA57F8D9-7BD6-4161-881B-AD2CEF9A30F6}.Debug|x86.Build.0 = Debug|Any CPU
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|x64.Build.0 = Release|x64
|
||||||
{AA57F8D9-7BD6-4161-881B-AD2CEF9A30F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||||
{AA57F8D9-7BD6-4161-881B-AD2CEF9A30F6}.Release|Any CPU.Build.0 = Release|Any CPU
|
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||||
{AA57F8D9-7BD6-4161-881B-AD2CEF9A30F6}.Release|x64.ActiveCfg = Release|Any CPU
|
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{AA57F8D9-7BD6-4161-881B-AD2CEF9A30F6}.Release|x64.Build.0 = Release|Any CPU
|
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.Debug|x64.Build.0 = Debug|x64
|
||||||
{AA57F8D9-7BD6-4161-881B-AD2CEF9A30F6}.Release|x86.ActiveCfg = Release|Any CPU
|
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.MinSizeRel|x64.ActiveCfg = Release|x64
|
||||||
{AA57F8D9-7BD6-4161-881B-AD2CEF9A30F6}.Release|x86.Build.0 = Release|Any CPU
|
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.MinSizeRel|x64.Build.0 = Release|x64
|
||||||
{28A26DF7-5F7A-43A2-A548-B55FEBCC3958}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.Release|x64.ActiveCfg = Release|x64
|
||||||
{28A26DF7-5F7A-43A2-A548-B55FEBCC3958}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.Release|x64.Build.0 = Release|x64
|
||||||
{28A26DF7-5F7A-43A2-A548-B55FEBCC3958}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||||
{28A26DF7-5F7A-43A2-A548-B55FEBCC3958}.Debug|x64.Build.0 = Debug|Any CPU
|
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||||
{28A26DF7-5F7A-43A2-A548-B55FEBCC3958}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{28A26DF7-5F7A-43A2-A548-B55FEBCC3958}.Debug|x86.Build.0 = Debug|Any CPU
|
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Debug|x64.Build.0 = Debug|x64
|
||||||
{28A26DF7-5F7A-43A2-A548-B55FEBCC3958}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.MinSizeRel|x64.ActiveCfg = Debug|x64
|
||||||
{28A26DF7-5F7A-43A2-A548-B55FEBCC3958}.Release|Any CPU.Build.0 = Release|Any CPU
|
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.MinSizeRel|x64.Build.0 = Debug|x64
|
||||||
{28A26DF7-5F7A-43A2-A548-B55FEBCC3958}.Release|x64.ActiveCfg = Release|Any CPU
|
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Release|x64.ActiveCfg = Release|x64
|
||||||
{28A26DF7-5F7A-43A2-A548-B55FEBCC3958}.Release|x64.Build.0 = Release|Any CPU
|
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Release|x64.Build.0 = Release|x64
|
||||||
{28A26DF7-5F7A-43A2-A548-B55FEBCC3958}.Release|x86.ActiveCfg = Release|Any CPU
|
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||||
{28A26DF7-5F7A-43A2-A548-B55FEBCC3958}.Release|x86.Build.0 = Release|Any CPU
|
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||||
{7543386A-5EBA-4AF0-9E0F-35657B58557D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{3201359D-C071-4089-9EDE-B04D759F1508}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{7543386A-5EBA-4AF0-9E0F-35657B58557D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{3201359D-C071-4089-9EDE-B04D759F1508}.Debug|x64.Build.0 = Debug|x64
|
||||||
{7543386A-5EBA-4AF0-9E0F-35657B58557D}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{3201359D-C071-4089-9EDE-B04D759F1508}.MinSizeRel|x64.ActiveCfg = Debug|x64
|
||||||
{7543386A-5EBA-4AF0-9E0F-35657B58557D}.Debug|x64.Build.0 = Debug|Any CPU
|
{3201359D-C071-4089-9EDE-B04D759F1508}.MinSizeRel|x64.Build.0 = Debug|x64
|
||||||
{7543386A-5EBA-4AF0-9E0F-35657B58557D}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{3201359D-C071-4089-9EDE-B04D759F1508}.Release|x64.ActiveCfg = Release|x64
|
||||||
{7543386A-5EBA-4AF0-9E0F-35657B58557D}.Debug|x86.Build.0 = Debug|Any CPU
|
{3201359D-C071-4089-9EDE-B04D759F1508}.Release|x64.Build.0 = Release|x64
|
||||||
{7543386A-5EBA-4AF0-9E0F-35657B58557D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{3201359D-C071-4089-9EDE-B04D759F1508}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||||
{7543386A-5EBA-4AF0-9E0F-35657B58557D}.Release|Any CPU.Build.0 = Release|Any CPU
|
{3201359D-C071-4089-9EDE-B04D759F1508}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||||
{7543386A-5EBA-4AF0-9E0F-35657B58557D}.Release|x64.ActiveCfg = Release|Any CPU
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{7543386A-5EBA-4AF0-9E0F-35657B58557D}.Release|x64.Build.0 = Release|Any CPU
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Debug|x64.Build.0 = Debug|x64
|
||||||
{7543386A-5EBA-4AF0-9E0F-35657B58557D}.Release|x86.ActiveCfg = Release|Any CPU
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.MinSizeRel|x64.ActiveCfg = Debug|x64
|
||||||
{7543386A-5EBA-4AF0-9E0F-35657B58557D}.Release|x86.Build.0 = Release|Any CPU
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.MinSizeRel|x64.Build.0 = Debug|x64
|
||||||
{C13A5ABD-F739-4BE8-A2FE-511E989A5B43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Release|x64.ActiveCfg = Release|x64
|
||||||
{C13A5ABD-F739-4BE8-A2FE-511E989A5B43}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Release|x64.Build.0 = Release|x64
|
||||||
{C13A5ABD-F739-4BE8-A2FE-511E989A5B43}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||||
{C13A5ABD-F739-4BE8-A2FE-511E989A5B43}.Debug|x64.Build.0 = Debug|Any CPU
|
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||||
{C13A5ABD-F739-4BE8-A2FE-511E989A5B43}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{C13A5ABD-F739-4BE8-A2FE-511E989A5B43}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{C13A5ABD-F739-4BE8-A2FE-511E989A5B43}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{C13A5ABD-F739-4BE8-A2FE-511E989A5B43}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{C13A5ABD-F739-4BE8-A2FE-511E989A5B43}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{C13A5ABD-F739-4BE8-A2FE-511E989A5B43}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{C13A5ABD-F739-4BE8-A2FE-511E989A5B43}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{C13A5ABD-F739-4BE8-A2FE-511E989A5B43}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{F7C6F079-67BA-4899-9B43-D3F8C121D264}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{F7C6F079-67BA-4899-9B43-D3F8C121D264}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{F7C6F079-67BA-4899-9B43-D3F8C121D264}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{F7C6F079-67BA-4899-9B43-D3F8C121D264}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{F7C6F079-67BA-4899-9B43-D3F8C121D264}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{F7C6F079-67BA-4899-9B43-D3F8C121D264}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{F7C6F079-67BA-4899-9B43-D3F8C121D264}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{F7C6F079-67BA-4899-9B43-D3F8C121D264}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{F7C6F079-67BA-4899-9B43-D3F8C121D264}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{F7C6F079-67BA-4899-9B43-D3F8C121D264}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{F7C6F079-67BA-4899-9B43-D3F8C121D264}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{F7C6F079-67BA-4899-9B43-D3F8C121D264}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{E60C119D-2919-4E2F-9D39-90DB1A8FF9A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{E60C119D-2919-4E2F-9D39-90DB1A8FF9A7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{E60C119D-2919-4E2F-9D39-90DB1A8FF9A7}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{E60C119D-2919-4E2F-9D39-90DB1A8FF9A7}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{E60C119D-2919-4E2F-9D39-90DB1A8FF9A7}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{E60C119D-2919-4E2F-9D39-90DB1A8FF9A7}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{E60C119D-2919-4E2F-9D39-90DB1A8FF9A7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{E60C119D-2919-4E2F-9D39-90DB1A8FF9A7}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{E60C119D-2919-4E2F-9D39-90DB1A8FF9A7}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{E60C119D-2919-4E2F-9D39-90DB1A8FF9A7}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{E60C119D-2919-4E2F-9D39-90DB1A8FF9A7}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{E60C119D-2919-4E2F-9D39-90DB1A8FF9A7}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{ECBAA198-EC93-4174-8156-BDA5F5E95042}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{ECBAA198-EC93-4174-8156-BDA5F5E95042}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{ECBAA198-EC93-4174-8156-BDA5F5E95042}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{ECBAA198-EC93-4174-8156-BDA5F5E95042}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{ECBAA198-EC93-4174-8156-BDA5F5E95042}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{ECBAA198-EC93-4174-8156-BDA5F5E95042}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{ECBAA198-EC93-4174-8156-BDA5F5E95042}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{ECBAA198-EC93-4174-8156-BDA5F5E95042}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{ECBAA198-EC93-4174-8156-BDA5F5E95042}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{ECBAA198-EC93-4174-8156-BDA5F5E95042}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{ECBAA198-EC93-4174-8156-BDA5F5E95042}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{ECBAA198-EC93-4174-8156-BDA5F5E95042}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{F54AE5C0-2ECA-4151-82E6-0D7EFE88FF40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{F54AE5C0-2ECA-4151-82E6-0D7EFE88FF40}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{F54AE5C0-2ECA-4151-82E6-0D7EFE88FF40}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{F54AE5C0-2ECA-4151-82E6-0D7EFE88FF40}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{F54AE5C0-2ECA-4151-82E6-0D7EFE88FF40}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{F54AE5C0-2ECA-4151-82E6-0D7EFE88FF40}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{F54AE5C0-2ECA-4151-82E6-0D7EFE88FF40}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{F54AE5C0-2ECA-4151-82E6-0D7EFE88FF40}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{F54AE5C0-2ECA-4151-82E6-0D7EFE88FF40}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{F54AE5C0-2ECA-4151-82E6-0D7EFE88FF40}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{F54AE5C0-2ECA-4151-82E6-0D7EFE88FF40}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{F54AE5C0-2ECA-4151-82E6-0D7EFE88FF40}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{A898C6C3-F134-4AF0-AFB3-3834C58CC0D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{A898C6C3-F134-4AF0-AFB3-3834C58CC0D7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{A898C6C3-F134-4AF0-AFB3-3834C58CC0D7}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{A898C6C3-F134-4AF0-AFB3-3834C58CC0D7}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{A898C6C3-F134-4AF0-AFB3-3834C58CC0D7}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{A898C6C3-F134-4AF0-AFB3-3834C58CC0D7}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{A898C6C3-F134-4AF0-AFB3-3834C58CC0D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{A898C6C3-F134-4AF0-AFB3-3834C58CC0D7}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{A898C6C3-F134-4AF0-AFB3-3834C58CC0D7}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{A898C6C3-F134-4AF0-AFB3-3834C58CC0D7}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{A898C6C3-F134-4AF0-AFB3-3834C58CC0D7}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{A898C6C3-F134-4AF0-AFB3-3834C58CC0D7}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{1E296FB3-D185-4A95-A1EB-AA5B37B85C60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{1E296FB3-D185-4A95-A1EB-AA5B37B85C60}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{1E296FB3-D185-4A95-A1EB-AA5B37B85C60}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{1E296FB3-D185-4A95-A1EB-AA5B37B85C60}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{1E296FB3-D185-4A95-A1EB-AA5B37B85C60}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{1E296FB3-D185-4A95-A1EB-AA5B37B85C60}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{1E296FB3-D185-4A95-A1EB-AA5B37B85C60}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{1E296FB3-D185-4A95-A1EB-AA5B37B85C60}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{1E296FB3-D185-4A95-A1EB-AA5B37B85C60}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{1E296FB3-D185-4A95-A1EB-AA5B37B85C60}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{1E296FB3-D185-4A95-A1EB-AA5B37B85C60}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{1E296FB3-D185-4A95-A1EB-AA5B37B85C60}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{B6070F41-8759-448B-B56D-A7D15D489569}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{B6070F41-8759-448B-B56D-A7D15D489569}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{B6070F41-8759-448B-B56D-A7D15D489569}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{B6070F41-8759-448B-B56D-A7D15D489569}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{B6070F41-8759-448B-B56D-A7D15D489569}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{B6070F41-8759-448B-B56D-A7D15D489569}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{B6070F41-8759-448B-B56D-A7D15D489569}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{B6070F41-8759-448B-B56D-A7D15D489569}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{B6070F41-8759-448B-B56D-A7D15D489569}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{B6070F41-8759-448B-B56D-A7D15D489569}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{B6070F41-8759-448B-B56D-A7D15D489569}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{B6070F41-8759-448B-B56D-A7D15D489569}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{B2D721AB-920C-4CD6-8DBF-6778A115A449}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{B2D721AB-920C-4CD6-8DBF-6778A115A449}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{B2D721AB-920C-4CD6-8DBF-6778A115A449}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{B2D721AB-920C-4CD6-8DBF-6778A115A449}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{B2D721AB-920C-4CD6-8DBF-6778A115A449}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{B2D721AB-920C-4CD6-8DBF-6778A115A449}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{B2D721AB-920C-4CD6-8DBF-6778A115A449}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{B2D721AB-920C-4CD6-8DBF-6778A115A449}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{B2D721AB-920C-4CD6-8DBF-6778A115A449}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{B2D721AB-920C-4CD6-8DBF-6778A115A449}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{B2D721AB-920C-4CD6-8DBF-6778A115A449}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{B2D721AB-920C-4CD6-8DBF-6778A115A449}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{38EE36C6-892C-4C94-8BB0-1ACB164E1F20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{38EE36C6-892C-4C94-8BB0-1ACB164E1F20}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{38EE36C6-892C-4C94-8BB0-1ACB164E1F20}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{38EE36C6-892C-4C94-8BB0-1ACB164E1F20}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{38EE36C6-892C-4C94-8BB0-1ACB164E1F20}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{38EE36C6-892C-4C94-8BB0-1ACB164E1F20}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{38EE36C6-892C-4C94-8BB0-1ACB164E1F20}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{38EE36C6-892C-4C94-8BB0-1ACB164E1F20}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{38EE36C6-892C-4C94-8BB0-1ACB164E1F20}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{38EE36C6-892C-4C94-8BB0-1ACB164E1F20}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{38EE36C6-892C-4C94-8BB0-1ACB164E1F20}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{38EE36C6-892C-4C94-8BB0-1ACB164E1F20}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{D432F3E9-3D2F-4623-B7B9-CEBA6701FFC3}.Debug|Any CPU.ActiveCfg = Debug|x64
|
|
||||||
{D432F3E9-3D2F-4623-B7B9-CEBA6701FFC3}.Debug|Any CPU.Build.0 = Debug|x64
|
|
||||||
{D432F3E9-3D2F-4623-B7B9-CEBA6701FFC3}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{D432F3E9-3D2F-4623-B7B9-CEBA6701FFC3}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{D432F3E9-3D2F-4623-B7B9-CEBA6701FFC3}.Debug|x86.ActiveCfg = Debug|x64
|
|
||||||
{D432F3E9-3D2F-4623-B7B9-CEBA6701FFC3}.Debug|x86.Build.0 = Debug|x64
|
|
||||||
{D432F3E9-3D2F-4623-B7B9-CEBA6701FFC3}.Release|Any CPU.ActiveCfg = Release|x64
|
|
||||||
{D432F3E9-3D2F-4623-B7B9-CEBA6701FFC3}.Release|Any CPU.Build.0 = Release|x64
|
|
||||||
{D432F3E9-3D2F-4623-B7B9-CEBA6701FFC3}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{D432F3E9-3D2F-4623-B7B9-CEBA6701FFC3}.Release|x64.Build.0 = Release|x64
|
|
||||||
{D432F3E9-3D2F-4623-B7B9-CEBA6701FFC3}.Release|x86.ActiveCfg = Release|x64
|
|
||||||
{D432F3E9-3D2F-4623-B7B9-CEBA6701FFC3}.Release|x86.Build.0 = Release|x64
|
|
||||||
{DD00F5D5-6C2F-4FDA-AE3D-25CF01A9A224}.Debug|Any CPU.ActiveCfg = Debug|x64
|
|
||||||
{DD00F5D5-6C2F-4FDA-AE3D-25CF01A9A224}.Debug|Any CPU.Build.0 = Debug|x64
|
|
||||||
{DD00F5D5-6C2F-4FDA-AE3D-25CF01A9A224}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{DD00F5D5-6C2F-4FDA-AE3D-25CF01A9A224}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{DD00F5D5-6C2F-4FDA-AE3D-25CF01A9A224}.Debug|x86.ActiveCfg = Debug|x64
|
|
||||||
{DD00F5D5-6C2F-4FDA-AE3D-25CF01A9A224}.Debug|x86.Build.0 = Debug|x64
|
|
||||||
{DD00F5D5-6C2F-4FDA-AE3D-25CF01A9A224}.Release|Any CPU.ActiveCfg = Release|x64
|
|
||||||
{DD00F5D5-6C2F-4FDA-AE3D-25CF01A9A224}.Release|Any CPU.Build.0 = Release|x64
|
|
||||||
{DD00F5D5-6C2F-4FDA-AE3D-25CF01A9A224}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{DD00F5D5-6C2F-4FDA-AE3D-25CF01A9A224}.Release|x64.Build.0 = Release|x64
|
|
||||||
{DD00F5D5-6C2F-4FDA-AE3D-25CF01A9A224}.Release|x86.ActiveCfg = Release|x64
|
|
||||||
{DD00F5D5-6C2F-4FDA-AE3D-25CF01A9A224}.Release|x86.Build.0 = Release|x64
|
|
||||||
{2B8243FF-60C6-4607-8AAE-7762D29B0A48}.Debug|Any CPU.ActiveCfg = Debug|x64
|
|
||||||
{2B8243FF-60C6-4607-8AAE-7762D29B0A48}.Debug|Any CPU.Build.0 = Debug|x64
|
|
||||||
{2B8243FF-60C6-4607-8AAE-7762D29B0A48}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{2B8243FF-60C6-4607-8AAE-7762D29B0A48}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{2B8243FF-60C6-4607-8AAE-7762D29B0A48}.Debug|x86.ActiveCfg = Debug|x64
|
|
||||||
{2B8243FF-60C6-4607-8AAE-7762D29B0A48}.Debug|x86.Build.0 = Debug|x64
|
|
||||||
{2B8243FF-60C6-4607-8AAE-7762D29B0A48}.Release|Any CPU.ActiveCfg = Release|x64
|
|
||||||
{2B8243FF-60C6-4607-8AAE-7762D29B0A48}.Release|Any CPU.Build.0 = Release|x64
|
|
||||||
{2B8243FF-60C6-4607-8AAE-7762D29B0A48}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{2B8243FF-60C6-4607-8AAE-7762D29B0A48}.Release|x64.Build.0 = Release|x64
|
|
||||||
{2B8243FF-60C6-4607-8AAE-7762D29B0A48}.Release|x86.ActiveCfg = Release|x64
|
|
||||||
{2B8243FF-60C6-4607-8AAE-7762D29B0A48}.Release|x86.Build.0 = Release|x64
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(NestedProjects) = preSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
{D7C6B9C7-1058-B1EA-FEE6-34C56B05AEDB} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
|
SolutionGuid = {422D1620-0166-4C26-9A81-CA8A2EB1AB58}
|
||||||
{684863A1-3396-4D31-A731-C0725CF07F4E} = {D7C6B9C7-1058-B1EA-FEE6-34C56B05AEDB}
|
EndGlobalSection
|
||||||
{45292808-4EF3-4D4A-B3F5-B75C42EE5870} = {D7C6B9C7-1058-B1EA-FEE6-34C56B05AEDB}
|
GlobalSection(Performance) = preSolution
|
||||||
{AA57F8D9-7BD6-4161-881B-AD2CEF9A30F6} = {D7C6B9C7-1058-B1EA-FEE6-34C56B05AEDB}
|
HasPerformanceSessions = true
|
||||||
{28A26DF7-5F7A-43A2-A548-B55FEBCC3958} = {D7C6B9C7-1058-B1EA-FEE6-34C56B05AEDB}
|
|
||||||
{7543386A-5EBA-4AF0-9E0F-35657B58557D} = {D7C6B9C7-1058-B1EA-FEE6-34C56B05AEDB}
|
|
||||||
{60E0D592-FFB3-0D0A-C4AA-E88919B48F9D} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
|
|
||||||
{C13A5ABD-F739-4BE8-A2FE-511E989A5B43} = {60E0D592-FFB3-0D0A-C4AA-E88919B48F9D}
|
|
||||||
{F7C6F079-67BA-4899-9B43-D3F8C121D264} = {60E0D592-FFB3-0D0A-C4AA-E88919B48F9D}
|
|
||||||
{E60C119D-2919-4E2F-9D39-90DB1A8FF9A7} = {60E0D592-FFB3-0D0A-C4AA-E88919B48F9D}
|
|
||||||
{ECBAA198-EC93-4174-8156-BDA5F5E95042} = {60E0D592-FFB3-0D0A-C4AA-E88919B48F9D}
|
|
||||||
{F54AE5C0-2ECA-4151-82E6-0D7EFE88FF40} = {60E0D592-FFB3-0D0A-C4AA-E88919B48F9D}
|
|
||||||
{A898C6C3-F134-4AF0-AFB3-3834C58CC0D7} = {60E0D592-FFB3-0D0A-C4AA-E88919B48F9D}
|
|
||||||
{1E296FB3-D185-4A95-A1EB-AA5B37B85C60} = {60E0D592-FFB3-0D0A-C4AA-E88919B48F9D}
|
|
||||||
{B6070F41-8759-448B-B56D-A7D15D489569} = {60E0D592-FFB3-0D0A-C4AA-E88919B48F9D}
|
|
||||||
{B2D721AB-920C-4CD6-8DBF-6778A115A449} = {60E0D592-FFB3-0D0A-C4AA-E88919B48F9D}
|
|
||||||
{38EE36C6-892C-4C94-8BB0-1ACB164E1F20} = {60E0D592-FFB3-0D0A-C4AA-E88919B48F9D}
|
|
||||||
{C5A3B5EA-BE9F-76E5-E9B8-8A22B289B295} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
|
|
||||||
{42C014A0-00C5-0620-8552-38912E891A7F} = {C5A3B5EA-BE9F-76E5-E9B8-8A22B289B295}
|
|
||||||
{D432F3E9-3D2F-4623-B7B9-CEBA6701FFC3} = {42C014A0-00C5-0620-8552-38912E891A7F}
|
|
||||||
{DD00F5D5-6C2F-4FDA-AE3D-25CF01A9A224} = {C5A3B5EA-BE9F-76E5-E9B8-8A22B289B295}
|
|
||||||
{2B8243FF-60C6-4607-8AAE-7762D29B0A48} = {C5A3B5EA-BE9F-76E5-E9B8-8A22B289B295}
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@@ -11,20 +11,10 @@
|
|||||||
<PackageReference Include="YaccLexTools" Version="1.2.2" />
|
<PackageReference Include="YaccLexTools" Version="1.2.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<Choose>
|
<ItemGroup>
|
||||||
<When Condition="'$(UseProjectRefs)' == 'true'">
|
<ProjectReference Include="..\ExpressionCore\ExpressionCore.csproj" />
|
||||||
<ItemGroup>
|
<ProjectReference Include="..\..\client\spark_core\spark_core.csproj" />
|
||||||
<ProjectReference Include="..\ExpressionCore\ExpressionCore.csproj" />
|
</ItemGroup>
|
||||||
<ProjectReference Include="..\..\cs\Bts.Spark.Core\Bts.Spark.Core.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
</When>
|
|
||||||
<Otherwise>
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="ExpressionCore" Version="$(SparkVersion)" />
|
|
||||||
<PackageReference Include="Bts.Spark.Core" Version="$(SparkVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Otherwise>
|
|
||||||
</Choose>
|
|
||||||
|
|
||||||
<ItemGroup Label="ArithmeticExpression">
|
<ItemGroup Label="ArithmeticExpression">
|
||||||
<Scanner Include="ArithmeticExpressionTokens.lex" />
|
<Scanner Include="ArithmeticExpressionTokens.lex" />
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\client\spark_core\spark_core.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
@@ -6,80 +6,23 @@ using Spark.Core.Collections;
|
|||||||
|
|
||||||
static class ArgumentComparer {
|
static class ArgumentComparer {
|
||||||
public static int Compare(
|
public static int Compare(
|
||||||
IArgument value1, IArgument value2, IDictionary<string, object?> env) {
|
IArgument value1, IArgument value2, IDictionary<string,object?> env) {
|
||||||
if (value1 is null) {
|
if (value1 is null) {
|
||||||
throw new ArgumentNullException(nameof(value1));
|
throw new ArgumentNullException(nameof(value1));
|
||||||
}
|
}
|
||||||
if (value2 is null) {
|
if (value2 is null) {
|
||||||
throw new ArgumentNullException(nameof(value2));
|
throw new ArgumentNullException(nameof(value2));
|
||||||
}
|
}
|
||||||
var obj1 = value1.GetValue(env);
|
var cmp1 = value1.Cast<IComparable>();
|
||||||
var obj2 = value2.GetValue(env);
|
var cmp2 = value2.Cast<IComparable>();
|
||||||
if (obj1 is null) {
|
|
||||||
if (obj2 is null) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (obj2 is null) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return compareObjs(obj1, obj2);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int compareObjs(object obj1, object obj2) {
|
|
||||||
try {
|
try {
|
||||||
var typ1 = obj1.GetType();
|
var v1 = cmp1.GetValue(env);
|
||||||
var typ2 = obj2.GetType();
|
var v2 = cmp2.GetValue(env);
|
||||||
bool areSameTypes = typ1 == typ2;
|
return v1.GetType().IsNumeric() ?
|
||||||
if (areSameTypes) {
|
new NumericComparer().Compare(v1, v2) : v1.CompareTo(v2);
|
||||||
return ((IComparable)obj1).CompareTo(obj2);
|
|
||||||
}
|
|
||||||
if (typ1.IsNumeric()) {
|
|
||||||
return tryCompareNumeric(obj1, obj2);
|
|
||||||
} else if (typ2.IsNumeric()) {
|
|
||||||
return -tryCompareNumeric(obj2, obj1);
|
|
||||||
} else if (typ1.IsEnum) {
|
|
||||||
if (typ2 == typeof(string)) {
|
|
||||||
return -((string)obj2).CompareTo(obj1.ToString());
|
|
||||||
}
|
|
||||||
} else if (typ1 == typeof(string)) {
|
|
||||||
return ((string)obj1).CompareTo(obj2.ToString());
|
|
||||||
} else if (typ1 == typeof(DateTime)) {
|
|
||||||
if (typ2 == typeof(TimeSpan)) {
|
|
||||||
return ((DateTime)obj1).Ticks.CompareTo(((TimeSpan)obj2).Ticks);
|
|
||||||
}
|
|
||||||
} else if (typ1 == typeof(TimeSpan)) {
|
|
||||||
if (typ2 == typeof(DateTime)) {
|
|
||||||
return ((TimeSpan)obj1).Ticks.CompareTo(((DateTime)obj2).Ticks);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
Log.Ui.error($"Comparison failed: {ex}");
|
Log.Ui.error($"Comparison failed: {ex}");
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
throw new ArgumentException("Failed to compare obj1 and obj2", nameof(obj1));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int tryCompareNumeric(object numericObj1, object obj2) {
|
|
||||||
var typ2 = obj2.GetType();
|
|
||||||
if (typ2.IsNumeric()) {
|
|
||||||
return new NumericComparer().Compare(numericObj1, obj2);
|
|
||||||
} else if (typ2.IsEnum) {
|
|
||||||
var undTyp2 = typ2.GetEnumUnderlyingType();
|
|
||||||
if (undTyp2 == typeof(byte)) {
|
|
||||||
return new NumericComparer().Compare(numericObj1, (byte)obj2);
|
|
||||||
}
|
|
||||||
if (undTyp2 == typeof(short)) {
|
|
||||||
return new NumericComparer().Compare(numericObj1, (short)obj2);
|
|
||||||
}
|
|
||||||
if (undTyp2 == typeof(int)) {
|
|
||||||
return new NumericComparer().Compare(numericObj1, (int)obj2);
|
|
||||||
}
|
|
||||||
if (undTyp2 == typeof(long)) {
|
|
||||||
return new NumericComparer().Compare(numericObj1, (long)obj2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new ArgumentException("Failed to compare numeric obj1 and obj2", nameof(obj2));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,30 +1,20 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Google.Protobuf" Version="3.24.3" />
|
<PackageReference Include="Google.Protobuf" Version="3.24.3" />
|
||||||
<PackageReference Include="YaccLexTools" Version="1.2.3" />
|
<PackageReference Include="YaccLexTools" Version="1.2.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<Choose>
|
<ItemGroup>
|
||||||
<When Condition="'$(UseProjectRefs)' == 'true'">
|
<ProjectReference Include="..\ExpressionCore\ExpressionCore.csproj" />
|
||||||
<ItemGroup>
|
<ProjectReference Include="..\..\client\spark_core\spark_core.csproj" />
|
||||||
<ProjectReference Include="..\ExpressionCore\ExpressionCore.csproj" />
|
</ItemGroup>
|
||||||
<ProjectReference Include="..\..\cs\Bts.Spark.Core\Bts.Spark.Core.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
</When>
|
|
||||||
<Otherwise>
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="ExpressionCore" Version="$(SparkVersion)" />
|
|
||||||
<PackageReference Include="Bts.Spark.Core" Version="$(SparkVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Otherwise>
|
|
||||||
</Choose>
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Scanner Include="BooleanExpressionTokens.lex" />
|
<Scanner Include="BooleanExpressionTokens.lex" />
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ namespace QUT.GplexBuffers
|
|||||||
public BufferException(string message) : base(message) { }
|
public BufferException(string message) : base(message) { }
|
||||||
public BufferException(string message, Exception innerException)
|
public BufferException(string message, Exception innerException)
|
||||||
: base(message, innerException) { }
|
: base(message, innerException) { }
|
||||||
|
protected BufferException(SerializationInfo info, StreamingContext context)
|
||||||
|
: base(info, context) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
internal abstract class ScanBuff
|
internal abstract class ScanBuff
|
||||||
@@ -58,10 +60,12 @@ namespace QUT.GplexBuffers
|
|||||||
return new BuildBuffer(source);
|
return new BuildBuffer(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (!BYTEMODE)
|
||||||
public static ScanBuff GetBuffer(Stream source, int fallbackCodePage)
|
public static ScanBuff GetBuffer(Stream source, int fallbackCodePage)
|
||||||
{
|
{
|
||||||
return new BuildBuffer(source, fallbackCodePage);
|
return new BuildBuffer(source, fallbackCodePage);
|
||||||
}
|
}
|
||||||
|
#endif // !BYTEMODE
|
||||||
#endif // !NOFILES
|
#endif // !NOFILES
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,15 +353,17 @@ namespace QUT.GplexBuffers
|
|||||||
{
|
{
|
||||||
FileStream fStrm = (stream as FileStream);
|
FileStream fStrm = (stream as FileStream);
|
||||||
if (fStrm != null) FileName = fStrm.Name;
|
if (fStrm != null) FileName = fStrm.Name;
|
||||||
NextBlk = BlockReaderFactory.Get(stream);
|
NextBlk = BlockReaderFactory.Raw(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (!BYTEMODE)
|
||||||
public BuildBuffer(Stream stream, int fallbackCodePage)
|
public BuildBuffer(Stream stream, int fallbackCodePage)
|
||||||
{
|
{
|
||||||
FileStream fStrm = (stream as FileStream);
|
FileStream fStrm = (stream as FileStream);
|
||||||
if (fStrm != null) FileName = fStrm.Name;
|
if (fStrm != null) FileName = fStrm.Name;
|
||||||
NextBlk = BlockReaderFactory.Get(stream, fallbackCodePage);
|
NextBlk = BlockReaderFactory.Get(stream, fallbackCodePage);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Marks a conservative lower bound for the buffer,
|
/// Marks a conservative lower bound for the buffer,
|
||||||
@@ -428,19 +434,43 @@ namespace QUT.GplexBuffers
|
|||||||
//
|
//
|
||||||
internal static class BlockReaderFactory
|
internal static class BlockReaderFactory
|
||||||
{
|
{
|
||||||
|
public static BlockReader Raw(Stream stream)
|
||||||
|
{
|
||||||
|
return delegate(char[] block, int index, int number)
|
||||||
|
{
|
||||||
|
byte[] b = new byte[number];
|
||||||
|
int count = stream.Read(b, 0, number);
|
||||||
|
int i = 0;
|
||||||
|
int j = index;
|
||||||
|
for (; i < count; i++, j++)
|
||||||
|
block[j] = (char)b[i];
|
||||||
|
return count;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public static BlockReader Get(Stream stream, int fallbackCodePage = -2)
|
#if (!BYTEMODE)
|
||||||
|
public static BlockReader Get(Stream stream, int fallbackCodePage)
|
||||||
{
|
{
|
||||||
Encoding encoding;
|
Encoding encoding;
|
||||||
int preamble = Preamble(stream);
|
int preamble = Preamble(stream);
|
||||||
|
|
||||||
if (preamble != 0) // There is a valid BOM here!
|
if (preamble != 0) // There is a valid BOM here!
|
||||||
encoding = Encoding.GetEncoding(preamble);
|
encoding = Encoding.GetEncoding(preamble);
|
||||||
else if (fallbackCodePage >= 0) // Anything but "guess"
|
else if (fallbackCodePage == -1) // Fallback is "raw" bytes
|
||||||
|
return Raw(stream);
|
||||||
|
else if (fallbackCodePage != -2) // Anything but "guess"
|
||||||
encoding = Encoding.GetEncoding(fallbackCodePage);
|
encoding = Encoding.GetEncoding(fallbackCodePage);
|
||||||
else // This is the "guess" option
|
else // This is the "guess" option
|
||||||
encoding = GuessEncoding(stream);
|
{
|
||||||
|
int guess = new Guesser(stream).GuessCodePage();
|
||||||
|
stream.Seek(0, SeekOrigin.Begin);
|
||||||
|
if (guess == -1) // ==> this is a 7-bit file
|
||||||
|
encoding = Encoding.ASCII;
|
||||||
|
else if (guess == 65001)
|
||||||
|
encoding = Encoding.UTF8;
|
||||||
|
else // ==> use the machine default
|
||||||
|
encoding = Encoding.Default;
|
||||||
|
}
|
||||||
StreamReader reader = new StreamReader(stream, encoding);
|
StreamReader reader = new StreamReader(stream, encoding);
|
||||||
return reader.Read;
|
return reader.Read;
|
||||||
}
|
}
|
||||||
@@ -458,14 +488,6 @@ namespace QUT.GplexBuffers
|
|||||||
int b2 = stream.ReadByte();
|
int b2 = stream.ReadByte();
|
||||||
if (b0 == 0xef && b1 == 0xbb && b2 == 0xbf)
|
if (b0 == 0xef && b1 == 0xbb && b2 == 0xbf)
|
||||||
return 65001; // UTF8
|
return 65001; // UTF8
|
||||||
|
|
||||||
int b3 = stream.ReadByte();
|
|
||||||
// Check for UTF-32 BOM (Byte Order Mark)
|
|
||||||
if (b0 == 0x00 && b1 == 0x00 && b2 == 0xFE && b3 == 0xFF)
|
|
||||||
return 12001; // UTF-32BE
|
|
||||||
if (b0 == 0xFF && b1 == 0xFE && b2 == 0x00 && b3 == 0x00)
|
|
||||||
return 12000; // UTF-32LE
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// There is no unicode preamble, so we
|
// There is no unicode preamble, so we
|
||||||
// return denoter for the machine default.
|
// return denoter for the machine default.
|
||||||
@@ -473,150 +495,7 @@ namespace QUT.GplexBuffers
|
|||||||
stream.Seek(0, SeekOrigin.Begin);
|
stream.Seek(0, SeekOrigin.Begin);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif // !BYTEMODE
|
||||||
private static Encoding GuessEncoding(Stream stream)
|
|
||||||
{
|
|
||||||
stream.Seek(0, SeekOrigin.Begin);
|
|
||||||
if (IsUtf16(stream, out Encoding encoding))
|
|
||||||
{
|
|
||||||
stream.Seek(0, SeekOrigin.Begin);
|
|
||||||
return encoding;
|
|
||||||
}
|
|
||||||
|
|
||||||
stream.Seek(0, SeekOrigin.Begin);
|
|
||||||
if (IsUtf8(stream))
|
|
||||||
{
|
|
||||||
stream.Seek(0, SeekOrigin.Begin);
|
|
||||||
return Encoding.UTF8;
|
|
||||||
}
|
|
||||||
|
|
||||||
stream.Seek(0, SeekOrigin.Begin);
|
|
||||||
if (IsAscii(stream))
|
|
||||||
{
|
|
||||||
stream.Seek(0, SeekOrigin.Begin);
|
|
||||||
return Encoding.ASCII;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !NET462_OR_GREATER
|
|
||||||
stream.Seek(0, SeekOrigin.Begin);
|
|
||||||
if (IsLatin1(stream))
|
|
||||||
{
|
|
||||||
stream.Seek(0, SeekOrigin.Begin);
|
|
||||||
return Encoding.Latin1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
stream.Seek(0, SeekOrigin.Begin);
|
|
||||||
return Encoding.Default;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsUtf8(Stream stream)
|
|
||||||
{
|
|
||||||
int b;
|
|
||||||
while ((b = stream.ReadByte()) != -1)
|
|
||||||
{
|
|
||||||
if ((b & 0x80) == 0) // 0xxxxxxx
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if ((b & 0xE0) == 0xC0) // 110xxxxx 10xxxxxx
|
|
||||||
{
|
|
||||||
if (!IsValidUtf8ContinuationByte(stream)) return false;
|
|
||||||
}
|
|
||||||
else if ((b & 0xF0) == 0xE0) // 1110xxxx 10xxxxxx 10xxxxxx
|
|
||||||
{
|
|
||||||
if (!IsValidUtf8ContinuationByte(stream) || !IsValidUtf8ContinuationByte(stream)) return false;
|
|
||||||
}
|
|
||||||
else if ((b & 0xF8) == 0xF0) // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
|
|
||||||
{
|
|
||||||
if (!IsValidUtf8ContinuationByte(stream) || !IsValidUtf8ContinuationByte(stream) || !IsValidUtf8ContinuationByte(stream)) return false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsValidUtf8ContinuationByte(Stream stream)
|
|
||||||
{
|
|
||||||
int b = stream.ReadByte();
|
|
||||||
return b != -1 && (b & 0xC0) == 0x80; // 10xxxxxx
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsUtf16(Stream stream, out Encoding encoding)
|
|
||||||
{
|
|
||||||
encoding = Encoding.Default;
|
|
||||||
|
|
||||||
if (stream.Length >= 2)
|
|
||||||
{
|
|
||||||
// Read the first two bytes
|
|
||||||
int b0 = stream.ReadByte();
|
|
||||||
int b1 = stream.ReadByte();
|
|
||||||
|
|
||||||
// Check for UTF-16 BOM (Byte Order Mark)
|
|
||||||
if (b0 == 0xFF && b1 == 0xFE)
|
|
||||||
{
|
|
||||||
encoding = Encoding.Unicode;
|
|
||||||
return true; // UTF-16LE
|
|
||||||
}
|
|
||||||
if (b0 == 0xFE && b1 == 0xFF)
|
|
||||||
{
|
|
||||||
encoding = Encoding.BigEndianUnicode;
|
|
||||||
return true; // UTF-16BE
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset the stream position
|
|
||||||
stream.Seek(0, SeekOrigin.Begin);
|
|
||||||
|
|
||||||
// Check for common UTF-16 patterns
|
|
||||||
byte[] buffer = new byte[2];
|
|
||||||
while (stream.Read(buffer, 0, 2) == 2)
|
|
||||||
{
|
|
||||||
if (buffer[0] == 0x00 && buffer[1] != 0x00)
|
|
||||||
{
|
|
||||||
encoding = Encoding.BigEndianUnicode;
|
|
||||||
return true; // Likely UTF-16BE
|
|
||||||
}
|
|
||||||
if (buffer[0] != 0x00 && buffer[1] == 0x00)
|
|
||||||
{
|
|
||||||
encoding = Encoding.Unicode;
|
|
||||||
return true; // Likely UTF-16LE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsAscii(Stream stream)
|
|
||||||
{
|
|
||||||
int b;
|
|
||||||
while ((b = stream.ReadByte()) != -1)
|
|
||||||
{
|
|
||||||
// Latin1 includes byte values from 0x00 to 0xFF
|
|
||||||
if (b > 0x7F)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsLatin1(Stream stream)
|
|
||||||
{
|
|
||||||
int b;
|
|
||||||
while ((b = stream.ReadByte()) != -1)
|
|
||||||
{
|
|
||||||
// Latin1 includes byte values from 0x00 to 0xFF
|
|
||||||
if (b > 0xFF)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif // !NOFILES
|
#endif // !NOFILES
|
||||||
#endregion Buffer classes
|
#endregion Buffer classes
|
||||||
@@ -661,6 +540,180 @@ namespace QUT.GplexBuffers
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#region guesser
|
||||||
|
#if (!BYTEMODE)
|
||||||
|
// ==============================================================
|
||||||
|
// ============ Encoding Guesser =============
|
||||||
|
// ==============================================================
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This class provides a simple finite state automaton that
|
||||||
|
/// scans the file looking for (1) valid UTF-8 byte patterns,
|
||||||
|
/// (2) bytes >= 0x80 which are not part of a UTF-8 sequence.
|
||||||
|
/// The method then guesses whether it is UTF-8 or maybe some
|
||||||
|
/// local machine default encoding. This works well for the
|
||||||
|
/// various Latin encodings.
|
||||||
|
/// </summary>
|
||||||
|
internal class Guesser
|
||||||
|
{
|
||||||
|
ScanBuff buffer;
|
||||||
|
|
||||||
|
public int GuessCodePage() { return Scan(); }
|
||||||
|
|
||||||
|
const int maxAccept = 10;
|
||||||
|
const int initial = 0;
|
||||||
|
const int eofNum = 0;
|
||||||
|
const int goStart = -1;
|
||||||
|
const int INITIAL = 0;
|
||||||
|
const int EndToken = 0;
|
||||||
|
|
||||||
|
#region user code
|
||||||
|
/*
|
||||||
|
* Reads the bytes of a file to determine if it is
|
||||||
|
* UTF-8 or a single-byte code page file.
|
||||||
|
*/
|
||||||
|
public long utfX;
|
||||||
|
public long uppr;
|
||||||
|
#endregion user code
|
||||||
|
|
||||||
|
int state;
|
||||||
|
int currentStart = startState[0];
|
||||||
|
int code;
|
||||||
|
|
||||||
|
#region ScannerTables
|
||||||
|
static int[] startState = new int[] { 11, 0 };
|
||||||
|
|
||||||
|
#region CharacterMap
|
||||||
|
static sbyte[] map = new sbyte[256] {
|
||||||
|
/* '\0' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
/* '\x10' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
/* '\x20' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
/* '0' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
/* '@' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
/* 'P' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
/* '`' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
/* 'p' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
/* '\x80' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||||
|
/* '\x90' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||||
|
/* '\xA0' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||||
|
/* '\xB0' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||||
|
/* '\xC0' */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
|
/* '\xD0' */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
|
/* '\xE0' */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||||
|
/* '\xF0' */ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5 };
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
static sbyte[][] nextState = new sbyte[][] {
|
||||||
|
new sbyte[] {0, 0, 0, 0, 0, 0},
|
||||||
|
new sbyte[] {-1, -1, 10, -1, -1, -1},
|
||||||
|
new sbyte[] {-1, -1, -1, -1, -1, -1},
|
||||||
|
new sbyte[] {-1, -1, 8, -1, -1, -1},
|
||||||
|
new sbyte[] {-1, -1, 5, -1, -1, -1},
|
||||||
|
new sbyte[] {-1, -1, 6, -1, -1, -1},
|
||||||
|
new sbyte[] {-1, -1, 7, -1, -1, -1},
|
||||||
|
null,
|
||||||
|
new sbyte[] {-1, -1, 9, -1, -1, -1},
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
new sbyte[] {-1, 1, 2, 3, 4, 2}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
[SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline")]
|
||||||
|
// Reason for suppression: cannot have self-reference in array initializer.
|
||||||
|
static Guesser()
|
||||||
|
{
|
||||||
|
nextState[7] = nextState[2];
|
||||||
|
nextState[9] = nextState[2];
|
||||||
|
nextState[10] = nextState[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
int NextState()
|
||||||
|
{
|
||||||
|
if (code == ScanBuff.EndOfFile)
|
||||||
|
return eofNum;
|
||||||
|
else
|
||||||
|
return nextState[state][map[code]];
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
public Guesser(System.IO.Stream file) { SetSource(file); }
|
||||||
|
|
||||||
|
public void SetSource(System.IO.Stream source)
|
||||||
|
{
|
||||||
|
this.buffer = new BuildBuffer(source);
|
||||||
|
code = buffer.Read();
|
||||||
|
}
|
||||||
|
|
||||||
|
int Scan()
|
||||||
|
{
|
||||||
|
for (; ; )
|
||||||
|
{
|
||||||
|
int next;
|
||||||
|
state = currentStart;
|
||||||
|
while ((next = NextState()) == goStart)
|
||||||
|
code = buffer.Read();
|
||||||
|
|
||||||
|
state = next;
|
||||||
|
code = buffer.Read();
|
||||||
|
|
||||||
|
while ((next = NextState()) > eofNum)
|
||||||
|
{
|
||||||
|
state = next;
|
||||||
|
code = buffer.Read();
|
||||||
|
}
|
||||||
|
if (state <= maxAccept)
|
||||||
|
{
|
||||||
|
#region ActionSwitch
|
||||||
|
#pragma warning disable 162
|
||||||
|
switch (state)
|
||||||
|
{
|
||||||
|
case eofNum:
|
||||||
|
switch (currentStart)
|
||||||
|
{
|
||||||
|
case 11:
|
||||||
|
if (utfX == 0 && uppr == 0) return -1; /* raw ascii */
|
||||||
|
else if (uppr * 10 > utfX) return 0; /* default code page */
|
||||||
|
else return 65001; /* UTF-8 encoding */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return EndToken;
|
||||||
|
case 1: // Recognized '{Upper128}', Shortest string "\xC0"
|
||||||
|
case 2: // Recognized '{Upper128}', Shortest string "\x80"
|
||||||
|
case 3: // Recognized '{Upper128}', Shortest string "\xE0"
|
||||||
|
case 4: // Recognized '{Upper128}', Shortest string "\xF0"
|
||||||
|
uppr++;
|
||||||
|
break;
|
||||||
|
case 5: // Recognized '{Utf8pfx4}{Utf8cont}', Shortest string "\xF0\x80"
|
||||||
|
uppr += 2;
|
||||||
|
break;
|
||||||
|
case 6: // Recognized '{Utf8pfx4}{Utf8cont}{2}', Shortest string "\xF0\x80\x80"
|
||||||
|
uppr += 3;
|
||||||
|
break;
|
||||||
|
case 7: // Recognized '{Utf8pfx4}{Utf8cont}{3}', Shortest string "\xF0\x80\x80\x80"
|
||||||
|
utfX += 3;
|
||||||
|
break;
|
||||||
|
case 8: // Recognized '{Utf8pfx3}{Utf8cont}', Shortest string "\xE0\x80"
|
||||||
|
uppr += 2;
|
||||||
|
break;
|
||||||
|
case 9: // Recognized '{Utf8pfx3}{Utf8cont}{2}', Shortest string "\xE0\x80\x80"
|
||||||
|
utfX += 2;
|
||||||
|
break;
|
||||||
|
case 10: // Recognized '{Utf8pfx2}{Utf8cont}', Shortest string "\xC0\x80"
|
||||||
|
utfX++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#pragma warning restore 162
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // end class Guesser
|
||||||
|
|
||||||
|
#endif // !BYTEMODE
|
||||||
|
#endregion
|
||||||
#endif // !NOFILES
|
#endif // !NOFILES
|
||||||
|
|
||||||
// End of code copied from embedded resource
|
// End of code copied from embedded resource
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@@ -10,20 +10,11 @@
|
|||||||
<PackageReference Include="YaccLexTools" Version="1.2.2" />
|
<PackageReference Include="YaccLexTools" Version="1.2.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<Choose>
|
<ItemGroup>
|
||||||
<When Condition="'$(UseProjectRefs)' == 'true'">
|
<ProjectReference Include="..\DataStreamCore\DataStreamCore.csproj" />
|
||||||
<ItemGroup>
|
<ProjectReference Include="..\ExpressionCore\ExpressionCore.csproj" />
|
||||||
<ProjectReference Include="..\DataStreamCore\DataStreamCore.csproj" />
|
<ProjectReference Include="..\..\client\spark_core\spark_core.csproj" />
|
||||||
<ProjectReference Include="..\ExpressionCore\ExpressionCore.csproj" />
|
</ItemGroup>
|
||||||
</ItemGroup>
|
|
||||||
</When>
|
|
||||||
<Otherwise>
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="DataStreamCore" Version="$(SparkVersion)" />
|
|
||||||
<PackageReference Include="ExpressionCore" Version="$(SparkVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Otherwise>
|
|
||||||
</Choose>
|
|
||||||
|
|
||||||
<ItemGroup Label="ColumnExpression">
|
<ItemGroup Label="ColumnExpression">
|
||||||
<Scanner Include="ColumnExpressionTokens.lex" />
|
<Scanner Include="ColumnExpressionTokens.lex" />
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@@ -10,20 +10,11 @@
|
|||||||
<PackageReference Include="YaccLexTools" Version="1.2.2" />
|
<PackageReference Include="YaccLexTools" Version="1.2.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<Choose>
|
<ItemGroup>
|
||||||
<When Condition="'$(UseProjectRefs)' == 'true'">
|
<ProjectReference Include="..\DataStreamCore\DataStreamCore.csproj" />
|
||||||
<ItemGroup>
|
<ProjectReference Include="..\ExpressionCore\ExpressionCore.csproj" />
|
||||||
<ProjectReference Include="..\DataStreamCore\DataStreamCore.csproj" />
|
<ProjectReference Include="..\..\client\spark_core\spark_core.csproj" />
|
||||||
<ProjectReference Include="..\ExpressionCore\ExpressionCore.csproj" />
|
</ItemGroup>
|
||||||
</ItemGroup>
|
|
||||||
</When>
|
|
||||||
<Otherwise>
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="DataStreamCore" Version="$(SparkVersion)" />
|
|
||||||
<PackageReference Include="ExpressionCore" Version="$(SparkVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Otherwise>
|
|
||||||
</Choose>
|
|
||||||
|
|
||||||
<ItemGroup Label="ColumnSortExpression">
|
<ItemGroup Label="ColumnSortExpression">
|
||||||
<Scanner Include="ColumnSortExpressionTokens.lex" />
|
<Scanner Include="ColumnSortExpressionTokens.lex" />
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
VITE_DATASTREAM_WEBSOCKET_URL=wss://localhost:443
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
VITE_DATASTREAM_WEBSOCKET_URL=wss://localhost:443
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
env: { browser: true, es2020: true },
|
||||||
|
extends: [
|
||||||
|
'eslint:recommended',
|
||||||
|
'plugin:react/recommended',
|
||||||
|
'plugin:react/jsx-runtime',
|
||||||
|
'plugin:react-hooks/recommended',
|
||||||
|
],
|
||||||
|
ignorePatterns: ['dist', '.eslintrc.cjs'],
|
||||||
|
parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
|
||||||
|
settings: { react: { version: '18.3.1' } },
|
||||||
|
plugins: ['react-refresh'],
|
||||||
|
rules: {
|
||||||
|
"import/order": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"groups": [
|
||||||
|
"builtin",
|
||||||
|
"external",
|
||||||
|
"internal",
|
||||||
|
["parent", "sibling", "index"]
|
||||||
|
],
|
||||||
|
"newlines-between": "always"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'react-refresh/only-export-components': [
|
||||||
|
'warn',
|
||||||
|
{ allowConstantExport: true },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
dist-ssr
|
||||||
|
*.local
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
|
.idea
|
||||||
|
.DS_Store
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<Project Sdk="Microsoft.VisualStudio.JavaScript.Sdk/0.5.128-alpha">
|
||||||
|
<PropertyGroup>
|
||||||
|
<StartupCommand>npm run dev</StartupCommand>
|
||||||
|
<JavaScriptTestRoot>src\</JavaScriptTestRoot>
|
||||||
|
<JavaScriptTestFramework>Jest</JavaScriptTestFramework>
|
||||||
|
<!-- Allows the build (or compile) script located on package.json to run on Build -->
|
||||||
|
<ShouldRunBuildScript>true</ShouldRunBuildScript>
|
||||||
|
<!-- Folder where production build objects will be placed -->
|
||||||
|
<PublishAssetsDirectory>$(MSBuildProjectDirectory)\distill</PublishAssetsDirectory>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# React + Vite
|
||||||
|
|
||||||
|
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
||||||
|
|
||||||
|
Currently, two official plugins are available:
|
||||||
|
|
||||||
|
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
|
||||||
|
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" type="image/ico" href="/logo.ico" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>BTS Cloud Streams</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="root"></div>
|
||||||
|
<script type="module" src="/src/main.jsx"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<packageSources>
|
||||||
|
<clear />
|
||||||
|
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
|
||||||
|
</packageSources>
|
||||||
|
<disabledPackageSources>
|
||||||
|
<clear />
|
||||||
|
</disabledPackageSources>
|
||||||
|
</configuration>
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"name": "bts.datastreamwebapp.client",
|
||||||
|
"private": true,
|
||||||
|
"version": "0.0.0",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "vite build",
|
||||||
|
"lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
|
||||||
|
"preview": "vite preview"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@angular/material": "^18.0.4",
|
||||||
|
"@emotion/react": "^11.11.4",
|
||||||
|
"@emotion/styled": "^11.11.5",
|
||||||
|
"@fontsource/noto-sans": "^5.0.22",
|
||||||
|
"@material/data-table": "^15.0.0-canary.7f224ddd4.0",
|
||||||
|
"@mui/icons-material": "^5.15.20",
|
||||||
|
"@mui/material": "^5.15.20",
|
||||||
|
"@mui/x-data-grid": "^7.7.1",
|
||||||
|
"bulma": "^1.0.1",
|
||||||
|
"classnames": "^2.5.1",
|
||||||
|
"react": "^18.3.1",
|
||||||
|
"react-data-grid": "^7.0.0-beta.44",
|
||||||
|
"react-data-table-component": "^7.6.2",
|
||||||
|
"react-dom": "^18.3.1",
|
||||||
|
"react-json-view-lite": "^1.4.0",
|
||||||
|
"react-pro-sidebar": "^1.1.0",
|
||||||
|
"react-use-websocket": "^4.8.1",
|
||||||
|
"rpc-websockets": "^7.11.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/react": "^18.3.3",
|
||||||
|
"@types/react-dom": "^18.3.0",
|
||||||
|
"@vitejs/plugin-react": "^4.3.1",
|
||||||
|
"eslint": "^8.57.0",
|
||||||
|
"eslint-plugin-import": "^2.29.1",
|
||||||
|
"eslint-plugin-react": "^7.34.2",
|
||||||
|
"eslint-plugin-react-hooks": "^4.6.2",
|
||||||
|
"eslint-plugin-react-refresh": "^0.4.7",
|
||||||
|
"react-mui-sidebar": "^1.3.5",
|
||||||
|
"vite": "^5.2.13"
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 8.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 107 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -0,0 +1,40 @@
|
|||||||
|
import { Sidebar, Menu, MenuItem, Submenu, Logo } from "react-mui-sidebar";
|
||||||
|
import './App.css';
|
||||||
|
|
||||||
|
const AnimatedSideBar = () => {
|
||||||
|
return (
|
||||||
|
<Sidebar className={"sidebar-container"} width={"270px"}>
|
||||||
|
<Logo img="https://adminmart.com/wp-content/uploads/2024/03/logo-admin-mart-news.png">
|
||||||
|
AdminMart
|
||||||
|
</Logo>
|
||||||
|
<Menu subHeading="HOME">
|
||||||
|
<MenuItem link="/" badge="true">
|
||||||
|
Modern
|
||||||
|
</MenuItem>
|
||||||
|
<MenuItem>eCommerce</MenuItem>
|
||||||
|
<MenuItem>Analytical</MenuItem>
|
||||||
|
</Menu>
|
||||||
|
<Menu subHeading="APPS">
|
||||||
|
<MenuItem>Chat</MenuItem>
|
||||||
|
<MenuItem>Calendar</MenuItem>
|
||||||
|
</Menu>
|
||||||
|
<Menu subHeading="OTHERS">
|
||||||
|
<Submenu title="Menu Level">
|
||||||
|
<MenuItem>Post</MenuItem>
|
||||||
|
<MenuItem>Details</MenuItem>
|
||||||
|
<Submenu title="Level 2">
|
||||||
|
<MenuItem>new</MenuItem>
|
||||||
|
<MenuItem>Hello</MenuItem>
|
||||||
|
</Submenu>
|
||||||
|
</Submenu>
|
||||||
|
|
||||||
|
<MenuItem>Chip</MenuItem>
|
||||||
|
<MenuItem target="_blank" link="google.com">
|
||||||
|
External Link
|
||||||
|
</MenuItem>
|
||||||
|
</Menu>
|
||||||
|
</Sidebar>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AnimatedSideBar;
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
@use "@material/checkbox";
|
||||||
|
@use "@material/icon-button";
|
||||||
|
@use "@material/data-table/data-table";
|
||||||
|
|
||||||
|
.root-div {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-content-div {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-div {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container-column {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container-row {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: stretch;
|
||||||
|
}
|
||||||
|
|
||||||
|
box.query-input-form {
|
||||||
|
/* p: 2, display: "flex", flexFlow: "column", alignItems: "stretch" */
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
align-items: stretch;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* li.ps-menuitem-root:hover {
|
||||||
|
background-color: #ff9922;
|
||||||
|
} */
|
||||||
|
|
||||||
|
.container-row-centered {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1#main-header {
|
||||||
|
padding: 4px 8px 4px 8px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
td:hover {
|
||||||
|
background-color: cadetblue;
|
||||||
|
}
|
||||||
|
|
||||||
|
td#cell-decimal {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
td#cell-integer {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
td#cell-string {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
td#cell-date-time {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sidebar.css */
|
||||||
|
/* .sidebar-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar {
|
||||||
|
position: relative;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
height: 100vh;
|
||||||
|
background-color: #333;
|
||||||
|
color: white;
|
||||||
|
overflow: hidden;
|
||||||
|
transition: transform 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar.closed {
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar.open {
|
||||||
|
width: 250px;
|
||||||
|
} */
|
||||||
@@ -0,0 +1,173 @@
|
|||||||
|
import { ThemeProvider, CssBaseline, GlobalStyles } from '@mui/material';
|
||||||
|
import QueryStatusView from './QueryStatusView';
|
||||||
|
import useMediaQuery from '@mui/material/useMediaQuery';
|
||||||
|
import QueryControl from './QueryControl';
|
||||||
|
import DataTable from './DataTable';
|
||||||
|
import { useState, useEffect, useMemo } from 'react';
|
||||||
|
import useWebSocket, { ReadyState } from 'react-use-websocket';
|
||||||
|
import Sidebar from './SideBar';
|
||||||
|
import getTheme from './Theme';
|
||||||
|
|
||||||
|
import '@fontsource/noto-sans';
|
||||||
|
import './App.css';
|
||||||
|
import './SideBar.css';
|
||||||
|
|
||||||
|
const webSocketUrl = import.meta.env.VITE_DATASTREAM_WEBSOCKET_URL;
|
||||||
|
// Always use the same subscription id (1), because we only show 1 table at a time.
|
||||||
|
// The server will automatically dispose the previous subscription and start a new one
|
||||||
|
// if we're currently subscribed to another query.
|
||||||
|
const subscriptionId = "1";
|
||||||
|
|
||||||
|
var rpcReqIdCounter = 1;
|
||||||
|
|
||||||
|
function subscribeReq(query) {
|
||||||
|
return {
|
||||||
|
jsonrpc: "2.0",
|
||||||
|
id: rpcReqIdCounter++,
|
||||||
|
method: "subscribe",
|
||||||
|
params: {
|
||||||
|
subscription_id: subscriptionId,
|
||||||
|
query: query
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function unsubscribeReq() {
|
||||||
|
return {
|
||||||
|
jsonrpc: "2.0",
|
||||||
|
id: rpcReqIdCounter++,
|
||||||
|
method: "unsubscribe",
|
||||||
|
params: {
|
||||||
|
subscription_id: subscriptionId,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const App = () => {
|
||||||
|
const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)');
|
||||||
|
const theme = getTheme({ mode: prefersDarkMode ? 'dark' : 'light' });
|
||||||
|
const globalStyles = {
|
||||||
|
':root': {
|
||||||
|
'--primary-color': theme.palette.primary.main,
|
||||||
|
'--primary-dark-color': theme.palette.primary.dark,
|
||||||
|
'--secondary-color': theme.palette.secondary.main,
|
||||||
|
'--secondary-dark-color': theme.palette.secondary.dark,
|
||||||
|
'--background-color': theme.palette.background.default,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const [blueTable, setBlueTable] = useState({ columns: null, rows: null });
|
||||||
|
const [queryError, setQueryError] = useState(null);
|
||||||
|
const [queryState, setQueryState] = useState("Unsubscribed");
|
||||||
|
const queryStateDetails = useMemo(() => {
|
||||||
|
if (queryState == "Unsubscribed") {
|
||||||
|
return "Enter query above, then click the play button to subscribe";
|
||||||
|
}
|
||||||
|
if (queryState == "Subscribed") {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}, [queryState]);
|
||||||
|
const [sidebarIsOpen, setSidebarIsOpen] = useState(false);
|
||||||
|
const [cannedQuery, setCannedQuery] = useState(null);
|
||||||
|
|
||||||
|
const onCannedQueryClicked = (cannedQuery) => {
|
||||||
|
console.info(`Executing canned query: ${JSON.stringify(cannedQuery)}`);
|
||||||
|
const queryText = cannedQuery.query.join("\n");
|
||||||
|
setCannedQuery({ queryText: queryText, clickTime: Date.now() });
|
||||||
|
subscribe(queryText);
|
||||||
|
};
|
||||||
|
|
||||||
|
const { sendJsonMessage, getWebSocket, readyState } = useWebSocket(
|
||||||
|
webSocketUrl,
|
||||||
|
{
|
||||||
|
onOpen: (e) => console.info(`WebSocket open. ${JSON.stringify(e)}`),
|
||||||
|
onClose: (e) => console.info(`WebSocket closed. ${JSON.stringify(e)}`),
|
||||||
|
onError: (e) => console.error(`WebSocket error: ${JSON.stringify(e)}`),
|
||||||
|
shouldReconnect: () => true,
|
||||||
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
console.info(`WebSocket readyState: ${readyState}`)
|
||||||
|
if (readyState != ReadyState.OPEN) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const ws = getWebSocket();
|
||||||
|
ws.onmessage = e => {
|
||||||
|
console.info(`Received message: ${e.data}`);
|
||||||
|
const msg = JSON.parse(e.data);
|
||||||
|
setQueryError(msg.error);
|
||||||
|
if (msg.error != null) {
|
||||||
|
setQueryState("Error");
|
||||||
|
} else if (msg.id != null) {
|
||||||
|
setQueryState(msg.result.status);
|
||||||
|
} else {
|
||||||
|
console.assert(msg.params.subscription_id == subscriptionId);
|
||||||
|
console.info(`Received rows: ${msg.params.table.all}`);
|
||||||
|
setBlueTable({ columns: msg.params.table.columns, rows: msg.params.table.all });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}, [getWebSocket, readyState]);
|
||||||
|
|
||||||
|
const subscribe = (query) => {
|
||||||
|
const req = subscribeReq(query);
|
||||||
|
console.info(`Subscribing: ${JSON.stringify(subscribeReq(query))}`);
|
||||||
|
sendJsonMessage(req);
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsubscribe = () => {
|
||||||
|
const req = unsubscribeReq();
|
||||||
|
console.info(`Unsubscribing: ${JSON.stringify(req)}`);
|
||||||
|
sendJsonMessage(req);
|
||||||
|
};
|
||||||
|
|
||||||
|
const onOpened = () => {
|
||||||
|
setSidebarIsOpen(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
const onClosed = () => {
|
||||||
|
setSidebarIsOpen(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
const sidebarWidth = sidebarIsOpen ? '250px' : '65px';
|
||||||
|
return (
|
||||||
|
<ThemeProvider theme={theme}>
|
||||||
|
<CssBaseline />
|
||||||
|
<GlobalStyles styles={globalStyles} />
|
||||||
|
<div className='root-div'>
|
||||||
|
<div style={{
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'column',
|
||||||
|
alignItems: 'flex-start',
|
||||||
|
flexWrap: 'nowrap',
|
||||||
|
width: sidebarWidth,
|
||||||
|
transition: 'width 0.3s ease',
|
||||||
|
}}>
|
||||||
|
<Sidebar onSelection={onCannedQueryClicked} onOpened={onOpened} onClosed={onClosed} />
|
||||||
|
</div>
|
||||||
|
<div style={{
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'column',
|
||||||
|
left: sidebarWidth,
|
||||||
|
width: '100%',
|
||||||
|
transition: 'width 0.3s ease',
|
||||||
|
}}>
|
||||||
|
<div style={{ width: '100%', display: 'flex', flexDirection: 'column', alignItems: 'flex-start', margin: theme.spacing(2, 0, 0, 0) }}>
|
||||||
|
<div style={{ width: '90%', rightMargin: '100px' }}>
|
||||||
|
<QueryControl
|
||||||
|
queryState={queryState}
|
||||||
|
queryText={cannedQuery?.queryText}
|
||||||
|
queryTextResetTime={cannedQuery?.clickTime}
|
||||||
|
subscribe={subscribe}
|
||||||
|
unsubscribe={unsubscribe} />
|
||||||
|
</div>
|
||||||
|
<div style={{ width: '90%', rightMargin: '100px' }}>
|
||||||
|
<QueryStatusView queryState={queryState} details={queryStateDetails} error={queryError} />
|
||||||
|
<DataTable columns={blueTable?.columns ?? []} rows={blueTable?.rows ?? []} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ThemeProvider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default App;
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
@use "@material/checkbox";
|
||||||
|
@use "@material/icon-button";
|
||||||
|
@use "@material/data-table/data-table";
|
||||||
|
|
||||||
|
.data-grid-container {
|
||||||
|
overflow: auto;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.data-grid {
|
||||||
|
max-height: 1000px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div[role=columnheader] {
|
||||||
|
border-top: 0px;
|
||||||
|
border-bottom: 0px;
|
||||||
|
background-color: var(--primary-dark-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* div[role=columnheader] {
|
||||||
|
border-top: 0px;
|
||||||
|
border-bottom: 0px;
|
||||||
|
background-color: var(--primary-dark-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rdg-row {
|
||||||
|
border: 0px;
|
||||||
|
border-top: 0px;
|
||||||
|
border-bottom: 0px;
|
||||||
|
background-color: rgba(var(--primary-dark-color), 0.8);
|
||||||
|
color: var(--primary-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rdg-row-odd {
|
||||||
|
border: 0px;
|
||||||
|
border-top: 0px;
|
||||||
|
border-bottom: 0px;
|
||||||
|
background-color: var(--primary-dark-color);
|
||||||
|
color: var(--primary-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rdg-cell {
|
||||||
|
border-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rdg-cell.even {
|
||||||
|
border-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rdg-cell.odd {
|
||||||
|
border-bottom: 5px;
|
||||||
|
} */
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
@use "@material/checkbox";
|
||||||
|
@use "@material/icon-button";
|
||||||
|
@use "@material/data-table/data-table";
|
||||||
|
|
||||||
|
th {
|
||||||
|
font-size: large;
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
td:hover {
|
||||||
|
background-color: cadetblue;
|
||||||
|
}
|
||||||
|
|
||||||
|
td#cell-decimal {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
td#cell-integer {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
td#cell-string {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
td#cell-date-time {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { useTheme } from '@mui/material/styles';
|
||||||
|
import { DataGrid } from '@mui/x-data-grid';
|
||||||
|
import './DataGrid.css'
|
||||||
|
import { useMemo, useState } from 'react';
|
||||||
|
|
||||||
|
export default function DataTable({ columns, rows }) {
|
||||||
|
const theme = useTheme();
|
||||||
|
const [columnWidths, setColumnWidths] = useState({});
|
||||||
|
|
||||||
|
const handleColumnResize = (params) => {
|
||||||
|
const newWidth = params.width;
|
||||||
|
setColumnWidths((prevWidths) => ({
|
||||||
|
...prevWidths,
|
||||||
|
[params.colDef.field]: params.width,
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
const getGridColDef = useMemo(() => {
|
||||||
|
return col => {
|
||||||
|
return {
|
||||||
|
field: col.name,
|
||||||
|
headerName: col.name,
|
||||||
|
width: columnWidths[col.name],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}, [columnWidths]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DataGrid
|
||||||
|
className='data-grid-container'
|
||||||
|
autosizeOnMount={false}
|
||||||
|
columns={columns?.map(getGridColDef) ?? []}
|
||||||
|
onColumnResize={handleColumnResize}
|
||||||
|
rows={rows ?? []}
|
||||||
|
sx={{
|
||||||
|
margin: theme.spacing(2, 0, 0, 0),
|
||||||
|
borderColor: 'primary.main',
|
||||||
|
backgroundColor: 'primary.dark',
|
||||||
|
color: 'text.primary',
|
||||||
|
'& .MuiDataGrid-columnHeader': {
|
||||||
|
color: 'primary.main',
|
||||||
|
fontWeight: 700,
|
||||||
|
backgroundColor: 'primary.dark'
|
||||||
|
},
|
||||||
|
'& .MuiDataGrid-filler': {
|
||||||
|
color: 'primary.main',
|
||||||
|
fontWeight: 700,
|
||||||
|
backgroundColor: 'primary.dark'
|
||||||
|
},
|
||||||
|
'& .MuiDataGrid-cell': {
|
||||||
|
color: 'text.primary',
|
||||||
|
},
|
||||||
|
'& .MuiDataGrid-cell:hover': {
|
||||||
|
color: 'primary.main',
|
||||||
|
},
|
||||||
|
'& .MuiDataGrid-row': {
|
||||||
|
'--DataGrid-rowBorderColor': 'secondary.dark'
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
DataTable.propTypes = {
|
||||||
|
columns: PropTypes.arrayOf(
|
||||||
|
PropTypes.shape({
|
||||||
|
name: PropTypes.string.isRequired,
|
||||||
|
type: PropTypes.string.isRequired,
|
||||||
|
})
|
||||||
|
).isRequired,
|
||||||
|
rows: PropTypes.arrayOf(PropTypes.array).isRequired,
|
||||||
|
apiRef: PropTypes.object,
|
||||||
|
};
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import DataTable from './DataTable';
|
||||||
|
import { useRef, useState, useEffect } from 'react';
|
||||||
|
import { useGridApiRef } from '@mui/x-data-grid';
|
||||||
|
import Box from '@mui/material/Box';
|
||||||
|
import Button from '@mui/material/Button';
|
||||||
|
import Grid from '@mui/material/Grid';
|
||||||
|
import Paper from '@mui/material/Paper';
|
||||||
|
import PlayArrowIcon from '@mui/icons-material/PlayArrow';
|
||||||
|
import StopIcon from '@mui/icons-material/Stop';
|
||||||
|
import TextField from '@mui/material/TextField';
|
||||||
|
import Tooltip from '@mui/material/Tooltip';
|
||||||
|
|
||||||
|
const QueryControl = (props) => {
|
||||||
|
const { queryState, queryText, queryTextResetTime, subscribe, unsubscribe } = props;
|
||||||
|
// const theme = useTheme();
|
||||||
|
let textInput = useRef();
|
||||||
|
const [queryTextChangeTime, setQueryTextChangeTime] = useState(null);
|
||||||
|
useEffect(() => {
|
||||||
|
if (queryText == null || textInput.current == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Init text field (unless a non-empty string is already present, or the user has modified
|
||||||
|
// the query - we don't want to overwrite their changes).
|
||||||
|
if (queryTextChangeTime == null || queryTextResetTime > queryTextChangeTime) {
|
||||||
|
console.info(`Initializing query text: ${queryText}`)
|
||||||
|
textInput.current.value = queryText;
|
||||||
|
}
|
||||||
|
}, [queryText, queryTextChangeTime, queryTextResetTime]);
|
||||||
|
const onClearClick = () => {
|
||||||
|
textInput.current.value = '';
|
||||||
|
};
|
||||||
|
|
||||||
|
const onRunClick = () => {
|
||||||
|
subscribe(textInput.current.value);
|
||||||
|
};
|
||||||
|
|
||||||
|
const onStopClick = () => {
|
||||||
|
unsubscribe();
|
||||||
|
};
|
||||||
|
|
||||||
|
const onKeyDown = (e) => {
|
||||||
|
// Detect keyboard shortcuts.
|
||||||
|
// Ctrl+Enter : Run
|
||||||
|
if (e.ctrlKey && e.key === 'Enter') {
|
||||||
|
onRunClick();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const onChange = (e) => {
|
||||||
|
// So we know not to overwrite the changes with the canned query on re-render
|
||||||
|
setQueryTextChangeTime(Date.now());
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Box sx={{ display: "flex", flexFlow: "column" }}>
|
||||||
|
<Paper elevation={3} sx={{ color: 'primary.main' }}>
|
||||||
|
<Box sx={{ p: 2 }}>
|
||||||
|
<TextField
|
||||||
|
fullWidth
|
||||||
|
multiline
|
||||||
|
rows={10}
|
||||||
|
variant="outlined"
|
||||||
|
onChange={onChange}
|
||||||
|
onKeyDown={onKeyDown}
|
||||||
|
inputRef={textInput}
|
||||||
|
placeholder="Enter Query..."
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Box sx={{ p: 2, borderTop: 1 }}>
|
||||||
|
<Grid container spacing={2} justifyContent="flex-start">
|
||||||
|
<Grid item xs>
|
||||||
|
<Tooltip title="Clear Query Text">
|
||||||
|
<Button onClick={onClearClick} sx={{ padding: '11px', color: 'text.dark' }}>
|
||||||
|
Clear
|
||||||
|
</Button>
|
||||||
|
</Tooltip>
|
||||||
|
</Grid>
|
||||||
|
<Grid item>
|
||||||
|
<Tooltip title="Run (Ctrl+Enter)">
|
||||||
|
<Button onClick={onRunClick} sx={{
|
||||||
|
color: `queryStartButton.${queryState}.color`,
|
||||||
|
bgcolor: `queryStartButton.${queryState}.backgroundColor`,
|
||||||
|
padding: '11px'
|
||||||
|
}}>
|
||||||
|
<PlayArrowIcon />
|
||||||
|
</Button>
|
||||||
|
</Tooltip>
|
||||||
|
</Grid>
|
||||||
|
<Grid item>
|
||||||
|
<Tooltip title="Stop">
|
||||||
|
<Button onClick={onStopClick} sx={{
|
||||||
|
color: `queryStopButton.${queryState}.color`,
|
||||||
|
bgcolor: `queryStopButton.${queryState}.backgroundColor`,
|
||||||
|
padding: '11px'
|
||||||
|
}}>
|
||||||
|
<StopIcon />
|
||||||
|
</Button>
|
||||||
|
</Tooltip>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</Box>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
QueryControl.propTypes = {
|
||||||
|
columns: PropTypes.array,
|
||||||
|
rows: PropTypes.array,
|
||||||
|
isRunning: PropTypes.bool,
|
||||||
|
queryText: PropTypes.string,
|
||||||
|
queryTextResetTime: PropTypes.number,
|
||||||
|
queryState: PropTypes.string,
|
||||||
|
subscribe: PropTypes.func,
|
||||||
|
unsubscribe: PropTypes.func,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default QueryControl;
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
import { useState } from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { Box, Typography, Collapse } from '@mui/material';
|
||||||
|
import Alert from '@mui/material/Alert';
|
||||||
|
import AlertTitle from '@mui/material/AlertTitle';
|
||||||
|
import { useTheme } from '@mui/material/styles';
|
||||||
|
import { alpha } from '@mui/system';
|
||||||
|
|
||||||
|
const QueryStatusView = ({ queryState, details, error }) => {
|
||||||
|
const theme = useTheme();
|
||||||
|
const [open, setOpen] = useState(false);
|
||||||
|
|
||||||
|
let header = queryState;
|
||||||
|
let headerContent = null;
|
||||||
|
let detailElements = [];
|
||||||
|
let severity = queryState == "Subscribed" ? "success" : "info";
|
||||||
|
let cursor = details == null ? "default" : "pointer";
|
||||||
|
if (error != null) {
|
||||||
|
severity = "error";
|
||||||
|
cursor = "pointer";
|
||||||
|
header = `Error Code: ${error.code}`;
|
||||||
|
headerContent = error.message;
|
||||||
|
detailElements.push(<Typography variant="body1">{error.data.error_message}</Typography>);
|
||||||
|
detailElements.push(<Typography variant="subtitle1">Stack Trace:</Typography>);
|
||||||
|
(error.data.stack_trace ?? []).forEach(line => detailElements.push(
|
||||||
|
<Typography variant="body2" component="pre" sx={{ whiteSpace: 'pre-wrap' }}>
|
||||||
|
{line}
|
||||||
|
</Typography>));
|
||||||
|
} else if (details != null) {
|
||||||
|
detailElements.push(<Typography variant="body1">{details}</Typography>);
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<Box sx={{ margin: theme.spacing(2, 0, 0, 0) }}>
|
||||||
|
<Alert
|
||||||
|
severity={severity}
|
||||||
|
onClick={() => setOpen(!open)}
|
||||||
|
sx={{
|
||||||
|
margin: theme.spacing(2, 0, 0, 0),
|
||||||
|
cursor: cursor,
|
||||||
|
}}>
|
||||||
|
<AlertTitle>{header}</AlertTitle>
|
||||||
|
{headerContent}
|
||||||
|
</Alert>
|
||||||
|
{detailElements.length == 0
|
||||||
|
? null
|
||||||
|
: <Collapse in={open}>
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
backgroundColor: alpha(theme.palette[severity].light, 0.75),
|
||||||
|
color: theme.palette[severity].contrastText,
|
||||||
|
padding: theme.spacing(2),
|
||||||
|
marginTop: theme.spacing(0),
|
||||||
|
borderRadius: theme.shape.borderRadius,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{detailElements}
|
||||||
|
</Box>
|
||||||
|
</Collapse>}
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
QueryStatusView.propTypes = {
|
||||||
|
queryState: PropTypes.string,
|
||||||
|
details: PropTypes.string,
|
||||||
|
error: PropTypes.shape({
|
||||||
|
code: PropTypes.number,
|
||||||
|
message: PropTypes.string,
|
||||||
|
data: PropTypes.object,
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
export default QueryStatusView;
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
import 'react-data-grid/lib/styles.css';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import DataGrid from 'react-data-grid';
|
||||||
|
import './DataGrid.css';
|
||||||
|
|
||||||
|
function getGridColDef(col) {
|
||||||
|
return {
|
||||||
|
key: col.name,
|
||||||
|
name: col.name,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function ReactDataGrid({columns, rows}) {
|
||||||
|
return (
|
||||||
|
<DataGrid className={"data-grid"} rows={rows} columns={columns.map(getGridColDef)} />
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
ReactDataGrid.propTypes = {
|
||||||
|
columns: PropTypes.arrayOf(
|
||||||
|
PropTypes.shape({
|
||||||
|
name: PropTypes.string.isRequired,
|
||||||
|
type: PropTypes.string.isRequired,
|
||||||
|
})
|
||||||
|
).isRequired,
|
||||||
|
rows: PropTypes.arrayOf(PropTypes.array).isRequired,
|
||||||
|
};
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
/* Sidebar.css */
|
||||||
|
.app-container {
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: flex-start;
|
||||||
|
background-color: transparent;
|
||||||
|
color: white;
|
||||||
|
overflow: hidden;
|
||||||
|
transition: width 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar.open {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar.closed {
|
||||||
|
width: 0%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-toggle-button {
|
||||||
|
border: 0px;
|
||||||
|
border-radius: 50%;
|
||||||
|
box-shadow: rgba(9, 30, 66, 0.08) 0px 0px 0px 1px, rgba(9, 30, 66, 0.08) 0px 2px 4px 1px;
|
||||||
|
color: var(--primary-color);
|
||||||
|
cursor: pointer;
|
||||||
|
height: 24px;
|
||||||
|
opacity: 1;
|
||||||
|
outline: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
background-color: transparent;
|
||||||
|
transition: background-color 100ms linear 0s, color 100ms linear 0s, opacity 300ms cubic-bezier(0.2, 0, 0, 1) 0s, transform 300ms cubic-bezier(0.2, 0, 0, 1) 0s;
|
||||||
|
width: 20%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-toggle-button:hover {
|
||||||
|
transition: background-color 100ms linear 0s, color 100ms linear 0s, opacity 300ms cubic-bezier(0.2, 0, 0, 1) 0s, transform 300ms cubic-bezier(0.2, 0, 0, 1) 0s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-content.open {
|
||||||
|
width: 165px;
|
||||||
|
transition: width 0.3s ease;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-content.closed {
|
||||||
|
width: 0%;
|
||||||
|
/* min-width: 25px; */
|
||||||
|
transition: width 0.3s ease;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu-item {
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu-item.open {
|
||||||
|
width: 100%;
|
||||||
|
/* justify-content: flex-start; */
|
||||||
|
transition: width 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu-item.closed {
|
||||||
|
width: 0%;
|
||||||
|
min-width: 0px;
|
||||||
|
/* justify-content: flex-start; */
|
||||||
|
transition: width 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu-item-content.open {
|
||||||
|
width: 100%;
|
||||||
|
/* justify-content: flex-start; */
|
||||||
|
transition: width 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu-item-content.closed {
|
||||||
|
width: 0px;
|
||||||
|
/* justify-content: flex-start; */
|
||||||
|
transition: width 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ensure span can shrink */
|
||||||
|
.button-text {
|
||||||
|
display: block; /* Make span a block element */
|
||||||
|
width: 100%; /* Ensure it takes the full width of its parent */
|
||||||
|
overflow: hidden; /* Hide any overflow content */
|
||||||
|
white-space: nowrap; /* Prevent text wrapping */
|
||||||
|
}
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
import { useState, useEffect } from 'react';
|
||||||
|
import Button from '@mui/material/Button';
|
||||||
|
import { useTheme } from '@mui/material/styles';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import Tooltip from '@mui/material/Tooltip';
|
||||||
|
import ChevronLeftRounded from "@mui/icons-material/ChevronLeftRounded"
|
||||||
|
import ChevronRightRounded from '@mui/icons-material/ChevronRightRounded';
|
||||||
|
import FileCopyIcon from '@mui/icons-material/FileCopy';
|
||||||
|
import './SideBar.css';
|
||||||
|
|
||||||
|
const Sidebar = ({ onSelection, onOpened, onClosed }) => {
|
||||||
|
const theme = useTheme();
|
||||||
|
const [isOpen, setIsOpen] = useState(false);
|
||||||
|
const [cannedQueries, setCannedQueries] = useState([]);
|
||||||
|
const Icon = isOpen ? ChevronLeftRounded : ChevronRightRounded;
|
||||||
|
|
||||||
|
const toggleIsOpen = () => {
|
||||||
|
if (isOpen) {
|
||||||
|
setIsOpen(false);
|
||||||
|
if (onClosed != null) {
|
||||||
|
onClosed();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setIsOpen(true);
|
||||||
|
if (onOpened != null) {
|
||||||
|
onOpened();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const onMenuItemClick = (event, cannedQuery) => {
|
||||||
|
console.info(`menu item clicked: ${cannedQuery.name}`);
|
||||||
|
onSelection(cannedQuery);
|
||||||
|
};
|
||||||
|
|
||||||
|
// const onMenuItemClick = async (event, cannedQuery) => {
|
||||||
|
// try {
|
||||||
|
// await navigator.clipboard.writeText(cannedQuery.query.join("\n"));
|
||||||
|
// alert(`Copied ${cannedQuery.name} to clipboard`);
|
||||||
|
// } catch (err) {
|
||||||
|
// console.error('Failed to copy query text: ', err);
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchCannedQueries = async () => {
|
||||||
|
try {
|
||||||
|
const response = await fetch('api/cannedqueries');
|
||||||
|
const data = await response.json();
|
||||||
|
setCannedQueries(data);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error fetching WebSocket config:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fetchCannedQueries();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const mainContentClass = `main-content ${isOpen ? 'open' : 'closed'}`;
|
||||||
|
const menuItemClass = `sidebar-menu-item ${isOpen ? 'open' : 'closed'}`;
|
||||||
|
const menuItemContentClass = `sidebar-menu-item-content ${isOpen ? 'open' : 'closed'}`;
|
||||||
|
const toggleButtonTitle = `${isOpen ? 'Hide' : 'Show'} Common Queries`;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={"sidebar"}
|
||||||
|
style={{
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'flexStart',
|
||||||
|
alignItems: 'flexStart',
|
||||||
|
margin: theme.spacing(2, 0, 0, 0)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div className={mainContentClass}>
|
||||||
|
{cannedQueries.map(cq =>
|
||||||
|
<Button key={cq.name} className={menuItemClass} onClick={(event) => onMenuItemClick(event, cq)}>
|
||||||
|
<div className={menuItemContentClass}>
|
||||||
|
<span className='button-text'>{cq.name}</span>
|
||||||
|
</div>
|
||||||
|
</Button>)
|
||||||
|
}
|
||||||
|
{/* {cannedQueries.map(cq =>
|
||||||
|
<Button
|
||||||
|
variant="contained"
|
||||||
|
color="primary"
|
||||||
|
startIcon={<FileCopyIcon />}
|
||||||
|
onClick={onMenuItemClick}
|
||||||
|
>
|
||||||
|
<div className={menuItemContentClass}>
|
||||||
|
<span className='button-text'>{cq.name}</span>
|
||||||
|
</div>
|
||||||
|
</Button>)} */}
|
||||||
|
</div>
|
||||||
|
<Tooltip title={toggleButtonTitle}>
|
||||||
|
<Button onClick={toggleIsOpen}>
|
||||||
|
<Icon className="w-5 h-5" />
|
||||||
|
</Button>
|
||||||
|
</Tooltip>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Sidebar;
|
||||||
|
|
||||||
|
Sidebar.propTypes = {
|
||||||
|
onSelection: PropTypes.func,
|
||||||
|
onOpened: PropTypes.func,
|
||||||
|
onClosed: PropTypes.func,
|
||||||
|
};
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
import { createTheme } from '@mui/material/styles';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import '@fontsource/noto-sans';
|
||||||
|
import './App.css';
|
||||||
|
|
||||||
|
const getLightPalette = () => {
|
||||||
|
return {
|
||||||
|
mode: 'light',
|
||||||
|
primary: {
|
||||||
|
light: '#6573c3',
|
||||||
|
main: '#3f51b5',
|
||||||
|
dark: '#2c387e',
|
||||||
|
contrastText: '#ffffff',
|
||||||
|
},
|
||||||
|
secondary: {
|
||||||
|
light: '#f73378',
|
||||||
|
main: '#f50057',
|
||||||
|
dark: '#ab003c',
|
||||||
|
contrastText: '#ffffff',
|
||||||
|
},
|
||||||
|
text: {
|
||||||
|
primary: '#000000c4',
|
||||||
|
secondary: '#00000086',
|
||||||
|
disabled: '#0000005b',
|
||||||
|
hint: '#0000005b',
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const getDarkPalette = () => {
|
||||||
|
return {
|
||||||
|
mode: 'dark',
|
||||||
|
primary: {
|
||||||
|
light: '#bcc5ff',
|
||||||
|
main: '#33baf9',
|
||||||
|
dark: '#202334',
|
||||||
|
contrastText: '#78a2ac',
|
||||||
|
},
|
||||||
|
secondary: {
|
||||||
|
light: '#9fd0b8',
|
||||||
|
main: '#5eb289',
|
||||||
|
dark: '#ffffff12',
|
||||||
|
contrastText: '#c8d4f7',
|
||||||
|
},
|
||||||
|
action: {
|
||||||
|
hoverOpacity: 0.08
|
||||||
|
},
|
||||||
|
text: {
|
||||||
|
primary: '#eaf8f8',
|
||||||
|
dark: '#eaf8f8a0'
|
||||||
|
},
|
||||||
|
queryStartButton: {
|
||||||
|
Subscribed: {
|
||||||
|
color: '#33baf9',
|
||||||
|
backgroundColor: '#ffffff40',
|
||||||
|
},
|
||||||
|
Unsubscribed: {
|
||||||
|
color: '#ffffff40',
|
||||||
|
backgroundColor: '#ffffff00',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
queryStopButton: {
|
||||||
|
Subscribed: {
|
||||||
|
color: '#ff4444a0',
|
||||||
|
backgroundColor: '#ffffff40',
|
||||||
|
},
|
||||||
|
Unsubscribed: {
|
||||||
|
color: '#ff444450',
|
||||||
|
backgroundColor: '#ffffff00',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: {
|
||||||
|
light: '#e57373',
|
||||||
|
main: '#f44336',
|
||||||
|
dark: '#d32f2f',
|
||||||
|
contrastText: '#fff',
|
||||||
|
},
|
||||||
|
warning: {
|
||||||
|
light: '#ffb74d',
|
||||||
|
main: '#ff9800',
|
||||||
|
dark: '#f57c00',
|
||||||
|
contrastText: '#000',
|
||||||
|
},
|
||||||
|
info: {
|
||||||
|
light: '#64b5f6',
|
||||||
|
main: '#2196f3',
|
||||||
|
dark: '#303030',
|
||||||
|
contrastText: '#fff',
|
||||||
|
},
|
||||||
|
success: {
|
||||||
|
light: '#81c784',
|
||||||
|
main: '#4caf50',
|
||||||
|
dark: '#388e3c',
|
||||||
|
contrastText: '#000',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const getTheme = ({ mode }) => {
|
||||||
|
return createTheme({
|
||||||
|
typography: {
|
||||||
|
fontFamily: '"Helvetica"'
|
||||||
|
},
|
||||||
|
palette: mode == 'dark' ? getDarkPalette() : getLightPalette()
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export default getTheme;
|
||||||
|
|
||||||
|
getTheme.propTypes = {
|
||||||
|
mode: PropTypes.string.isRequired,
|
||||||
|
};
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 4.0 KiB |
@@ -0,0 +1,51 @@
|
|||||||
|
.dark-high-contrast {
|
||||||
|
--md-sys-color-primary: rgb(251 250 255);
|
||||||
|
--md-sys-color-surface-tint: rgb(165 200 255);
|
||||||
|
--md-sys-color-on-primary: rgb(0 0 0);
|
||||||
|
--md-sys-color-primary-container: rgb(173 204 255);
|
||||||
|
--md-sys-color-on-primary-container: rgb(0 0 0);
|
||||||
|
--md-sys-color-secondary: rgb(250 250 255);
|
||||||
|
--md-sys-color-on-secondary: rgb(0 0 0);
|
||||||
|
--md-sys-color-secondary-container: rgb(159 208 255);
|
||||||
|
--md-sys-color-on-secondary-container: rgb(0 0 0);
|
||||||
|
--md-sys-color-tertiary: rgb(255 249 251);
|
||||||
|
--md-sys-color-on-tertiary: rgb(0 0 0);
|
||||||
|
--md-sys-color-tertiary-container: rgb(222 193 231);
|
||||||
|
--md-sys-color-on-tertiary-container: rgb(0 0 0);
|
||||||
|
--md-sys-color-error: rgb(255 249 249);
|
||||||
|
--md-sys-color-on-error: rgb(0 0 0);
|
||||||
|
--md-sys-color-error-container: rgb(255 186 177);
|
||||||
|
--md-sys-color-on-error-container: rgb(0 0 0);
|
||||||
|
--md-sys-color-background: rgb(17 19 24);
|
||||||
|
--md-sys-color-on-background: rgb(225 226 233);
|
||||||
|
--md-sys-color-surface: rgb(17 19 24);
|
||||||
|
--md-sys-color-on-surface: rgb(255 255 255);
|
||||||
|
--md-sys-color-surface-variant: rgb(67 71 78);
|
||||||
|
--md-sys-color-on-surface-variant: rgb(251 250 255);
|
||||||
|
--md-sys-color-outline: rgb(200 202 212);
|
||||||
|
--md-sys-color-outline-variant: rgb(200 202 212);
|
||||||
|
--md-sys-color-shadow: rgb(0 0 0);
|
||||||
|
--md-sys-color-scrim: rgb(0 0 0);
|
||||||
|
--md-sys-color-inverse-surface: rgb(225 226 233);
|
||||||
|
--md-sys-color-inverse-on-surface: rgb(0 0 0);
|
||||||
|
--md-sys-color-inverse-primary: rgb(0 42 83);
|
||||||
|
--md-sys-color-primary-fixed: rgb(219 231 255);
|
||||||
|
--md-sys-color-on-primary-fixed: rgb(0 0 0);
|
||||||
|
--md-sys-color-primary-fixed-dim: rgb(173 204 255);
|
||||||
|
--md-sys-color-on-primary-fixed-variant: rgb(0 22 49);
|
||||||
|
--md-sys-color-secondary-fixed: rgb(214 233 255);
|
||||||
|
--md-sys-color-on-secondary-fixed: rgb(0 0 0);
|
||||||
|
--md-sys-color-secondary-fixed-dim: rgb(159 208 255);
|
||||||
|
--md-sys-color-on-secondary-fixed-variant: rgb(0 24 42);
|
||||||
|
--md-sys-color-tertiary-fixed: rgb(249 222 255);
|
||||||
|
--md-sys-color-on-tertiary-fixed: rgb(0 0 0);
|
||||||
|
--md-sys-color-tertiary-fixed-dim: rgb(222 193 231);
|
||||||
|
--md-sys-color-on-tertiary-fixed-variant: rgb(33 14 42);
|
||||||
|
--md-sys-color-surface-dim: rgb(17 19 24);
|
||||||
|
--md-sys-color-surface-bright: rgb(55 57 62);
|
||||||
|
--md-sys-color-surface-container-lowest: rgb(12 14 19);
|
||||||
|
--md-sys-color-surface-container-low: rgb(25 28 32);
|
||||||
|
--md-sys-color-surface-container: rgb(29 32 36);
|
||||||
|
--md-sys-color-surface-container-high: rgb(40 42 47);
|
||||||
|
--md-sys-color-surface-container-highest: rgb(50 53 58);
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
.dark-medium-contrast {
|
||||||
|
--md-sys-color-primary: rgb(173 204 255);
|
||||||
|
--md-sys-color-surface-tint: rgb(165 200 255);
|
||||||
|
--md-sys-color-on-primary: rgb(0 22 49);
|
||||||
|
--md-sys-color-primary-container: rgb(112 146 198);
|
||||||
|
--md-sys-color-on-primary-container: rgb(0 0 0);
|
||||||
|
--md-sys-color-secondary: rgb(159 208 255);
|
||||||
|
--md-sys-color-on-secondary: rgb(0 24 42);
|
||||||
|
--md-sys-color-secondary-container: rgb(100 149 193);
|
||||||
|
--md-sys-color-on-secondary-container: rgb(0 0 0);
|
||||||
|
--md-sys-color-tertiary: rgb(222 193 231);
|
||||||
|
--md-sys-color-on-tertiary: rgb(33 14 42);
|
||||||
|
--md-sys-color-tertiary-container: rgb(162 136 171);
|
||||||
|
--md-sys-color-on-tertiary-container: rgb(0 0 0);
|
||||||
|
--md-sys-color-error: rgb(255 186 177);
|
||||||
|
--md-sys-color-on-error: rgb(55 0 1);
|
||||||
|
--md-sys-color-error-container: rgb(255 84 73);
|
||||||
|
--md-sys-color-on-error-container: rgb(0 0 0);
|
||||||
|
--md-sys-color-background: rgb(17 19 24);
|
||||||
|
--md-sys-color-on-background: rgb(225 226 233);
|
||||||
|
--md-sys-color-surface: rgb(17 19 24);
|
||||||
|
--md-sys-color-on-surface: rgb(251 250 255);
|
||||||
|
--md-sys-color-surface-variant: rgb(67 71 78);
|
||||||
|
--md-sys-color-on-surface-variant: rgb(200 202 212);
|
||||||
|
--md-sys-color-outline: rgb(160 163 171);
|
||||||
|
--md-sys-color-outline-variant: rgb(128 131 139);
|
||||||
|
--md-sys-color-shadow: rgb(0 0 0);
|
||||||
|
--md-sys-color-scrim: rgb(0 0 0);
|
||||||
|
--md-sys-color-inverse-surface: rgb(225 226 233);
|
||||||
|
--md-sys-color-inverse-on-surface: rgb(40 42 47);
|
||||||
|
--md-sys-color-inverse-primary: rgb(35 73 120);
|
||||||
|
--md-sys-color-primary-fixed: rgb(212 227 255);
|
||||||
|
--md-sys-color-on-primary-fixed: rgb(0 17 40);
|
||||||
|
--md-sys-color-primary-fixed-dim: rgb(165 200 255);
|
||||||
|
--md-sys-color-on-primary-fixed-variant: rgb(10 55 100);
|
||||||
|
--md-sys-color-secondary-fixed: rgb(206 229 255);
|
||||||
|
--md-sys-color-on-secondary-fixed: rgb(0 18 34);
|
||||||
|
--md-sys-color-secondary-fixed-dim: rgb(154 203 250);
|
||||||
|
--md-sys-color-on-secondary-fixed-variant: rgb(0 57 91);
|
||||||
|
--md-sys-color-tertiary-fixed: rgb(247 216 255);
|
||||||
|
--md-sys-color-on-tertiary-fixed: rgb(28 9 37);
|
||||||
|
--md-sys-color-tertiary-fixed-dim: rgb(218 189 226);
|
||||||
|
--md-sys-color-on-tertiary-fixed-variant: rgb(67 46 76);
|
||||||
|
--md-sys-color-surface-dim: rgb(17 19 24);
|
||||||
|
--md-sys-color-surface-bright: rgb(55 57 62);
|
||||||
|
--md-sys-color-surface-container-lowest: rgb(12 14 19);
|
||||||
|
--md-sys-color-surface-container-low: rgb(25 28 32);
|
||||||
|
--md-sys-color-surface-container: rgb(29 32 36);
|
||||||
|
--md-sys-color-surface-container-high: rgb(40 42 47);
|
||||||
|
--md-sys-color-surface-container-highest: rgb(50 53 58);
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
.dark {
|
||||||
|
--md-sys-color-primary: rgb(165 200 255);
|
||||||
|
--md-sys-color-surface-tint: rgb(165 200 255);
|
||||||
|
--md-sys-color-on-primary: rgb(0 49 94);
|
||||||
|
--md-sys-color-primary-container: rgb(34 72 118);
|
||||||
|
--md-sys-color-on-primary-container: rgb(212 227 255);
|
||||||
|
--md-sys-color-secondary: rgb(154 203 250);
|
||||||
|
--md-sys-color-on-secondary: rgb(0 51 83);
|
||||||
|
--md-sys-color-secondary-container: rgb(12 74 114);
|
||||||
|
--md-sys-color-on-secondary-container: rgb(206 229 255);
|
||||||
|
--md-sys-color-tertiary: rgb(218 189 226);
|
||||||
|
--md-sys-color-on-tertiary: rgb(61 41 70);
|
||||||
|
--md-sys-color-tertiary-container: rgb(85 63 93);
|
||||||
|
--md-sys-color-on-tertiary-container: rgb(247 216 255);
|
||||||
|
--md-sys-color-error: rgb(255 180 171);
|
||||||
|
--md-sys-color-on-error: rgb(105 0 5);
|
||||||
|
--md-sys-color-error-container: rgb(147 0 10);
|
||||||
|
--md-sys-color-on-error-container: rgb(255 218 214);
|
||||||
|
--md-sys-color-background: rgb(17 19 24);
|
||||||
|
--md-sys-color-on-background: rgb(225 226 233);
|
||||||
|
--md-sys-color-surface: rgb(17 19 24);
|
||||||
|
--md-sys-color-on-surface: rgb(225 226 233);
|
||||||
|
--md-sys-color-surface-variant: rgb(67 71 78);
|
||||||
|
--md-sys-color-on-surface-variant: rgb(195 198 207);
|
||||||
|
--md-sys-color-outline: rgb(141 145 153);
|
||||||
|
--md-sys-color-outline-variant: rgb(67 71 78);
|
||||||
|
--md-sys-color-shadow: rgb(0 0 0);
|
||||||
|
--md-sys-color-scrim: rgb(0 0 0);
|
||||||
|
--md-sys-color-inverse-surface: rgb(225 226 233);
|
||||||
|
--md-sys-color-inverse-on-surface: rgb(46 48 53);
|
||||||
|
--md-sys-color-inverse-primary: rgb(60 96 144);
|
||||||
|
--md-sys-color-primary-fixed: rgb(212 227 255);
|
||||||
|
--md-sys-color-on-primary-fixed: rgb(0 28 58);
|
||||||
|
--md-sys-color-primary-fixed-dim: rgb(165 200 255);
|
||||||
|
--md-sys-color-on-primary-fixed-variant: rgb(34 72 118);
|
||||||
|
--md-sys-color-secondary-fixed: rgb(206 229 255);
|
||||||
|
--md-sys-color-on-secondary-fixed: rgb(0 29 50);
|
||||||
|
--md-sys-color-secondary-fixed-dim: rgb(154 203 250);
|
||||||
|
--md-sys-color-on-secondary-fixed-variant: rgb(12 74 114);
|
||||||
|
--md-sys-color-tertiary-fixed: rgb(247 216 255);
|
||||||
|
--md-sys-color-on-tertiary-fixed: rgb(39 20 48);
|
||||||
|
--md-sys-color-tertiary-fixed-dim: rgb(218 189 226);
|
||||||
|
--md-sys-color-on-tertiary-fixed-variant: rgb(85 63 93);
|
||||||
|
--md-sys-color-surface-dim: rgb(17 19 24);
|
||||||
|
--md-sys-color-surface-bright: rgb(55 57 62);
|
||||||
|
--md-sys-color-surface-container-lowest: rgb(12 14 19);
|
||||||
|
--md-sys-color-surface-container-low: rgb(25 28 32);
|
||||||
|
--md-sys-color-surface-container: rgb(29 32 36);
|
||||||
|
--md-sys-color-surface-container-high: rgb(40 42 47);
|
||||||
|
--md-sys-color-surface-container-highest: rgb(50 53 58);
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
.light-high-contrast {
|
||||||
|
--md-sys-color-primary: rgb(0 34 70);
|
||||||
|
--md-sys-color-surface-tint: rgb(60 96 144);
|
||||||
|
--md-sys-color-on-primary: rgb(255 255 255);
|
||||||
|
--md-sys-color-primary-container: rgb(29 68 114);
|
||||||
|
--md-sys-color-on-primary-container: rgb(255 255 255);
|
||||||
|
--md-sys-color-secondary: rgb(0 36 61);
|
||||||
|
--md-sys-color-on-secondary: rgb(255 255 255);
|
||||||
|
--md-sys-color-secondary-container: rgb(3 70 110);
|
||||||
|
--md-sys-color-on-secondary-container: rgb(255 255 255);
|
||||||
|
--md-sys-color-tertiary: rgb(46 26 55);
|
||||||
|
--md-sys-color-on-tertiary: rgb(255 255 255);
|
||||||
|
--md-sys-color-tertiary-container: rgb(81 59 89);
|
||||||
|
--md-sys-color-on-tertiary-container: rgb(255 255 255);
|
||||||
|
--md-sys-color-error: rgb(78 0 2);
|
||||||
|
--md-sys-color-on-error: rgb(255 255 255);
|
||||||
|
--md-sys-color-error-container: rgb(140 0 9);
|
||||||
|
--md-sys-color-on-error-container: rgb(255 255 255);
|
||||||
|
--md-sys-color-background: rgb(249 249 255);
|
||||||
|
--md-sys-color-on-background: rgb(25 28 32);
|
||||||
|
--md-sys-color-surface: rgb(249 249 255);
|
||||||
|
--md-sys-color-on-surface: rgb(0 0 0);
|
||||||
|
--md-sys-color-surface-variant: rgb(224 226 236);
|
||||||
|
--md-sys-color-on-surface-variant: rgb(32 36 43);
|
||||||
|
--md-sys-color-outline: rgb(63 67 74);
|
||||||
|
--md-sys-color-outline-variant: rgb(63 67 74);
|
||||||
|
--md-sys-color-shadow: rgb(0 0 0);
|
||||||
|
--md-sys-color-scrim: rgb(0 0 0);
|
||||||
|
--md-sys-color-inverse-surface: rgb(46 48 53);
|
||||||
|
--md-sys-color-inverse-on-surface: rgb(255 255 255);
|
||||||
|
--md-sys-color-inverse-primary: rgb(228 236 255);
|
||||||
|
--md-sys-color-primary-fixed: rgb(29 68 114);
|
||||||
|
--md-sys-color-on-primary-fixed: rgb(255 255 255);
|
||||||
|
--md-sys-color-primary-fixed-dim: rgb(0 45 88);
|
||||||
|
--md-sys-color-on-primary-fixed-variant: rgb(255 255 255);
|
||||||
|
--md-sys-color-secondary-fixed: rgb(3 70 110);
|
||||||
|
--md-sys-color-on-secondary-fixed: rgb(255 255 255);
|
||||||
|
--md-sys-color-secondary-fixed-dim: rgb(0 47 77);
|
||||||
|
--md-sys-color-on-secondary-fixed-variant: rgb(255 255 255);
|
||||||
|
--md-sys-color-tertiary-fixed: rgb(81 59 89);
|
||||||
|
--md-sys-color-on-tertiary-fixed: rgb(255 255 255);
|
||||||
|
--md-sys-color-tertiary-fixed-dim: rgb(57 37 66);
|
||||||
|
--md-sys-color-on-tertiary-fixed-variant: rgb(255 255 255);
|
||||||
|
--md-sys-color-surface-dim: rgb(217 218 224);
|
||||||
|
--md-sys-color-surface-bright: rgb(249 249 255);
|
||||||
|
--md-sys-color-surface-container-lowest: rgb(255 255 255);
|
||||||
|
--md-sys-color-surface-container-low: rgb(243 243 250);
|
||||||
|
--md-sys-color-surface-container: rgb(237 237 244);
|
||||||
|
--md-sys-color-surface-container-high: rgb(231 232 238);
|
||||||
|
--md-sys-color-surface-container-highest: rgb(225 226 233);
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
.light-medium-contrast {
|
||||||
|
--md-sys-color-primary: rgb(29 68 114);
|
||||||
|
--md-sys-color-surface-tint: rgb(60 96 144);
|
||||||
|
--md-sys-color-on-primary: rgb(255 255 255);
|
||||||
|
--md-sys-color-primary-container: rgb(83 118 167);
|
||||||
|
--md-sys-color-on-primary-container: rgb(255 255 255);
|
||||||
|
--md-sys-color-secondary: rgb(3 70 110);
|
||||||
|
--md-sys-color-on-secondary: rgb(255 255 255);
|
||||||
|
--md-sys-color-secondary-container: rgb(71 121 163);
|
||||||
|
--md-sys-color-on-secondary-container: rgb(255 255 255);
|
||||||
|
--md-sys-color-tertiary: rgb(81 59 89);
|
||||||
|
--md-sys-color-on-tertiary: rgb(255 255 255);
|
||||||
|
--md-sys-color-tertiary-container: rgb(133 108 141);
|
||||||
|
--md-sys-color-on-tertiary-container: rgb(255 255 255);
|
||||||
|
--md-sys-color-error: rgb(140 0 9);
|
||||||
|
--md-sys-color-on-error: rgb(255 255 255);
|
||||||
|
--md-sys-color-error-container: rgb(218 52 46);
|
||||||
|
--md-sys-color-on-error-container: rgb(255 255 255);
|
||||||
|
--md-sys-color-background: rgb(249 249 255);
|
||||||
|
--md-sys-color-on-background: rgb(25 28 32);
|
||||||
|
--md-sys-color-surface: rgb(249 249 255);
|
||||||
|
--md-sys-color-on-surface: rgb(25 28 32);
|
||||||
|
--md-sys-color-surface-variant: rgb(224 226 236);
|
||||||
|
--md-sys-color-on-surface-variant: rgb(63 67 74);
|
||||||
|
--md-sys-color-outline: rgb(91 95 103);
|
||||||
|
--md-sys-color-outline-variant: rgb(119 123 131);
|
||||||
|
--md-sys-color-shadow: rgb(0 0 0);
|
||||||
|
--md-sys-color-scrim: rgb(0 0 0);
|
||||||
|
--md-sys-color-inverse-surface: rgb(46 48 53);
|
||||||
|
--md-sys-color-inverse-on-surface: rgb(240 240 247);
|
||||||
|
--md-sys-color-inverse-primary: rgb(165 200 255);
|
||||||
|
--md-sys-color-primary-fixed: rgb(83 118 167);
|
||||||
|
--md-sys-color-on-primary-fixed: rgb(255 255 255);
|
||||||
|
--md-sys-color-primary-fixed-dim: rgb(58 93 141);
|
||||||
|
--md-sys-color-on-primary-fixed-variant: rgb(255 255 255);
|
||||||
|
--md-sys-color-secondary-fixed: rgb(71 121 163);
|
||||||
|
--md-sys-color-on-secondary-fixed: rgb(255 255 255);
|
||||||
|
--md-sys-color-secondary-fixed-dim: rgb(43 96 137);
|
||||||
|
--md-sys-color-on-secondary-fixed-variant: rgb(255 255 255);
|
||||||
|
--md-sys-color-tertiary-fixed: rgb(133 108 141);
|
||||||
|
--md-sys-color-on-tertiary-fixed: rgb(255 255 255);
|
||||||
|
--md-sys-color-tertiary-fixed-dim: rgb(107 84 116);
|
||||||
|
--md-sys-color-on-tertiary-fixed-variant: rgb(255 255 255);
|
||||||
|
--md-sys-color-surface-dim: rgb(217 218 224);
|
||||||
|
--md-sys-color-surface-bright: rgb(249 249 255);
|
||||||
|
--md-sys-color-surface-container-lowest: rgb(255 255 255);
|
||||||
|
--md-sys-color-surface-container-low: rgb(243 243 250);
|
||||||
|
--md-sys-color-surface-container: rgb(237 237 244);
|
||||||
|
--md-sys-color-surface-container-high: rgb(231 232 238);
|
||||||
|
--md-sys-color-surface-container-highest: rgb(225 226 233);
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
.light {
|
||||||
|
--md-sys-color-primary: rgb(60 96 144);
|
||||||
|
--md-sys-color-surface-tint: rgb(60 96 144);
|
||||||
|
--md-sys-color-on-primary: rgb(255 255 255);
|
||||||
|
--md-sys-color-primary-container: rgb(212 227 255);
|
||||||
|
--md-sys-color-on-primary-container: rgb(0 28 58);
|
||||||
|
--md-sys-color-secondary: rgb(46 98 140);
|
||||||
|
--md-sys-color-on-secondary: rgb(255 255 255);
|
||||||
|
--md-sys-color-secondary-container: rgb(206 229 255);
|
||||||
|
--md-sys-color-on-secondary-container: rgb(0 29 50);
|
||||||
|
--md-sys-color-tertiary: rgb(110 86 118);
|
||||||
|
--md-sys-color-on-tertiary: rgb(255 255 255);
|
||||||
|
--md-sys-color-tertiary-container: rgb(247 216 255);
|
||||||
|
--md-sys-color-on-tertiary-container: rgb(39 20 48);
|
||||||
|
--md-sys-color-error: rgb(186 26 26);
|
||||||
|
--md-sys-color-on-error: rgb(255 255 255);
|
||||||
|
--md-sys-color-error-container: rgb(255 218 214);
|
||||||
|
--md-sys-color-on-error-container: rgb(65 0 2);
|
||||||
|
--md-sys-color-background: rgb(249 249 255);
|
||||||
|
--md-sys-color-on-background: rgb(25 28 32);
|
||||||
|
--md-sys-color-surface: rgb(249 249 255);
|
||||||
|
--md-sys-color-on-surface: rgb(25 28 32);
|
||||||
|
--md-sys-color-surface-variant: rgb(224 226 236);
|
||||||
|
--md-sys-color-on-surface-variant: rgb(67 71 78);
|
||||||
|
--md-sys-color-outline: rgb(116 119 127);
|
||||||
|
--md-sys-color-outline-variant: rgb(195 198 207);
|
||||||
|
--md-sys-color-shadow: rgb(0 0 0);
|
||||||
|
--md-sys-color-scrim: rgb(0 0 0);
|
||||||
|
--md-sys-color-inverse-surface: rgb(46 48 53);
|
||||||
|
--md-sys-color-inverse-on-surface: rgb(240 240 247);
|
||||||
|
--md-sys-color-inverse-primary: rgb(165 200 255);
|
||||||
|
--md-sys-color-primary-fixed: rgb(212 227 255);
|
||||||
|
--md-sys-color-on-primary-fixed: rgb(0 28 58);
|
||||||
|
--md-sys-color-primary-fixed-dim: rgb(165 200 255);
|
||||||
|
--md-sys-color-on-primary-fixed-variant: rgb(34 72 118);
|
||||||
|
--md-sys-color-secondary-fixed: rgb(206 229 255);
|
||||||
|
--md-sys-color-on-secondary-fixed: rgb(0 29 50);
|
||||||
|
--md-sys-color-secondary-fixed-dim: rgb(154 203 250);
|
||||||
|
--md-sys-color-on-secondary-fixed-variant: rgb(12 74 114);
|
||||||
|
--md-sys-color-tertiary-fixed: rgb(247 216 255);
|
||||||
|
--md-sys-color-on-tertiary-fixed: rgb(39 20 48);
|
||||||
|
--md-sys-color-tertiary-fixed-dim: rgb(218 189 226);
|
||||||
|
--md-sys-color-on-tertiary-fixed-variant: rgb(85 63 93);
|
||||||
|
--md-sys-color-surface-dim: rgb(217 218 224);
|
||||||
|
--md-sys-color-surface-bright: rgb(249 249 255);
|
||||||
|
--md-sys-color-surface-container-lowest: rgb(255 255 255);
|
||||||
|
--md-sys-color-surface-container-low: rgb(243 243 250);
|
||||||
|
--md-sys-color-surface-container: rgb(237 237 244);
|
||||||
|
--md-sys-color-surface-container-high: rgb(231 232 238);
|
||||||
|
--md-sys-color-surface-container-highest: rgb(225 226 233);
|
||||||
|
}
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
:root {
|
||||||
|
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
|
||||||
|
line-height: 1.5;
|
||||||
|
font-weight: 400;
|
||||||
|
|
||||||
|
color-scheme: light dark;
|
||||||
|
color: rgba(255, 255, 255, 0.87);
|
||||||
|
background-color: #242424;
|
||||||
|
|
||||||
|
font-synthesis: none;
|
||||||
|
text-rendering: optimizeLegibility;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
font-weight: 500;
|
||||||
|
color: #646cff;
|
||||||
|
text-decoration: inherit;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
color: #535bf2;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
display: flex;
|
||||||
|
place-items: center;
|
||||||
|
min-width: 320px;
|
||||||
|
min-height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
border-radius: 8px;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
padding: 0.6em 1.2em;
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: 500;
|
||||||
|
font-family: inherit;
|
||||||
|
background-color: #1a1a1a;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: border-color 0.25s;
|
||||||
|
}
|
||||||
|
button:hover {
|
||||||
|
border-color: #646cff;
|
||||||
|
}
|
||||||
|
button:focus,
|
||||||
|
button:focus-visible {
|
||||||
|
outline: 4px auto -webkit-focus-ring-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
button#query-button {
|
||||||
|
height: 5em;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
button#play-button {
|
||||||
|
padding: '10px 20px';
|
||||||
|
font-size: '16px';
|
||||||
|
cursor: 'pointer';
|
||||||
|
background-color: '#28a745';
|
||||||
|
color: '#fff';
|
||||||
|
border: 'none';
|
||||||
|
border-radius: '5px';
|
||||||
|
};
|
||||||
|
|
||||||
|
button#pause-button {
|
||||||
|
background-color: #ffc107;
|
||||||
|
}
|
||||||
|
|
||||||
|
button#stop-button {
|
||||||
|
background-color: #dc3545;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 3.2em;
|
||||||
|
line-height: 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
p#footer {
|
||||||
|
float: none;
|
||||||
|
clear: both;
|
||||||
|
vertical-align: bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
table#query-output {
|
||||||
|
float: none;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea#query-input {
|
||||||
|
height: 5em;
|
||||||
|
width: 50em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: light) {
|
||||||
|
:root {
|
||||||
|
color: #213547;
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
color: #747bff;
|
||||||
|
}
|
||||||
|
button {
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import ReactDOM from 'react-dom/client';
|
||||||
|
import App from './App';
|
||||||
|
|
||||||
|
ReactDOM.createRoot(document.getElementById('root')).render(
|
||||||
|
<App />
|
||||||
|
)
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
import { fileURLToPath, URL } from 'node:url';
|
||||||
|
import { defineConfig, loadEnv } from 'vite';
|
||||||
|
import plugin from '@vitejs/plugin-react';
|
||||||
|
import fs from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
import child_process from 'child_process';
|
||||||
|
import process, { env } from 'process';
|
||||||
|
|
||||||
|
const baseFolder =
|
||||||
|
process.env.APPDATA !== undefined && process.env.APPDATA !== ''
|
||||||
|
? `${process.env.APPDATA}/ASP.NET/https`
|
||||||
|
: `${process.env.HOME}/.aspnet/https`;
|
||||||
|
|
||||||
|
const certificateName = "bts.datastreamwebapp.client";
|
||||||
|
const certFilePath = path.join(baseFolder, `${certificateName}.pem`);
|
||||||
|
const keyFilePath = path.join(baseFolder, `${certificateName}.key`);
|
||||||
|
|
||||||
|
if (!fs.existsSync(certFilePath) || !fs.existsSync(keyFilePath)) {
|
||||||
|
if (0 !== child_process.spawnSync('dotnet', [
|
||||||
|
'dev-certs',
|
||||||
|
'https',
|
||||||
|
'--export-path',
|
||||||
|
certFilePath,
|
||||||
|
'--format',
|
||||||
|
'Pem',
|
||||||
|
'--no-password',
|
||||||
|
], { stdio: 'inherit', }).status) {
|
||||||
|
throw new Error("Could not create certificate.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default defineConfig(({ $$command, mode, $$isSsrBuild, $$isPreview }) => {
|
||||||
|
const target = env.ASPNETCORE_HTTPS_PORT
|
||||||
|
? `https://localhost:${env.ASPNETCORE_HTTPS_PORT}`
|
||||||
|
: env.ASPNETCORE_URLS
|
||||||
|
? env.ASPNETCORE_URLS.split(';')[0]
|
||||||
|
: 'https://localhost:8443';
|
||||||
|
return {
|
||||||
|
plugins: [plugin()],
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
'@': fileURLToPath(new URL('./src', import.meta.url))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
build: {
|
||||||
|
minify: false,
|
||||||
|
sourcemap: true,
|
||||||
|
outDir: `../../../build/Bts.DataStreamWebApp.Client/${mode}/dist`
|
||||||
|
},
|
||||||
|
server: {
|
||||||
|
proxy: {
|
||||||
|
'^/api': {
|
||||||
|
target,
|
||||||
|
secure: false
|
||||||
|
},
|
||||||
|
'^/ws': {
|
||||||
|
target,
|
||||||
|
secure: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
port: 5173,
|
||||||
|
https: {
|
||||||
|
key: fs.readFileSync(keyFilePath),
|
||||||
|
cert: fs.readFileSync(certFilePath),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<InvariantGlobalization>true</InvariantGlobalization>
|
||||||
|
<SpaRoot>..\Bts.DataStreamWebApp.Client</SpaRoot>
|
||||||
|
<SpaProxyLaunchCommand>npm run dev</SpaProxyLaunchCommand>
|
||||||
|
<SpaProxyServerUrl>https://localhost:5173</SpaProxyServerUrl>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="CommandLineParser" Version="2.9.1" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.SpaProxy" Version="7.0.20" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="7.0.20" />
|
||||||
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Bts.DataStreamWebApp.Client\Bts.DataStreamWebApp.Client.esproj">
|
||||||
|
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\DataStream\DataStream.csproj" />
|
||||||
|
<ProjectReference Include="..\SharedStreams\SharedStreams.csproj" />
|
||||||
|
<ProjectReference Include="..\..\client\spark_api\spark_api.csproj" />
|
||||||
|
<ProjectReference Include="..\..\client\spark_core\spark_core.csproj" />
|
||||||
|
<ProjectReference Include="..\..\client\spark_websocket\spark_websocket.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ConfigurationProfile Include="appsettings.Development.json" />
|
||||||
|
<ConfigurationProfile Include="appsettings.Production.json" />
|
||||||
|
<ConfigurationProfile Include="appsettings.ProductionAws.json" />
|
||||||
|
<ConfigurationProfile Include="appsettings.Staging.json" />
|
||||||
|
<ConfigurationProfile Include="appsettings.json" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
namespace Bts.DataStreamWebApp.Server;
|
||||||
|
|
||||||
|
public class CannedQueriesConfig {
|
||||||
|
public List<CannedQuery>? Items { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
namespace Bts.DataStreamWebApp.Server;
|
||||||
|
|
||||||
|
public class CannedQuery {
|
||||||
|
public string? Name { get; set; }
|
||||||
|
public List<string>? Query { get; set; }
|
||||||
|
}
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
namespace Bts.DataStreamWebApp.Server;
|
||||||
|
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
|
[ApiController]
|
||||||
|
[Route("api/[controller]")]
|
||||||
|
public class CannedQueriesController : ControllerBase {
|
||||||
|
readonly IConfiguration config;
|
||||||
|
|
||||||
|
public CannedQueriesController(IConfiguration config) =>
|
||||||
|
this.config = config;
|
||||||
|
|
||||||
|
[HttpGet(Name = "GetCannedQueries")]
|
||||||
|
public IEnumerable<CannedQuery>? Get() {
|
||||||
|
var cannedQueries = config.GetSection("CannedQueries").Get<List<CannedQuery>>()?.ToArray() ?? Array.Empty<CannedQuery>();
|
||||||
|
return cannedQueries;
|
||||||
|
}
|
||||||
|
}
|
||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
// using Bts.DataStreamWebApp.Server;
|
||||||
|
|
||||||
|
// using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
|
// [ApiController]
|
||||||
|
// [Route("api/[controller]")]
|
||||||
|
// public class ConfigController : ControllerBase {
|
||||||
|
// private readonly IConfiguration _configuration;
|
||||||
|
|
||||||
|
// public ConfigController(IConfiguration configuration) {
|
||||||
|
// _configuration = configuration;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// [HttpGet("websocket")]
|
||||||
|
// public ActionResult<DataStreamWebSocketConfig> GetWebSocketConfig() {
|
||||||
|
// var endpoint = $"{_configuration["Kestrel:Endpoints:Http:Url"]}/ws";
|
||||||
|
// var webSocketConfig = new DataStreamWebSocketConfig {
|
||||||
|
// Endpoint = endpoint // or Https based on your setup
|
||||||
|
// };
|
||||||
|
// return Ok(webSocketConfig);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
namespace Bts.DataStreamWebApp.Server.Controllers;
|
||||||
|
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
|
[Route("/ws")]
|
||||||
|
public class DataStreamSubscriptionController : ControllerBase {
|
||||||
|
readonly ILogger logger;
|
||||||
|
|
||||||
|
public DataStreamSubscriptionController(ILogger<DataStreamSubscriptionController> logger) {
|
||||||
|
this.logger = logger;
|
||||||
|
logger.LogInformation("Creating {ControllerType}", GetType().Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Route("/ws")]
|
||||||
|
public async Task Get(CancellationToken cancellationToken) {
|
||||||
|
if (!HttpContext.WebSockets.IsWebSocketRequest) {
|
||||||
|
logger.LogError("Expected websocket request on path '{}'", HttpContext.Request.Path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
logger.LogInformation("Establishing websocket connection...");
|
||||||
|
try {
|
||||||
|
using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
|
||||||
|
logger.LogInformation("Websocket connection established.");
|
||||||
|
using var server = new DataStreamWebSocketServer(webSocket, logger);
|
||||||
|
await server.Run(cancellationToken);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
logger.LogError("DataStreamSubscriptionController.Run threw exception: {Exception}", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
namespace Bts.DataStreamWebApp.Server.Controllers;
|
||||||
|
|
||||||
|
using BCG;
|
||||||
|
|
||||||
|
using bts.websocket_core.json_rpc;
|
||||||
|
|
||||||
|
using Bts.DataStreamCore;
|
||||||
|
using Bts.DataStreamWebApp.Server.Messages;
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Net.WebSockets;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
class DataStreamSubscription : IDisposable, IHostedService {
|
||||||
|
public readonly ViewStream ViewStream;
|
||||||
|
public DataPacket? LastFired;
|
||||||
|
|
||||||
|
readonly ILogger logger;
|
||||||
|
readonly WebSocket webSocket;
|
||||||
|
|
||||||
|
public DataStreamSubscription(string id, JsonRpcId requestId, ViewStream viewStream, WebSocket webSocket, ILogger logger) {
|
||||||
|
ViewStream = viewStream;
|
||||||
|
RequestId = requestId;
|
||||||
|
Id = id;
|
||||||
|
this.webSocket = webSocket;
|
||||||
|
this.logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Id { get; }
|
||||||
|
public JsonRpcId RequestId { get; }
|
||||||
|
public SubscriptionStatus Status { get; private set; }
|
||||||
|
|
||||||
|
public void Start() {
|
||||||
|
if (Status == SubscriptionStatus.Subscribed) {
|
||||||
|
logger.LogWarning("Ignoring redundant call to 'Start'. Id = {Id} Status = {Status}", Id, Status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
logger.LogInformation("Subscribing to ViewStream. SubscriptionId = {SubscriptionId}", Id);
|
||||||
|
Status = SubscriptionStatus.Subscribed;
|
||||||
|
ViewStream.onChange += onChange;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task StartAsync(CancellationToken cancellationToken) {
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
Start();
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task Clear() {
|
||||||
|
if (LastFired is null) {
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
logger.LogInformation("Clearing subscription (firing DataPacket to delete all rows). Id = {Id} Status = {Status}", Id, Status);
|
||||||
|
return sendDataPacket("clear", new(new BlueTable(LastFired.schema), new BlueTable(LastFired.schema), LastFired.newRows));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Stop() {
|
||||||
|
if (Status == SubscriptionStatus.Unsubscribed) {
|
||||||
|
logger.LogWarning("Ignoring redundant call to 'Stop'. Id = {Id} Status = {Status}", Id, Status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
logger.LogInformation("Unsubscribing from ViewStream. SubscriptionId = {SubscriptionId}", Id);
|
||||||
|
Status = SubscriptionStatus.Unsubscribed;
|
||||||
|
ViewStream.onChange -= onChange;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task StopAsync(CancellationToken cancellationToken) {
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
Stop();
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose() =>
|
||||||
|
Stop();
|
||||||
|
|
||||||
|
async void onChange(object newValue) {
|
||||||
|
if (newValue is not DataPacket dp) {
|
||||||
|
logger.LogError("Expected DataPacket in stream callback (actually received {}).", newValue?.GetType());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (webSocket.State != WebSocketState.Open) {
|
||||||
|
logger.LogError(
|
||||||
|
"Unsubscribing from stream early because WebSocket state = {WebSocketState}", webSocket.State);
|
||||||
|
Dispose();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await sendDataPacket("subscribe", dp);
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task sendDataPacket(string method, DataPacket dp) {
|
||||||
|
var serializerOpts = new JsonSerializerOptions {
|
||||||
|
NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals
|
||||||
|
};
|
||||||
|
serializerOpts.Converters.Add(new DataPacketJsonConverter() {
|
||||||
|
IncludeCurrent = true,
|
||||||
|
UseObjectRows = true,
|
||||||
|
});
|
||||||
|
var res = JsonRpcRequest.CreateNotification(method, new DataStreamSubscriptionUpdate() {
|
||||||
|
SubscriptionId = Id,
|
||||||
|
Table = dp
|
||||||
|
});
|
||||||
|
var str = serialize(res, serializerOpts);
|
||||||
|
if (str is null) {
|
||||||
|
logger.LogError("Unsubscribing from stream early because we failed to serialize an outgoing DataPacket");
|
||||||
|
Dispose();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
logger.LogInformation(
|
||||||
|
"Sending DataPacket. NumRows = {NumRows} NumCols = {NumCols} MessageLength = {MessageLength}",
|
||||||
|
dp.newRows.Count,
|
||||||
|
dp.schema.columnNames.Length,
|
||||||
|
str.Length);
|
||||||
|
var bytes = Encoding.UTF8.GetBytes(str);
|
||||||
|
try {
|
||||||
|
await webSocket.SendAsync(bytes, WebSocketMessageType.Text, true, CancellationToken.None);
|
||||||
|
LastFired = dp;
|
||||||
|
} catch (WebSocketException ex) {
|
||||||
|
logger.LogError($"sendDataPacket failed on webSocket.SendAsync: {ex}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string? serialize<T>(T message, JsonSerializerOptions? opts) {
|
||||||
|
opts ??= JsonSerializerOptions.Default;
|
||||||
|
try {
|
||||||
|
return JsonSerializer.Serialize(message, opts);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
logger.LogError("Failed to serialize message of type {MessageType}: {Exception}", typeof(T), ex);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
namespace Bts.DataStreamWebApp.Server;
|
||||||
|
|
||||||
|
using BCG;
|
||||||
|
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
public class DataStreamSubscriptionUpdate {
|
||||||
|
[JsonPropertyName("subscription_id")]
|
||||||
|
public string? SubscriptionId { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("table")]
|
||||||
|
public DataPacket? Table { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
namespace Bts.DataStreamWebApp.Server;
|
||||||
|
|
||||||
|
using Bts.PubSub;
|
||||||
|
|
||||||
|
using CommandLine;
|
||||||
|
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
class DataStreamWebAppServerConfig {
|
||||||
|
/// <summary>
|
||||||
|
/// The login user for sparkd
|
||||||
|
/// </summary>
|
||||||
|
[JsonPropertyName("user")]
|
||||||
|
[Option("user", HelpText = "The sparkd login user")]
|
||||||
|
public string? User { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The login password for sparkd
|
||||||
|
/// </summary>
|
||||||
|
[JsonPropertyName("password")]
|
||||||
|
[Option("pass", HelpText = "The sparkd login password")]
|
||||||
|
public string? Password { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The config server url for sparkd
|
||||||
|
/// </summary>
|
||||||
|
[JsonPropertyName("sparkd")]
|
||||||
|
[Option("sparkd", HelpText = "The sparkd config server")]
|
||||||
|
public string? Sparkd { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("pubsub")]
|
||||||
|
public PubSubConfig? PubSub { get; set; }
|
||||||
|
|
||||||
|
[Option("content-root-path")]
|
||||||
|
[JsonPropertyName("content_root_path")]
|
||||||
|
public string? ContentRootPath { get; set; }
|
||||||
|
|
||||||
|
[Option("web-root-path")]
|
||||||
|
[JsonPropertyName("web_root_path")]
|
||||||
|
public string? WebRootPath { get; set; }
|
||||||
|
|
||||||
|
[Option("environment-name")]
|
||||||
|
[JsonPropertyName("environment_name")]
|
||||||
|
public string? EnvironmentName { get; set; }
|
||||||
|
|
||||||
|
public DirectoryBrowserOptions? DirectoryBrowser { get; set; }
|
||||||
|
|
||||||
|
[Option(
|
||||||
|
"config",
|
||||||
|
MetaValue = "PATH",
|
||||||
|
HelpText = "Path to json file representing these options (DataStreamPublisherConfig)")]
|
||||||
|
[JsonIgnore]
|
||||||
|
public string? ConfigFile { get; set; }
|
||||||
|
|
||||||
|
public static DataStreamWebAppServerConfig Default() =>
|
||||||
|
new() {
|
||||||
|
User = "bts",
|
||||||
|
PubSub = PubSubConfig.Default(),
|
||||||
|
};
|
||||||
|
|
||||||
|
public void MergeWith(DataStreamWebAppServerConfig other) {
|
||||||
|
User ??= other.User;
|
||||||
|
Password ??= other.Password;
|
||||||
|
PubSub ??= other.PubSub;
|
||||||
|
Sparkd ??= other.Sparkd;
|
||||||
|
ContentRootPath ??= other.ContentRootPath;
|
||||||
|
WebRootPath ??= other.WebRootPath;
|
||||||
|
ConfigFile ??= other.ConfigFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Merges options with those defined in `ConfigFile` (does not overwrite
|
||||||
|
/// non-null existing values).
|
||||||
|
/// </summary>
|
||||||
|
/// <exception cref="InvalidOperationException">
|
||||||
|
/// JsonSerializer.Deserialize returns null
|
||||||
|
/// </exception>
|
||||||
|
public void MergeWithConfigFile() {
|
||||||
|
if (ConfigFile is null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var cfgString = File.ReadAllText(ConfigFile);
|
||||||
|
var parsedCfg = JsonSerializer.Deserialize<DataStreamWebAppServerConfig>(cfgString) ??
|
||||||
|
throw new InvalidOperationException($"Failed to parse json from {ConfigFile}");
|
||||||
|
MergeWith(parsedCfg);
|
||||||
|
ConfigFile = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
namespace Bts.DataStreamWebApp.Server;
|
||||||
|
|
||||||
|
public class DataStreamWebSocketConfig {
|
||||||
|
public string? Endpoint { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,148 @@
|
|||||||
|
namespace Bts.DataStreamWebApp.Server.Controllers;
|
||||||
|
|
||||||
|
using bts.websocket_core.json_rpc;
|
||||||
|
|
||||||
|
using Bts.DataStreamWebApp.Server.Messages;
|
||||||
|
|
||||||
|
using System.Net.WebSockets;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Nodes;
|
||||||
|
|
||||||
|
public class DataStreamWebSocketServer : IDisposable, IAsyncDisposable {
|
||||||
|
readonly ILogger logger;
|
||||||
|
readonly WebSocket webSocket;
|
||||||
|
readonly Dictionary<string, DataStreamSubscription> subscriptions = new();
|
||||||
|
|
||||||
|
public DataStreamWebSocketServer(WebSocket webSocket, ILogger logger) {
|
||||||
|
this.webSocket = webSocket;
|
||||||
|
this.logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<int> Run(CancellationToken cancellationToken) {
|
||||||
|
logger.LogInformation("DataStreamWebSocketServer running");
|
||||||
|
await foreach (var req in JsonRpcRequestAsyncEnumerable.Create(webSocket, logger, cancellationToken)) {
|
||||||
|
await (req.Method switch {
|
||||||
|
"subscribe" => onSubscribe(req, cancellationToken),
|
||||||
|
"unsubscribe" => onUnsubscribe(req.Deserialize<UnsubscribeRequest>(), cancellationToken),
|
||||||
|
_ => Task.CompletedTask,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
logger.LogInformation("DataStreamWebSocketServer stopped");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Disposes internal subscriptions. To additionally notify the client of the subscription status
|
||||||
|
/// change(s), use <see cref="DisposeAsync"/>.
|
||||||
|
/// </summary>
|
||||||
|
public void Dispose() {
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
disposeSubscriptions();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Disposes internal subscriptions (like <see cref="Dispose"/>), then sends 'subscription status change'
|
||||||
|
/// notifications to the client (unlike <see cref="Dispose"/>).
|
||||||
|
/// </summary>
|
||||||
|
public async ValueTask DisposeAsync() {
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
var finalSubs = subscriptions.Values.Select(s => (s.RequestId, s.Id)).ToList();
|
||||||
|
disposeSubscriptions();
|
||||||
|
// Send a 'subscription status change' msg to the client for each one.
|
||||||
|
foreach (var (requestId, id) in finalSubs) {
|
||||||
|
await sendSubscriptionStatus(requestId, id, "unsubscribe", SubscriptionStatus.Unsubscribed, CancellationToken.None);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task onSubscribe(JsonRpcRequest<JsonNode> req, CancellationToken cancellationToken) {
|
||||||
|
ArgumentNullException.ThrowIfNull(req.Id);
|
||||||
|
ArgumentException.ThrowIfNullOrEmpty(req.Method);
|
||||||
|
if (!SubscribeRequest.Parse(req, out var subReq, out var parseErr, out var errCode)) {
|
||||||
|
logger.LogError("Invalid 'subscribe' request: {Reason}", parseErr);
|
||||||
|
var rpcError = JsonRpcResponse.CreateError<SubscriptionError>(
|
||||||
|
req.Id, new() { Code = (long)errCode, Message = "Failed to parse subscription request", Data = parseErr });
|
||||||
|
await send(rpcError, cancellationToken);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var subId = subReq.SubscriptionId ?? throw new InvalidOperationException("SubscriptionId is null (parse false)");
|
||||||
|
disposeSubscription(subId);
|
||||||
|
if (!subReq.ParseQuery(out var vs, out parseErr, out errCode)) {
|
||||||
|
logger.LogError("Invalid 'subscribe' request: {Reason}", parseErr);
|
||||||
|
var rpcError = JsonRpcResponse.CreateError<SubscriptionError>(
|
||||||
|
req.Id, new() { Code = (long)errCode, Message = "Failed to parse subscription request", Data = parseErr });
|
||||||
|
await send(rpcError, cancellationToken);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (subscriptions.TryGetValue(subId, out var oldSub)) {
|
||||||
|
logger.LogInformation("Disposing existing subscription with id {SubscriptionId}", subId);
|
||||||
|
oldSub.Dispose();
|
||||||
|
}
|
||||||
|
var sub = new DataStreamSubscription(subId, req.Id.Value, vs, webSocket, logger);
|
||||||
|
subscriptions[subId] = sub;
|
||||||
|
await sendSubscriptionStatus(req.Id.Value, subId, req.Method, SubscriptionStatus.Subscribed, cancellationToken);
|
||||||
|
vs.ErrorChanged += OnStreamError;
|
||||||
|
await sub.StartAsync(cancellationToken);
|
||||||
|
|
||||||
|
async void OnStreamError(Exception exception) {
|
||||||
|
logger.LogError("Error in ViewStream (disposing subscription): {Exception}", exception);
|
||||||
|
subscriptions.Remove(sub.Id);
|
||||||
|
sub.Dispose();
|
||||||
|
var error = new SubscriptionError() {
|
||||||
|
ErrorMessage = "Error in ViewStream (disposing subscription)"
|
||||||
|
};
|
||||||
|
if (exception is not null) {
|
||||||
|
error.ErrorMessage += ". " + exception.Message;
|
||||||
|
error.StackTrace = exception.StackTrace?.Split("\n")?.ToList();
|
||||||
|
}
|
||||||
|
var rpcError = JsonRpcResponse.CreateError<SubscriptionError>(
|
||||||
|
req.Id, new() { Code = (long)ErrorCode.ViewStreamError, Message = "Error in ViewStream (disposing subscription)", Data = error });
|
||||||
|
await send(rpcError, cancellationToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task onUnsubscribe(JsonRpcRequest<UnsubscribeRequest> req, CancellationToken cancellationToken) {
|
||||||
|
ArgumentNullException.ThrowIfNull(req.Id);
|
||||||
|
ArgumentException.ThrowIfNullOrEmpty(req.Method);
|
||||||
|
var subId = req.Params?.SubscriptionId ?? string.Empty;
|
||||||
|
if (!disposeSubscription(subId)) {
|
||||||
|
logger.LogInformation("Unable to dispose subscription. Subscription with id {Id} not found.", subId);
|
||||||
|
}
|
||||||
|
await sendSubscriptionStatus(req.Id.Value, subId, "unsubscribe", SubscriptionStatus.Unsubscribed, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool disposeSubscription(string subId) {
|
||||||
|
if (!subscriptions.TryGetValue(subId, out var sub)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
logger.LogInformation("Disposing subscription with id {Id}", subId);
|
||||||
|
sub.Dispose();
|
||||||
|
subscriptions.Remove(subId);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Task sendSubscriptionStatus(JsonRpcId reqId, string subId, string method, SubscriptionStatus status, CancellationToken cancellationToken) {
|
||||||
|
logger.LogInformation("Sending {Method} ack. SubscriptionId = {SubscriptionId}", method, subId);
|
||||||
|
var response = JsonRpcResponse.Create(reqId, new SubscriptionStatusMessage() {
|
||||||
|
SubscriptionId = subId,
|
||||||
|
Status = status,
|
||||||
|
});
|
||||||
|
return send(response, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
Task send<T>(T message, CancellationToken cancellationToken) {
|
||||||
|
if (message is null) {
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
var str = JsonSerializer.Serialize(message);
|
||||||
|
var bytes = Encoding.UTF8.GetBytes(str);
|
||||||
|
logger.LogTrace("Sending data. Length = {Length}", bytes.Length);
|
||||||
|
return webSocket.SendAsync(bytes, WebSocketMessageType.Text, true, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
void disposeSubscriptions() {
|
||||||
|
logger.LogInformation("Disposing DataStreamWebSocketServer subscriptions. Count: {Count}", subscriptions.Count);
|
||||||
|
subscriptions.Values.DisposeAll();
|
||||||
|
subscriptions.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
FROM bluetradingsystems/linux_dotnet7
|
||||||
|
|
||||||
|
RUN dotnet dev-certs https --trust
|
||||||
|
COPY --chown=bts:bts "build/Release/bin/net7.0/linux-x64/publish" "bin"
|
||||||
|
COPY --chown=bts:bts "build/Bts.DataStreamWebApp.Client/production/dist" "bin/wwwroot"
|
||||||
|
COPY --chown=bts:bts "src/DataStreamSuite/Bts.DataStreamWebApp.Server/spark.conf" ".local/share/bts/Bts.DataStreamWebApp.Server/conf/spark.conf"
|
||||||
|
WORKDIR "/home/bts/bin"
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
namespace Bts.DataStreamWebApp.Server;
|
||||||
|
|
||||||
|
public class CannedQueriesResponse {
|
||||||
|
public List<CannedQuery>? Items { get; set; }
|
||||||
|
}
|
||||||
Loaded 100 of 2819 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user