diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2f63ec18d..0165914e2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,40 +1,50 @@ -name: 'C++ CI' +name: Build and Release on: push: - branches: - - master - - feature/github_actions + tags: + - 'v*' jobs: - build: + release: runs-on: ubuntu-latest + permissions: + contents: write + pages: write + id-token: write steps: - - uses: actions/checkout@v2 - with: - submodules: true - - run: sudo apt-get update && sudo apt-get install libboost-test-dev -y - - run: cmake . -DPATCH_VERSION=${{ github.run_number }} -DWITH_BOOST_TEST=ON - - run: cmake --build . - - run: cmake --build . --target test - - run: cmake --build . --target package - - name: Create Release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/checkout@v4 + + - name: Build in Docker + run: | + # 1. Собираем образ + docker build -t builder . + + # 2. Создаем временный контейнер для копирования файлов + docker create --name extractor builder + + # 3. Подготавливаем папки на сервере GitHub + mkdir -p dist + + # 4. Копируем .deb пакет из папки /output контейнера + docker cp extractor:/output/. ./dist/ + + # 5. Копируем документацию. + # Путь /build/docs/html так как в Doxyfile OUTPUT_DIRECTORY = docs + docker cp extractor:/build/docs/html/. ./dist-docs + + # 6. Удаляем контейнер + docker rm extractor + + - name: Create GitHub Release + uses: softprops/action-gh-release@v1 with: - tag_name: ${{ github.run_number }} - release_name: Release ${{ github.run_number }} - draft: false - prerelease: false - - name: Upload Release Asset - id: upload-release-asset - uses: actions/upload-release-asset@v1 + files: dist/*.deb env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Deploy to GitHub Pages + uses: JamesIves/github-pages-deploy-action@v4 with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./helloworld-0.0.${{ github.run_number }}-Linux.deb - asset_name: helloworld-0.0.${{ github.run_number }}-Linux.deb - asset_content_type: application/vnd.debian.binary-package \ No newline at end of file + folder: dist-docs + branch: gh-pages \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..f9811ee8d --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +**/.idea/ +**/.settings/ +**/.vscode/ +**/build/ +**/debug/ +**/release/ +html/ +latex/ +*.deb +dist/ +output/ +*.pdb \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..c1bbd415d --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,27 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Отладка VS (Visual Studio)", + "type": "cppvsdbg", + "request": "launch", + "program": "${workspaceFolder}/build/Debug/kafka_order_sender.exe", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}/build/Debug", + "environment": [], + "console": "externalTerminal" + }, + { + "name": "Запуск без отладки", + "type": "cppvsdbg", + "request": "launch", + "program": "${workspaceFolder}/build/Release/kafka_order_sender.exe", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}/build/Release", + "environment": [], + "console": "externalTerminal" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..62d2b42f7 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,26 @@ +{ + "cmake.sourceDirectory": "${workspaceFolder}", + "cmake.buildDirectory": "${workspaceFolder}/build", + "cmake.generator": "Visual Studio 18 2026", + "cmake.configureSettings": { + "CMAKE_TOOLCHAIN_FILE": "C:/vcpkg/scripts/buildsystems/vcpkg.cmake" + }, + "cmake.buildConfig": "Debug", + "C_Cpp.default.cppStandard": "c++17", + "C_Cpp.default.includePath": [ + "${workspaceFolder}/src", + "${workspaceFolder}/src/config", + "${workspaceFolder}/src/kafka", + "${workspaceFolder}/src/parser", + "${workspaceFolder}/src/cache", + "${workspaceFolder}/src/utils", + "C:/vcpkg/installed/x64-windows/include" + ], + "files.associations": { + "*.hpp": "cpp", + "*.cpp": "cpp", + "*.json": "json" + }, + "editor.formatOnSave": true, + "editor.rulers": [100] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..f7415a3e4 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,90 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "CMake Configure", + "type": "shell", + "command": "cmake", + "args": [ + "..", + "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake", + "-DCMAKE_BUILD_TYPE=Debug" + ], + "options": { + "cwd": "${workspaceFolder}/build" + }, + "group": { + "kind": "build", + "isDefault": false + }, + "problemMatcher": [] + }, + { + "label": "CMake Build (Debug)", + "type": "shell", + "command": "cmake", + "args": [ + "--build", + ".", + "--config", + "Debug" + ], + "options": { + "cwd": "${workspaceFolder}/build" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [ + "$msCompile" + ], + "dependsOn": [ + "CMake Configure" + ] + }, + { + "label": "CMake Build (Release)", + "type": "shell", + "command": "cmake", + "args": [ + "--build", + ".", + "--config", + "Release" + ], + "options": { + "cwd": "${workspaceFolder}/build" + }, + "group": { + "kind": "build", + "isDefault": false + }, + "problemMatcher": [ + "$msCompile" + ], + "dependsOn": [ + "CMake Configure" + ] + }, + { + "label": "Clean Build", + "type": "shell", + "command": "cmake", + "args": [ + "--build", + ".", + "--target", + "clean" + ], + "options": { + "cwd": "${workspaceFolder}/build" + }, + "group": { + "kind": "build", + "isDefault": false + }, + "problemMatcher": [] + } + ] +} \ No newline at end of file diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md new file mode 100644 index 000000000..778b3a45f --- /dev/null +++ b/ARCHITECTURE.md @@ -0,0 +1,608 @@ +# Architecture Design Report +## Kafka-1C Connector + +--- + +## 1. Введение + +**Название проекта:** Kafka-1C Connector + +**Краткое описание:** Высокопроизводительный микросервис на C++20 для интеграции 1С с Apache Kafka. Обеспечивает двунаправленный обмен заказами между 1С и внешними системами с гарантией доставки и восстановлением после сбоев. + +**Версия:** 1.0.0 + +**Автор:** Ошкин Евгений + +--- + +## 2. Функциональные требования (ФТ) + +| ID | Требование | Описание | Статус | +|-------|-----------------------|---------------------------------------------------|--------| +| ФТ-01 | Чтение JSON файлов | Producer читает JSON файлы из папки input/ | ✅ | +| ФТ-02 | Парсинг JSON | Парсинг и валидация структуры заказа | ✅ | +| ФТ-03 | Отправка в Kafka | Отправка заказов в топик orders.input | ✅ | +| ФТ-04 | Чтение из Kafka | Consumer читает сообщения из топика orders.input | ✅ | +| ФТ-05 | Поиск контрагента | Поиск контрагента в PostgreSQL по ИНН/КПП | ✅ | +| ФТ-06 | Создание контрагента | Создание нового контрагента, если не найден | ✅ | +| ФТ-07 | Поиск товара | Поиск товара по артикулу в PostgreSQL | ✅ | +| ФТ-08 | Создание заказа | Создание заказа в PostgreSQL (шапка + товары) | ✅ | +| ФТ-09 | Кэширование | Сохранение сообщений в SQLite до обработки | ✅ | +| ФТ-10 | Восстановление | Восстановление из кэша после сбоя | ✅ | +| ФТ-11 | Обработка ошибок | Отправка ошибок в топик orders.errors | ✅ | +| ФТ-12 | Аудит | Запись в регистр сведений _InfoRg60 | ✅ | +| ФТ-13 | Режимы работы | Producer, Consumer, both | ✅ | + +--- + +## 3. Нефункциональные требования (НФТ) + +| ID | Требование | Описание | Статус | +|--------|----------------------|-----------------------------------------------|--------| +| НФТ-01 | Производительность | Lock-free многопоточность через std::atomic | ✅ | +| НФТ-02 | Надежность | SQLite кэширование перед отправкой | ✅ | +| НФТ-03 | Отказоустойчивость | Автоматическое восстановление из кэша | ✅ | +| НФТ-04 | Масштабируемость | Поддержка групп потребителей Kafka | ✅ | +| НФТ-05 | Безопасность | acks=all в Kafka Producer | ✅ | +| НФТ-06 | Кодировка | Поддержка UTF-8 для кириллицы | ✅ | +| НФТ-07 | Логирование | Детальные логи с временными метками | ✅ | +| НФТ-08 | Конфигурация | Гибкая настройка через JSON | ✅ | + +--- + +## 4. Архитектура системы + +### 4.1 Общая архитектура +┌─────────────────────────────────────────────────────────────────────────────────────┐ +│ KAFKA-1C CONNECTOR │ +├─────────────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────────┐ ┌─────────────────────────────────────────┐ │ +│ │ PRODUCER (Поток 1) │ │ CONSUMER (Поток 2) │ │ +│ │ │ │ │ │ +│ │ 📁 input/*.json │ │ 📨 Kafka (orders.input) │ │ +│ │ ↓ │ │ ↓ │ │ +│ │ 🔍 JsonParser::parseOrder() │ │ 🔍 OrderProcessor::processMessage() │ │ +│ │ ↓ │ │ ↓ │ │ +│ │ ✅ JsonParser::validate() │ │ 🔍 processClient() → PostgreSQL │ │ +│ │ ↓ │ │ ↓ │ │ +│ │ 💾 MessageCache::save() │ │ 🔍 processProducts() → PostgreSQL │ │ +│ │ ↓ │ │ ↓ │ │ +│ │ 📤 KafkaProducer::send() │ │ 📝 createOrder() → PostgreSQL │ │ +│ │ ↓ │ │ ↓ │ │ +│ │ 🗑 fs::remove() │ │ 📤 sendError() → Kafka (ошибки) │ │ +│ └─────────────────────────────────┘ └─────────────────────────────────────────┘ │ +│ │ +│ ┌───────────────────────────────────────────────────────────────────────────────┐ │ +│ │ ОБЩИЕ РЕСУРСЫ │ │ +│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────────┐ │ │ +│ │ │ PostgreSQL │ │ SQLite │ │ Logger │ │ │ +│ │ │ (1С таблицы) │ │ Кэш │ │ (Логирование) │ │ │ +│ │ └─────────────────┘ └─────────────────┘ └─────────────────────────────┘ │ │ +│ └───────────────────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────────────┘ + + +--- + +## 5. Диаграмма классов + +### 5.1 UML Class Diagram +┌─────────────────────────────────────────────────────────────────────────────────────┐ +│ ДИАГРАММА КЛАССОВ │ +├─────────────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────────────────┐ │ +│ │ AppConfig │ │ +│ ├─────────────────────────────────────────┤ │ +│ │ - kafka: KafkaConfig │ │ +│ │ - database: DatabaseConfig │ │ +│ │ - processing: ProcessingConfig │ │ +│ │ - cache: CacheConfig │ │ +│ │ - groups: vector │ │ +│ │ - mode: string │ │ +│ ├─────────────────────────────────────────┤ │ +│ │ + load(filename): AppConfig │ │ +│ └─────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────┐ │ +│ │ KafkaProducer │ │ +│ ├─────────────────────────────────────────┤ │ +│ │ - brokers_: string │ │ +│ │ - topic_: string │ │ +│ │ - producer_: unique_ptr │ │ +│ │ - delivery_cb_: unique_ptr │ │ +│ │ - callback_: DeliveryCallback │ │ +│ │ - sent_count_: atomic │ │ +│ │ - failed_count_: atomic │ │ +│ ├─────────────────────────────────────────┤ │ +│ │ + init(acks, retries): bool │ │ +│ │ + send(message): bool │ │ +│ │ + send(key, message): bool │ │ +│ │ + flush(timeout): void │ │ +│ │ + setDeliveryCallback(cb): void │ │ +│ │ + getSentCount(): size_t │ │ +│ │ + getFailedCount(): size_t │ │ +│ └─────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────┐ │ +│ │ KafkaConsumer │ │ +│ ├─────────────────────────────────────────┤ │ +│ │ - brokers_: string │ │ +│ │ - group_id_: string │ │ +│ │ - topic_: string │ │ +│ │ - consumer_: unique_ptr │ │ +│ │ - callback_: MessageCallback │ │ +│ │ - running_: atomic │ │ +│ │ - consumer_thread_: unique_ptr │ │ +│ ├─────────────────────────────────────────┤ │ +│ │ + init(): bool │ │ +│ │ + start(): void │ │ +│ │ + stop(): void │ │ +│ │ + setMessageCallback(cb): void │ │ +│ │ + isRunning(): bool │ │ +│ │ - consumeLoop(): void │ │ +│ └─────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────┐ │ +│ │ OrderProcessor │ │ +│ ├─────────────────────────────────────────┤ │ +│ │ - db_: PostgreSQL& │ │ +│ │ - cache_: MessageCache& │ │ +│ │ - error_producer_: KafkaProducer& │ │ +│ ├─────────────────────────────────────────┤ │ +│ │ + processMessage(key, value, ts): bool │ │ +│ │ + reprocessPendingMessages(): void │ │ +│ │ - sendError(type, desc, msg): void │ │ +│ │ - getLinuxTime(): long long │ │ +│ │ - processClient(order): optional │ │ +│ │ - processProducts(order): vector │ │ +│ │ - createOrder(order, client, items): │ │ +│ │ - logToRegister(order, json): void │ │ +│ └─────────────────────────────────────────┘ │ +│ │ │ │ +│ ┌─────────┴─────────┐ │ │ +│ ▼ ▼ ▼ │ +│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ +│ │ PostgreSQL │ │ MessageCache │ │ JsonParser │ │ +│ ├──────────────────┤ ├──────────────────┤ ├──────────────────┤ │ +│ │ - conn_: unique │ │ - db_: sqlite3* │ │ + parseOrder() │ │ +│ │ - connected_: boo│ │ - mutex_: mutex │ │ + validate() │ │ +│ ├──────────────────┤ ├──────────────────┤ └──────────────────┘ │ +│ │ + connect(): boo │ │ + init(): bool │ │ +│ │ + execute(): bool│ │ + save(): bool │ ┌──────────────────┐ │ +│ │ + query(): resul │ │ + markSent(): bo │ │ OrderData │ │ +│ │ + findClient(): │ │ + markError(): bo│ ├──────────────────┤ │ +│ │ + createClient() │ │ + getPending(): │ │ - tin: string │ │ +│ │ + createOrder() │ │ + removeSent(): │ │ - trrc: string │ │ +│ │ + logKafkaMessag │ │ + getPendingCoun│ │ - contractor: st│ │ +│ │ - escape(): stri │ │ + getTotalCount(│ │ - date: string │ │ +│ │ - generateUUID() │ │ - execute(): boo│ │ - number: string│ │ +│ │ - formatDate(): │ └──────────────────┘ │ - goods: vector│ │ +│ └──────────────────┘ └──────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────────────┘ + + +--- + +## 6. Диаграмма последовательности (Flow Diagram) + +### 6.1 Producer Flow +┌─────────────────────────────────────────────────────────────────────────────────────┐ +│ FLOW DIAGRAM: PRODUCER (JSON → KAFKA) │ +├─────────────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ [main] [Producer] [JsonParser] [MessageCache] [KafkaProducer] [fs] │ +│ │ │ │ │ │ │ │ +│ │──run─────▶│ │ │ │ │ │ +│ │ │ │ │ │ │ │ +│ │ │──loop─────▶│ │ │ │ │ +│ │ │ │ │ │ │ │ +│ │ │ 1. Чтение файла │ │ │ │ +│ │ │──parseOrder(file)────────▶│ │ │ │ +│ │ │ │ │ │ │ │ +│ │ │ 2. Парсинг JSON │ │ │ │ +│ │ │ │──fromJson()──▶│ │ │ │ +│ │ │ │◀─OrderData────│ │ │ │ +│ │ │ │ │ │ │ │ +│ │ │ 3. Валидация │ │ │ │ +│ │ │ │──validate()──▶│ │ │ │ +│ │ │ │◀─true─────────│ │ │ │ +│ │ │ │ │ │ │ │ +│ │ │ 4. Сохранение в кэш │ │ │ │ +│ │ │──save(file, msg)─────────▶│ │ │ │ +│ │ │ │ │──INSERT──────▶│ │ │ +│ │ │ │ │◀─OK───────────│ │ │ +│ │ │◀─true──────────────────────│ │ │ │ +│ │ │ │ │ │ │ │ +│ │ │ 5. Отправка в Kafka │ │ │ │ +│ │ │──send(key, msg)───────────│──────────────▶│ │ │ +│ │ │ │ │ │──produce──▶│ │ +│ │ │ │ │ │◀─delivered│ │ +│ │ │◀─true───────────────────────────────────────│ │ │ +│ │ │ │ │ │ │ │ +│ │ │ 6. Удаление файла │ │ │ │ +│ │ │──remove(file)──────────────────────────────────────────▶│ │ +│ │ │◀─OK──────────────────────────────────────────────────────│ │ +│ │ │ │ │ │ │ │ +│ │◀─done─────│ │ │ │ │ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────────────┘ + + +### 6.2 Consumer Flow +┌─────────────────────────────────────────────────────────────────────────────────────┐ +│ FLOW DIAGRAM: CONSUMER (KAFKA → POSTGRESQL) │ +├─────────────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ [main] [Consumer] [OrderProcessor] [PostgreSQL] [MessageCache] [Kafka] │ +│ │ │ │ │ │ │ │ +│ │──run────▶│ │ │ │ │ │ +│ │ │ │ │ │ │ │ +│ │ │──consume────────────────────────────────────────────────▶│ │ +│ │ │◀─message─────────────────────────────────────────────────│ │ +│ │ │ │ │ │ │ │ +│ │ │ 1. Восстановление из кэша │ │ │ │ +│ │ │──reprocessPending()───────▶│ │ │ │ +│ │ │ │──getPending()─▶│ │ │ │ +│ │ │ │◀─messages──────│ │ │ │ +│ │ │ │ │ │ │ │ +│ │ │ 2. Обработка сообщения │ │ │ │ +│ │ │──callback─────────────────▶│ │ │ │ +│ │ │ │ │ │ │ │ +│ │ │ 3. Парсинг JSON │ │ │ │ +│ │ │ │──fromJson()───▶│ │ │ │ +│ │ │ │◀─OrderData─────│ │ │ │ +│ │ │ │ │ │ │ │ +│ │ │ 4. Сохранение в кэш │ │ │ │ +│ │ │ │──save()───────▶│ │ │ │ +│ │ │ │ │──INSERT─────▶│ │ │ +│ │ │ │ │◀─OK──────────│ │ │ +│ │ │ │ │ │ │ │ +│ │ │ 5. Поиск контрагента │ │ │ │ +│ │ │ │──findClient()─▶│ │ │ │ +│ │ │ │ │──SELECT─────▶│ │ │ +│ │ │ │ │◀─client─────│ │ │ +│ │ │ │◀─client────────│ │ │ │ +│ │ │ │ │ │ │ │ +│ │ │ 6. Поиск товара │ │ │ │ +│ │ │ │──findProduct()▶│ │ │ │ +│ │ │ │ │──SELECT─────▶│ │ │ +│ │ │ │ │◀─product────│ │ │ +│ │ │ │◀─product───────│ │ │ │ +│ │ │ │ │ │ │ │ +│ │ │ 7. Создание заказа │ │ │ │ +│ │ │ │──createOrder()▶│ │ │ │ +│ │ │ │ │──INSERT─────▶│ │ │ +│ │ │ │ │ (_Document49│ │ │ +│ │ │ │ │ _DocumntVT5│ │ │ +│ │ │ │ │ _InfoRg60) │ │ │ +│ │ │ │ │◀─OK──────────│ │ │ +│ │ │ │◀─order_id──────│ │ │ │ +│ │ │ │ │ │ │ │ +│ │ │ 8. Обновление статуса │ │ │ │ +│ │ │ │──markSent()───▶│ │ │ │ +│ │ │ │ │──UPDATE─────▶│ │ │ +│ │ │ │ │◀─OK──────────│ │ │ +│ │ │ │ │ │ │ │ +│ │ │ 9. Коммит offset (batch) │ │ │ │ +│ │ │──commitAsync()────────────────────────────────────────▶│ │ +│ │ │◀─OK─────────────────────────────────────────────────────│ │ +│ │ │ │ │ │ │ │ +│ │◀─done────│ │ │ │ │ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────────────┘ + + +### 6.3 Error Flow +┌─────────────────────────────────────────────────────────────────────────────────────┐ +│ FLOW DIAGRAM: ERROR HANDLING │ +├─────────────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ [Processor] [sendError] [KafkaProducer] [Kafka] │ +│ │ │ │ │ │ +│ │ Обнаружена ошибка │ │ │ +│ │──sendError(type, desc)──▶│ │ │ +│ │ │ │ │ │ +│ │ Формирование JSON ошибки│ │ │ +│ │ │──generateUUID() │ │ +│ │ │──create JSON │ │ +│ │ │ { error_type, uuid, │ │ +│ │ │ timestamp, description,│ │ +│ │ │ original_message } │ │ +│ │ │ │ │ │ +│ │ Отправка в Kafka │ │ │ +│ │ │──send(key, error_msg)───▶│ │ +│ │ │ │ │──produce(topic: orders.errors)──▶│ +│ │ │ │ │◀─delivered───────────────────────│ +│ │ │◀─true─────────────────────│ │ +│ │ │ │ │ │ +│ │ Логирование ошибки │ │ │ +│ │ │──Logger::error() │ │ +│ │ │ │ │ │ +│ │◀───────────│ │ │ │ +│ │ +│ Пример ошибки в Kafka: │ +│ { │ +│ "error_type": "PostgreSQL write error", │ +│ "uuid": "550e8400-e29b-41d4-a716-446655440000", │ +│ "timestamp": 1712345678901, │ +│ "description": "Client not found: TIN=7709876543", │ +│ "original_message": "{"TIN":"7709876543",...}" │ +│ } │ +│ │ +└─────────────────────────────────────────────────────────────────────────────────────┘ + + +--- + +## 7. Компоненты и их ответственность + +### 7.1 Таблица компонентов + +| Компонент | Файл | Ответственность | +|-----------------------|---------------------------------------|--------------------------------------------| +| **main** | `main.cpp` | Точка входа, запуск потоков, инициализация | +| **AppConfig** | `config/config.hpp/cpp` | Загрузка и хранение конфигурации из JSON | +| **KafkaProducer** | `kafka/producer.hpp/cpp` | Отправка сообщений в Kafka | +| **KafkaConsumer** | `kafka/consumer.hpp/cpp` | Получение сообщений из Kafka | +| **OrderProcessor** | `processor/order_processor.hpp/cpp` | Бизнес-логика обработки заказов | +| **PostgreSQL** | `database/postgresql.hpp/cpp` | Работа с PostgreSQL (1С таблицы) | +| **MessageCache** | `cache/sqlite_cache.hpp/cpp` | Кэширование сообщений в SQLite | +| **JsonParser** | `parser/json_parser.hpp/cpp` | Парсинг и валидация JSON | +| **Logger** | `utils/logger.hpp/cpp` | Логирование с временными метками | +| **UUID** | `utils/uuid.hpp` | Генерация UUID | + +--- + +## 8. Потоки данных + +### 8.1 Поток Producer +Файл (JSON) → JsonParser::parseOrder() → OrderData → toJson() +↓ +MessageCache::save() → SQLite (status='pending') +↓ +KafkaProducer::send() → Kafka (topic: orders.input) +↓ +fs::remove() → Удаление файла + + +### 8.2 Поток Consumer +Kafka (topic: orders.input) → KafkaConsumer::consume() +↓ +OrderProcessor::processMessage() +↓ +JsonParser::fromJson() → OrderData +↓ +MessageCache::save() → SQLite (status='pending') +↓ +OrderProcessor::logToRegister() → _InfoRg60 (аудит) +↓ +OrderProcessor::processClient() +├── PostgreSQL::findClient() → _Reference47 +└── PostgreSQL::createClient() → _Reference47 (если не найден) +↓ +OrderProcessor::processProducts() +└── PostgreSQL::findProductByArticle() → _Reference48 +↓ +OrderProcessor::createOrder() +└── PostgreSQL::createOrder() +├── INSERT INTO _Document49 (шапка) +└── INSERT INTO _Document49_VT54 (товары) +↓ +MessageCache::markSent() → SQLite (status='sent') +↓ +KafkaConsumer::commitAsync() → Коммит offset + + +### 8.3 Поток ошибок +Ошибка → OrderProcessor::sendError() +↓ +Формирование JSON ошибки (uuid, timestamp, description) +↓ +KafkaProducer::send() → Kafka (topic: orders.errors) + +--- + +## 9. Таблицы базы данных + +### 9.1 Схема PostgreSQL (1С) + +```sql +-- Контрагенты +CREATE TABLE _Reference47 ( + _IDRRef UUID PRIMARY KEY, + _Version BYTEA, + _Marked BOOLEAN DEFAULT FALSE, + _Code VARCHAR(20), + _Description VARCHAR(255), + _Fld50 VARCHAR(12), -- ИНН + _Fld51 VARCHAR(9), -- КПП + _PredefinedID UUID +); + +-- Номенклатура +CREATE TABLE _Reference48 ( + _IDRRef UUID PRIMARY KEY, + _Version BYTEA, + _Marked BOOLEAN DEFAULT FALSE, + _Code VARCHAR(20), + _Description VARCHAR(255), + _Fld52 VARCHAR(50) -- Артикул +); + +-- Заказы (шапка) +CREATE TABLE _Document49 ( + _IDRRef UUID PRIMARY KEY, + _Version BYTEA, + _Marked BOOLEAN DEFAULT FALSE, + _Date_Time TIMESTAMP, + _Number VARCHAR(50), + _Posted BOOLEAN DEFAULT TRUE, + _Fld53RRef UUID REFERENCES _Reference47(_IDRRef) -- Контрагент +); + +-- Товары в заказе (табличная часть) +CREATE TABLE _Document49_VT54 ( + _Document49_IDRRef UUID REFERENCES _Document49(_IDRRef), + _KeyField UUID, -- GUID документа (дублирует _Document49_IDRRef) + _LineNo55 INTEGER, -- Номер строки + _Fld56RRef UUID REFERENCES _Reference48(_IDRRef), -- Товар + _Fld57 NUMERIC(15,3), -- Количество + _Fld58 NUMERIC(15,2), -- Цена + _Fld59 NUMERIC(15,2) -- Сумма +); + +-- Регистр сведений (аудит) +CREATE TABLE _InfoRg60 ( + _Fld61 BIGINT, -- Linux timestamp + _Fld62 VARCHAR(12), -- ИНН + _Fld63 VARCHAR(9), -- КПП + _Fld64 TEXT -- JSON заказа +); +``` + +## 10. Конфигурация +### 10.1 Структура settings.json + +{ + "kafka": { + "bootstrap_servers": "localhost:9092", + "topics": { + "input": "orders.input", + "output": "orders.output", + "errors": "orders.errors" + }, + "producer": { + "acks": "all", + "retries": 3, + "batch_size": 100, + "linger_ms": 5 + }, + "consumer": { + "group_id": "kafka_1c_consumer", + "auto_offset_reset": "earliest", + "enable_auto_commit": true + } + }, + "database": { + "postgresql": { + "host": "localhost", + "port": 5432, + "database": "trade_otus", + "username": "postgres", + "password": "Dthibyf7" + } + }, + "cache": { + "path": "cache/messages.db", + "retention_days": 7, + "reprocess_delay_seconds": 7, + "source_prefix": "localhost:9092|orders.input" + }, + "processing": { + "max_workers": 4, + "batch_size": 100, + "retry_interval_seconds": 60, + "delete_after_send": true + }, + "mode": "both", + "groups": [ + { + "name": "Main", + "enabled": true, + "input_directory": "input", + "kafka_topic": "orders.input" + } + ] +} + +## 11. Технические решения +### 11.1 Lock-free многопоточность + +// Атомарный счетчик для распределения файлов между потоками +std::atomic next_index{0}; +while ((idx = next_index.fetch_add(1)) < files.size()) { + // Обработка файла без блокировок +} + +### 11.2 Формат UUID в 1С + +// Вход: 550e8400-e29b-41d4-a716-446655440000 +// Выход: 0084550e-9be2-d441-a716-446655440000 +// Переворот первых 3 групп байт +std::string convertTo1CUUID(const std::string& uuid) { + // part1: 550e8400 → 0084550e + // part2: e29b → 9be2 + // part3: 41d4 → d441 + // part4, part5: без изменений +} + +### 11.3 Batch commit offset + +// Коммит каждые 50 сообщений или каждые 5 секунд +const int BATCH_SIZE = 50; +const int COMMIT_INTERVAL_MS = 5000; + +if (messages_since_commit >= BATCH_SIZE || elapsed >= COMMIT_INTERVAL_MS) { + consumer_->commitAsync(msg); + messages_since_commit = 0; +} + +## 12. Выводы +### 12.1 Достигнутые результаты + +✅ Проект полностью реализован на C++20 +✅ Producer и Consumer работают в одном приложении +✅ Интеграция с PostgreSQL (1С таблицы) +✅ SQLite кэширование для надежности +✅ Lock-free многопоточность +✅ Автоматическое восстановление после сбоев +✅ Поддержка кириллицы +✅ Документация (Doxygen, README) + +### 12.2 Планы на развитие +🔹 Динамические SQL запросы через конфигурацию +🔹 Поддержка RabbitMQ +🔹 GUI для настройки (Qt) +🔹 Метрики и мониторинг (Prometheus) +🔹 Web-интерфейс администратора + +## 13. Приложения +### 13.1. Стек технологий + +Технология Версия Назначение +C++ 20 Язык программирования +Apache Kafka 4.2.1 Брокер сообщений +PostgreSQL 17 База данных +SQLite 3 Кэширование +CMake 3.10+ Система сборки +vcpkg latest Менеджер зависимостей +librdkafka 2.14.2 Kafka клиент +nlohmann-json 3.12.0 JSON парсер +libpqxx 8.0.2 PostgreSQL клиент + +### 13.2. Структура проекта + +ProjectC++ +├── CMakeLists.txt # Конфигурация сборки +├── Dockerfile # Docker образ +├── Doxyfile # Конфигурация Doxygen +├── README.md # Документация +├── ARCHITECTURE.md # Архитектурный отчет +├── config/ +│ └── settings.json # Основная конфигурация +├── input/ # JSON файлы заказов +├── cache/ # SQLite база (создается автоматически) +├── src/ +│ ├── main.cpp # Точка входа +│ ├── config/ # Загрузка конфигурации +│ ├── kafka/ # Kafka Producer/Consumer +│ ├── parser/ # Парсинг JSON +│ ├── cache/ # SQLite кэш +│ ├── database/ # PostgreSQL +│ ├── processor/ # Обработка заказов +│ └── utils/ # Логирование, UUID +└── build/ # Сборка (создается) \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b57fe738..1fb5ce83d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,86 +1,99 @@ -cmake_minimum_required(VERSION 3.12) - -set(PATCH_VERSION "1" CACHE INTERNAL "Patch version") -set(PROJECT_VESRION 0.0.${PATCH_VERSION}) - -project(helloworld VERSION ${PROJECT_VESRION}) +cmake_minimum_required(VERSION 3.10) +project(kafkaordersender VERSION 8.0.0 LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# ============================================================ +# ПУТИ К БИБЛИОТЕКАМ (из vcpkg) +# ============================================================ + +set(VCPKG_ROOT "C:/vcpkg/installed/x64-windows") + +# ============================================================ +# ИСХОДНЫЕ ФАЙЛЫ +# ============================================================ + +set(SOURCES + src/main.cpp + src/config/config.cpp + src/kafka/producer.cpp + src/kafka/consumer.cpp + src/parser/json_parser.cpp + src/cache/sqlite_cache.cpp + src/database/postgresql.cpp + src/processor/order_processor.cpp + src/utils/logger.cpp +) -option(WITH_BOOST_TEST "Whether to build Boost test" ON) +set(HEADERS + src/config/config.hpp + src/kafka/producer.hpp + src/kafka/consumer.hpp + src/parser/json_parser.hpp + src/cache/sqlite_cache.hpp + src/database/postgresql.hpp + src/processor/order_processor.hpp + src/utils/logger.hpp + src/utils/uuid.hpp +) -configure_file(version.h.in version.h) +# ============================================================ +# ИСПОЛНЯЕМЫЙ ФАЙЛ +# ============================================================ -add_executable(helloworld_cli main.cpp) -add_library(helloworld lib.cpp) +add_executable(kafka_order_sender ${SOURCES} ${HEADERS}) -set_target_properties(helloworld_cli helloworld PROPERTIES - CXX_STANDARD 14 - CXX_STANDARD_REQUIRED ON +# Пути для заголовочных файлов +target_include_directories(kafka_order_sender PRIVATE + ${CMAKE_SOURCE_DIR}/src + ${VCPKG_ROOT}/include ) -target_include_directories(helloworld - PRIVATE "${CMAKE_BINARY_DIR}" +# Пути для библиотек +target_link_directories(kafka_order_sender PRIVATE + ${VCPKG_ROOT}/lib ) -target_link_libraries(helloworld_cli PRIVATE - helloworld +# Линковка библиотек +target_link_libraries(kafka_order_sender + PRIVATE + rdkafka++ # C++ библиотека для Kafka + rdkafka # C библиотека для Kafka + sqlite3 # SQLite3 + pqxx # PostgreSQL C++ библиотека ) -if(WITH_BOOST_TEST) - find_package(Boost COMPONENTS unit_test_framework REQUIRED) - add_executable(test_version test_version.cpp) - - set_target_properties(test_version PROPERTIES - CXX_STANDARD 14 - CXX_STANDARD_REQUIRED ON - ) - - set_target_properties(test_version PROPERTIES - COMPILE_DEFINITIONS BOOST_TEST_DYN_LINK - INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIR} - ) - - target_link_libraries(test_version - ${Boost_LIBRARIES} - helloworld - ) -endif() - -if (MSVC) - target_compile_options(helloworld_cli PRIVATE - /W4 - ) - target_compile_options(helloworld PRIVATE - /W4 - ) - if(WITH_BOOST_TEST) - target_compile_options(test_version PRIVATE - /W4 - ) - endif() -else () - target_compile_options(helloworld_cli PRIVATE - -Wall -Wextra -pedantic -Werror - ) - target_compile_options(helloworld PRIVATE - -Wall -Wextra -pedantic -Werror - ) - if(WITH_BOOST_TEST) - target_compile_options(test_version PRIVATE - -Wall -Wextra -pedantic -Werror - ) - endif() +# Для MSVC +if(MSVC) + target_compile_definitions(kafka_order_sender PRIVATE _CRT_SECURE_NO_WARNINGS) endif() -install(TARGETS helloworld_cli RUNTIME DESTINATION bin) - -set(CPACK_GENERATOR DEB) -set(CPACK_PACKAGE_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}") -set(CPACK_PACKAGE_VERSION_MINOR "${PROJECT_VERSION_MINOR}") -set(CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}") -set(CPACK_PACKAGE_CONTACT example@example.com) -include(CPack) - -if(WITH_BOOST_TEST) - enable_testing() - add_test(test_version test_version) -endif() +# ============================================================ +# УСТАНОВКА +# ============================================================ + +install(TARGETS kafka_order_sender RUNTIME DESTINATION bin) +install(DIRECTORY config/ DESTINATION config) +install(DIRECTORY input/ DESTINATION input) + +file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/config" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/Release") +#file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/input" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/Release") +# Копируем только .json файлы из корня input (без подпапок) +file(GLOB INPUT_FILES "${CMAKE_CURRENT_SOURCE_DIR}/input/*.json") +foreach(FILE ${INPUT_FILES}) + get_filename_component(FILENAME ${FILE} NAME) + file(COPY ${FILE} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/Release/input/") +endforeach() +file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/Release/cache") + +file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/config" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/Debug") +#file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/input" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/Debug") +# Копируем только .json файлы из корня input (без подпапок) +file(GLOB INPUT_FILES "${CMAKE_CURRENT_SOURCE_DIR}/input/*.json") +foreach(FILE ${INPUT_FILES}) + get_filename_component(FILENAME ${FILE} NAME) + file(COPY ${FILE} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/Debug/input/") +endforeach() +file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/Debug/cache") \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..3c92def7a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,46 @@ +FROM ubuntu:22.04 + +RUN apt-get update && apt-get install -y \ + build-essential \ + cmake \ + git \ + wget \ + curl \ + zip \ + unzip \ + tar \ + pkg-config \ + python3 \ + python3-dev \ + python3-pip \ + bison \ + flex \ + libreadline-dev \ + libicu-dev \ + libssl-dev \ + libsasl2-dev \ + libzstd-dev \ + libpq-dev \ + libpqxx-dev \ + librdkafka-dev \ + nlohmann-json3-dev \ + libsqlite3-dev \ + debhelper \ + dpkg-dev \ + fakeroot \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /build +COPY . . + +RUN doxygen Doxyfile || echo "Doxygen warnings ignored" + +RUN find debian -type f -exec dos2unix {} \; || true + +RUN chmod +x debian/rules + +RUN dpkg-buildpackage -b -us -uc + +RUN mkdir -p /output && cp /*.deb /output/ + +VOLUME /output \ No newline at end of file diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 000000000..68c3047b7 --- /dev/null +++ b/Doxyfile @@ -0,0 +1,140 @@ +# ============================================================ +# Doxyfile — конфигурация Doxygen для генерации документации +# ============================================================ + +# Основные настройки +PROJECT_NAME = "Kafka-1C Connector" +PROJECT_NUMBER = "1.0.0" +PROJECT_BRIEF = "High-performance Kafka-1C integration microservice" +PROJECT_LOGO = + +OUTPUT_DIRECTORY = docs/doxygen +CREATE_SUBDIRS = NO +ALLOW_UNICODE_NAMES = NO +OUTPUT_LANGUAGE = Russian + +# Входные файлы +INPUT = src/ +FILE_PATTERNS = *.cpp *.hpp *.h *.md +RECURSIVE = YES +EXCLUDE = src/cache/sqlite_cache.cpp src/kafka/producer.cpp src/parser/json_parser.cpp src/config/config.cpp src/utils/logger.cpp +EXCLUDE_SYMLINKS = NO + +# Извлечение информации +EXTRACT_ALL = YES +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +EXTRACT_ANON_NSPACES = NO + +# Визуализация +HAVE_DOT = YES +DOT_IMAGE_FORMAT = png +INTERACTIVE_SVG = NO +DOT_PATH = +DOTFILE_DIRS = +CLASS_DIAGRAMS = YES +DIA_PATH = + +# HTML выход +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_COLORSTYLE = AUTO_LIGHT +HTML_TIMESTAMP = YES +HTML_DYNAMIC_MENUS = YES +HTML_INDEX_NUM_ENTRIES = 100 + +# LaTeX выход (отключен) +GENERATE_LATEX = NO + +# RTF выход (отключен) +GENERATE_RTF = NO + +# Man страницы (отключены) +GENERATE_MAN = NO + +# XML выход (отключен) +GENERATE_XML = NO + +# DocBook выход (отключен) +GENERATE_DOCBOOK = NO + +# Предисловие и послесловие +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = + +# Предопределенные макросы +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES + +# Внешние ссылки +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES + +# Китайский, японский, корейский +PERL_PATH = /usr/bin/perl + +# Группировка классов +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = YES +CALLER_GRAPH = YES +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES + +# Сортировка +SORT_BY_SCOPE_NAME = NO +SORT_BY_BRIEF = NO +SORT_BY_MEMBER_DOC = NO +SORT_GROUP_NAMES = YES +SORT_MEMBERS_CTORS_1ST = NO + +# Включение исходного кода +SOURCE_BROWSER = YES +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +REFERENCES_LINK_SOURCE = YES +USE_HTAGS = NO +VERBATIM_HEADERS = YES + +# Листинг кода +INLINE_INFO = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES + +# Поиск +SEARCHENGINE = YES +SERVER_BASED_SEARCH = NO +EXTERNAL_SEARCH = NO + +# Другое +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_AS_ERROR = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 000000000..1a86828bb --- /dev/null +++ b/README.md @@ -0,0 +1,430 @@ +# Kafka-1C Connector + +**Высокопроизводительный микросервис для интеграции 1С с Apache Kafka на C++** + +[![C++](https://img.shields.io/badge/C++-20-blue.svg)](https://isocpp.org/) +[![Kafka](https://img.shields.io/badge/Kafka-4.2.1-green.svg)](https://kafka.apache.org/) +[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-16-blue.svg)](https://www.postgresql.org/) +[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) + +--- + +## 📋 Описание + +**Kafka-1C Connector** — это production-ready микросервис на C++20 для высокоскоростной интеграции 1С с Apache Kafka. Обеспечивает надежную передачу заказов между 1С и внешними системами с гарантией доставки и восстановлением после сбоев. + +### Ключевые возможности + +| Возможность | Описание | +|-------------|----------| +| **🔁 Двунаправленная интеграция** | Producer (1С → Kafka) и Consumer (Kafka → 1С) в одном приложении | +| **💾 Надежность** | SQLite кэширование всех сообщений с восстановлением после сбоев | +| **🚀 Производительность** | Lock-free многопоточная обработка с атомарными операциями | +| **🔄 Отказоустойчивость** | Автоматическое восстановление неотправленных сообщений при перезапуске | +| **📊 Мониторинг** | Детальное логирование и статистика по всем операциям | +| **⚙️ Гибкость** | JSON-конфигурация всех параметров (топики, потоки, папки) | +| **🐳 Docker** | Готовый Dockerfile для развертывания в контейнере | + +--- + +## 🏗 Архитектура +┌─────────────────────────────────────────────────────────────────────────────┐ +│ Kafka-1C Connector │ +├─────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────┐ ┌──────────────────────────────────┐ │ +│ │ PRODUCER (Поток 1) │ │ CONSUMER (Поток 2) │ │ +│ │ │ │ │ │ +│ │ 📁 input/*.json │ │ 📨 Kafka (orders.input) │ │ +│ │ ↓ │ │ ↓ │ │ +│ │ 🔍 Парсинг JSON │ │ 🔍 Парсинг JSON │ │ +│ │ ↓ │ │ ↓ │ │ +│ │ 💾 SQLite кэш (pending) │ │ 🔍 Поиск контрагента │ │ +│ │ ↓ │ │ ↓ │ │ +│ │ 📤 Kafka (orders.input) │ │ 🔍 Поиск товаров │ │ +│ │ ↓ │ │ ↓ │ │ +│ │ ✅ Обновление статуса │ │ 📝 Создание заказа │ │ +│ │ 🗑 Удаление файла │ │ ↓ │ │ +│ └─────────────────────────────┘ │ 💾 SQLite кэш (sent/error) │ │ +│ │ ↓ │ │ +│ │ 📤 Kafka (orders.errors) │ │ +│ └──────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ ОБЩИЕ РЕСУРСЫ │ │ +│ │ • SQLite кэш (cache/messages.db) │ │ +│ │ • PostgreSQL (trade_otus) │ │ +│ │ • Конфигурация (config/settings.json) │ │ +│ │ • Логгер с временными метками │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ + + +--- + +## 🚀 Быстрый старт + +### Требования + +| Компонент | Версия | Описание | +|-----------|--------|----------| +| **C++** | 20 | Стандарт языка | +| **CMake** | 3.10+ | Система сборки | +| **Apache Kafka** | 4.2.1+ | Брокер сообщений | +| **PostgreSQL** | 16+ | База данных | +| **vcpkg** | latest | Менеджер пакетов | + +### Зависимости (vcpkg) + +```powershell +vcpkg install librdkafka:x64-windows +vcpkg install nlohmann-json:x64-windows +vcpkg install sqlite3:x64-windows +vcpkg install libpqxx:x64-windows + +Сборка +Windows (Visual Studio) +git clone +cd ProjectC++ +mkdir build && cd build +cmake .. -DCMAKE_TOOLCHAIN_FILE="C:/vcpkg/scripts/buildsystems/vcpkg.cmake" -DCMAKE_BUILD_TYPE=Release +cmake --build . --config Release + +Linux / macOS +mkdir build && cd build +cmake .. -DCMAKE_BUILD_TYPE=Release +make -j$(nproc) + +Запуск +1. Запустите Kafka +# Linux +cd /opt/kafka +./bin/kafka-server-start.sh config/server.properties + +# Windows +cd D:\kafka +.\bin\windows\kafka-server-start.bat .\config\server.properties + +2. Создайте топики +# Linux +/opt/kafka/bin/kafka-topics.sh --create \ + --topic orders.input \ + --bootstrap-server localhost:9092 \ + --partitions 3 \ + --replication-factor 1 + +/opt/kafka/bin/kafka-topics.sh --create \ + --topic orders.errors \ + --bootstrap-server localhost:9092 \ + --partitions 1 \ + --replication-factor 1 + +# Windows +.\bin\windows\kafka-topics.bat --create --topic orders.input --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1 + +3. Запустите микросервис +cd build/Release +./kafka_order_sender.exe # Режим both (Producer + Consumer) +./kafka_order_sender.exe producer # Только Producer +./kafka_order_sender.exe consumer # Только Consumer + +⚙️ Конфигурация +config/settings.json +{ + "kafka": { + "bootstrap_servers": "localhost:9092", + "topics": { + "input": "orders.input", + "output": "orders.output", + "errors": "orders.errors" + }, + "producer": { + "acks": "all", + "retries": 3, + "batch_size": 100, + "linger_ms": 5 + }, + "consumer": { + "group_id": "kafka_1c_consumer", + "auto_offset_reset": "earliest", + "enable_auto_commit": true + } + }, + "database": { + "postgresql": { + "host": "localhost", + "port": 5432, + "database": "trade_otus", + "username": "postgres", + "password": "your_password" + } + }, + "cache": { + "path": "cache/messages.db" + }, + "processing": { + "max_workers": 4, + "batch_size": 100, + "retry_interval_seconds": 60, + "delete_after_send": true + }, + "mode": "both", + "groups": [ + { + "name": "Main", + "enabled": true, + "input_directory": "input", + "kafka_topic": "orders.input" + } + ] +} + + Параметры конфигурации +Параметр Описание Значение по умолчанию +kafka.bootstrap_servers Адрес Kafka брокера localhost:9092 +kafka.producer.acks Уровень подтверждения (0, 1, all) all +kafka.producer.retries Количество попыток отправки 3 +kafka.consumer.group_id ID группы потребителей kafka_1c_consumer +database.postgresql.host Хост PostgreSQL localhost +database.postgresql.port Порт PostgreSQL 5432 +processing.max_workers Максимальное количество потоков 4 +processing.delete_after_send Удалять файлы после отправки true +mode Режим работы (producer, consumer, both) both + +📁 Формат заказа (JSON) +Пример файла input/order_1.json +{ + "TIN": "7701234567", + "TRRC": "770101001", + "contractor": "ООО Тестовая Компания", + "date": "2026-08-02T10:00:00", + "number": "ORD-001", + "goods": [ + { + "SKU": "PROD-001", + "Quantity": 10, + "Price": 1500.50, + "Sum": 15005.00 + }, + { + "SKU": "PROD-002", + "Quantity": 5, + "Price": 2500.00, + "Sum": 12500.00 + } + ] +} + + Поля заказа +Поле Тип Обязательное Описание +TIN string ✅ ИНН контрагента (12 цифр) +TRRC string ✅ КПП контрагента (9 цифр) +contractor string ❌ Наименование контрагента +date string ❌ Дата документа (ISO 8601) +number string ❌ Номер документа +goods array ✅ Массив товаров +SKU string ✅ Артикул товара +Quantity number ✅ Количество +Price number ✅ Цена за единицу +Sum number ✅ Сумма + + +🔄 Работа с PostgreSQL +Схема базы данных (1С) +-- Контрагенты +CREATE TABLE _Reference47 ( + _IDRRef UUID PRIMARY KEY, + _Code VARCHAR(20), + _Description VARCHAR(255), + _Fld50 VARCHAR(12), -- ИНН + _Fld51 VARCHAR(9), -- КПП + _Marked BOOLEAN DEFAULT FALSE +); + +-- Номенклатура +CREATE TABLE _Reference48 ( + _IDRRef UUID PRIMARY KEY, + _Code VARCHAR(20), + _Description VARCHAR(255), + _Fld52 VARCHAR(50), -- Артикул + _Marked BOOLEAN DEFAULT FALSE +); + +-- Заказы +CREATE TABLE _Document49 ( + _IDRRef UUID PRIMARY KEY, + _Date_Time TIMESTAMP, + _Number VARCHAR(50), + _Posted BOOLEAN DEFAULT TRUE, + _Marked BOOLEAN DEFAULT FALSE, + _Fld53RRef UUID REFERENCES _Reference47(_IDRRef) +); + +-- Товары в заказе +CREATE TABLE _Document49_VT54 ( + _Document49_IDRRef UUID REFERENCES _Document49(_IDRRef), + _Fld56RRef UUID REFERENCES _Reference48(_IDRRef), + _Fld57 NUMERIC(15, 3), + _Fld58 NUMERIC(15, 2), + _Fld59 NUMERIC(15, 2) +); + +-- Регистр сведений (логи) +CREATE TABLE _InfoRg60 ( + _Fld61 BIGINT, -- Linux timestamp + _Fld62 VARCHAR(12), -- ИНН + _Fld63 VARCHAR(9), -- КПП + _Fld64 TEXT -- JSON данные +); + +Логика обработки заказа +1. Поиск контрагента по TIN и TRRC + +2. Если не найден — создание нового контрагента + +3. Поиск товаров по артикулам (SKU) + +4. Создание заказа в документе и таблице товаров + +5. Запись в регистр сведений (аудит) + +📊 Мониторинг +Просмотр сообщений в Kafka + +# Просмотр всех сообщений +kafka-console-consumer --topic orders.input --bootstrap-server localhost:9092 --from-beginning + +# Просмотр ошибок +kafka-console-consumer --topic orders.errors --bootstrap-server localhost:9092 --from-beginning + +# Просмотр с фильтром по ключу +kafka-console-consumer --topic orders.input --bootstrap-server localhost:9092 --property print.key=true --property key.separator=: + +Просмотр кэша SQLite +# Установить sqlite3 +sqlite3 cache/messages.db + +# Просмотр всех сообщений +SELECT * FROM messages; + +# Просмотр только ожидающих +SELECT * FROM messages WHERE status = 'pending'; + +# Статистика по статусам +SELECT status, COUNT(*) FROM messages GROUP BY status; + +Логирование +Программа выводит логи в консоль с временными метками: +[INFO] 2026-08-02 14:30:15.123 === Kafka-1C Connector (Producer + Consumer) === +[INFO] 2026-08-02 14:30:15.124 Version: 1.0.0 +[INFO] 2026-08-02 14:30:15.125 Config loaded successfully +[INFO] 2026-08-02 14:30:15.126 Cache initialized: cache/messages.db +[INFO] 2026-08-02 14:30:15.127 PostgreSQL connected: trade_otus +[Kafka] Producer initialized. Brokers: localhost:9092, Topic: orders.input +[INFO] 2026-08-02 14:30:15.128 Mode: both +[INFO] 2026-08-02 14:30:15.129 Starting Producer thread... +[INFO] 2026-08-02 14:30:17.130 Starting Consumer thread... +[INFO] 2026-08-02 14:30:17.131 Found 1 files in input +[JSON] Loaded: order_1.json +[INFO] 2026-08-02 14:30:17.132 [Producer] Sent: 7701234567 (1) +[DEBUG] 2026-08-02 14:30:17.133 [Producer] Delivered: 7701234567 (offset: 0) +[INFO] 2026-08-02 14:30:17.134 Order processed successfully: ORD-001 + +🐳 Docker +Сборка образа +docker build -t kafka-1c-connector . + +Запуск контейнера +docker run -p 9092:9092 -p 5432:5432 kafka-1c-connector + +📁 Структура проекта +ProjectC++ +├── CMakeLists.txt # Конфигурация сборки +├── Dockerfile # Docker образ +├── Doxyfile # Конфигурация Doxygen +├── README.md # Документация +├── .gitignore # Игнорируемые файлы +│ +├── config/ +│ └── settings.json # Основная конфигурация +│ +├── input/ # Папка для JSON файлов +│ └── order_1.json # Пример заказа +│ +├── cache/ # SQLite база (создается автоматически) +│ └── messages.db # Кэш сообщений +│ +└── src/ + ├── main.cpp # Точка входа + ├── config/ + │ ├── config.hpp + │ └── config.cpp # Загрузка конфигурации + ├── kafka/ + │ ├── producer.hpp + │ ├── producer.cpp # Kafka Producer + │ ├── consumer.hpp + │ └── consumer.cpp # Kafka Consumer + ├── parser/ + │ ├── json_parser.hpp + │ └── json_parser.cpp # Парсинг JSON + ├── cache/ + │ ├── sqlite_cache.hpp + │ └── sqlite_cache.cpp # SQLite кэш + ├── database/ + │ ├── postgresql.hpp + │ └── postgresql.cpp # PostgreSQL + ├── processor/ + │ ├── order_processor.hpp + │ └── order_processor.cpp # Обработка заказов + └── utils/ + ├── logger.hpp + ├── logger.cpp # Логирование + └── uuid.hpp # Генерация UUID + +🔧 Отладка +Включение DEBUG логов +В main.cpp добавьте: +Logger::setLevel(Logger::Level::DEBUG); + +Брейкпоинты для отладки +Файл Строка Что проверять +main.cpp AppConfig config = AppConfig::load(...) Загрузка конфига +producer.cpp producer_->produce(...) Отправка в Kafka +consumer.cpp consumer_->consume(...) Получение из Kafka +order_processor.cpp processMessage(...) Обработка заказа +postgresql.cpp txn.exec(...) Выполнение SQL + +📈 План развития +✅ Сделано (MVP) +☑ Kafka Producer с многопоточностью +☑ Kafka Consumer с автоматическим коммитом +☑ SQLite кэширование и восстановление +☑ Интеграция с PostgreSQL (1С схема) +☑ JSON-конфигурация +☑ Логирование +☑ Docker-контейнеризация +🚧 В планах (Релиз 2.0) +□ Динамические SQL запросы через конфигурацию +□ Поддержка RabbitMQ +□ GUI для настройки (Qt) +□ Метрики и мониторинг (Prometheus) +□ Кластеризация и балансировка +□ Web-интерфейс администратора + +📄 Лицензия +MIT License. См. файл LICENSE. + +📧 Контакты +Автор: Evgeniy Oshkin + +Email: oshkines@mail.ru + +GitHub: oshkines/otus-cpp-prof + +⭐ Поддержка +Если проект оказался полезным, поставьте звезду на GitHub! Это поможет другим разработчикам найти его. + +Сделано с ❤️ для бешеной скорости интеграции 1С и Kafka + +© 2026 Evgeniy Oshkin. Все права защищены. diff --git a/config/settings.json b/config/settings.json new file mode 100644 index 000000000..55671bd9e --- /dev/null +++ b/config/settings.json @@ -0,0 +1,51 @@ +{ + "kafka": { + "bootstrap_servers": "localhost:9092", + "topics": { + "input": "orders.input", + "output": "orders.output", + "errors": "orders.errors" + }, + "producer": { + "acks": "all", + "retries": 3, + "batch_size": 100, + "linger_ms": 5 + }, + "consumer": { + "group_id": "kafka_1c_consumer", + "auto_offset_reset": "earliest", + "enable_auto_commit": true + } + }, + "database": { + "postgresql": { + "host": "localhost", + "port": 5432, + "database": "trade_otus", + "username": "postgres", + "password": "Dthibyf7" + } + }, + "cache": { + "path": "cache/messages.db", + "retention_days": 7, + "reprocess_delay_seconds": 7, + "source_prefix": "localhost:9092|orders.input" + }, + "processing": { + "max_workers": 4, + "batch_size": 100, + "retry_interval_seconds": 60, + "delete_after_send": true + }, + "mode": "both", + "groups": [ + { + "name": "Main", + "enabled": true, + "input_directory": "input", + "kafka_topic": "orders.input" + } + ] +} \ No newline at end of file diff --git "a/config/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.txt" "b/config/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.txt" new file mode 100644 index 000000000..6e7877eec --- /dev/null +++ "b/config/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.txt" @@ -0,0 +1 @@ +"mode": "consumer", ->// "producer", "consumer", "both" \ No newline at end of file diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 000000000..9b6292275 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,5 @@ +kafkaordersender (8.0.0-1) unstable; urgency=medium + + * Initial release. + + -- oshkines Wed, 04 Aug 2026 21:00:00 +0300 \ No newline at end of file diff --git a/debian/control b/debian/control new file mode 100644 index 000000000..60e6a1968 --- /dev/null +++ b/debian/control @@ -0,0 +1,12 @@ +Source: kafkaordersender +Section: libs +Priority: optional +Maintainer: oshkines +Build-Depends: debhelper-compat (= 13), cmake, g++ +Standards-Version: 4.6.0 + +Package: kafkaordersender +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: Kafka-1C Connector + High-performance Kafka-1C integration microservice \ No newline at end of file diff --git a/debian/format b/debian/format new file mode 100644 index 000000000..46ebe0266 --- /dev/null +++ b/debian/format @@ -0,0 +1 @@ +3.0 (quilt) \ No newline at end of file diff --git a/debian/rules b/debian/rules new file mode 100644 index 000000000..9364a8d9a --- /dev/null +++ b/debian/rules @@ -0,0 +1,14 @@ +#!/usr/bin/make -f + +%: + dh $@ + +override_dh_auto_configure: + dh_auto_configure -- -DCMAKE_BUILD_TYPE=Release + +override_dh_auto_install: + dh_auto_install + +override_dh_clean: + dh_clean + rm -rf build \ No newline at end of file diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 000000000..46ebe0266 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) \ No newline at end of file diff --git a/debian/templates/changelog b/debian/templates/changelog new file mode 100644 index 000000000..9b6292275 --- /dev/null +++ b/debian/templates/changelog @@ -0,0 +1,5 @@ +kafkaordersender (8.0.0-1) unstable; urgency=medium + + * Initial release. + + -- oshkines Wed, 04 Aug 2026 21:00:00 +0300 \ No newline at end of file diff --git a/debian/templates/control b/debian/templates/control new file mode 100644 index 000000000..60e6a1968 --- /dev/null +++ b/debian/templates/control @@ -0,0 +1,12 @@ +Source: kafkaordersender +Section: libs +Priority: optional +Maintainer: oshkines +Build-Depends: debhelper-compat (= 13), cmake, g++ +Standards-Version: 4.6.0 + +Package: kafkaordersender +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: Kafka-1C Connector + High-performance Kafka-1C integration microservice \ No newline at end of file diff --git a/debian/templates/format b/debian/templates/format new file mode 100644 index 000000000..46ebe0266 --- /dev/null +++ b/debian/templates/format @@ -0,0 +1 @@ +3.0 (quilt) \ No newline at end of file diff --git a/debian/templates/rules b/debian/templates/rules new file mode 100644 index 000000000..9364a8d9a --- /dev/null +++ b/debian/templates/rules @@ -0,0 +1,14 @@ +#!/usr/bin/make -f + +%: + dh $@ + +override_dh_auto_configure: + dh_auto_configure -- -DCMAKE_BUILD_TYPE=Release + +override_dh_auto_install: + dh_auto_install + +override_dh_clean: + dh_clean + rm -rf build \ No newline at end of file diff --git a/docs/html/annotated.html b/docs/html/annotated.html new file mode 100644 index 000000000..0a21c87aa --- /dev/null +++ b/docs/html/annotated.html @@ -0,0 +1,159 @@ + + + + + + + +Kafka-1C Connector: Классы + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Классы
+
+
+
Классы с их кратким описанием.
+
+
+
+ + + + diff --git a/docs/html/annotated_dup.js b/docs/html/annotated_dup.js new file mode 100644 index 000000000..a2b380081 --- /dev/null +++ b/docs/html/annotated_dup.js @@ -0,0 +1,24 @@ +var annotated_dup = +[ + [ "database", "namespacedatabase.html", [ + [ "ConnectionParams", "structdatabase_1_1_connection_params.html", "structdatabase_1_1_connection_params" ], + [ "Client", "structdatabase_1_1_client.html", "structdatabase_1_1_client" ], + [ "Product", "structdatabase_1_1_product.html", "structdatabase_1_1_product" ], + [ "OrderItem", "structdatabase_1_1_order_item.html", "structdatabase_1_1_order_item" ], + [ "PostgreSQL", "classdatabase_1_1_postgre_s_q_l.html", "classdatabase_1_1_postgre_s_q_l" ] + ] ], + [ "AppConfig", "struct_app_config.html", "struct_app_config" ], + [ "CacheConfig", "struct_cache_config.html", "struct_cache_config" ], + [ "DatabaseConfig", "struct_database_config.html", "struct_database_config" ], + [ "GroupConfig", "struct_group_config.html", "struct_group_config" ], + [ "JsonParser", "class_json_parser.html", null ], + [ "KafkaConfig", "struct_kafka_config.html", "struct_kafka_config" ], + [ "KafkaConsumer", "class_kafka_consumer.html", "class_kafka_consumer" ], + [ "KafkaProducer", "class_kafka_producer.html", "class_kafka_producer" ], + [ "Logger", "class_logger.html", "class_logger" ], + [ "MessageCache", "class_message_cache.html", "class_message_cache" ], + [ "OrderData", "struct_order_data.html", "struct_order_data" ], + [ "OrderItem", "struct_order_item.html", "struct_order_item" ], + [ "OrderProcessor", "class_order_processor.html", "class_order_processor" ], + [ "ProcessingConfig", "struct_processing_config.html", "struct_processing_config" ] +]; \ No newline at end of file diff --git a/docs/html/class_json_parser-members.html b/docs/html/class_json_parser-members.html new file mode 100644 index 000000000..c74e07fab --- /dev/null +++ b/docs/html/class_json_parser-members.html @@ -0,0 +1,139 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
JsonParser Список членов класса
+
+
+ +

Полный список членов класса JsonParser, включая наследуемые из базового класса

+ + + + + +
parseDirectory(const std::string &directory)JsonParserstatic
parseOrder(const std::string &filename)JsonParserstatic
parseOrderFromString(const std::string &json_str)JsonParserstatic
validate(const OrderData &order)JsonParserstatic
+
+
+ + + + diff --git a/docs/html/class_json_parser.html b/docs/html/class_json_parser.html new file mode 100644 index 000000000..077feaa1b --- /dev/null +++ b/docs/html/class_json_parser.html @@ -0,0 +1,293 @@ + + + + + + + +Kafka-1C Connector: Класс JsonParser + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Класс JsonParser
+
+
+ +

#include <json_parser.hpp>

+ + + + + + +

+Открытые статические члены

static OrderData parseOrder (const std::string &filename)
static OrderData parseOrderFromString (const std::string &json_str)
static std::vector< OrderDataparseDirectory (const std::string &directory)
static bool validate (const OrderData &order)
+

Подробное описание

+
+

См. определение в файле json_parser.hpp строка 44

+

Методы

+ +

◆ parseDirectory()

+ +
+
+ + + + + +
+ + + + + + + +
std::vector< OrderData > JsonParser::parseDirectory (const std::string & directory)
+
+static
+
+ +
+
+ +

◆ parseOrder()

+ +
+
+ + + + + +
+ + + + + + + +
OrderData JsonParser::parseOrder (const std::string & filename)
+
+static
+
+
+Граф вызова функции:
+
+
+ + + + + + + + + +
+ +
+
+ +

◆ parseOrderFromString()

+ +
+
+ + + + + +
+ + + + + + + +
OrderData JsonParser::parseOrderFromString (const std::string & json_str)
+
+static
+
+ +
+
+ +

◆ validate()

+ +
+
+ + + + + +
+ + + + + + + +
bool JsonParser::validate (const OrderData & order)
+
+static
+
+
+Граф вызова функции:
+
+
+ + + + + + + + + + + + + + + + + +
+ +
+
+
Объявления и описания членов класса находятся в файле: +
+
+ +
+ + + + diff --git a/docs/html/class_json_parser_a1d6b83be5c0757b3a628a7c1737e4628_icgraph.dot b/docs/html/class_json_parser_a1d6b83be5c0757b3a628a7c1737e4628_icgraph.dot new file mode 100644 index 000000000..a38f43d19 --- /dev/null +++ b/docs/html/class_json_parser_a1d6b83be5c0757b3a628a7c1737e4628_icgraph.dot @@ -0,0 +1,23 @@ +digraph "JsonParser::validate" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="JsonParser::validate",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="processFiles",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a5bc44c4396b63ff16c6a74bb1c394478",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="runProducer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a046be377067f3f52c8b9516cdb1e47b5",tooltip=" "]; + Node3 -> Node4 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="OrderProcessor::processMessage",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_order_processor.html#a6f8aa8e2aeb597be492065036c2f23f5",tooltip=" "]; + Node5 -> Node6 [id="edge5_Node000005_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="runConsumer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854",tooltip=" "]; + Node6 -> Node4 [id="edge6_Node000006_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node7 [id="edge7_Node000001_Node000007",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="OrderProcessor::reprocess\lPendingMessages",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_order_processor.html#af7a710bdbf4bd5c4578db73437477a5f",tooltip=" "]; + Node7 -> Node6 [id="edge8_Node000007_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; +} diff --git a/docs/html/class_json_parser_a1d6b83be5c0757b3a628a7c1737e4628_icgraph.map b/docs/html/class_json_parser_a1d6b83be5c0757b3a628a7c1737e4628_icgraph.map new file mode 100644 index 000000000..1b1802097 --- /dev/null +++ b/docs/html/class_json_parser_a1d6b83be5c0757b3a628a7c1737e4628_icgraph.map @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/html/class_json_parser_a1d6b83be5c0757b3a628a7c1737e4628_icgraph.md5 b/docs/html/class_json_parser_a1d6b83be5c0757b3a628a7c1737e4628_icgraph.md5 new file mode 100644 index 000000000..772aaee96 --- /dev/null +++ b/docs/html/class_json_parser_a1d6b83be5c0757b3a628a7c1737e4628_icgraph.md5 @@ -0,0 +1 @@ +33b6d06a9e04175d03699ec74e4fa05d \ No newline at end of file diff --git a/docs/html/class_json_parser_a1d6b83be5c0757b3a628a7c1737e4628_icgraph.png b/docs/html/class_json_parser_a1d6b83be5c0757b3a628a7c1737e4628_icgraph.png new file mode 100644 index 000000000..2ad61cc04 Binary files /dev/null and b/docs/html/class_json_parser_a1d6b83be5c0757b3a628a7c1737e4628_icgraph.png differ diff --git a/docs/html/class_json_parser_af18e9188a3948e4c5b3d9c17a76bcd74_icgraph.dot b/docs/html/class_json_parser_af18e9188a3948e4c5b3d9c17a76bcd74_icgraph.dot new file mode 100644 index 000000000..cb84f7dfe --- /dev/null +++ b/docs/html/class_json_parser_af18e9188a3948e4c5b3d9c17a76bcd74_icgraph.dot @@ -0,0 +1,15 @@ +digraph "JsonParser::parseOrder" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="JsonParser::parseOrder",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="processFiles",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a5bc44c4396b63ff16c6a74bb1c394478",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="runProducer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a046be377067f3f52c8b9516cdb1e47b5",tooltip=" "]; + Node3 -> Node4 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_json_parser_af18e9188a3948e4c5b3d9c17a76bcd74_icgraph.map b/docs/html/class_json_parser_af18e9188a3948e4c5b3d9c17a76bcd74_icgraph.map new file mode 100644 index 000000000..ab60bd0e4 --- /dev/null +++ b/docs/html/class_json_parser_af18e9188a3948e4c5b3d9c17a76bcd74_icgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/class_json_parser_af18e9188a3948e4c5b3d9c17a76bcd74_icgraph.md5 b/docs/html/class_json_parser_af18e9188a3948e4c5b3d9c17a76bcd74_icgraph.md5 new file mode 100644 index 000000000..53df5bdea --- /dev/null +++ b/docs/html/class_json_parser_af18e9188a3948e4c5b3d9c17a76bcd74_icgraph.md5 @@ -0,0 +1 @@ +509f5602bd99c165a892da50dece1fab \ No newline at end of file diff --git a/docs/html/class_json_parser_af18e9188a3948e4c5b3d9c17a76bcd74_icgraph.png b/docs/html/class_json_parser_af18e9188a3948e4c5b3d9c17a76bcd74_icgraph.png new file mode 100644 index 000000000..01667521f Binary files /dev/null and b/docs/html/class_json_parser_af18e9188a3948e4c5b3d9c17a76bcd74_icgraph.png differ diff --git a/docs/html/class_kafka_consumer-members.html b/docs/html/class_kafka_consumer-members.html new file mode 100644 index 000000000..e5afd8feb --- /dev/null +++ b/docs/html/class_kafka_consumer-members.html @@ -0,0 +1,143 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
KafkaConsumer Список членов класса
+
+
+ +

Полный список членов класса KafkaConsumer, включая наследуемые из базового класса

+ + + + + + + + + +
init()KafkaConsumer
isRunning() constKafkaConsumer
KafkaConsumer(const std::string &brokers, const std::string &group_id, const std::string &topic)KafkaConsumer
MessageCallback typedefKafkaConsumer
setMessageCallback(MessageCallback cb)KafkaConsumer
start()KafkaConsumer
stop()KafkaConsumer
~KafkaConsumer()KafkaConsumer
+
+
+ + + + diff --git a/docs/html/class_kafka_consumer.html b/docs/html/class_kafka_consumer.html new file mode 100644 index 000000000..168bfc462 --- /dev/null +++ b/docs/html/class_kafka_consumer.html @@ -0,0 +1,422 @@ + + + + + + + +Kafka-1C Connector: Класс KafkaConsumer + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Класс KafkaConsumer
+
+
+ +

#include <consumer.hpp>

+ + + +

+Открытые типы

using MessageCallback
+ + + + + + + + +

+Открытые члены

 KafkaConsumer (const std::string &brokers, const std::string &group_id, const std::string &topic)
 ~KafkaConsumer ()
bool init ()
void start ()
void stop ()
void setMessageCallback (MessageCallback cb)
bool isRunning () const
+

Подробное описание

+
+

См. определение в файле consumer.hpp строка 10

+

Определения типов

+ +

◆ MessageCallback

+ +
+
+Инициализатор
std::function<void(const std::string &key,
+
const std::string &value,
+
int64_t timestamp)>
+
+

См. определение в файле consumer.hpp строка 13

+ +
+
+

Конструктор(ы)

+ +

◆ KafkaConsumer()

+ +
+
+ + + + + + + + + + + + + + + + +
KafkaConsumer::KafkaConsumer (const std::string & brokers,
const std::string & group_id,
const std::string & topic )
+
+ +

См. определение в файле consumer.cpp строка 5

+ +
+
+ +

◆ ~KafkaConsumer()

+ +
+
+ + + + + + + +
KafkaConsumer::~KafkaConsumer ()
+
+ +

См. определение в файле consumer.cpp строка 11

+
+Граф вызовов:
+
+
+ + + + + + + +
+ +
+
+

Методы

+ +

◆ init()

+ +
+
+ + + + + + + +
bool KafkaConsumer::init ()
+
+ +

См. определение в файле consumer.cpp строка 15

+
+Граф вызовов:
+
+
+ + + + + + + +
+
+Граф вызова функции:
+
+
+ + + + + + + +
+ +
+
+ +

◆ isRunning()

+ +
+
+ + + + + + + +
bool KafkaConsumer::isRunning () const
+
+ +

См. определение в файле consumer.hpp строка 25

+ +
+
+ +

◆ setMessageCallback()

+ +
+
+ + + + + + + +
void KafkaConsumer::setMessageCallback (MessageCallback cb)
+
+ +

См. определение в файле consumer.cpp строка 69

+
+Граф вызова функции:
+
+
+ + + + + + + +
+ +
+
+ +

◆ start()

+ +
+
+ + + + + + + +
void KafkaConsumer::start ()
+
+ +

См. определение в файле consumer.cpp строка 45

+
+Граф вызовов:
+
+
+ + + + + +
+
+Граф вызова функции:
+
+
+ + + + + + + +
+ +
+
+ +

◆ stop()

+ +
+
+ + + + + + + +
void KafkaConsumer::stop ()
+
+ +

См. определение в файле consumer.cpp строка 53

+
+Граф вызовов:
+
+
+ + + + + +
+
+Граф вызова функции:
+
+
+ + + + + + + + + +
+ +
+
+
Объявления и описания членов классов находятся в файлах: +
+
+ +
+ + + + diff --git a/docs/html/class_kafka_consumer.js b/docs/html/class_kafka_consumer.js new file mode 100644 index 000000000..7869ba706 --- /dev/null +++ b/docs/html/class_kafka_consumer.js @@ -0,0 +1,11 @@ +var class_kafka_consumer = +[ + [ "MessageCallback", "class_kafka_consumer.html#a5a6cbea7cd95c9b71b9d99e2df550cbc", null ], + [ "KafkaConsumer", "class_kafka_consumer.html#a11206b927d21acae545fb51b155d0b86", null ], + [ "~KafkaConsumer", "class_kafka_consumer.html#a4dd0e33f7341f6de09f7f470fa785dca", null ], + [ "init", "class_kafka_consumer.html#ad3e3608060a00e4429a2e14d24ad09c8", null ], + [ "isRunning", "class_kafka_consumer.html#a46990adceb2dd354969ab9df76ccf288", null ], + [ "setMessageCallback", "class_kafka_consumer.html#a21535be303ced919722a21c8a10646ba", null ], + [ "start", "class_kafka_consumer.html#a56ee2ca2d7d35993b23f95d1dee846c1", null ], + [ "stop", "class_kafka_consumer.html#a4b681b6d27e4cb550a35f61c7acf279a", null ] +]; \ No newline at end of file diff --git a/docs/html/class_kafka_consumer_a21535be303ced919722a21c8a10646ba_icgraph.dot b/docs/html/class_kafka_consumer_a21535be303ced919722a21c8a10646ba_icgraph.dot new file mode 100644 index 000000000..33b385d50 --- /dev/null +++ b/docs/html/class_kafka_consumer_a21535be303ced919722a21c8a10646ba_icgraph.dot @@ -0,0 +1,13 @@ +digraph "KafkaConsumer::setMessageCallback" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="KafkaConsumer::setMessage\lCallback",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="runConsumer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_kafka_consumer_a21535be303ced919722a21c8a10646ba_icgraph.map b/docs/html/class_kafka_consumer_a21535be303ced919722a21c8a10646ba_icgraph.map new file mode 100644 index 000000000..fad50f2ac --- /dev/null +++ b/docs/html/class_kafka_consumer_a21535be303ced919722a21c8a10646ba_icgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/class_kafka_consumer_a21535be303ced919722a21c8a10646ba_icgraph.md5 b/docs/html/class_kafka_consumer_a21535be303ced919722a21c8a10646ba_icgraph.md5 new file mode 100644 index 000000000..de9e64687 --- /dev/null +++ b/docs/html/class_kafka_consumer_a21535be303ced919722a21c8a10646ba_icgraph.md5 @@ -0,0 +1 @@ +2b13a3d95c9cc2130955b98c453f32bb \ No newline at end of file diff --git a/docs/html/class_kafka_consumer_a21535be303ced919722a21c8a10646ba_icgraph.png b/docs/html/class_kafka_consumer_a21535be303ced919722a21c8a10646ba_icgraph.png new file mode 100644 index 000000000..e66e266a9 Binary files /dev/null and b/docs/html/class_kafka_consumer_a21535be303ced919722a21c8a10646ba_icgraph.png differ diff --git a/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_cgraph.dot b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_cgraph.dot new file mode 100644 index 000000000..92b996897 --- /dev/null +++ b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_cgraph.dot @@ -0,0 +1,11 @@ +digraph "KafkaConsumer::stop" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="KafkaConsumer::stop",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Logger::info",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a474176e6966186566a2a321cb5cbd739",tooltip=" "]; +} diff --git a/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_cgraph.map b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_cgraph.map new file mode 100644 index 000000000..c78b65ff0 --- /dev/null +++ b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_cgraph.md5 b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_cgraph.md5 new file mode 100644 index 000000000..07e0c1812 --- /dev/null +++ b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_cgraph.md5 @@ -0,0 +1 @@ +06eceed4bd53537b2ef22eef2fe30cd8 \ No newline at end of file diff --git a/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_cgraph.png b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_cgraph.png new file mode 100644 index 000000000..689788ad2 Binary files /dev/null and b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_cgraph.png differ diff --git a/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_icgraph.dot b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_icgraph.dot new file mode 100644 index 000000000..15652b496 --- /dev/null +++ b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_icgraph.dot @@ -0,0 +1,15 @@ +digraph "KafkaConsumer::stop" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="KafkaConsumer::stop",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="runConsumer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="KafkaConsumer::~KafkaConsumer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_consumer.html#a4dd0e33f7341f6de09f7f470fa785dca",tooltip=" "]; +} diff --git a/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_icgraph.map b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_icgraph.map new file mode 100644 index 000000000..636b5ed3e --- /dev/null +++ b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_icgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_icgraph.md5 b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_icgraph.md5 new file mode 100644 index 000000000..43976864b --- /dev/null +++ b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_icgraph.md5 @@ -0,0 +1 @@ +c87606d6fc3c81d1b661cd89c0cc8ceb \ No newline at end of file diff --git a/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_icgraph.png b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_icgraph.png new file mode 100644 index 000000000..8e1f08d85 Binary files /dev/null and b/docs/html/class_kafka_consumer_a4b681b6d27e4cb550a35f61c7acf279a_icgraph.png differ diff --git a/docs/html/class_kafka_consumer_a4dd0e33f7341f6de09f7f470fa785dca_cgraph.dot b/docs/html/class_kafka_consumer_a4dd0e33f7341f6de09f7f470fa785dca_cgraph.dot new file mode 100644 index 000000000..408672e12 --- /dev/null +++ b/docs/html/class_kafka_consumer_a4dd0e33f7341f6de09f7f470fa785dca_cgraph.dot @@ -0,0 +1,13 @@ +digraph "KafkaConsumer::~KafkaConsumer" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="KafkaConsumer::~KafkaConsumer",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="KafkaConsumer::stop",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_consumer.html#a4b681b6d27e4cb550a35f61c7acf279a",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="Logger::info",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a474176e6966186566a2a321cb5cbd739",tooltip=" "]; +} diff --git a/docs/html/class_kafka_consumer_a4dd0e33f7341f6de09f7f470fa785dca_cgraph.map b/docs/html/class_kafka_consumer_a4dd0e33f7341f6de09f7f470fa785dca_cgraph.map new file mode 100644 index 000000000..073d51e20 --- /dev/null +++ b/docs/html/class_kafka_consumer_a4dd0e33f7341f6de09f7f470fa785dca_cgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/class_kafka_consumer_a4dd0e33f7341f6de09f7f470fa785dca_cgraph.md5 b/docs/html/class_kafka_consumer_a4dd0e33f7341f6de09f7f470fa785dca_cgraph.md5 new file mode 100644 index 000000000..6ae4b9eaa --- /dev/null +++ b/docs/html/class_kafka_consumer_a4dd0e33f7341f6de09f7f470fa785dca_cgraph.md5 @@ -0,0 +1 @@ +27e7db78dfec6abdc0869febf676d213 \ No newline at end of file diff --git a/docs/html/class_kafka_consumer_a4dd0e33f7341f6de09f7f470fa785dca_cgraph.png b/docs/html/class_kafka_consumer_a4dd0e33f7341f6de09f7f470fa785dca_cgraph.png new file mode 100644 index 000000000..e819e2a25 Binary files /dev/null and b/docs/html/class_kafka_consumer_a4dd0e33f7341f6de09f7f470fa785dca_cgraph.png differ diff --git a/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_cgraph.dot b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_cgraph.dot new file mode 100644 index 000000000..cc2dbf004 --- /dev/null +++ b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_cgraph.dot @@ -0,0 +1,11 @@ +digraph "KafkaConsumer::start" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="KafkaConsumer::start",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Logger::info",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a474176e6966186566a2a321cb5cbd739",tooltip=" "]; +} diff --git a/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_cgraph.map b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_cgraph.map new file mode 100644 index 000000000..f240999ef --- /dev/null +++ b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_cgraph.md5 b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_cgraph.md5 new file mode 100644 index 000000000..f9b6c1332 --- /dev/null +++ b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_cgraph.md5 @@ -0,0 +1 @@ +005541097d096a15a474a60ba8eaec7b \ No newline at end of file diff --git a/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_cgraph.png b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_cgraph.png new file mode 100644 index 000000000..6c296523e Binary files /dev/null and b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_cgraph.png differ diff --git a/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_icgraph.dot b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_icgraph.dot new file mode 100644 index 000000000..23170258a --- /dev/null +++ b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_icgraph.dot @@ -0,0 +1,13 @@ +digraph "KafkaConsumer::start" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="KafkaConsumer::start",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="runConsumer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_icgraph.map b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_icgraph.map new file mode 100644 index 000000000..8a22f566a --- /dev/null +++ b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_icgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_icgraph.md5 b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_icgraph.md5 new file mode 100644 index 000000000..c76a3198e --- /dev/null +++ b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_icgraph.md5 @@ -0,0 +1 @@ +d1229034989c0546a14623a9721314ba \ No newline at end of file diff --git a/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_icgraph.png b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_icgraph.png new file mode 100644 index 000000000..b55132b79 Binary files /dev/null and b/docs/html/class_kafka_consumer_a56ee2ca2d7d35993b23f95d1dee846c1_icgraph.png differ diff --git a/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_cgraph.dot b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_cgraph.dot new file mode 100644 index 000000000..cc57e5bd7 --- /dev/null +++ b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_cgraph.dot @@ -0,0 +1,13 @@ +digraph "KafkaConsumer::init" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="KafkaConsumer::init",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Logger::error",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aafe8b4f6ed1259fbde150ab59e0785e7",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="Logger::info",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a474176e6966186566a2a321cb5cbd739",tooltip=" "]; +} diff --git a/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_cgraph.map b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_cgraph.map new file mode 100644 index 000000000..cb875a79b --- /dev/null +++ b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_cgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_cgraph.md5 b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_cgraph.md5 new file mode 100644 index 000000000..8237b8685 --- /dev/null +++ b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_cgraph.md5 @@ -0,0 +1 @@ +01a6fedbc6ac72fd11ef9f8d39c19998 \ No newline at end of file diff --git a/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_cgraph.png b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_cgraph.png new file mode 100644 index 000000000..69e0e796b Binary files /dev/null and b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_cgraph.png differ diff --git a/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_icgraph.dot b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_icgraph.dot new file mode 100644 index 000000000..38eb0b593 --- /dev/null +++ b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_icgraph.dot @@ -0,0 +1,13 @@ +digraph "KafkaConsumer::init" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="KafkaConsumer::init",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="runConsumer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_icgraph.map b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_icgraph.map new file mode 100644 index 000000000..5992ddad1 --- /dev/null +++ b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_icgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_icgraph.md5 b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_icgraph.md5 new file mode 100644 index 000000000..05c87d0f9 --- /dev/null +++ b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_icgraph.md5 @@ -0,0 +1 @@ +b5be53f9d3a0c42de32bdf4060e5ab41 \ No newline at end of file diff --git a/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_icgraph.png b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_icgraph.png new file mode 100644 index 000000000..002ef50ae Binary files /dev/null and b/docs/html/class_kafka_consumer_ad3e3608060a00e4429a2e14d24ad09c8_icgraph.png differ diff --git a/docs/html/class_kafka_producer-members.html b/docs/html/class_kafka_producer-members.html new file mode 100644 index 000000000..b7eaece64 --- /dev/null +++ b/docs/html/class_kafka_producer-members.html @@ -0,0 +1,145 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
KafkaProducer Список членов класса
+
+
+ +

Полный список членов класса KafkaProducer, включая наследуемые из базового класса

+ + + + + + + + + + + +
DeliveryCallback typedefKafkaProducer
flush(int timeout_ms=5000)KafkaProducer
getFailedCount() constKafkaProducer
getSentCount() constKafkaProducer
init(const std::string &acks="all", int retries=3)KafkaProducer
KafkaProducer(const std::string &brokers, const std::string &topic)KafkaProducer
send(const std::string &message)KafkaProducer
send(const std::string &key, const std::string &message)KafkaProducer
setDeliveryCallback(DeliveryCallback cb)KafkaProducer
~KafkaProducer()KafkaProducer
+
+
+ + + + diff --git a/docs/html/class_kafka_producer.html b/docs/html/class_kafka_producer.html new file mode 100644 index 000000000..8b33527aa --- /dev/null +++ b/docs/html/class_kafka_producer.html @@ -0,0 +1,397 @@ + + + + + + + +Kafka-1C Connector: Класс KafkaProducer + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Класс KafkaProducer
+
+
+ +

#include <producer.hpp>

+ + + +

+Открытые типы

using DeliveryCallback = std::function<void(const std::string&, int, int64_t)>
+ + + + + + + + + + +

+Открытые члены

 KafkaProducer (const std::string &brokers, const std::string &topic)
 ~KafkaProducer ()
bool init (const std::string &acks="all", int retries=3)
bool send (const std::string &message)
bool send (const std::string &key, const std::string &message)
void setDeliveryCallback (DeliveryCallback cb)
void flush (int timeout_ms=5000)
size_t getSentCount () const
size_t getFailedCount () const
+

Подробное описание

+
+

См. определение в файле producer.hpp строка 9

+

Определения типов

+ +

◆ DeliveryCallback

+ +
+
+ + + + +
using KafkaProducer::DeliveryCallback = std::function<void(const std::string&, int, int64_t)>
+
+ +

См. определение в файле producer.hpp строка 11

+ +
+
+

Конструктор(ы)

+ +

◆ KafkaProducer()

+ +
+
+ + + + + + + + + + + +
KafkaProducer::KafkaProducer (const std::string & brokers,
const std::string & topic )
+
+ +
+
+ +

◆ ~KafkaProducer()

+ +
+
+ + + + + + + +
KafkaProducer::~KafkaProducer ()
+
+ +
+
+

Методы

+ +

◆ flush()

+ +
+
+ + + + + + + +
void KafkaProducer::flush (int timeout_ms = 5000)
+
+
+Граф вызова функции:
+
+
+ + + + + +
+ +
+
+ +

◆ getFailedCount()

+ +
+
+ + + + + + + +
size_t KafkaProducer::getFailedCount () const
+
+ +

См. определение в файле producer.hpp строка 24

+ +
+
+ +

◆ getSentCount()

+ +
+
+ + + + + + + +
size_t KafkaProducer::getSentCount () const
+
+ +

См. определение в файле producer.hpp строка 23

+ +
+
+ +

◆ init()

+ +
+
+ + + + + + + + + + + +
bool KafkaProducer::init (const std::string & acks = "all",
int retries = 3 )
+
+
+Граф вызова функции:
+
+
+ + + + + +
+ +
+
+ +

◆ send() [1/2]

+ +
+
+ + + + + + + + + + + +
bool KafkaProducer::send (const std::string & key,
const std::string & message )
+
+ +
+
+ +

◆ send() [2/2]

+ +
+
+ + + + + + + +
bool KafkaProducer::send (const std::string & message)
+
+
+Граф вызова функции:
+
+
+ + + + + + + + + +
+ +
+
+ +

◆ setDeliveryCallback()

+ +
+
+ + + + + + + +
void KafkaProducer::setDeliveryCallback (DeliveryCallback cb)
+
+
+Граф вызова функции:
+
+
+ + + + + +
+ +
+
+
Объявления и описания членов класса находятся в файле: +
+
+ +
+ + + + diff --git a/docs/html/class_kafka_producer.js b/docs/html/class_kafka_producer.js new file mode 100644 index 000000000..2579d496c --- /dev/null +++ b/docs/html/class_kafka_producer.js @@ -0,0 +1,13 @@ +var class_kafka_producer = +[ + [ "DeliveryCallback", "class_kafka_producer.html#ab3ca45833957d458b67df80abcc60f2a", null ], + [ "KafkaProducer", "class_kafka_producer.html#a7b50ec53a1b4e433a6674519376d8c27", null ], + [ "~KafkaProducer", "class_kafka_producer.html#acb41ef37ae06e2f660fcc38e614843ce", null ], + [ "flush", "class_kafka_producer.html#a6266bb25d0bbec95a32243d88006ea55", null ], + [ "getFailedCount", "class_kafka_producer.html#a93934ddc34c83e74fd7adb110c1b3f2c", null ], + [ "getSentCount", "class_kafka_producer.html#a8f20c25ada021053e6a9752b6ebe3cad", null ], + [ "init", "class_kafka_producer.html#a6012cf74b1de379e1110c0db1690b64c", null ], + [ "send", "class_kafka_producer.html#afcc3fa74dced31f8fab9bb198a26414e", null ], + [ "send", "class_kafka_producer.html#a5c01eb2a998310bbfe16ebc77666af8f", null ], + [ "setDeliveryCallback", "class_kafka_producer.html#a848df41ef97ff523fc21c3b12285c26c", null ] +]; \ No newline at end of file diff --git a/docs/html/class_kafka_producer_a5c01eb2a998310bbfe16ebc77666af8f_icgraph.dot b/docs/html/class_kafka_producer_a5c01eb2a998310bbfe16ebc77666af8f_icgraph.dot new file mode 100644 index 000000000..b7421976b --- /dev/null +++ b/docs/html/class_kafka_producer_a5c01eb2a998310bbfe16ebc77666af8f_icgraph.dot @@ -0,0 +1,15 @@ +digraph "KafkaProducer::send" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="KafkaProducer::send",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="processFiles",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a5bc44c4396b63ff16c6a74bb1c394478",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="runProducer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a046be377067f3f52c8b9516cdb1e47b5",tooltip=" "]; + Node3 -> Node4 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_kafka_producer_a5c01eb2a998310bbfe16ebc77666af8f_icgraph.map b/docs/html/class_kafka_producer_a5c01eb2a998310bbfe16ebc77666af8f_icgraph.map new file mode 100644 index 000000000..5ab263375 --- /dev/null +++ b/docs/html/class_kafka_producer_a5c01eb2a998310bbfe16ebc77666af8f_icgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/class_kafka_producer_a5c01eb2a998310bbfe16ebc77666af8f_icgraph.md5 b/docs/html/class_kafka_producer_a5c01eb2a998310bbfe16ebc77666af8f_icgraph.md5 new file mode 100644 index 000000000..0988e83ea --- /dev/null +++ b/docs/html/class_kafka_producer_a5c01eb2a998310bbfe16ebc77666af8f_icgraph.md5 @@ -0,0 +1 @@ +aa5416f906eb98183974bb55063cd7b5 \ No newline at end of file diff --git a/docs/html/class_kafka_producer_a5c01eb2a998310bbfe16ebc77666af8f_icgraph.png b/docs/html/class_kafka_producer_a5c01eb2a998310bbfe16ebc77666af8f_icgraph.png new file mode 100644 index 000000000..02e788ac9 Binary files /dev/null and b/docs/html/class_kafka_producer_a5c01eb2a998310bbfe16ebc77666af8f_icgraph.png differ diff --git a/docs/html/class_kafka_producer_a6012cf74b1de379e1110c0db1690b64c_icgraph.dot b/docs/html/class_kafka_producer_a6012cf74b1de379e1110c0db1690b64c_icgraph.dot new file mode 100644 index 000000000..288353b99 --- /dev/null +++ b/docs/html/class_kafka_producer_a6012cf74b1de379e1110c0db1690b64c_icgraph.dot @@ -0,0 +1,11 @@ +digraph "KafkaProducer::init" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="KafkaProducer::init",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_kafka_producer_a6012cf74b1de379e1110c0db1690b64c_icgraph.map b/docs/html/class_kafka_producer_a6012cf74b1de379e1110c0db1690b64c_icgraph.map new file mode 100644 index 000000000..6323c0ef7 --- /dev/null +++ b/docs/html/class_kafka_producer_a6012cf74b1de379e1110c0db1690b64c_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/class_kafka_producer_a6012cf74b1de379e1110c0db1690b64c_icgraph.md5 b/docs/html/class_kafka_producer_a6012cf74b1de379e1110c0db1690b64c_icgraph.md5 new file mode 100644 index 000000000..dcf172180 --- /dev/null +++ b/docs/html/class_kafka_producer_a6012cf74b1de379e1110c0db1690b64c_icgraph.md5 @@ -0,0 +1 @@ +0c6f846c99289c599c5dd1d78b6a5c46 \ No newline at end of file diff --git a/docs/html/class_kafka_producer_a6012cf74b1de379e1110c0db1690b64c_icgraph.png b/docs/html/class_kafka_producer_a6012cf74b1de379e1110c0db1690b64c_icgraph.png new file mode 100644 index 000000000..77d114ed6 Binary files /dev/null and b/docs/html/class_kafka_producer_a6012cf74b1de379e1110c0db1690b64c_icgraph.png differ diff --git a/docs/html/class_kafka_producer_a6266bb25d0bbec95a32243d88006ea55_icgraph.dot b/docs/html/class_kafka_producer_a6266bb25d0bbec95a32243d88006ea55_icgraph.dot new file mode 100644 index 000000000..ba6cc0d30 --- /dev/null +++ b/docs/html/class_kafka_producer_a6266bb25d0bbec95a32243d88006ea55_icgraph.dot @@ -0,0 +1,11 @@ +digraph "KafkaProducer::flush" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="KafkaProducer::flush",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_kafka_producer_a6266bb25d0bbec95a32243d88006ea55_icgraph.map b/docs/html/class_kafka_producer_a6266bb25d0bbec95a32243d88006ea55_icgraph.map new file mode 100644 index 000000000..7d68c0629 --- /dev/null +++ b/docs/html/class_kafka_producer_a6266bb25d0bbec95a32243d88006ea55_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/class_kafka_producer_a6266bb25d0bbec95a32243d88006ea55_icgraph.md5 b/docs/html/class_kafka_producer_a6266bb25d0bbec95a32243d88006ea55_icgraph.md5 new file mode 100644 index 000000000..4d8918569 --- /dev/null +++ b/docs/html/class_kafka_producer_a6266bb25d0bbec95a32243d88006ea55_icgraph.md5 @@ -0,0 +1 @@ +fa75f78a15ad80ae9e602f0a64f5fb31 \ No newline at end of file diff --git a/docs/html/class_kafka_producer_a6266bb25d0bbec95a32243d88006ea55_icgraph.png b/docs/html/class_kafka_producer_a6266bb25d0bbec95a32243d88006ea55_icgraph.png new file mode 100644 index 000000000..fd41ce4df Binary files /dev/null and b/docs/html/class_kafka_producer_a6266bb25d0bbec95a32243d88006ea55_icgraph.png differ diff --git a/docs/html/class_kafka_producer_a848df41ef97ff523fc21c3b12285c26c_icgraph.dot b/docs/html/class_kafka_producer_a848df41ef97ff523fc21c3b12285c26c_icgraph.dot new file mode 100644 index 000000000..846a9a431 --- /dev/null +++ b/docs/html/class_kafka_producer_a848df41ef97ff523fc21c3b12285c26c_icgraph.dot @@ -0,0 +1,11 @@ +digraph "KafkaProducer::setDeliveryCallback" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="KafkaProducer::setDelivery\lCallback",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_kafka_producer_a848df41ef97ff523fc21c3b12285c26c_icgraph.map b/docs/html/class_kafka_producer_a848df41ef97ff523fc21c3b12285c26c_icgraph.map new file mode 100644 index 000000000..b8f355c40 --- /dev/null +++ b/docs/html/class_kafka_producer_a848df41ef97ff523fc21c3b12285c26c_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/class_kafka_producer_a848df41ef97ff523fc21c3b12285c26c_icgraph.md5 b/docs/html/class_kafka_producer_a848df41ef97ff523fc21c3b12285c26c_icgraph.md5 new file mode 100644 index 000000000..e20550d44 --- /dev/null +++ b/docs/html/class_kafka_producer_a848df41ef97ff523fc21c3b12285c26c_icgraph.md5 @@ -0,0 +1 @@ +c62758a0c29401aa75298d179466834d \ No newline at end of file diff --git a/docs/html/class_kafka_producer_a848df41ef97ff523fc21c3b12285c26c_icgraph.png b/docs/html/class_kafka_producer_a848df41ef97ff523fc21c3b12285c26c_icgraph.png new file mode 100644 index 000000000..e46e49a74 Binary files /dev/null and b/docs/html/class_kafka_producer_a848df41ef97ff523fc21c3b12285c26c_icgraph.png differ diff --git a/docs/html/class_logger-members.html b/docs/html/class_logger-members.html new file mode 100644 index 000000000..5083f0f75 --- /dev/null +++ b/docs/html/class_logger-members.html @@ -0,0 +1,141 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Logger Список членов класса
+
+
+ +

Полный список членов класса Logger, включая наследуемые из базового класса

+ + + + + + + +
debug(const std::string &message)Loggerstatic
error(const std::string &message)Loggerstatic
info(const std::string &message)Loggerstatic
Level перечислениеLogger
setLevel(Level level)Loggerstatic
warning(const std::string &message)Loggerstatic
+
+
+ + + + diff --git a/docs/html/class_logger.html b/docs/html/class_logger.html new file mode 100644 index 000000000..e1c881746 --- /dev/null +++ b/docs/html/class_logger.html @@ -0,0 +1,462 @@ + + + + + + + +Kafka-1C Connector: Класс Logger + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Класс Logger
+
+
+ +

#include <logger.hpp>

+ + + +

+Открытые типы

enum class  Level { INFO +, WARNING +, ERROR +, DEBUG + }
+ + + + + + +

+Открытые статические члены

static void setLevel (Level level)
static void info (const std::string &message)
static void warning (const std::string &message)
static void error (const std::string &message)
static void debug (const std::string &message)
+

Подробное описание

+
+

См. определение в файле logger.hpp строка 14

+

Перечисления

+ +

◆ Level

+ +
+
+ + + + + +
+ + + + +
enum class Logger::Level
+
+strong
+
+ + + + + +
Элементы перечислений
INFO 
WARNING 
ERROR 
DEBUG 
+ +

См. определение в файле logger.hpp строка 16

+ +
+
+

Методы

+ +

◆ debug()

+ +
+
+ + + + + +
+ + + + + + + +
void Logger::debug (const std::string & message)
+
+static
+
+ +

См. определение в файле logger.hpp строка 37

+
+Граф вызова функции:
+
+
+ + + + + + + + + + + + + + + + + +
+ +
+
+ +

◆ error()

+ +
+
+ + + + + +
+ + + + + + + +
void Logger::error (const std::string & message)
+
+static
+
+ +

См. определение в файле logger.hpp строка 33

+
+Граф вызова функции:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +

◆ info()

+ +
+
+ + + + + +
+ + + + + + + +
void Logger::info (const std::string & message)
+
+static
+
+ +

См. определение в файле logger.hpp строка 25

+
+Граф вызова функции:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +

◆ setLevel()

+ +
+
+ + + + + +
+ + + + + + + +
void Logger::setLevel (Level level)
+
+static
+
+ +

См. определение в файле logger.hpp строка 23

+ +
+
+ +

◆ warning()

+ +
+
+ + + + + +
+ + + + + + + +
void Logger::warning (const std::string & message)
+
+static
+
+ +

См. определение в файле logger.hpp строка 29

+
+Граф вызова функции:
+
+
+ + + + + + + + + + + + + + + + + +
+ +
+
+
Объявления и описания членов класса находятся в файле: +
+
+ +
+ + + + diff --git a/docs/html/class_logger.js b/docs/html/class_logger.js new file mode 100644 index 000000000..6dc4964e8 --- /dev/null +++ b/docs/html/class_logger.js @@ -0,0 +1,9 @@ +var class_logger = +[ + [ "Level", "class_logger.html#ad766a24576ea8b27ad9d5649cef46d8f", [ + [ "INFO", "class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fa551b723eafd6a31d444fcb2f5920fbd3", null ], + [ "WARNING", "class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fa059e9861e0400dfbe05c98a841f3f96b", null ], + [ "ERROR", "class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fabb1ca97ec761fc37101737ba0aa2e7c5", null ], + [ "DEBUG", "class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fadc30ec20708ef7b0f641ef78b7880a15", null ] + ] ] +]; \ No newline at end of file diff --git a/docs/html/class_logger_a474176e6966186566a2a321cb5cbd739_icgraph.dot b/docs/html/class_logger_a474176e6966186566a2a321cb5cbd739_icgraph.dot new file mode 100644 index 000000000..0a9405af6 --- /dev/null +++ b/docs/html/class_logger_a474176e6966186566a2a321cb5cbd739_icgraph.dot @@ -0,0 +1,45 @@ +digraph "Logger::info" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="Logger::info",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="database::PostgreSQL\l::connect",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a785b7fa2f3259b5258c06bfbd9e8b2c3",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="database::PostgreSQL\l::findClient",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a78e26c9484a4cda19507c89600f609b6",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="KafkaConsumer::init",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_consumer.html#ad3e3608060a00e4429a2e14d24ad09c8",tooltip=" "]; + Node5 -> Node6 [id="edge5_Node000005_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="runConsumer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854",tooltip=" "]; + Node6 -> Node3 [id="edge6_Node000006_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node3 [id="edge7_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node7 [id="edge8_Node000001_Node000007",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="processFiles",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a5bc44c4396b63ff16c6a74bb1c394478",tooltip=" "]; + Node7 -> Node8 [id="edge9_Node000007_Node000008",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node8 [id="Node000008",label="runProducer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a046be377067f3f52c8b9516cdb1e47b5",tooltip=" "]; + Node8 -> Node3 [id="edge10_Node000008_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node9 [id="edge11_Node000001_Node000009",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node9 [id="Node000009",label="OrderProcessor::processMessage",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_order_processor.html#a6f8aa8e2aeb597be492065036c2f23f5",tooltip=" "]; + Node9 -> Node6 [id="edge12_Node000009_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node10 [id="edge13_Node000001_Node000010",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node10 [id="Node000010",label="OrderProcessor::reprocess\lPendingMessages",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_order_processor.html#af7a710bdbf4bd5c4578db73437477a5f",tooltip=" "]; + Node10 -> Node6 [id="edge14_Node000010_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node6 [id="edge15_Node000001_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node8 [id="edge16_Node000001_Node000008",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node11 [id="edge17_Node000001_Node000011",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node11 [id="Node000011",label="signalHandler",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#ad2e59c7203b3bddc1bc9a2224b52e8e7",tooltip=" "]; + Node11 -> Node3 [id="edge18_Node000011_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node12 [id="edge19_Node000001_Node000012",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node12 [id="Node000012",label="KafkaConsumer::start",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_consumer.html#a56ee2ca2d7d35993b23f95d1dee846c1",tooltip=" "]; + Node12 -> Node6 [id="edge20_Node000012_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node13 [id="edge21_Node000001_Node000013",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node13 [id="Node000013",label="KafkaConsumer::stop",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_consumer.html#a4b681b6d27e4cb550a35f61c7acf279a",tooltip=" "]; + Node13 -> Node6 [id="edge22_Node000013_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node13 -> Node14 [id="edge23_Node000013_Node000014",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node14 [id="Node000014",label="KafkaConsumer::~KafkaConsumer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_consumer.html#a4dd0e33f7341f6de09f7f470fa785dca",tooltip=" "]; +} diff --git a/docs/html/class_logger_a474176e6966186566a2a321cb5cbd739_icgraph.map b/docs/html/class_logger_a474176e6966186566a2a321cb5cbd739_icgraph.map new file mode 100644 index 000000000..9ca853cc2 --- /dev/null +++ b/docs/html/class_logger_a474176e6966186566a2a321cb5cbd739_icgraph.map @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/class_logger_a474176e6966186566a2a321cb5cbd739_icgraph.md5 b/docs/html/class_logger_a474176e6966186566a2a321cb5cbd739_icgraph.md5 new file mode 100644 index 000000000..6a5115486 --- /dev/null +++ b/docs/html/class_logger_a474176e6966186566a2a321cb5cbd739_icgraph.md5 @@ -0,0 +1 @@ +d6f2ece551dbe21a0c002fc64cfe6dd2 \ No newline at end of file diff --git a/docs/html/class_logger_a474176e6966186566a2a321cb5cbd739_icgraph.png b/docs/html/class_logger_a474176e6966186566a2a321cb5cbd739_icgraph.png new file mode 100644 index 000000000..2dd013347 Binary files /dev/null and b/docs/html/class_logger_a474176e6966186566a2a321cb5cbd739_icgraph.png differ diff --git a/docs/html/class_logger_a5025d14c1f40cc23e9cbb48f98f0d9a6_icgraph.dot b/docs/html/class_logger_a5025d14c1f40cc23e9cbb48f98f0d9a6_icgraph.dot new file mode 100644 index 000000000..ffc8391cf --- /dev/null +++ b/docs/html/class_logger_a5025d14c1f40cc23e9cbb48f98f0d9a6_icgraph.dot @@ -0,0 +1,23 @@ +digraph "Logger::warning" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="Logger::warning",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="database::PostgreSQL\l::findClient",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a78e26c9484a4cda19507c89600f609b6",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="processFiles",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a5bc44c4396b63ff16c6a74bb1c394478",tooltip=" "]; + Node4 -> Node5 [id="edge4_Node000004_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="runProducer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a046be377067f3f52c8b9516cdb1e47b5",tooltip=" "]; + Node5 -> Node3 [id="edge5_Node000005_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node6 [id="edge6_Node000001_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="OrderProcessor::processMessage",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_order_processor.html#a6f8aa8e2aeb597be492065036c2f23f5",tooltip=" "]; + Node6 -> Node7 [id="edge7_Node000006_Node000007",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="runConsumer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854",tooltip=" "]; + Node7 -> Node3 [id="edge8_Node000007_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; +} diff --git a/docs/html/class_logger_a5025d14c1f40cc23e9cbb48f98f0d9a6_icgraph.map b/docs/html/class_logger_a5025d14c1f40cc23e9cbb48f98f0d9a6_icgraph.map new file mode 100644 index 000000000..397e45c67 --- /dev/null +++ b/docs/html/class_logger_a5025d14c1f40cc23e9cbb48f98f0d9a6_icgraph.map @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/html/class_logger_a5025d14c1f40cc23e9cbb48f98f0d9a6_icgraph.md5 b/docs/html/class_logger_a5025d14c1f40cc23e9cbb48f98f0d9a6_icgraph.md5 new file mode 100644 index 000000000..ae41d128e --- /dev/null +++ b/docs/html/class_logger_a5025d14c1f40cc23e9cbb48f98f0d9a6_icgraph.md5 @@ -0,0 +1 @@ +e4e420dd4150dcb59c35110210bd9a87 \ No newline at end of file diff --git a/docs/html/class_logger_a5025d14c1f40cc23e9cbb48f98f0d9a6_icgraph.png b/docs/html/class_logger_a5025d14c1f40cc23e9cbb48f98f0d9a6_icgraph.png new file mode 100644 index 000000000..bf52c9d4b Binary files /dev/null and b/docs/html/class_logger_a5025d14c1f40cc23e9cbb48f98f0d9a6_icgraph.png differ diff --git a/docs/html/class_logger_aafe8b4f6ed1259fbde150ab59e0785e7_icgraph.dot b/docs/html/class_logger_aafe8b4f6ed1259fbde150ab59e0785e7_icgraph.dot new file mode 100644 index 000000000..4f7c24ba0 --- /dev/null +++ b/docs/html/class_logger_aafe8b4f6ed1259fbde150ab59e0785e7_icgraph.dot @@ -0,0 +1,43 @@ +digraph "Logger::error" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="Logger::error",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="database::PostgreSQL\l::connect",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a785b7fa2f3259b5258c06bfbd9e8b2c3",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="database::PostgreSQL\l::execute",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#aae16b58e807cbaf423edb361275dc018",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="database::PostgreSQL\l::executeParams",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a1b682272e817f53fe4f0ccfcb727e253",tooltip=" "]; + Node1 -> Node6 [id="edge5_Node000001_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="getJsonFiles",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a5a216c3284e0a72fe4f8101cd8b12b60",tooltip=" "]; + Node6 -> Node7 [id="edge6_Node000006_Node000007",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="runProducer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a046be377067f3f52c8b9516cdb1e47b5",tooltip=" "]; + Node7 -> Node3 [id="edge7_Node000007_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node8 [id="edge8_Node000001_Node000008",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node8 [id="Node000008",label="KafkaConsumer::init",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_consumer.html#ad3e3608060a00e4429a2e14d24ad09c8",tooltip=" "]; + Node8 -> Node9 [id="edge9_Node000008_Node000009",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node9 [id="Node000009",label="runConsumer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854",tooltip=" "]; + Node9 -> Node3 [id="edge10_Node000009_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node3 [id="edge11_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node10 [id="edge12_Node000001_Node000010",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node10 [id="Node000010",label="processFiles",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a5bc44c4396b63ff16c6a74bb1c394478",tooltip=" "]; + Node10 -> Node7 [id="edge13_Node000010_Node000007",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node11 [id="edge14_Node000001_Node000011",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node11 [id="Node000011",label="OrderProcessor::processMessage",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_order_processor.html#a6f8aa8e2aeb597be492065036c2f23f5",tooltip=" "]; + Node11 -> Node9 [id="edge15_Node000011_Node000009",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node12 [id="edge16_Node000001_Node000012",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node12 [id="Node000012",label="database::PostgreSQL\l::query",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a95022441d5201d81365056c401ec2474",tooltip=" "]; + Node12 -> Node5 [id="edge17_Node000012_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node12 -> Node13 [id="edge18_Node000012_Node000013",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node13 [id="Node000013",label="database::PostgreSQL\l::findClient",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a78e26c9484a4cda19507c89600f609b6",tooltip=" "]; + Node1 -> Node14 [id="edge19_Node000001_Node000014",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node14 [id="Node000014",label="OrderProcessor::reprocess\lPendingMessages",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_order_processor.html#af7a710bdbf4bd5c4578db73437477a5f",tooltip=" "]; + Node14 -> Node9 [id="edge20_Node000014_Node000009",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node9 [id="edge21_Node000001_Node000009",dir="back",color="steelblue1",style="solid",tooltip=" "]; +} diff --git a/docs/html/class_logger_aafe8b4f6ed1259fbde150ab59e0785e7_icgraph.map b/docs/html/class_logger_aafe8b4f6ed1259fbde150ab59e0785e7_icgraph.map new file mode 100644 index 000000000..1a8bd99a4 --- /dev/null +++ b/docs/html/class_logger_aafe8b4f6ed1259fbde150ab59e0785e7_icgraph.map @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/class_logger_aafe8b4f6ed1259fbde150ab59e0785e7_icgraph.md5 b/docs/html/class_logger_aafe8b4f6ed1259fbde150ab59e0785e7_icgraph.md5 new file mode 100644 index 000000000..8de2b149d --- /dev/null +++ b/docs/html/class_logger_aafe8b4f6ed1259fbde150ab59e0785e7_icgraph.md5 @@ -0,0 +1 @@ +ab59f760daa13a04231ef266b8e37bb6 \ No newline at end of file diff --git a/docs/html/class_logger_aafe8b4f6ed1259fbde150ab59e0785e7_icgraph.png b/docs/html/class_logger_aafe8b4f6ed1259fbde150ab59e0785e7_icgraph.png new file mode 100644 index 000000000..34bd0d6ca Binary files /dev/null and b/docs/html/class_logger_aafe8b4f6ed1259fbde150ab59e0785e7_icgraph.png differ diff --git a/docs/html/class_logger_aed78385ee0ad9d124521735894abab46_icgraph.dot b/docs/html/class_logger_aed78385ee0ad9d124521735894abab46_icgraph.dot new file mode 100644 index 000000000..e9e75a782 --- /dev/null +++ b/docs/html/class_logger_aed78385ee0ad9d124521735894abab46_icgraph.dot @@ -0,0 +1,23 @@ +digraph "Logger::debug" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="Logger::debug",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="database::PostgreSQL\l::findClient",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a78e26c9484a4cda19507c89600f609b6",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="processFiles",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a5bc44c4396b63ff16c6a74bb1c394478",tooltip=" "]; + Node4 -> Node5 [id="edge4_Node000004_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="runProducer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a046be377067f3f52c8b9516cdb1e47b5",tooltip=" "]; + Node5 -> Node3 [id="edge5_Node000005_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node6 [id="edge6_Node000001_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="OrderProcessor::processMessage",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_order_processor.html#a6f8aa8e2aeb597be492065036c2f23f5",tooltip=" "]; + Node6 -> Node7 [id="edge7_Node000006_Node000007",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="runConsumer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854",tooltip=" "]; + Node7 -> Node3 [id="edge8_Node000007_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; +} diff --git a/docs/html/class_logger_aed78385ee0ad9d124521735894abab46_icgraph.map b/docs/html/class_logger_aed78385ee0ad9d124521735894abab46_icgraph.map new file mode 100644 index 000000000..a47bc2311 --- /dev/null +++ b/docs/html/class_logger_aed78385ee0ad9d124521735894abab46_icgraph.map @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/html/class_logger_aed78385ee0ad9d124521735894abab46_icgraph.md5 b/docs/html/class_logger_aed78385ee0ad9d124521735894abab46_icgraph.md5 new file mode 100644 index 000000000..58f398b4e --- /dev/null +++ b/docs/html/class_logger_aed78385ee0ad9d124521735894abab46_icgraph.md5 @@ -0,0 +1 @@ +5aaf2fca8ab6cdc0a9ce293bdc79e8da \ No newline at end of file diff --git a/docs/html/class_logger_aed78385ee0ad9d124521735894abab46_icgraph.png b/docs/html/class_logger_aed78385ee0ad9d124521735894abab46_icgraph.png new file mode 100644 index 000000000..eb44f4892 Binary files /dev/null and b/docs/html/class_logger_aed78385ee0ad9d124521735894abab46_icgraph.png differ diff --git a/docs/html/class_message_cache-members.html b/docs/html/class_message_cache-members.html new file mode 100644 index 000000000..2e12c6c83 --- /dev/null +++ b/docs/html/class_message_cache-members.html @@ -0,0 +1,148 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
MessageCache Список членов класса
+
+
+ +

Полный список членов класса MessageCache, включая наследуемые из базового класса

+ + + + + + + + + + + + + + +
cleanup(int days=7)MessageCache
getPendingCount()MessageCache
getPendingMessages(int limit=100)MessageCache
getTotalCount()MessageCache
init()MessageCache
markError(int64_t id, const std::string &error)MessageCache
markSent(int64_t id)MessageCache
MessageCache(const std::string &db_path)MessageCache
removeSent()MessageCache
save(const std::string &filename, const std::string &topic, const std::string &message, const std::string &tin="", const std::string &trrc="", const std::string &source="")MessageCache
setReprocessDelay(int seconds)MessageCache
setSourcePrefix(const std::string &prefix)MessageCache
~MessageCache()MessageCache
+
+
+ + + + diff --git a/docs/html/class_message_cache.html b/docs/html/class_message_cache.html new file mode 100644 index 000000000..fd4f728ec --- /dev/null +++ b/docs/html/class_message_cache.html @@ -0,0 +1,494 @@ + + + + + + + +Kafka-1C Connector: Класс MessageCache + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Класс MessageCache
+
+
+ +

#include <sqlite_cache.hpp>

+ + + + + + + + + + + + + + + +

+Открытые члены

 MessageCache (const std::string &db_path)
 ~MessageCache ()
bool init ()
bool save (const std::string &filename, const std::string &topic, const std::string &message, const std::string &tin="", const std::string &trrc="", const std::string &source="")
void setSourcePrefix (const std::string &prefix)
void setReprocessDelay (int seconds)
bool markSent (int64_t id)
bool markError (int64_t id, const std::string &error)
std::vector< std::tuple< int64_t, std::string, std::string, std::string > > getPendingMessages (int limit=100)
bool removeSent ()
void cleanup (int days=7)
size_t getPendingCount ()
size_t getTotalCount ()
+

Подробное описание

+
+

См. определение в файле sqlite_cache.hpp строка 14

+

Конструктор(ы)

+ +

◆ MessageCache()

+ +
+
+ + + + + + + +
MessageCache::MessageCache (const std::string & db_path)
+
+ +
+
+ +

◆ ~MessageCache()

+ +
+
+ + + + + + + +
MessageCache::~MessageCache ()
+
+ +
+
+

Методы

+ +

◆ cleanup()

+ +
+
+ + + + + + + +
void MessageCache::cleanup (int days = 7)
+
+
+Граф вызова функции:
+
+
+ + + + + +
+ +
+
+ +

◆ getPendingCount()

+ +
+
+ + + + + + + +
size_t MessageCache::getPendingCount ()
+
+
+Граф вызова функции:
+
+
+ + + + + +
+ +
+
+ +

◆ getPendingMessages()

+ +
+
+ + + + + + + +
std::vector< std::tuple< int64_t, std::string, std::string, std::string > > MessageCache::getPendingMessages (int limit = 100)
+
+ +
+
+ +

◆ getTotalCount()

+ +
+
+ + + + + + + +
size_t MessageCache::getTotalCount ()
+
+
+Граф вызова функции:
+
+
+ + + + + +
+ +
+
+ +

◆ init()

+ +
+
+ + + + + + + +
bool MessageCache::init ()
+
+
+Граф вызова функции:
+
+
+ + + + + +
+ +
+
+ +

◆ markError()

+ +
+
+ + + + + + + + + + + +
bool MessageCache::markError (int64_t id,
const std::string & error )
+
+ +
+
+ +

◆ markSent()

+ +
+
+ + + + + + + +
bool MessageCache::markSent (int64_t id)
+
+ +
+
+ +

◆ removeSent()

+ +
+
+ + + + + + + +
bool MessageCache::removeSent ()
+
+ +
+
+ +

◆ save()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
bool MessageCache::save (const std::string & filename,
const std::string & topic,
const std::string & message,
const std::string & tin = "",
const std::string & trrc = "",
const std::string & source = "" )
+
+
+Граф вызова функции:
+
+
+ + + + + + + + + +
+ +
+
+ +

◆ setReprocessDelay()

+ +
+
+ + + + + + + +
void MessageCache::setReprocessDelay (int seconds)
+
+ +

См. определение в файле sqlite_cache.hpp строка 29

+
+Граф вызова функции:
+
+
+ + + + + +
+ +
+
+ +

◆ setSourcePrefix()

+ +
+
+ + + + + + + +
void MessageCache::setSourcePrefix (const std::string & prefix)
+
+ +

См. определение в файле sqlite_cache.hpp строка 28

+
+Граф вызова функции:
+
+
+ + + + + +
+ +
+
+
Объявления и описания членов класса находятся в файле: +
+
+ +
+ + + + diff --git a/docs/html/class_message_cache.js b/docs/html/class_message_cache.js new file mode 100644 index 000000000..edb56c6f6 --- /dev/null +++ b/docs/html/class_message_cache.js @@ -0,0 +1,16 @@ +var class_message_cache = +[ + [ "MessageCache", "class_message_cache.html#ad3ecc4f9d87a5f147db6eb8d02a83cd9", null ], + [ "~MessageCache", "class_message_cache.html#a6ba6cafac1143389d777172aed9f9fbd", null ], + [ "cleanup", "class_message_cache.html#a50c216e984ae61005f4daf4b8c124a22", null ], + [ "getPendingCount", "class_message_cache.html#ab3729d708193c6be1460fb7a2860e03a", null ], + [ "getPendingMessages", "class_message_cache.html#a201b93a9b56bc038a470a05483566e55", null ], + [ "getTotalCount", "class_message_cache.html#aba79bed3c66e3fe011ae25ed45bb9f8b", null ], + [ "init", "class_message_cache.html#ae986415d8621c4d18493379325ce04cc", null ], + [ "markError", "class_message_cache.html#a765eefeba20b5cc7298a7d10def84903", null ], + [ "markSent", "class_message_cache.html#a56f1f38d36817479eab94ada855e2e4e", null ], + [ "removeSent", "class_message_cache.html#a6e8847a867b6750273845c3a6ca57c65", null ], + [ "save", "class_message_cache.html#a699e48cdd16aaf9e8a67d25d30925a24", null ], + [ "setReprocessDelay", "class_message_cache.html#abe7996aada9f77e39d9ed2d830dcddb9", null ], + [ "setSourcePrefix", "class_message_cache.html#a7d8db594bd5c90375565decd61911596", null ] +]; \ No newline at end of file diff --git a/docs/html/class_message_cache_a50c216e984ae61005f4daf4b8c124a22_icgraph.dot b/docs/html/class_message_cache_a50c216e984ae61005f4daf4b8c124a22_icgraph.dot new file mode 100644 index 000000000..4ad78b3e2 --- /dev/null +++ b/docs/html/class_message_cache_a50c216e984ae61005f4daf4b8c124a22_icgraph.dot @@ -0,0 +1,11 @@ +digraph "MessageCache::cleanup" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="MessageCache::cleanup",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_message_cache_a50c216e984ae61005f4daf4b8c124a22_icgraph.map b/docs/html/class_message_cache_a50c216e984ae61005f4daf4b8c124a22_icgraph.map new file mode 100644 index 000000000..19fd0d08a --- /dev/null +++ b/docs/html/class_message_cache_a50c216e984ae61005f4daf4b8c124a22_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/class_message_cache_a50c216e984ae61005f4daf4b8c124a22_icgraph.md5 b/docs/html/class_message_cache_a50c216e984ae61005f4daf4b8c124a22_icgraph.md5 new file mode 100644 index 000000000..200ad42db --- /dev/null +++ b/docs/html/class_message_cache_a50c216e984ae61005f4daf4b8c124a22_icgraph.md5 @@ -0,0 +1 @@ +930712125ee50dce2ffd9da68b900f28 \ No newline at end of file diff --git a/docs/html/class_message_cache_a50c216e984ae61005f4daf4b8c124a22_icgraph.png b/docs/html/class_message_cache_a50c216e984ae61005f4daf4b8c124a22_icgraph.png new file mode 100644 index 000000000..f46a32821 Binary files /dev/null and b/docs/html/class_message_cache_a50c216e984ae61005f4daf4b8c124a22_icgraph.png differ diff --git a/docs/html/class_message_cache_a699e48cdd16aaf9e8a67d25d30925a24_icgraph.dot b/docs/html/class_message_cache_a699e48cdd16aaf9e8a67d25d30925a24_icgraph.dot new file mode 100644 index 000000000..81ab1b974 --- /dev/null +++ b/docs/html/class_message_cache_a699e48cdd16aaf9e8a67d25d30925a24_icgraph.dot @@ -0,0 +1,15 @@ +digraph "MessageCache::save" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="MessageCache::save",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="processFiles",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a5bc44c4396b63ff16c6a74bb1c394478",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="runProducer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a046be377067f3f52c8b9516cdb1e47b5",tooltip=" "]; + Node3 -> Node4 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_message_cache_a699e48cdd16aaf9e8a67d25d30925a24_icgraph.map b/docs/html/class_message_cache_a699e48cdd16aaf9e8a67d25d30925a24_icgraph.map new file mode 100644 index 000000000..6bedff9f3 --- /dev/null +++ b/docs/html/class_message_cache_a699e48cdd16aaf9e8a67d25d30925a24_icgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/class_message_cache_a699e48cdd16aaf9e8a67d25d30925a24_icgraph.md5 b/docs/html/class_message_cache_a699e48cdd16aaf9e8a67d25d30925a24_icgraph.md5 new file mode 100644 index 000000000..f4124692b --- /dev/null +++ b/docs/html/class_message_cache_a699e48cdd16aaf9e8a67d25d30925a24_icgraph.md5 @@ -0,0 +1 @@ +6032e5e88df805c0ad70dbe776860d3e \ No newline at end of file diff --git a/docs/html/class_message_cache_a699e48cdd16aaf9e8a67d25d30925a24_icgraph.png b/docs/html/class_message_cache_a699e48cdd16aaf9e8a67d25d30925a24_icgraph.png new file mode 100644 index 000000000..47f9a9115 Binary files /dev/null and b/docs/html/class_message_cache_a699e48cdd16aaf9e8a67d25d30925a24_icgraph.png differ diff --git a/docs/html/class_message_cache_a7d8db594bd5c90375565decd61911596_icgraph.dot b/docs/html/class_message_cache_a7d8db594bd5c90375565decd61911596_icgraph.dot new file mode 100644 index 000000000..b206c3aa1 --- /dev/null +++ b/docs/html/class_message_cache_a7d8db594bd5c90375565decd61911596_icgraph.dot @@ -0,0 +1,11 @@ +digraph "MessageCache::setSourcePrefix" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="MessageCache::setSourcePrefix",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_message_cache_a7d8db594bd5c90375565decd61911596_icgraph.map b/docs/html/class_message_cache_a7d8db594bd5c90375565decd61911596_icgraph.map new file mode 100644 index 000000000..5e83103ad --- /dev/null +++ b/docs/html/class_message_cache_a7d8db594bd5c90375565decd61911596_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/class_message_cache_a7d8db594bd5c90375565decd61911596_icgraph.md5 b/docs/html/class_message_cache_a7d8db594bd5c90375565decd61911596_icgraph.md5 new file mode 100644 index 000000000..067e847c0 --- /dev/null +++ b/docs/html/class_message_cache_a7d8db594bd5c90375565decd61911596_icgraph.md5 @@ -0,0 +1 @@ +066d59893aec18b564939838720c1dec \ No newline at end of file diff --git a/docs/html/class_message_cache_a7d8db594bd5c90375565decd61911596_icgraph.png b/docs/html/class_message_cache_a7d8db594bd5c90375565decd61911596_icgraph.png new file mode 100644 index 000000000..0d87980cc Binary files /dev/null and b/docs/html/class_message_cache_a7d8db594bd5c90375565decd61911596_icgraph.png differ diff --git a/docs/html/class_message_cache_ab3729d708193c6be1460fb7a2860e03a_icgraph.dot b/docs/html/class_message_cache_ab3729d708193c6be1460fb7a2860e03a_icgraph.dot new file mode 100644 index 000000000..f4219e0d3 --- /dev/null +++ b/docs/html/class_message_cache_ab3729d708193c6be1460fb7a2860e03a_icgraph.dot @@ -0,0 +1,11 @@ +digraph "MessageCache::getPendingCount" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="MessageCache::getPending\lCount",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_message_cache_ab3729d708193c6be1460fb7a2860e03a_icgraph.map b/docs/html/class_message_cache_ab3729d708193c6be1460fb7a2860e03a_icgraph.map new file mode 100644 index 000000000..d30f0e3a7 --- /dev/null +++ b/docs/html/class_message_cache_ab3729d708193c6be1460fb7a2860e03a_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/class_message_cache_ab3729d708193c6be1460fb7a2860e03a_icgraph.md5 b/docs/html/class_message_cache_ab3729d708193c6be1460fb7a2860e03a_icgraph.md5 new file mode 100644 index 000000000..0c1c27698 --- /dev/null +++ b/docs/html/class_message_cache_ab3729d708193c6be1460fb7a2860e03a_icgraph.md5 @@ -0,0 +1 @@ +ed9b2b1af5a618d8e321927477e5621c \ No newline at end of file diff --git a/docs/html/class_message_cache_ab3729d708193c6be1460fb7a2860e03a_icgraph.png b/docs/html/class_message_cache_ab3729d708193c6be1460fb7a2860e03a_icgraph.png new file mode 100644 index 000000000..2ce80bcb4 Binary files /dev/null and b/docs/html/class_message_cache_ab3729d708193c6be1460fb7a2860e03a_icgraph.png differ diff --git a/docs/html/class_message_cache_aba79bed3c66e3fe011ae25ed45bb9f8b_icgraph.dot b/docs/html/class_message_cache_aba79bed3c66e3fe011ae25ed45bb9f8b_icgraph.dot new file mode 100644 index 000000000..d8644fe0d --- /dev/null +++ b/docs/html/class_message_cache_aba79bed3c66e3fe011ae25ed45bb9f8b_icgraph.dot @@ -0,0 +1,11 @@ +digraph "MessageCache::getTotalCount" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="MessageCache::getTotalCount",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_message_cache_aba79bed3c66e3fe011ae25ed45bb9f8b_icgraph.map b/docs/html/class_message_cache_aba79bed3c66e3fe011ae25ed45bb9f8b_icgraph.map new file mode 100644 index 000000000..3a4770867 --- /dev/null +++ b/docs/html/class_message_cache_aba79bed3c66e3fe011ae25ed45bb9f8b_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/class_message_cache_aba79bed3c66e3fe011ae25ed45bb9f8b_icgraph.md5 b/docs/html/class_message_cache_aba79bed3c66e3fe011ae25ed45bb9f8b_icgraph.md5 new file mode 100644 index 000000000..ba87ec783 --- /dev/null +++ b/docs/html/class_message_cache_aba79bed3c66e3fe011ae25ed45bb9f8b_icgraph.md5 @@ -0,0 +1 @@ +4e316bed86ce7c5ff2456e09e4adae7e \ No newline at end of file diff --git a/docs/html/class_message_cache_aba79bed3c66e3fe011ae25ed45bb9f8b_icgraph.png b/docs/html/class_message_cache_aba79bed3c66e3fe011ae25ed45bb9f8b_icgraph.png new file mode 100644 index 000000000..63b1befa9 Binary files /dev/null and b/docs/html/class_message_cache_aba79bed3c66e3fe011ae25ed45bb9f8b_icgraph.png differ diff --git a/docs/html/class_message_cache_abe7996aada9f77e39d9ed2d830dcddb9_icgraph.dot b/docs/html/class_message_cache_abe7996aada9f77e39d9ed2d830dcddb9_icgraph.dot new file mode 100644 index 000000000..3ac46b105 --- /dev/null +++ b/docs/html/class_message_cache_abe7996aada9f77e39d9ed2d830dcddb9_icgraph.dot @@ -0,0 +1,11 @@ +digraph "MessageCache::setReprocessDelay" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="MessageCache::setReprocess\lDelay",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_message_cache_abe7996aada9f77e39d9ed2d830dcddb9_icgraph.map b/docs/html/class_message_cache_abe7996aada9f77e39d9ed2d830dcddb9_icgraph.map new file mode 100644 index 000000000..4b234adc5 --- /dev/null +++ b/docs/html/class_message_cache_abe7996aada9f77e39d9ed2d830dcddb9_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/class_message_cache_abe7996aada9f77e39d9ed2d830dcddb9_icgraph.md5 b/docs/html/class_message_cache_abe7996aada9f77e39d9ed2d830dcddb9_icgraph.md5 new file mode 100644 index 000000000..c778bb704 --- /dev/null +++ b/docs/html/class_message_cache_abe7996aada9f77e39d9ed2d830dcddb9_icgraph.md5 @@ -0,0 +1 @@ +5d81741793157bfe6277ccfc35710531 \ No newline at end of file diff --git a/docs/html/class_message_cache_abe7996aada9f77e39d9ed2d830dcddb9_icgraph.png b/docs/html/class_message_cache_abe7996aada9f77e39d9ed2d830dcddb9_icgraph.png new file mode 100644 index 000000000..2cd63e13c Binary files /dev/null and b/docs/html/class_message_cache_abe7996aada9f77e39d9ed2d830dcddb9_icgraph.png differ diff --git a/docs/html/class_message_cache_ae986415d8621c4d18493379325ce04cc_icgraph.dot b/docs/html/class_message_cache_ae986415d8621c4d18493379325ce04cc_icgraph.dot new file mode 100644 index 000000000..158aca970 --- /dev/null +++ b/docs/html/class_message_cache_ae986415d8621c4d18493379325ce04cc_icgraph.dot @@ -0,0 +1,11 @@ +digraph "MessageCache::init" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="MessageCache::init",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_message_cache_ae986415d8621c4d18493379325ce04cc_icgraph.map b/docs/html/class_message_cache_ae986415d8621c4d18493379325ce04cc_icgraph.map new file mode 100644 index 000000000..1e4526d77 --- /dev/null +++ b/docs/html/class_message_cache_ae986415d8621c4d18493379325ce04cc_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/class_message_cache_ae986415d8621c4d18493379325ce04cc_icgraph.md5 b/docs/html/class_message_cache_ae986415d8621c4d18493379325ce04cc_icgraph.md5 new file mode 100644 index 000000000..a1285dd5b --- /dev/null +++ b/docs/html/class_message_cache_ae986415d8621c4d18493379325ce04cc_icgraph.md5 @@ -0,0 +1 @@ +f606483dbeb8b55665e8bf4aaacddf39 \ No newline at end of file diff --git a/docs/html/class_message_cache_ae986415d8621c4d18493379325ce04cc_icgraph.png b/docs/html/class_message_cache_ae986415d8621c4d18493379325ce04cc_icgraph.png new file mode 100644 index 000000000..17efe909e Binary files /dev/null and b/docs/html/class_message_cache_ae986415d8621c4d18493379325ce04cc_icgraph.png differ diff --git a/docs/html/class_order_processor-members.html b/docs/html/class_order_processor-members.html new file mode 100644 index 000000000..c1c1683f9 --- /dev/null +++ b/docs/html/class_order_processor-members.html @@ -0,0 +1,138 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
OrderProcessor Список членов класса
+
+
+ +

Полный список членов класса OrderProcessor, включая наследуемые из базового класса

+ + + + +
OrderProcessor(database::PostgreSQL &db, MessageCache &cache, KafkaProducer &error_producer)OrderProcessor
processMessage(const std::string &key, const std::string &value, int64_t timestamp)OrderProcessor
reprocessPendingMessages()OrderProcessor
+
+
+ + + + diff --git a/docs/html/class_order_processor.html b/docs/html/class_order_processor.html new file mode 100644 index 000000000..41ec0977f --- /dev/null +++ b/docs/html/class_order_processor.html @@ -0,0 +1,293 @@ + + + + + + + +Kafka-1C Connector: Класс OrderProcessor + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Класс OrderProcessor
+
+
+ +

#include <order_processor.hpp>

+ + + + + +

+Открытые члены

 OrderProcessor (database::PostgreSQL &db, MessageCache &cache, KafkaProducer &error_producer)
bool processMessage (const std::string &key, const std::string &value, int64_t timestamp)
void reprocessPendingMessages ()
+

Подробное описание

+
+

См. определение в файле order_processor.hpp строка 11

+

Конструктор(ы)

+ +

◆ OrderProcessor()

+ +
+
+ + + + + + + + + + + + + + + + +
OrderProcessor::OrderProcessor (database::PostgreSQL & db,
MessageCache & cache,
KafkaProducer & error_producer )
+
+ +

См. определение в файле order_processor.cpp строка 12

+ +
+
+

Методы

+ +

◆ processMessage()

+ +
+
+ + + + + + + + + + + + + + + + +
bool OrderProcessor::processMessage (const std::string & key,
const std::string & value,
int64_t timestamp )
+
+ +

См. определение в файле order_processor.cpp строка 90

+
+Граф вызовов:
+
+
+ + + + + + + + + + + + + + + +
+
+Граф вызова функции:
+
+
+ + + + + + + +
+ +
+
+ +

◆ reprocessPendingMessages()

+ +
+
+ + + + + + + +
void OrderProcessor::reprocessPendingMessages ()
+
+ +

См. определение в файле order_processor.cpp строка 179

+
+Граф вызовов:
+
+
+ + + + + + + + + + + +
+
+Граф вызова функции:
+
+
+ + + + + + + +
+ +
+
+
Объявления и описания членов классов находятся в файлах: +
+
+ +
+ + + + diff --git a/docs/html/class_order_processor.js b/docs/html/class_order_processor.js new file mode 100644 index 000000000..27cbe97fb --- /dev/null +++ b/docs/html/class_order_processor.js @@ -0,0 +1,6 @@ +var class_order_processor = +[ + [ "OrderProcessor", "class_order_processor.html#a7686bf7d98b381b0fe4db4039766d255", null ], + [ "processMessage", "class_order_processor.html#a6f8aa8e2aeb597be492065036c2f23f5", null ], + [ "reprocessPendingMessages", "class_order_processor.html#af7a710bdbf4bd5c4578db73437477a5f", null ] +]; \ No newline at end of file diff --git a/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_cgraph.dot b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_cgraph.dot new file mode 100644 index 000000000..cfbbafe50 --- /dev/null +++ b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_cgraph.dot @@ -0,0 +1,21 @@ +digraph "OrderProcessor::processMessage" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="OrderProcessor::processMessage",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Logger::debug",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aed78385ee0ad9d124521735894abab46",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="Logger::error",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aafe8b4f6ed1259fbde150ab59e0785e7",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="OrderData::fromJson",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$struct_order_data.html#a3e88570de45cee6e214655aa12ed42f3",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="Logger::info",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a474176e6966186566a2a321cb5cbd739",tooltip=" "]; + Node1 -> Node6 [id="edge5_Node000001_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="JsonParser::validate",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_json_parser.html#a1d6b83be5c0757b3a628a7c1737e4628",tooltip=" "]; + Node1 -> Node7 [id="edge6_Node000001_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="Logger::warning",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a5025d14c1f40cc23e9cbb48f98f0d9a6",tooltip=" "]; +} diff --git a/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_cgraph.map b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_cgraph.map new file mode 100644 index 000000000..5e5889e17 --- /dev/null +++ b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_cgraph.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_cgraph.md5 b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_cgraph.md5 new file mode 100644 index 000000000..4c207c88b --- /dev/null +++ b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_cgraph.md5 @@ -0,0 +1 @@ +99b54546d30471a50e87323382d5a5c0 \ No newline at end of file diff --git a/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_cgraph.png b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_cgraph.png new file mode 100644 index 000000000..aa277b4ed Binary files /dev/null and b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_cgraph.png differ diff --git a/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_icgraph.dot b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_icgraph.dot new file mode 100644 index 000000000..8cdedbe1c --- /dev/null +++ b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_icgraph.dot @@ -0,0 +1,13 @@ +digraph "OrderProcessor::processMessage" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="OrderProcessor::processMessage",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="runConsumer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_icgraph.map b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_icgraph.map new file mode 100644 index 000000000..8eb031387 --- /dev/null +++ b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_icgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_icgraph.md5 b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_icgraph.md5 new file mode 100644 index 000000000..836950fcd --- /dev/null +++ b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_icgraph.md5 @@ -0,0 +1 @@ +a522a6ba64b872743c8221fe193eeb8f \ No newline at end of file diff --git a/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_icgraph.png b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_icgraph.png new file mode 100644 index 000000000..44b8abf3a Binary files /dev/null and b/docs/html/class_order_processor_a6f8aa8e2aeb597be492065036c2f23f5_icgraph.png differ diff --git a/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_cgraph.dot b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_cgraph.dot new file mode 100644 index 000000000..578cf1f5b --- /dev/null +++ b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_cgraph.dot @@ -0,0 +1,17 @@ +digraph "OrderProcessor::reprocessPendingMessages" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="OrderProcessor::reprocess\lPendingMessages",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Logger::error",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aafe8b4f6ed1259fbde150ab59e0785e7",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="OrderData::fromJson",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$struct_order_data.html#a3e88570de45cee6e214655aa12ed42f3",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="Logger::info",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a474176e6966186566a2a321cb5cbd739",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="JsonParser::validate",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_json_parser.html#a1d6b83be5c0757b3a628a7c1737e4628",tooltip=" "]; +} diff --git a/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_cgraph.map b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_cgraph.map new file mode 100644 index 000000000..88e1cc4ea --- /dev/null +++ b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_cgraph.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_cgraph.md5 b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_cgraph.md5 new file mode 100644 index 000000000..97d5e4bf2 --- /dev/null +++ b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_cgraph.md5 @@ -0,0 +1 @@ +e1e5c658b0d502de001d0367ba4906ae \ No newline at end of file diff --git a/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_cgraph.png b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_cgraph.png new file mode 100644 index 000000000..f4f4c2445 Binary files /dev/null and b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_cgraph.png differ diff --git a/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_icgraph.dot b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_icgraph.dot new file mode 100644 index 000000000..9dd8943ad --- /dev/null +++ b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_icgraph.dot @@ -0,0 +1,13 @@ +digraph "OrderProcessor::reprocessPendingMessages" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="OrderProcessor::reprocess\lPendingMessages",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="runConsumer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_icgraph.map b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_icgraph.map new file mode 100644 index 000000000..32d2080ac --- /dev/null +++ b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_icgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_icgraph.md5 b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_icgraph.md5 new file mode 100644 index 000000000..6b9a45257 --- /dev/null +++ b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_icgraph.md5 @@ -0,0 +1 @@ +dc715e54a82801b40fafa3e88fb90568 \ No newline at end of file diff --git a/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_icgraph.png b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_icgraph.png new file mode 100644 index 000000000..964246ab7 Binary files /dev/null and b/docs/html/class_order_processor_af7a710bdbf4bd5c4578db73437477a5f_icgraph.png differ diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l-members.html b/docs/html/classdatabase_1_1_postgre_s_q_l-members.html new file mode 100644 index 000000000..9a8e2935b --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l-members.html @@ -0,0 +1,149 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
database::PostgreSQL Список членов класса
+
+
+ +

Полный список членов класса database::PostgreSQL, включая наследуемые из базового класса

+ + + + + + + + + + + + + + + +
connect()database::PostgreSQL
createClient(const std::string &inn, const std::string &kpp, const std::string &name)database::PostgreSQL
createOrder(const std::string &client_id, const std::string &date, const std::string &number, const std::vector< OrderItem > &items)database::PostgreSQL
disconnect()database::PostgreSQL
execute(const std::string &sql)database::PostgreSQL
executeParams(const std::string &sql, const std::vector< std::string > &params)database::PostgreSQL
findClient(const std::string &inn, const std::string &kpp="")database::PostgreSQL
findProductByArticle(const std::string &article)database::PostgreSQL
isConnected() constdatabase::PostgreSQL
logKafkaMessage(long long linux_time, const std::string &tin, const std::string &trrc, const std::string &json_data)database::PostgreSQL
PostgreSQL()database::PostgreSQL
PostgreSQL(const ConnectionParams &params)database::PostgreSQL
query(const std::string &sql)database::PostgreSQL
~PostgreSQL()database::PostgreSQL
+
+
+ + + + diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l.html b/docs/html/classdatabase_1_1_postgre_s_q_l.html new file mode 100644 index 000000000..3c0b2da83 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l.html @@ -0,0 +1,611 @@ + + + + + + + +Kafka-1C Connector: Класс database::PostgreSQL + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Класс database::PostgreSQL
+
+
+ +

#include <postgresql.hpp>

+ + + + + + + + + + + + + + + + +

+Открытые члены

 PostgreSQL ()
 PostgreSQL (const ConnectionParams &params)
 ~PostgreSQL ()
bool connect ()
bool isConnected () const
void disconnect ()
bool execute (const std::string &sql)
bool executeParams (const std::string &sql, const std::vector< std::string > &params)
pqxx::result query (const std::string &sql)
std::optional< ClientfindClient (const std::string &inn, const std::string &kpp="")
std::string createClient (const std::string &inn, const std::string &kpp, const std::string &name)
std::optional< ProductfindProductByArticle (const std::string &article)
std::string createOrder (const std::string &client_id, const std::string &date, const std::string &number, const std::vector< OrderItem > &items)
void logKafkaMessage (long long linux_time, const std::string &tin, const std::string &trrc, const std::string &json_data)
+

Подробное описание

+
+

См. определение в файле postgresql.hpp строка 64

+

Конструктор(ы)

+ +

◆ PostgreSQL() [1/2]

+ +
+
+ + + + + + + +
database::PostgreSQL::PostgreSQL ()
+
+ +

См. определение в файле postgresql.cpp строка 17

+ +
+
+ +

◆ PostgreSQL() [2/2]

+ +
+
+ + + + + + + +
database::PostgreSQL::PostgreSQL (const ConnectionParams & params)
+
+ +

См. определение в файле postgresql.cpp строка 20

+ +
+
+ +

◆ ~PostgreSQL()

+ +
+
+ + + + + + + +
database::PostgreSQL::~PostgreSQL ()
+
+ +

См. определение в файле postgresql.cpp строка 23

+
+Граф вызовов:
+
+
+ + + + + +
+ +
+
+

Методы

+ +

◆ connect()

+ +
+
+ + + + + + + +
bool database::PostgreSQL::connect ()
+
+ +

См. определение в файле postgresql.cpp строка 32

+
+Граф вызовов:
+
+
+ + + + + + + +
+
+Граф вызова функции:
+
+
+ + + + + +
+ +
+
+ +

◆ createClient()

+ +
+
+ + + + + + + + + + + + + + + + +
std::string database::PostgreSQL::createClient (const std::string & inn,
const std::string & kpp,
const std::string & name )
+
+ +

См. определение в файле postgresql.cpp строка 362

+ +
+
+ +

◆ createOrder()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
std::string database::PostgreSQL::createOrder (const std::string & client_id,
const std::string & date,
const std::string & number,
const std::vector< OrderItem > & items )
+
+ +

См. определение в файле postgresql.cpp строка 462

+ +
+
+ +

◆ disconnect()

+ +
+
+ + + + + + + +
void database::PostgreSQL::disconnect ()
+
+ +

См. определение в файле postgresql.cpp строка 81

+
+Граф вызова функции:
+
+
+ + + + + +
+ +
+
+ +

◆ execute()

+ +
+
+ + + + + + + +
bool database::PostgreSQL::execute (const std::string & sql)
+
+ +

См. определение в файле postgresql.cpp строка 95

+
+Граф вызовов:
+
+
+ + + + + + + +
+ +
+
+ +

◆ executeParams()

+ +
+
+ + + + + + + + + + + +
bool database::PostgreSQL::executeParams (const std::string & sql,
const std::vector< std::string > & params )
+
+ +

См. определение в файле postgresql.cpp строка 118

+
+Граф вызовов:
+
+
+ + + + + + + + + + + +
+ +
+
+ +

◆ findClient()

+ +
+
+ + + + + + + + + + + +
std::optional< Client > database::PostgreSQL::findClient (const std::string & inn,
const std::string & kpp = "" )
+
+ +

См. определение в файле postgresql.cpp строка 307

+
+Граф вызовов:
+
+
+ + + + + + + + + + + + + + + +
+ +
+
+ +

◆ findProductByArticle()

+ +
+
+ + + + + + + +
std::optional< Product > database::PostgreSQL::findProductByArticle (const std::string & article)
+
+ +

См. определение в файле postgresql.cpp строка 420

+ +
+
+ +

◆ isConnected()

+ +
+
+ + + + + + + +
bool database::PostgreSQL::isConnected () const
+
+ +

См. определение в файле postgresql.cpp строка 76

+
+Граф вызова функции:
+
+
+ + + + + + + + + + + + +
+ +
+
+ +

◆ logKafkaMessage()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
void database::PostgreSQL::logKafkaMessage (long long linux_time,
const std::string & tin,
const std::string & trrc,
const std::string & json_data )
+
+ +

См. определение в файле postgresql.cpp строка 537

+ +
+
+ +

◆ query()

+ +
+
+ + + + + + + +
pqxx::result database::PostgreSQL::query (const std::string & sql)
+
+ +

См. определение в файле postgresql.cpp строка 153

+
+Граф вызовов:
+
+
+ + + + + + + +
+
+Граф вызова функции:
+
+
+ + + + + + + +
+ +
+
+
Объявления и описания членов классов находятся в файлах: +
+
+ +
+ + + + diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l.js b/docs/html/classdatabase_1_1_postgre_s_q_l.js new file mode 100644 index 000000000..f651f4aa9 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l.js @@ -0,0 +1,17 @@ +var classdatabase_1_1_postgre_s_q_l = +[ + [ "PostgreSQL", "classdatabase_1_1_postgre_s_q_l.html#afa4286fcc9ddb506fc30b9d934615b0f", null ], + [ "PostgreSQL", "classdatabase_1_1_postgre_s_q_l.html#aa38b062a15f9d260deb2b39f8f72f8e7", null ], + [ "~PostgreSQL", "classdatabase_1_1_postgre_s_q_l.html#a372a7ea6dc198d0ed42190d114980e39", null ], + [ "connect", "classdatabase_1_1_postgre_s_q_l.html#a785b7fa2f3259b5258c06bfbd9e8b2c3", null ], + [ "createClient", "classdatabase_1_1_postgre_s_q_l.html#ac22c54f52920ec67e8579bb70f360949", null ], + [ "createOrder", "classdatabase_1_1_postgre_s_q_l.html#a6773124fa34e1abd8758791867453058", null ], + [ "disconnect", "classdatabase_1_1_postgre_s_q_l.html#af41a6c8beb9e194a4c1bdfa346d0712d", null ], + [ "execute", "classdatabase_1_1_postgre_s_q_l.html#aae16b58e807cbaf423edb361275dc018", null ], + [ "executeParams", "classdatabase_1_1_postgre_s_q_l.html#a1b682272e817f53fe4f0ccfcb727e253", null ], + [ "findClient", "classdatabase_1_1_postgre_s_q_l.html#a78e26c9484a4cda19507c89600f609b6", null ], + [ "findProductByArticle", "classdatabase_1_1_postgre_s_q_l.html#a4a090045c1149fcfef8b05415d41e6fb", null ], + [ "isConnected", "classdatabase_1_1_postgre_s_q_l.html#af9b6445361883ff9a3dd155fc9bf1b52", null ], + [ "logKafkaMessage", "classdatabase_1_1_postgre_s_q_l.html#af10309b83ba66fdfdbf86871653cbab7", null ], + [ "query", "classdatabase_1_1_postgre_s_q_l.html#a95022441d5201d81365056c401ec2474", null ] +]; \ No newline at end of file diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a1b682272e817f53fe4f0ccfcb727e253_cgraph.dot b/docs/html/classdatabase_1_1_postgre_s_q_l_a1b682272e817f53fe4f0ccfcb727e253_cgraph.dot new file mode 100644 index 000000000..93a39ee91 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a1b682272e817f53fe4f0ccfcb727e253_cgraph.dot @@ -0,0 +1,17 @@ +digraph "database::PostgreSQL::executeParams" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="database::PostgreSQL\l::executeParams",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Logger::error",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aafe8b4f6ed1259fbde150ab59e0785e7",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="database::PostgreSQL\l::isConnected",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#af9b6445361883ff9a3dd155fc9bf1b52",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="database::PostgreSQL\l::query",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a95022441d5201d81365056c401ec2474",tooltip=" "]; + Node4 -> Node2 [id="edge4_Node000004_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node4 -> Node3 [id="edge5_Node000004_Node000003",color="steelblue1",style="solid",tooltip=" "]; +} diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a1b682272e817f53fe4f0ccfcb727e253_cgraph.map b/docs/html/classdatabase_1_1_postgre_s_q_l_a1b682272e817f53fe4f0ccfcb727e253_cgraph.map new file mode 100644 index 000000000..458f04949 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a1b682272e817f53fe4f0ccfcb727e253_cgraph.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a1b682272e817f53fe4f0ccfcb727e253_cgraph.md5 b/docs/html/classdatabase_1_1_postgre_s_q_l_a1b682272e817f53fe4f0ccfcb727e253_cgraph.md5 new file mode 100644 index 000000000..916ec3838 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a1b682272e817f53fe4f0ccfcb727e253_cgraph.md5 @@ -0,0 +1 @@ +b9e0654265c43d6682c211a7f9154833 \ No newline at end of file diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a1b682272e817f53fe4f0ccfcb727e253_cgraph.png b/docs/html/classdatabase_1_1_postgre_s_q_l_a1b682272e817f53fe4f0ccfcb727e253_cgraph.png new file mode 100644 index 000000000..934247936 Binary files /dev/null and b/docs/html/classdatabase_1_1_postgre_s_q_l_a1b682272e817f53fe4f0ccfcb727e253_cgraph.png differ diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a372a7ea6dc198d0ed42190d114980e39_cgraph.dot b/docs/html/classdatabase_1_1_postgre_s_q_l_a372a7ea6dc198d0ed42190d114980e39_cgraph.dot new file mode 100644 index 000000000..f7746a43f --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a372a7ea6dc198d0ed42190d114980e39_cgraph.dot @@ -0,0 +1,11 @@ +digraph "database::PostgreSQL::~PostgreSQL" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="database::PostgreSQL\l::~PostgreSQL",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="database::PostgreSQL\l::disconnect",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#af41a6c8beb9e194a4c1bdfa346d0712d",tooltip=" "]; +} diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a372a7ea6dc198d0ed42190d114980e39_cgraph.map b/docs/html/classdatabase_1_1_postgre_s_q_l_a372a7ea6dc198d0ed42190d114980e39_cgraph.map new file mode 100644 index 000000000..efcbd3e54 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a372a7ea6dc198d0ed42190d114980e39_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a372a7ea6dc198d0ed42190d114980e39_cgraph.md5 b/docs/html/classdatabase_1_1_postgre_s_q_l_a372a7ea6dc198d0ed42190d114980e39_cgraph.md5 new file mode 100644 index 000000000..15ed0d289 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a372a7ea6dc198d0ed42190d114980e39_cgraph.md5 @@ -0,0 +1 @@ +092b36eea0205cb7fbbf264243acc506 \ No newline at end of file diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a372a7ea6dc198d0ed42190d114980e39_cgraph.png b/docs/html/classdatabase_1_1_postgre_s_q_l_a372a7ea6dc198d0ed42190d114980e39_cgraph.png new file mode 100644 index 000000000..72bafccab Binary files /dev/null and b/docs/html/classdatabase_1_1_postgre_s_q_l_a372a7ea6dc198d0ed42190d114980e39_cgraph.png differ diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_cgraph.dot b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_cgraph.dot new file mode 100644 index 000000000..10b1a50b8 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_cgraph.dot @@ -0,0 +1,13 @@ +digraph "database::PostgreSQL::connect" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="database::PostgreSQL\l::connect",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Logger::error",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aafe8b4f6ed1259fbde150ab59e0785e7",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="Logger::info",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a474176e6966186566a2a321cb5cbd739",tooltip=" "]; +} diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_cgraph.map b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_cgraph.map new file mode 100644 index 000000000..223423916 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_cgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_cgraph.md5 b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_cgraph.md5 new file mode 100644 index 000000000..d798051f6 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_cgraph.md5 @@ -0,0 +1 @@ +cc3f6ff35471f4661e4a627b1eccff1c \ No newline at end of file diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_cgraph.png b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_cgraph.png new file mode 100644 index 000000000..129680996 Binary files /dev/null and b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_cgraph.png differ diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_icgraph.dot b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_icgraph.dot new file mode 100644 index 000000000..cf2916c4f --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_icgraph.dot @@ -0,0 +1,11 @@ +digraph "database::PostgreSQL::connect" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="database::PostgreSQL\l::connect",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_icgraph.map b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_icgraph.map new file mode 100644 index 000000000..89a1dcd66 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_icgraph.md5 b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_icgraph.md5 new file mode 100644 index 000000000..3714e2233 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_icgraph.md5 @@ -0,0 +1 @@ +ae705ec01da91473ed7195dd211a0efd \ No newline at end of file diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_icgraph.png b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_icgraph.png new file mode 100644 index 000000000..857e5d122 Binary files /dev/null and b/docs/html/classdatabase_1_1_postgre_s_q_l_a785b7fa2f3259b5258c06bfbd9e8b2c3_icgraph.png differ diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a78e26c9484a4cda19507c89600f609b6_cgraph.dot b/docs/html/classdatabase_1_1_postgre_s_q_l_a78e26c9484a4cda19507c89600f609b6_cgraph.dot new file mode 100644 index 000000000..a7d15cba4 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a78e26c9484a4cda19507c89600f609b6_cgraph.dot @@ -0,0 +1,21 @@ +digraph "database::PostgreSQL::findClient" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="database::PostgreSQL\l::findClient",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Logger::debug",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aed78385ee0ad9d124521735894abab46",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="Logger::info",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a474176e6966186566a2a321cb5cbd739",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="database::PostgreSQL\l::query",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a95022441d5201d81365056c401ec2474",tooltip=" "]; + Node4 -> Node5 [id="edge4_Node000004_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="Logger::error",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aafe8b4f6ed1259fbde150ab59e0785e7",tooltip=" "]; + Node4 -> Node6 [id="edge5_Node000004_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="database::PostgreSQL\l::isConnected",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#af9b6445361883ff9a3dd155fc9bf1b52",tooltip=" "]; + Node1 -> Node7 [id="edge6_Node000001_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="Logger::warning",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a5025d14c1f40cc23e9cbb48f98f0d9a6",tooltip=" "]; +} diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a78e26c9484a4cda19507c89600f609b6_cgraph.map b/docs/html/classdatabase_1_1_postgre_s_q_l_a78e26c9484a4cda19507c89600f609b6_cgraph.map new file mode 100644 index 000000000..1120b5efb --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a78e26c9484a4cda19507c89600f609b6_cgraph.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a78e26c9484a4cda19507c89600f609b6_cgraph.md5 b/docs/html/classdatabase_1_1_postgre_s_q_l_a78e26c9484a4cda19507c89600f609b6_cgraph.md5 new file mode 100644 index 000000000..aabe75813 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a78e26c9484a4cda19507c89600f609b6_cgraph.md5 @@ -0,0 +1 @@ +97e72d48d7ccf772af06f13f91b8ac5d \ No newline at end of file diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a78e26c9484a4cda19507c89600f609b6_cgraph.png b/docs/html/classdatabase_1_1_postgre_s_q_l_a78e26c9484a4cda19507c89600f609b6_cgraph.png new file mode 100644 index 000000000..11baeb2cc Binary files /dev/null and b/docs/html/classdatabase_1_1_postgre_s_q_l_a78e26c9484a4cda19507c89600f609b6_cgraph.png differ diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_cgraph.dot b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_cgraph.dot new file mode 100644 index 000000000..5aed392de --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_cgraph.dot @@ -0,0 +1,13 @@ +digraph "database::PostgreSQL::query" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="database::PostgreSQL\l::query",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Logger::error",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aafe8b4f6ed1259fbde150ab59e0785e7",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="database::PostgreSQL\l::isConnected",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#af9b6445361883ff9a3dd155fc9bf1b52",tooltip=" "]; +} diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_cgraph.map b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_cgraph.map new file mode 100644 index 000000000..20dff48bb --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_cgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_cgraph.md5 b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_cgraph.md5 new file mode 100644 index 000000000..1d474371d --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_cgraph.md5 @@ -0,0 +1 @@ +622c92a2830aaeb1a19445e6e0e7896d \ No newline at end of file diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_cgraph.png b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_cgraph.png new file mode 100644 index 000000000..3002898de Binary files /dev/null and b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_cgraph.png differ diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_icgraph.dot b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_icgraph.dot new file mode 100644 index 000000000..5c807e696 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_icgraph.dot @@ -0,0 +1,13 @@ +digraph "database::PostgreSQL::query" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="database::PostgreSQL\l::query",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="database::PostgreSQL\l::executeParams",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a1b682272e817f53fe4f0ccfcb727e253",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="database::PostgreSQL\l::findClient",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a78e26c9484a4cda19507c89600f609b6",tooltip=" "]; +} diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_icgraph.map b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_icgraph.map new file mode 100644 index 000000000..96bd053b8 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_icgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_icgraph.md5 b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_icgraph.md5 new file mode 100644 index 000000000..c140a67dc --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_icgraph.md5 @@ -0,0 +1 @@ +14f54e9d991eac427bb9845fb21a3261 \ No newline at end of file diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_icgraph.png b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_icgraph.png new file mode 100644 index 000000000..0037a97cf Binary files /dev/null and b/docs/html/classdatabase_1_1_postgre_s_q_l_a95022441d5201d81365056c401ec2474_icgraph.png differ diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_aae16b58e807cbaf423edb361275dc018_cgraph.dot b/docs/html/classdatabase_1_1_postgre_s_q_l_aae16b58e807cbaf423edb361275dc018_cgraph.dot new file mode 100644 index 000000000..16b6e1c3d --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_aae16b58e807cbaf423edb361275dc018_cgraph.dot @@ -0,0 +1,13 @@ +digraph "database::PostgreSQL::execute" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="database::PostgreSQL\l::execute",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Logger::error",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aafe8b4f6ed1259fbde150ab59e0785e7",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="database::PostgreSQL\l::isConnected",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#af9b6445361883ff9a3dd155fc9bf1b52",tooltip=" "]; +} diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_aae16b58e807cbaf423edb361275dc018_cgraph.map b/docs/html/classdatabase_1_1_postgre_s_q_l_aae16b58e807cbaf423edb361275dc018_cgraph.map new file mode 100644 index 000000000..595ab4a91 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_aae16b58e807cbaf423edb361275dc018_cgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_aae16b58e807cbaf423edb361275dc018_cgraph.md5 b/docs/html/classdatabase_1_1_postgre_s_q_l_aae16b58e807cbaf423edb361275dc018_cgraph.md5 new file mode 100644 index 000000000..4d762d350 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_aae16b58e807cbaf423edb361275dc018_cgraph.md5 @@ -0,0 +1 @@ +9140e8fa2f01513131ad86af24b19a0a \ No newline at end of file diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_aae16b58e807cbaf423edb361275dc018_cgraph.png b/docs/html/classdatabase_1_1_postgre_s_q_l_aae16b58e807cbaf423edb361275dc018_cgraph.png new file mode 100644 index 000000000..29ba6ed54 Binary files /dev/null and b/docs/html/classdatabase_1_1_postgre_s_q_l_aae16b58e807cbaf423edb361275dc018_cgraph.png differ diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_af41a6c8beb9e194a4c1bdfa346d0712d_icgraph.dot b/docs/html/classdatabase_1_1_postgre_s_q_l_af41a6c8beb9e194a4c1bdfa346d0712d_icgraph.dot new file mode 100644 index 000000000..8848d9a8f --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_af41a6c8beb9e194a4c1bdfa346d0712d_icgraph.dot @@ -0,0 +1,11 @@ +digraph "database::PostgreSQL::disconnect" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="database::PostgreSQL\l::disconnect",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="database::PostgreSQL\l::~PostgreSQL",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a372a7ea6dc198d0ed42190d114980e39",tooltip=" "]; +} diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_af41a6c8beb9e194a4c1bdfa346d0712d_icgraph.map b/docs/html/classdatabase_1_1_postgre_s_q_l_af41a6c8beb9e194a4c1bdfa346d0712d_icgraph.map new file mode 100644 index 000000000..512ed9074 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_af41a6c8beb9e194a4c1bdfa346d0712d_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_af41a6c8beb9e194a4c1bdfa346d0712d_icgraph.md5 b/docs/html/classdatabase_1_1_postgre_s_q_l_af41a6c8beb9e194a4c1bdfa346d0712d_icgraph.md5 new file mode 100644 index 000000000..9ff8b2ac0 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_af41a6c8beb9e194a4c1bdfa346d0712d_icgraph.md5 @@ -0,0 +1 @@ +940877a23026b546fad9d7057667bbe3 \ No newline at end of file diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_af41a6c8beb9e194a4c1bdfa346d0712d_icgraph.png b/docs/html/classdatabase_1_1_postgre_s_q_l_af41a6c8beb9e194a4c1bdfa346d0712d_icgraph.png new file mode 100644 index 000000000..3b03c2fc3 Binary files /dev/null and b/docs/html/classdatabase_1_1_postgre_s_q_l_af41a6c8beb9e194a4c1bdfa346d0712d_icgraph.png differ diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_af9b6445361883ff9a3dd155fc9bf1b52_icgraph.dot b/docs/html/classdatabase_1_1_postgre_s_q_l_af9b6445361883ff9a3dd155fc9bf1b52_icgraph.dot new file mode 100644 index 000000000..c7f04465f --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_af9b6445361883ff9a3dd155fc9bf1b52_icgraph.dot @@ -0,0 +1,18 @@ +digraph "database::PostgreSQL::isConnected" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="database::PostgreSQL\l::isConnected",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="database::PostgreSQL\l::execute",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#aae16b58e807cbaf423edb361275dc018",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="database::PostgreSQL\l::executeParams",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a1b682272e817f53fe4f0ccfcb727e253",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="database::PostgreSQL\l::query",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a95022441d5201d81365056c401ec2474",tooltip=" "]; + Node4 -> Node3 [id="edge4_Node000004_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 -> Node5 [id="edge5_Node000004_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="database::PostgreSQL\l::findClient",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a78e26c9484a4cda19507c89600f609b6",tooltip=" "]; +} diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_af9b6445361883ff9a3dd155fc9bf1b52_icgraph.map b/docs/html/classdatabase_1_1_postgre_s_q_l_af9b6445361883ff9a3dd155fc9bf1b52_icgraph.map new file mode 100644 index 000000000..c3efabfa4 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_af9b6445361883ff9a3dd155fc9bf1b52_icgraph.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_af9b6445361883ff9a3dd155fc9bf1b52_icgraph.md5 b/docs/html/classdatabase_1_1_postgre_s_q_l_af9b6445361883ff9a3dd155fc9bf1b52_icgraph.md5 new file mode 100644 index 000000000..ea2de9698 --- /dev/null +++ b/docs/html/classdatabase_1_1_postgre_s_q_l_af9b6445361883ff9a3dd155fc9bf1b52_icgraph.md5 @@ -0,0 +1 @@ +6887e3a985e939f051172a482888ec49 \ No newline at end of file diff --git a/docs/html/classdatabase_1_1_postgre_s_q_l_af9b6445361883ff9a3dd155fc9bf1b52_icgraph.png b/docs/html/classdatabase_1_1_postgre_s_q_l_af9b6445361883ff9a3dd155fc9bf1b52_icgraph.png new file mode 100644 index 000000000..6dc2144d1 Binary files /dev/null and b/docs/html/classdatabase_1_1_postgre_s_q_l_af9b6445361883ff9a3dd155fc9bf1b52_icgraph.png differ diff --git a/docs/html/classes.html b/docs/html/classes.html new file mode 100644 index 000000000..ae4ab5262 --- /dev/null +++ b/docs/html/classes.html @@ -0,0 +1,168 @@ + + + + + + + +Kafka-1C Connector: Алфавитный указатель классов + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Алфавитный указатель классов
+
+ +
+
+ + + + diff --git a/docs/html/clipboard.js b/docs/html/clipboard.js new file mode 100644 index 000000000..769fe42f4 --- /dev/null +++ b/docs/html/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Скопировать в буфер обмена" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +document.addEventListener('DOMContentLoaded', function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + clipboard_div.addEventListener('click', function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/docs/html/codefolding.js b/docs/html/codefolding.js new file mode 100644 index 000000000..5b55e8b66 --- /dev/null +++ b/docs/html/codefolding.js @@ -0,0 +1,143 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2026 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +let codefold = { + opened : true, + + show_plus : function(el) { + if (el) { + el.classList.remove('minus'); + el.classList.add('plus'); + } + }, + + show_minus : function(el) { + if (el) { + el.classList.add('minus'); + el.classList.remove('plus'); + } + }, + + // toggle all folding blocks + toggle_all : function() { + if (this.opened) { + const foldAll = document.getElementById('fold_all'); + this.show_plus(foldAll); + document.querySelectorAll('div[id^=foldopen]').forEach(el => el.style.display = 'none'); + document.querySelectorAll('div[id^=foldclosed]').forEach(el => el.style.display = ''); + document.querySelectorAll('div[id^=foldclosed] span.fold').forEach(el => this.show_plus(el)); + } else { + const foldAll = document.getElementById('fold_all'); + this.show_minus(foldAll); + document.querySelectorAll('div[id^=foldopen]').forEach(el => el.style.display = ''); + document.querySelectorAll('div[id^=foldclosed]').forEach(el => el.style.display = 'none'); + } + this.opened=!this.opened; + }, + + // toggle single folding block + toggle : function(id) { + const openEl = document.getElementById('foldopen'+id); + const closedEl = document.getElementById('foldclosed'+id); + if (openEl) { + openEl.style.display = openEl.style.display === 'none' ? '' : 'none'; + const nextEl = openEl.nextElementSibling; + if (nextEl) { + nextEl.querySelectorAll('span.fold').forEach(el => this.show_plus(el)); + } + } + if (closedEl) { + closedEl.style.display = closedEl.style.display === 'none' ? '' : 'none'; + } + }, + + init : function() { + // add code folding line and global control + document.querySelectorAll('span.lineno').forEach((el, index) => { + el.style.paddingRight = '4px'; + el.style.marginRight = '2px'; + el.style.display = 'inline-block'; + el.style.width = '54px'; + el.style.background = 'linear-gradient(var(--fold-line-color),var(--fold-line-color)) no-repeat 46px/2px 100%'; + const span = document.createElement('span'); + if (index === 0) { // add global toggle to first line + span.className = 'fold minus'; + span.id = 'fold_all'; + span.onclick = () => codefold.toggle_all(); + } else { // add vertical lines to other rows + span.className = 'fold' + } + el.appendChild(span); + }); + // add toggle controls to lines with fold divs + document.querySelectorAll('div.foldopen').forEach(el => { + // extract specific id to use + const id = el.getAttribute('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = el.getAttribute('data-start'); + const end = el.getAttribute('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + const firstFold = el.querySelector('span.fold'); + if (firstFold) { + const span = document.createElement('span'); + span.className = 'fold minus'; + span.onclick = () => codefold.toggle(id); + firstFold.replaceWith(span); + } + // append div for folded (closed) representation + const closedDiv = document.createElement('div'); + closedDiv.id = 'foldclosed'+id; + closedDiv.className = 'foldclosed'; + closedDiv.style.display = 'none'; + el.after(closedDiv); + // extract the first line from the "open" section to represent closed content + const line = el.children[0] ? el.children[0].cloneNode(true) : null; + if (line) { + // remove any glow that might still be active on the original line + line.classList.remove('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + line.innerHTML = line.innerHTML.replace(new RegExp('\\s*'+start+'\\s*$','g'),''); + } + // replace minus with plus symbol + line.querySelectorAll('span.fold').forEach(span => { + codefold.show_plus(span); + // re-apply click handler as it is not copied with cloneNode + span.onclick = () => codefold.toggle(id); + }); + // append ellipsis + const ellipsisLink = document.createElement('a'); + ellipsisLink.href = "javascript:codefold.toggle('"+id+"')"; + ellipsisLink.innerHTML = '…'; + line.appendChild(document.createTextNode(' '+start)); + line.appendChild(ellipsisLink); + line.appendChild(document.createTextNode(end)); + // insert constructed line into closed div + closedDiv.appendChild(line); + } + }); + }, +}; +/* @license-end */ diff --git a/docs/html/config_8hpp.html b/docs/html/config_8hpp.html new file mode 100644 index 000000000..f19d090d2 --- /dev/null +++ b/docs/html/config_8hpp.html @@ -0,0 +1,214 @@ + + + + + + + +Kafka-1C Connector: Файл src/config/config.hpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Файл config.hpp
+
+
+
#include <string>
+#include <vector>
+#include <nlohmann/json.hpp>
+#include "../database/postgresql.hpp"
+
+Граф включаемых заголовочных файлов для config.hpp:
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+Граф файлов, в которые включается этот файл:
+
+
+ + + + + +
+
+

См. исходные тексты.

+ + + + + + + + + + + +

+Классы

struct  KafkaConfig
struct  KafkaConfig::Topics
struct  KafkaConfig::Producer
struct  KafkaConfig::Consumer
struct  DatabaseConfig
struct  ProcessingConfig
struct  CacheConfig
struct  GroupConfig
struct  AppConfig
+ + +

+Определения типов

using json = nlohmann::json
+

Типы

+ +

◆ json

+ +
+
+ + + + +
using json = nlohmann::json
+
+ +

См. определение в файле config.hpp строка 8

+ +
+
+
+
+ +
+ + + + diff --git a/docs/html/config_8hpp.js b/docs/html/config_8hpp.js new file mode 100644 index 000000000..ee7e6a46b --- /dev/null +++ b/docs/html/config_8hpp.js @@ -0,0 +1,13 @@ +var config_8hpp = +[ + [ "KafkaConfig", "struct_kafka_config.html", "struct_kafka_config" ], + [ "KafkaConfig::Topics", "struct_kafka_config_1_1_topics.html", "struct_kafka_config_1_1_topics" ], + [ "KafkaConfig::Producer", "struct_kafka_config_1_1_producer.html", "struct_kafka_config_1_1_producer" ], + [ "KafkaConfig::Consumer", "struct_kafka_config_1_1_consumer.html", "struct_kafka_config_1_1_consumer" ], + [ "DatabaseConfig", "struct_database_config.html", "struct_database_config" ], + [ "ProcessingConfig", "struct_processing_config.html", "struct_processing_config" ], + [ "CacheConfig", "struct_cache_config.html", "struct_cache_config" ], + [ "GroupConfig", "struct_group_config.html", "struct_group_config" ], + [ "AppConfig", "struct_app_config.html", "struct_app_config" ], + [ "json", "config_8hpp.html#ab701e3ac61a85b337ec5c1abaad6742d", null ] +]; \ No newline at end of file diff --git a/docs/html/config_8hpp__dep__incl.dot b/docs/html/config_8hpp__dep__incl.dot new file mode 100644 index 000000000..5f8ca065a --- /dev/null +++ b/docs/html/config_8hpp__dep__incl.dot @@ -0,0 +1,10 @@ +digraph "src/config/config.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/config/config.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="src/main.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html",tooltip=" "]; +} diff --git a/docs/html/config_8hpp__dep__incl.map b/docs/html/config_8hpp__dep__incl.map new file mode 100644 index 000000000..228b45312 --- /dev/null +++ b/docs/html/config_8hpp__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/config_8hpp__dep__incl.md5 b/docs/html/config_8hpp__dep__incl.md5 new file mode 100644 index 000000000..819e86ad3 --- /dev/null +++ b/docs/html/config_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +661757a1cae91ea534494fb82271961e \ No newline at end of file diff --git a/docs/html/config_8hpp__dep__incl.png b/docs/html/config_8hpp__dep__incl.png new file mode 100644 index 000000000..5da7f32d1 Binary files /dev/null and b/docs/html/config_8hpp__dep__incl.png differ diff --git a/docs/html/config_8hpp__incl.dot b/docs/html/config_8hpp__incl.dot new file mode 100644 index 000000000..39059a44e --- /dev/null +++ b/docs/html/config_8hpp__incl.dot @@ -0,0 +1,24 @@ +digraph "src/config/config.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/config/config.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="string",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="vector",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="nlohmann/json.hpp",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="../database/postgresql.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$postgresql_8hpp.html",tooltip=" "]; + Node5 -> Node6 [id="edge5_Node000005_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="pqxx/pqxx",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node5 -> Node2 [id="edge6_Node000005_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node5 -> Node7 [id="edge7_Node000005_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="memory",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node5 -> Node8 [id="edge8_Node000005_Node000008",color="steelblue1",style="solid",tooltip=" "]; + Node8 [id="Node000008",label="optional",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node5 -> Node3 [id="edge9_Node000005_Node000003",color="steelblue1",style="solid",tooltip=" "]; +} diff --git a/docs/html/config_8hpp__incl.map b/docs/html/config_8hpp__incl.map new file mode 100644 index 000000000..12107539e --- /dev/null +++ b/docs/html/config_8hpp__incl.map @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/config_8hpp__incl.md5 b/docs/html/config_8hpp__incl.md5 new file mode 100644 index 000000000..f5414777e --- /dev/null +++ b/docs/html/config_8hpp__incl.md5 @@ -0,0 +1 @@ +b4c8cf561d1a89507902e06d6d28e8cb \ No newline at end of file diff --git a/docs/html/config_8hpp__incl.png b/docs/html/config_8hpp__incl.png new file mode 100644 index 000000000..e648d427a Binary files /dev/null and b/docs/html/config_8hpp__incl.png differ diff --git a/docs/html/config_8hpp_source.html b/docs/html/config_8hpp_source.html new file mode 100644 index 000000000..96922e4ae --- /dev/null +++ b/docs/html/config_8hpp_source.html @@ -0,0 +1,288 @@ + + + + + + + +Kafka-1C Connector: Исходный файл src/config/config.hpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
config.hpp
+
+
+См. документацию.
1#pragma once
+
2
+
3#include <string>
+
4#include <vector>
+
5#include <nlohmann/json.hpp>
+
6#include "../database/postgresql.hpp" // <-- ДОБАВЛЯЕМ
+
7
+
8using json = nlohmann::json;
+
9
+
10// ============================================================
+
11// KafkaConfig
+
12// ============================================================
+
+ +
14{
+
15 std::string bootstrap_servers;
+
+
16 struct Topics
+
17 {
+
18 std::string input;
+
19 std::string output;
+
20 std::string errors;
+ +
+
+
22 struct Producer
+
23 {
+
24 std::string acks;
+ + + + +
+
+
29 struct Consumer
+
30 {
+
31 std::string group_id;
+
32 std::string auto_offset_reset;
+ + +
+
35};
+
+
36
+
37// ============================================================
+
38// DatabaseConfig — используем ConnectionParams из database
+
39// ============================================================
+ +
44
+
45// ============================================================
+
46// ProcessingConfig
+
47// ============================================================
+ +
55
+
56// ============================================================
+
57// CacheConfig
+
58// ============================================================
+
+ +
60{
+
61 std::string path;
+ + +
64 std::string source_prefix; // УНИКАЛЬНЫЙ ПРЕФИКС РАЗДЕЛЕНИЯ ПОТОКОВ В КЭШЕ SQLLITE
+
65};
+
+
66
+
67// ============================================================
+
68// GroupConfig
+
69// ============================================================
+
+ +
71{
+
72 std::string name;
+
73 bool enabled;
+
74 std::string input_directory;
+
75 std::string kafka_topic;
+
76};
+
+
77
+
78// ============================================================
+
79// AppConfig
+
80// ============================================================
+
+ +
82{
+ + + + +
87 std::vector<GroupConfig> groups;
+
88 std::string mode; // "producer", "consumer", "both"
+
89
+
90 static AppConfig load(const std::string &filename);
+
91};
+
+
nlohmann::json json
Определения config.hpp:8
+
Определения postgresql.cpp:11
+ +
Определения config.hpp:82
+
std::vector< GroupConfig > groups
Определения config.hpp:87
+
ProcessingConfig processing
Определения config.hpp:85
+
KafkaConfig kafka
Определения config.hpp:83
+
std::string mode
Определения config.hpp:88
+
CacheConfig cache
Определения config.hpp:86
+
static AppConfig load(const std::string &filename)
+
Определения config.hpp:60
+
int reprocess_delay_seconds
Определения config.hpp:63
+
std::string source_prefix
Определения config.hpp:64
+
int retention_days
Определения config.hpp:62
+
std::string path
Определения config.hpp:61
+
Определения config.hpp:41
+
database::ConnectionParams postgresql
Определения config.hpp:42
+
Определения config.hpp:71
+
bool enabled
Определения config.hpp:73
+
std::string input_directory
Определения config.hpp:74
+
std::string name
Определения config.hpp:72
+
std::string kafka_topic
Определения config.hpp:75
+
Определения config.hpp:30
+
std::string group_id
Определения config.hpp:31
+
std::string auto_offset_reset
Определения config.hpp:32
+
bool enable_auto_commit
Определения config.hpp:33
+
Определения config.hpp:23
+
int batch_size
Определения config.hpp:26
+
std::string acks
Определения config.hpp:24
+
int retries
Определения config.hpp:25
+
int linger_ms
Определения config.hpp:27
+
Определения config.hpp:17
+
std::string output
Определения config.hpp:19
+
std::string input
Определения config.hpp:18
+
std::string errors
Определения config.hpp:20
+
Определения config.hpp:14
+
std::string bootstrap_servers
Определения config.hpp:15
+
struct KafkaConfig::Consumer consumer
+
struct KafkaConfig::Producer producer
+
struct KafkaConfig::Topics topics
+
Определения config.hpp:49
+
int retry_interval_seconds
Определения config.hpp:52
+
bool delete_after_send
Определения config.hpp:53
+
int max_workers
Определения config.hpp:50
+
int batch_size
Определения config.hpp:51
+ +
+
+
+ + + + diff --git a/docs/html/consumer_8cpp.html b/docs/html/consumer_8cpp.html new file mode 100644 index 000000000..0e5320c49 --- /dev/null +++ b/docs/html/consumer_8cpp.html @@ -0,0 +1,181 @@ + + + + + + + +Kafka-1C Connector: Файл src/kafka/consumer.cpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Файл consumer.cpp
+
+
+
#include "consumer.hpp"
+#include "../utils/logger.hpp"
+#include <iostream>
+
+Граф включаемых заголовочных файлов для consumer.cpp:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

См. исходные тексты.

+
+
+ +
+ + + + diff --git a/docs/html/consumer_8cpp__incl.dot b/docs/html/consumer_8cpp__incl.dot new file mode 100644 index 000000000..2a7b621ea --- /dev/null +++ b/docs/html/consumer_8cpp__incl.dot @@ -0,0 +1,36 @@ +digraph "src/kafka/consumer.cpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/kafka/consumer.cpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="consumer.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$consumer_8hpp.html",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="librdkafka/rdkafkacpp.h",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node4 [id="edge3_Node000002_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="string",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node5 [id="edge4_Node000002_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="memory",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node6 [id="edge5_Node000002_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="functional",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node7 [id="edge6_Node000002_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="atomic",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node8 [id="edge7_Node000002_Node000008",color="steelblue1",style="solid",tooltip=" "]; + Node8 [id="Node000008",label="thread",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node9 [id="edge8_Node000001_Node000009",color="steelblue1",style="solid",tooltip=" "]; + Node9 [id="Node000009",label="../utils/logger.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$logger_8hpp.html",tooltip=" "]; + Node9 -> Node4 [id="edge9_Node000009_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node9 -> Node10 [id="edge10_Node000009_Node000010",color="steelblue1",style="solid",tooltip=" "]; + Node10 [id="Node000010",label="iostream",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node9 -> Node11 [id="edge11_Node000009_Node000011",color="steelblue1",style="solid",tooltip=" "]; + Node11 [id="Node000011",label="chrono",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node9 -> Node12 [id="edge12_Node000009_Node000012",color="steelblue1",style="solid",tooltip=" "]; + Node12 [id="Node000012",label="iomanip",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node9 -> Node13 [id="edge13_Node000009_Node000013",color="steelblue1",style="solid",tooltip=" "]; + Node13 [id="Node000013",label="sstream",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node9 -> Node14 [id="edge14_Node000009_Node000014",color="steelblue1",style="solid",tooltip=" "]; + Node14 [id="Node000014",label="mutex",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node10 [id="edge15_Node000001_Node000010",color="steelblue1",style="solid",tooltip=" "]; +} diff --git a/docs/html/consumer_8cpp__incl.map b/docs/html/consumer_8cpp__incl.map new file mode 100644 index 000000000..36efe6864 --- /dev/null +++ b/docs/html/consumer_8cpp__incl.map @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/consumer_8cpp__incl.md5 b/docs/html/consumer_8cpp__incl.md5 new file mode 100644 index 000000000..f3b2fd20b --- /dev/null +++ b/docs/html/consumer_8cpp__incl.md5 @@ -0,0 +1 @@ +79cde7d91e561c53c56694e12229c941 \ No newline at end of file diff --git a/docs/html/consumer_8cpp__incl.png b/docs/html/consumer_8cpp__incl.png new file mode 100644 index 000000000..2de571538 Binary files /dev/null and b/docs/html/consumer_8cpp__incl.png differ diff --git a/docs/html/consumer_8cpp_source.html b/docs/html/consumer_8cpp_source.html new file mode 100644 index 000000000..707a36f1d --- /dev/null +++ b/docs/html/consumer_8cpp_source.html @@ -0,0 +1,261 @@ + + + + + + + +Kafka-1C Connector: Исходный файл src/kafka/consumer.cpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
consumer.cpp
+
+
+См. документацию.
1#include "consumer.hpp"
+
2#include "../utils/logger.hpp"
+
3#include <iostream>
+
4
+
+
5KafkaConsumer::KafkaConsumer(const std::string& brokers,
+
6 const std::string& group_id,
+
7 const std::string& topic)
+
8 : brokers_(brokers), group_id_(group_id), topic_(topic),
+
9 consumer_(nullptr), running_(false) {}
+
+
10
+ +
14
+
+ +
16 RdKafka::Conf* conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL);
+
17
+
18 conf->set("bootstrap.servers", brokers_, errstr_);
+
19 conf->set("group.id", group_id_, errstr_);
+
20 conf->set("enable.auto.commit", "true", errstr_); // ← ВКЛЮЧАЕМ АВТО-КОММИТ
+
21 conf->set("auto.commit.interval.ms", "1000", errstr_); // ← КАЖДУЮ СЕКУНДУ
+
22 conf->set("auto.offset.reset", "earliest", errstr_);
+
23 conf->set("session.timeout.ms", "6000", errstr_);
+
24
+
25 consumer_.reset(RdKafka::KafkaConsumer::create(conf, errstr_));
+
26 delete conf;
+
27
+
28 if (!consumer_) {
+
29 Logger::error("Failed to create consumer: " + errstr_);
+
30 return false;
+
31 }
+
32
+
33 // Подписываемся на топик
+
34 std::vector<std::string> topics = {topic_};
+
35 RdKafka::ErrorCode err = consumer_->subscribe(topics);
+
36 if (err != RdKafka::ERR_NO_ERROR) {
+
37 Logger::error("Failed to subscribe: " + RdKafka::err2str(err));
+
38 return false;
+
39 }
+
40
+
41 Logger::info("Kafka consumer initialized. Brokers: " + brokers_ + ", Topic: " + topic_);
+
42 return true;
+
43}
+
+
44
+
+ +
46 if (running_.load()) return;
+
47
+
48 running_.store(true);
+
49 consumer_thread_ = std::make_unique<std::thread>(&KafkaConsumer::consumeLoop, this);
+
50 Logger::info("Kafka consumer started");
+
51}
+
+
52
+
+ +
54 if (!running_.load()) return;
+
55
+
56 running_.store(false);
+
57 if (consumer_thread_ && consumer_thread_->joinable()) {
+
58 consumer_thread_->join();
+
59 }
+
60 consumer_thread_.reset();
+
61
+
62 if (consumer_) {
+
63 consumer_->close();
+
64 }
+
65
+
66 Logger::info("Kafka consumer stopped");
+
67}
+
+
68
+
+ +
70 callback_ = std::move(cb);
+
71}
+
+
72
+
73void KafkaConsumer::consumeLoop() {
+
74 Logger::info("Consumer loop started for topic: " + topic_);
+
75
+
76 while (running_.load()) {
+
77 RdKafka::Message* msg = consumer_->consume(1000); // 1 секунда таймаут
+
78
+
79 if (!msg) continue;
+
80
+
81 if (msg->err() == RdKafka::ERR_NO_ERROR) {
+
82 // Получаем сообщение
+
83 std::string key = msg->key() ? *msg->key() : "";
+
84 std::string value(static_cast<const char*>(msg->payload()), msg->len());
+
85 int64_t timestamp = msg->timestamp().timestamp;
+
86
+
87 Logger::debug("Received message: " + key);
+
88
+
89 if (callback_) {
+
90 callback_(key, value, timestamp);
+
91 }
+
92 // АСИНХРОННЫЙ КОММИТ (не блокирует)
+
93 consumer_->commitAsync(msg);
+
94 } else if (msg->err() == RdKafka::ERR__PARTITION_EOF) {
+
95 // Конец партиции — нормально
+
96 } else {
+
97 Logger::error("Consumer error: " + msg->errstr());
+
98 }
+
99
+
100 delete msg;
+
101 }
+
102
+
103 Logger::info("Consumer loop stopped");
+
104}
+
KafkaConsumer(const std::string &brokers, const std::string &group_id, const std::string &topic)
Определения consumer.cpp:5
+
void setMessageCallback(MessageCallback cb)
Определения consumer.cpp:69
+
void stop()
Определения consumer.cpp:53
+
~KafkaConsumer()
Определения consumer.cpp:11
+
void start()
Определения consumer.cpp:45
+
std::function< void(const std::string &key, const std::string &value, int64_t timestamp)> MessageCallback
Определения consumer.hpp:13
+
bool init()
Определения consumer.cpp:15
+
static void info(const std::string &message)
Определения logger.hpp:25
+
static void error(const std::string &message)
Определения logger.hpp:33
+
static void debug(const std::string &message)
Определения logger.hpp:37
+ + +
+
+
+ + + + diff --git a/docs/html/consumer_8hpp.html b/docs/html/consumer_8hpp.html new file mode 100644 index 000000000..e8cb75430 --- /dev/null +++ b/docs/html/consumer_8hpp.html @@ -0,0 +1,185 @@ + + + + + + + +Kafka-1C Connector: Файл src/kafka/consumer.hpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Файл consumer.hpp
+
+
+
#include <librdkafka/rdkafkacpp.h>
+#include <string>
+#include <memory>
+#include <functional>
+#include <atomic>
+#include <thread>
+
+Граф включаемых заголовочных файлов для consumer.hpp:
+
+
+ + + + + + + + + + + + + + + +
+
+Граф файлов, в которые включается этот файл:
+
+
+ + + + + + + +
+
+

См. исходные тексты.

+ + + +

+Классы

class  KafkaConsumer
+
+
+ +
+ + + + diff --git a/docs/html/consumer_8hpp.js b/docs/html/consumer_8hpp.js new file mode 100644 index 000000000..ddb95bf51 --- /dev/null +++ b/docs/html/consumer_8hpp.js @@ -0,0 +1,4 @@ +var consumer_8hpp = +[ + [ "KafkaConsumer", "class_kafka_consumer.html", "class_kafka_consumer" ] +]; \ No newline at end of file diff --git a/docs/html/consumer_8hpp__dep__incl.dot b/docs/html/consumer_8hpp__dep__incl.dot new file mode 100644 index 000000000..b590dccc0 --- /dev/null +++ b/docs/html/consumer_8hpp__dep__incl.dot @@ -0,0 +1,12 @@ +digraph "src/kafka/consumer.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/kafka/consumer.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="src/kafka/consumer.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$consumer_8cpp.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="src/main.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html",tooltip=" "]; +} diff --git a/docs/html/consumer_8hpp__dep__incl.map b/docs/html/consumer_8hpp__dep__incl.map new file mode 100644 index 000000000..5f1f60292 --- /dev/null +++ b/docs/html/consumer_8hpp__dep__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/consumer_8hpp__dep__incl.md5 b/docs/html/consumer_8hpp__dep__incl.md5 new file mode 100644 index 000000000..9170fb29c --- /dev/null +++ b/docs/html/consumer_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +0a76f9825c0ceee93eed740e9ef17b63 \ No newline at end of file diff --git a/docs/html/consumer_8hpp__dep__incl.png b/docs/html/consumer_8hpp__dep__incl.png new file mode 100644 index 000000000..73b8623dc Binary files /dev/null and b/docs/html/consumer_8hpp__dep__incl.png differ diff --git a/docs/html/consumer_8hpp__incl.dot b/docs/html/consumer_8hpp__incl.dot new file mode 100644 index 000000000..638a90d07 --- /dev/null +++ b/docs/html/consumer_8hpp__incl.dot @@ -0,0 +1,20 @@ +digraph "src/kafka/consumer.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/kafka/consumer.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="librdkafka/rdkafkacpp.h",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="string",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="memory",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="functional",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node6 [id="edge5_Node000001_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="atomic",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node7 [id="edge6_Node000001_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="thread",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; +} diff --git a/docs/html/consumer_8hpp__incl.map b/docs/html/consumer_8hpp__incl.map new file mode 100644 index 000000000..68c396cea --- /dev/null +++ b/docs/html/consumer_8hpp__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/html/consumer_8hpp__incl.md5 b/docs/html/consumer_8hpp__incl.md5 new file mode 100644 index 000000000..ce0d15dcf --- /dev/null +++ b/docs/html/consumer_8hpp__incl.md5 @@ -0,0 +1 @@ +8cd9dd805d5ca82e6695eeae348dba76 \ No newline at end of file diff --git a/docs/html/consumer_8hpp__incl.png b/docs/html/consumer_8hpp__incl.png new file mode 100644 index 000000000..706f8a2c7 Binary files /dev/null and b/docs/html/consumer_8hpp__incl.png differ diff --git a/docs/html/consumer_8hpp_source.html b/docs/html/consumer_8hpp_source.html new file mode 100644 index 000000000..dcaed0828 --- /dev/null +++ b/docs/html/consumer_8hpp_source.html @@ -0,0 +1,181 @@ + + + + + + + +Kafka-1C Connector: Исходный файл src/kafka/consumer.hpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
consumer.hpp
+
+
+См. документацию.
1#pragma once
+
2
+
3#include <librdkafka/rdkafkacpp.h>
+
4#include <string>
+
5#include <memory>
+
6#include <functional>
+
7#include <atomic>
+
8#include <thread>
+
9
+
+ +
11{
+
12public:
+
13 using MessageCallback = std::function<void(const std::string &key,
+
14 const std::string &value,
+
15 int64_t timestamp)>;
+
16
+
17 KafkaConsumer(const std::string &brokers, const std::string &group_id, const std::string &topic);
+ +
19
+
20 bool init();
+
21 void start();
+
22 void stop();
+ +
24
+
25 bool isRunning() const { return running_.load(); }
+
26
+
27private:
+
28 void consumeLoop();
+
29
+
30 std::string brokers_;
+
31 std::string group_id_;
+
32 std::string topic_;
+
33 std::unique_ptr<RdKafka::KafkaConsumer> consumer_;
+
34 MessageCallback callback_;
+
35 std::atomic<bool> running_;
+
36 std::unique_ptr<std::thread> consumer_thread_;
+
37 std::string errstr_;
+
38};
+
+
KafkaConsumer(const std::string &brokers, const std::string &group_id, const std::string &topic)
Определения consumer.cpp:5
+
void setMessageCallback(MessageCallback cb)
Определения consumer.cpp:69
+
bool isRunning() const
Определения consumer.hpp:25
+
void stop()
Определения consumer.cpp:53
+
~KafkaConsumer()
Определения consumer.cpp:11
+
void start()
Определения consumer.cpp:45
+
std::function< void(const std::string &key, const std::string &value, int64_t timestamp)> MessageCallback
Определения consumer.hpp:13
+
bool init()
Определения consumer.cpp:15
+
+
+
+ + + + diff --git a/docs/html/cookie.js b/docs/html/cookie.js new file mode 100644 index 000000000..53ad21d98 --- /dev/null +++ b/docs/html/cookie.js @@ -0,0 +1,58 @@ +/*! + Cookie helper functions + Copyright (c) 2023 Dimitri van Heesch + Released under MIT license. +*/ +let Cookie = { + cookie_namespace: 'doxygen_', + + readSetting(cookie,defVal) { + if (window.chrome) { + const val = localStorage.getItem(this.cookie_namespace+cookie) || + sessionStorage.getItem(this.cookie_namespace+cookie); + if (val) return val; + } else { + let myCookie = this.cookie_namespace+cookie+"="; + if (document.cookie) { + const index = document.cookie.indexOf(myCookie); + if (index != -1) { + const valStart = index + myCookie.length; + let valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + return document.cookie.substring(valStart, valEnd); + } + } + } + return defVal; + }, + + writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete + if (window.chrome) { + if (days==0) { + sessionStorage.setItem(this.cookie_namespace+cookie,val); + } else { + localStorage.setItem(this.cookie_namespace+cookie,val); + } + } else { + let date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; + document.cookie = this.cookie_namespace + cookie + "=" + + val + "; SameSite=Lax;" + expiration + "path=/"; + } + }, + + eraseSetting(cookie) { + if (window.chrome) { + if (localStorage.getItem(this.cookie_namespace+cookie)) { + localStorage.removeItem(this.cookie_namespace+cookie); + } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { + sessionStorage.removeItem(this.cookie_namespace+cookie); + } + } else { + this.writeSetting(cookie,'',-1); + } + }, +} diff --git a/docs/html/dir_000001_000002.html b/docs/html/dir_000001_000002.html new file mode 100644 index 000000000..b29c345a5 --- /dev/null +++ b/docs/html/dir_000001_000002.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: src/config -> database Связь + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+

config → database Связь

Файл в src/configВключает файл в src/database
config.hpppostgresql.hpp
+
+ +
+ + + + diff --git a/docs/html/dir_000002_000007.html b/docs/html/dir_000002_000007.html new file mode 100644 index 000000000..6dfd06e82 --- /dev/null +++ b/docs/html/dir_000002_000007.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: src/database -> utils Связь + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+

database → utils Связь

Файл в src/databaseВключает файл в src/utils
postgresql.cpplogger.hpp
+
+ +
+ + + + diff --git a/docs/html/dir_000003_000007.html b/docs/html/dir_000003_000007.html new file mode 100644 index 000000000..c69bb1b28 --- /dev/null +++ b/docs/html/dir_000003_000007.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: src/kafka -> utils Связь + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+

kafka → utils Связь

Файл в src/kafkaВключает файл в src/utils
consumer.cpplogger.hpp
+
+ +
+ + + + diff --git a/docs/html/dir_000005_000000.html b/docs/html/dir_000005_000000.html new file mode 100644 index 000000000..e9f224619 --- /dev/null +++ b/docs/html/dir_000005_000000.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: src/processor -> cache Связь + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+

processor → cache Связь

Файл в src/processorВключает файл в src/cache
order_processor.hppsqlite_cache.hpp
+
+ +
+ + + + diff --git a/docs/html/dir_000005_000002.html b/docs/html/dir_000005_000002.html new file mode 100644 index 000000000..08efa5f4f --- /dev/null +++ b/docs/html/dir_000005_000002.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: src/processor -> database Связь + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+

processor → database Связь

Файл в src/processorВключает файл в src/database
order_processor.hpppostgresql.hpp
+
+ +
+ + + + diff --git a/docs/html/dir_000005_000003.html b/docs/html/dir_000005_000003.html new file mode 100644 index 000000000..89cc10f2b --- /dev/null +++ b/docs/html/dir_000005_000003.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: src/processor -> kafka Связь + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+

processor → kafka Связь

Файл в src/processorВключает файл в src/kafka
order_processor.hppproducer.hpp
+
+ +
+ + + + diff --git a/docs/html/dir_000005_000004.html b/docs/html/dir_000005_000004.html new file mode 100644 index 000000000..00a3d943d --- /dev/null +++ b/docs/html/dir_000005_000004.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: src/processor -> parser Связь + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+

processor → parser Связь

Файл в src/processorВключает файл в src/parser
order_processor.hppjson_parser.hpp
+
+ +
+ + + + diff --git a/docs/html/dir_000005_000007.html b/docs/html/dir_000005_000007.html new file mode 100644 index 000000000..8c952cf8d --- /dev/null +++ b/docs/html/dir_000005_000007.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: src/processor -> utils Связь + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+

processor → utils Связь

Файл в src/processorВключает файл в src/utils
order_processor.cpplogger.hpp
order_processor.cppuuid.hpp
+
+ +
+ + + + diff --git a/docs/html/dir_000006_000000.html b/docs/html/dir_000006_000000.html new file mode 100644 index 000000000..22ba41bea --- /dev/null +++ b/docs/html/dir_000006_000000.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: src -> cache Связь + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+

src → cache Связь

Файл в srcВключает файл в src/cache
main.cppsqlite_cache.hpp
processor / order_processor.hppsqlite_cache.hpp
+
+ +
+ + + + diff --git a/docs/html/dir_000006_000001.html b/docs/html/dir_000006_000001.html new file mode 100644 index 000000000..caa732dae --- /dev/null +++ b/docs/html/dir_000006_000001.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: src -> config Связь + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+

src → config Связь

Файл в srcВключает файл в src/config
main.cppconfig.hpp
+
+ +
+ + + + diff --git a/docs/html/dir_000006_000002.html b/docs/html/dir_000006_000002.html new file mode 100644 index 000000000..310bc23a7 --- /dev/null +++ b/docs/html/dir_000006_000002.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: src -> database Связь + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+

src → database Связь

Файл в srcВключает файл в src/database
config / config.hpppostgresql.hpp
main.cpppostgresql.hpp
processor / order_processor.hpppostgresql.hpp
+
+ +
+ + + + diff --git a/docs/html/dir_000006_000003.html b/docs/html/dir_000006_000003.html new file mode 100644 index 000000000..9bb1865f5 --- /dev/null +++ b/docs/html/dir_000006_000003.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: src -> kafka Связь + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+

src → kafka Связь

Файл в srcВключает файл в src/kafka
main.cppconsumer.hpp
main.cppproducer.hpp
processor / order_processor.hppproducer.hpp
+
+ +
+ + + + diff --git a/docs/html/dir_000006_000004.html b/docs/html/dir_000006_000004.html new file mode 100644 index 000000000..d708190e0 --- /dev/null +++ b/docs/html/dir_000006_000004.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: src -> parser Связь + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+

src → parser Связь

Файл в srcВключает файл в src/parser
main.cppjson_parser.hpp
processor / order_processor.hppjson_parser.hpp
+
+ +
+ + + + diff --git a/docs/html/dir_000006_000005.html b/docs/html/dir_000006_000005.html new file mode 100644 index 000000000..834f9d97d --- /dev/null +++ b/docs/html/dir_000006_000005.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: src -> processor Связь + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+

src → processor Связь

Файл в srcВключает файл в src/processor
main.cpporder_processor.hpp
+
+ +
+ + + + diff --git a/docs/html/dir_000006_000007.html b/docs/html/dir_000006_000007.html new file mode 100644 index 000000000..a47b0c4a5 --- /dev/null +++ b/docs/html/dir_000006_000007.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: src -> utils Связь + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ + +
+ +
+ + + + diff --git a/docs/html/dir_1de7975868b084fd11f0850c7fb44b67.html b/docs/html/dir_1de7975868b084fd11f0850c7fb44b67.html new file mode 100644 index 000000000..99ae2bf3f --- /dev/null +++ b/docs/html/dir_1de7975868b084fd11f0850c7fb44b67.html @@ -0,0 +1,170 @@ + + + + + + + +Kafka-1C Connector: Содержание директории src/processor + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Содержание директории processor
+
+
+
+Директория графа зависимостей processor:
+
+
src/processor
+ + + + + + + + + + + + + + + + + + + +
+ + + + +

+Файлы

 
order_processor.cpp
 
order_processor.hpp
+
+
+ +
+ + + + diff --git a/docs/html/dir_1de7975868b084fd11f0850c7fb44b67.js b/docs/html/dir_1de7975868b084fd11f0850c7fb44b67.js new file mode 100644 index 000000000..dede95737 --- /dev/null +++ b/docs/html/dir_1de7975868b084fd11f0850c7fb44b67.js @@ -0,0 +1,5 @@ +var dir_1de7975868b084fd11f0850c7fb44b67 = +[ + [ "order_processor.cpp", "order__processor_8cpp.html", null ], + [ "order_processor.hpp", "order__processor_8hpp.html", "order__processor_8hpp" ] +]; \ No newline at end of file diff --git a/docs/html/dir_1de7975868b084fd11f0850c7fb44b67_dep.dot b/docs/html/dir_1de7975868b084fd11f0850c7fb44b67_dep.dot new file mode 100644 index 000000000..48927c3ad --- /dev/null +++ b/docs/html/dir_1de7975868b084fd11f0850c7fb44b67_dep.dot @@ -0,0 +1,22 @@ +digraph "src/processor" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_68267d1309a1af8e8297ef4c3efbcdba { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="src", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_68267d1309a1af8e8297ef4c3efbcdba.html",tooltip=""] + dir_313caf1132e152dd9b58bea13a4052ca [label="utils", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_313caf1132e152dd9b58bea13a4052ca.html",tooltip=""]; + dir_b1f85b4500d4f866a4815ca77f1375fe [label="kafka", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_b1f85b4500d4f866a4815ca77f1375fe.html",tooltip=""]; + dir_803ee67260c130b45d29089798491ab2 [label="database", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_803ee67260c130b45d29089798491ab2.html",tooltip=""]; + dir_6dd2d287d08a289e9849dd6e2f6b9333 [label="cache", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_6dd2d287d08a289e9849dd6e2f6b9333.html",tooltip=""]; + dir_6cd8491d143eb218b70983dbdb3c58bc [label="parser", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_6cd8491d143eb218b70983dbdb3c58bc.html",tooltip=""]; + dir_1de7975868b084fd11f0850c7fb44b67 [label="processor", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_1de7975868b084fd11f0850c7fb44b67.html",tooltip=""]; + } + dir_1de7975868b084fd11f0850c7fb44b67->dir_313caf1132e152dd9b58bea13a4052ca [headlabel="2", labeldistance=1.5 headhref="dir_000005_000007.html" href="dir_000005_000007.html" color="steelblue1" fontcolor="steelblue1"]; + dir_1de7975868b084fd11f0850c7fb44b67->dir_6cd8491d143eb218b70983dbdb3c58bc [headlabel="1", labeldistance=1.5 headhref="dir_000005_000004.html" href="dir_000005_000004.html" color="steelblue1" fontcolor="steelblue1"]; + dir_1de7975868b084fd11f0850c7fb44b67->dir_6dd2d287d08a289e9849dd6e2f6b9333 [headlabel="1", labeldistance=1.5 headhref="dir_000005_000000.html" href="dir_000005_000000.html" color="steelblue1" fontcolor="steelblue1"]; + dir_1de7975868b084fd11f0850c7fb44b67->dir_803ee67260c130b45d29089798491ab2 [headlabel="1", labeldistance=1.5 headhref="dir_000005_000002.html" href="dir_000005_000002.html" color="steelblue1" fontcolor="steelblue1"]; + dir_1de7975868b084fd11f0850c7fb44b67->dir_b1f85b4500d4f866a4815ca77f1375fe [headlabel="1", labeldistance=1.5 headhref="dir_000005_000003.html" href="dir_000005_000003.html" color="steelblue1" fontcolor="steelblue1"]; +} diff --git a/docs/html/dir_1de7975868b084fd11f0850c7fb44b67_dep.map b/docs/html/dir_1de7975868b084fd11f0850c7fb44b67_dep.map new file mode 100644 index 000000000..68a23f04d --- /dev/null +++ b/docs/html/dir_1de7975868b084fd11f0850c7fb44b67_dep.map @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/dir_1de7975868b084fd11f0850c7fb44b67_dep.md5 b/docs/html/dir_1de7975868b084fd11f0850c7fb44b67_dep.md5 new file mode 100644 index 000000000..f70476fcf --- /dev/null +++ b/docs/html/dir_1de7975868b084fd11f0850c7fb44b67_dep.md5 @@ -0,0 +1 @@ +64eaf9251a16585111a6c4fec5310017 \ No newline at end of file diff --git a/docs/html/dir_1de7975868b084fd11f0850c7fb44b67_dep.png b/docs/html/dir_1de7975868b084fd11f0850c7fb44b67_dep.png new file mode 100644 index 000000000..26f64db0e Binary files /dev/null and b/docs/html/dir_1de7975868b084fd11f0850c7fb44b67_dep.png differ diff --git a/docs/html/dir_313caf1132e152dd9b58bea13a4052ca.html b/docs/html/dir_313caf1132e152dd9b58bea13a4052ca.html new file mode 100644 index 000000000..0c9a2ef38 --- /dev/null +++ b/docs/html/dir_313caf1132e152dd9b58bea13a4052ca.html @@ -0,0 +1,155 @@ + + + + + + + +Kafka-1C Connector: Содержание директории src/utils + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Содержание директории utils
+
+
+
+Директория графа зависимостей utils:
+
+
src/utils
+ + + + +
+ + + + +

+Файлы

 
logger.hpp
 
uuid.hpp
+
+
+ +
+ + + + diff --git a/docs/html/dir_313caf1132e152dd9b58bea13a4052ca.js b/docs/html/dir_313caf1132e152dd9b58bea13a4052ca.js new file mode 100644 index 000000000..77dffe42e --- /dev/null +++ b/docs/html/dir_313caf1132e152dd9b58bea13a4052ca.js @@ -0,0 +1,5 @@ +var dir_313caf1132e152dd9b58bea13a4052ca = +[ + [ "logger.hpp", "logger_8hpp.html", "logger_8hpp" ], + [ "uuid.hpp", "uuid_8hpp.html", "uuid_8hpp" ] +]; \ No newline at end of file diff --git a/docs/html/dir_313caf1132e152dd9b58bea13a4052ca_dep.dot b/docs/html/dir_313caf1132e152dd9b58bea13a4052ca_dep.dot new file mode 100644 index 000000000..b205da365 --- /dev/null +++ b/docs/html/dir_313caf1132e152dd9b58bea13a4052ca_dep.dot @@ -0,0 +1,12 @@ +digraph "src/utils" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_68267d1309a1af8e8297ef4c3efbcdba { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="src", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_68267d1309a1af8e8297ef4c3efbcdba.html",tooltip=""] + dir_313caf1132e152dd9b58bea13a4052ca [label="utils", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_313caf1132e152dd9b58bea13a4052ca.html",tooltip=""]; + } +} diff --git a/docs/html/dir_313caf1132e152dd9b58bea13a4052ca_dep.map b/docs/html/dir_313caf1132e152dd9b58bea13a4052ca_dep.map new file mode 100644 index 000000000..51830aa35 --- /dev/null +++ b/docs/html/dir_313caf1132e152dd9b58bea13a4052ca_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/dir_313caf1132e152dd9b58bea13a4052ca_dep.md5 b/docs/html/dir_313caf1132e152dd9b58bea13a4052ca_dep.md5 new file mode 100644 index 000000000..9b8e0d32d --- /dev/null +++ b/docs/html/dir_313caf1132e152dd9b58bea13a4052ca_dep.md5 @@ -0,0 +1 @@ +de5318216316fb9f465ba4751a6854a4 \ No newline at end of file diff --git a/docs/html/dir_313caf1132e152dd9b58bea13a4052ca_dep.png b/docs/html/dir_313caf1132e152dd9b58bea13a4052ca_dep.png new file mode 100644 index 000000000..d44007662 Binary files /dev/null and b/docs/html/dir_313caf1132e152dd9b58bea13a4052ca_dep.png differ diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 000000000..31cdb6bd5 --- /dev/null +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,200 @@ + + + + + + + +Kafka-1C Connector: Содержание директории src + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Содержание директории src
+
+
+
+Директория графа зависимостей src:
+
+
src
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +

+Директории

 
cache
 
config
 
database
 
kafka
 
parser
 
processor
 
utils
+ + +

+Файлы

 
main.cpp
+
+
+ +
+ + + + diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.js b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.js new file mode 100644 index 000000000..ec95e7ba3 --- /dev/null +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.js @@ -0,0 +1,11 @@ +var dir_68267d1309a1af8e8297ef4c3efbcdba = +[ + [ "cache", "dir_6dd2d287d08a289e9849dd6e2f6b9333.html", "dir_6dd2d287d08a289e9849dd6e2f6b9333" ], + [ "config", "dir_7e83d1792d529f4aa7126ac7e0b3b699.html", "dir_7e83d1792d529f4aa7126ac7e0b3b699" ], + [ "database", "dir_803ee67260c130b45d29089798491ab2.html", "dir_803ee67260c130b45d29089798491ab2" ], + [ "kafka", "dir_b1f85b4500d4f866a4815ca77f1375fe.html", "dir_b1f85b4500d4f866a4815ca77f1375fe" ], + [ "parser", "dir_6cd8491d143eb218b70983dbdb3c58bc.html", "dir_6cd8491d143eb218b70983dbdb3c58bc" ], + [ "processor", "dir_1de7975868b084fd11f0850c7fb44b67.html", "dir_1de7975868b084fd11f0850c7fb44b67" ], + [ "utils", "dir_313caf1132e152dd9b58bea13a4052ca.html", "dir_313caf1132e152dd9b58bea13a4052ca" ], + [ "main.cpp", "main_8cpp.html", "main_8cpp" ] +]; \ No newline at end of file diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.dot b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.dot new file mode 100644 index 000000000..1f0a011fd --- /dev/null +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.dot @@ -0,0 +1,34 @@ +digraph "src" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_68267d1309a1af8e8297ef4c3efbcdba { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="", fontname=Helvetica,fontsize=10 style="filled,bold", URL="dir_68267d1309a1af8e8297ef4c3efbcdba.html",tooltip=""] + dir_68267d1309a1af8e8297ef4c3efbcdba [shape=plaintext, label="src"]; + dir_6dd2d287d08a289e9849dd6e2f6b9333 [label="cache", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_6dd2d287d08a289e9849dd6e2f6b9333.html",tooltip=""]; + dir_7e83d1792d529f4aa7126ac7e0b3b699 [label="config", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_7e83d1792d529f4aa7126ac7e0b3b699.html",tooltip=""]; + dir_803ee67260c130b45d29089798491ab2 [label="database", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_803ee67260c130b45d29089798491ab2.html",tooltip=""]; + dir_b1f85b4500d4f866a4815ca77f1375fe [label="kafka", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_b1f85b4500d4f866a4815ca77f1375fe.html",tooltip=""]; + dir_6cd8491d143eb218b70983dbdb3c58bc [label="parser", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_6cd8491d143eb218b70983dbdb3c58bc.html",tooltip=""]; + dir_1de7975868b084fd11f0850c7fb44b67 [label="processor", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_1de7975868b084fd11f0850c7fb44b67.html",tooltip=""]; + dir_313caf1132e152dd9b58bea13a4052ca [label="utils", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_313caf1132e152dd9b58bea13a4052ca.html",tooltip=""]; + } + dir_68267d1309a1af8e8297ef4c3efbcdba->dir_1de7975868b084fd11f0850c7fb44b67 [headlabel="1", labeldistance=1.5 headhref="dir_000006_000005.html" href="dir_000006_000005.html" color="steelblue1" fontcolor="steelblue1"]; + dir_68267d1309a1af8e8297ef4c3efbcdba->dir_313caf1132e152dd9b58bea13a4052ca [headlabel="5", labeldistance=1.5 headhref="dir_000006_000007.html" href="dir_000006_000007.html" color="steelblue1" fontcolor="steelblue1"]; + dir_68267d1309a1af8e8297ef4c3efbcdba->dir_6cd8491d143eb218b70983dbdb3c58bc [headlabel="2", labeldistance=1.5 headhref="dir_000006_000004.html" href="dir_000006_000004.html" color="steelblue1" fontcolor="steelblue1"]; + dir_68267d1309a1af8e8297ef4c3efbcdba->dir_6dd2d287d08a289e9849dd6e2f6b9333 [headlabel="2", labeldistance=1.5 headhref="dir_000006_000000.html" href="dir_000006_000000.html" color="steelblue1" fontcolor="steelblue1"]; + dir_68267d1309a1af8e8297ef4c3efbcdba->dir_7e83d1792d529f4aa7126ac7e0b3b699 [headlabel="1", labeldistance=1.5 headhref="dir_000006_000001.html" href="dir_000006_000001.html" color="steelblue1" fontcolor="steelblue1"]; + dir_68267d1309a1af8e8297ef4c3efbcdba->dir_803ee67260c130b45d29089798491ab2 [headlabel="3", labeldistance=1.5 headhref="dir_000006_000002.html" href="dir_000006_000002.html" color="steelblue1" fontcolor="steelblue1"]; + dir_68267d1309a1af8e8297ef4c3efbcdba->dir_b1f85b4500d4f866a4815ca77f1375fe [headlabel="3", labeldistance=1.5 headhref="dir_000006_000003.html" href="dir_000006_000003.html" color="steelblue1" fontcolor="steelblue1"]; + dir_7e83d1792d529f4aa7126ac7e0b3b699->dir_803ee67260c130b45d29089798491ab2 [headlabel="1", labeldistance=1.5 headhref="dir_000001_000002.html" href="dir_000001_000002.html" color="steelblue1" fontcolor="steelblue1"]; + dir_803ee67260c130b45d29089798491ab2->dir_313caf1132e152dd9b58bea13a4052ca [headlabel="1", labeldistance=1.5 headhref="dir_000002_000007.html" href="dir_000002_000007.html" color="steelblue1" fontcolor="steelblue1"]; + dir_b1f85b4500d4f866a4815ca77f1375fe->dir_313caf1132e152dd9b58bea13a4052ca [headlabel="1", labeldistance=1.5 headhref="dir_000003_000007.html" href="dir_000003_000007.html" color="steelblue1" fontcolor="steelblue1"]; + dir_1de7975868b084fd11f0850c7fb44b67->dir_313caf1132e152dd9b58bea13a4052ca [headlabel="2", labeldistance=1.5 headhref="dir_000005_000007.html" href="dir_000005_000007.html" color="steelblue1" fontcolor="steelblue1"]; + dir_1de7975868b084fd11f0850c7fb44b67->dir_6cd8491d143eb218b70983dbdb3c58bc [headlabel="1", labeldistance=1.5 headhref="dir_000005_000004.html" href="dir_000005_000004.html" color="steelblue1" fontcolor="steelblue1"]; + dir_1de7975868b084fd11f0850c7fb44b67->dir_6dd2d287d08a289e9849dd6e2f6b9333 [headlabel="1", labeldistance=1.5 headhref="dir_000005_000000.html" href="dir_000005_000000.html" color="steelblue1" fontcolor="steelblue1"]; + dir_1de7975868b084fd11f0850c7fb44b67->dir_803ee67260c130b45d29089798491ab2 [headlabel="1", labeldistance=1.5 headhref="dir_000005_000002.html" href="dir_000005_000002.html" color="steelblue1" fontcolor="steelblue1"]; + dir_1de7975868b084fd11f0850c7fb44b67->dir_b1f85b4500d4f866a4815ca77f1375fe [headlabel="1", labeldistance=1.5 headhref="dir_000005_000003.html" href="dir_000005_000003.html" color="steelblue1" fontcolor="steelblue1"]; +} diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map new file mode 100644 index 000000000..936b77301 --- /dev/null +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 new file mode 100644 index 000000000..e231c9285 --- /dev/null +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 @@ -0,0 +1 @@ +6ec20cfe01b6fae4616616bbd766a849 \ No newline at end of file diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.png b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.png new file mode 100644 index 000000000..a4ec89e24 Binary files /dev/null and b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.png differ diff --git a/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc.html b/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc.html new file mode 100644 index 000000000..285d03e9b --- /dev/null +++ b/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc.html @@ -0,0 +1,154 @@ + + + + + + + +Kafka-1C Connector: Содержание директории src/parser + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Содержание директории parser
+
+
+
+Директория графа зависимостей parser:
+
+
src/parser
+ + + + +
+ + + +

+Файлы

 
json_parser.hpp
+
+
+ +
+ + + + diff --git a/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc.js b/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc.js new file mode 100644 index 000000000..08c061c79 --- /dev/null +++ b/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc.js @@ -0,0 +1,4 @@ +var dir_6cd8491d143eb218b70983dbdb3c58bc = +[ + [ "json_parser.hpp", "json__parser_8hpp.html", "json__parser_8hpp" ] +]; \ No newline at end of file diff --git a/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc_dep.dot b/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc_dep.dot new file mode 100644 index 000000000..4069d5944 --- /dev/null +++ b/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc_dep.dot @@ -0,0 +1,12 @@ +digraph "src/parser" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_68267d1309a1af8e8297ef4c3efbcdba { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="src", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_68267d1309a1af8e8297ef4c3efbcdba.html",tooltip=""] + dir_6cd8491d143eb218b70983dbdb3c58bc [label="parser", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_6cd8491d143eb218b70983dbdb3c58bc.html",tooltip=""]; + } +} diff --git a/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc_dep.map b/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc_dep.map new file mode 100644 index 000000000..248112aca --- /dev/null +++ b/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc_dep.md5 b/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc_dep.md5 new file mode 100644 index 000000000..1d5ee8b38 --- /dev/null +++ b/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc_dep.md5 @@ -0,0 +1 @@ +7245d0581d09538c3afa2d1fe94845d7 \ No newline at end of file diff --git a/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc_dep.png b/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc_dep.png new file mode 100644 index 000000000..2197c2a2a Binary files /dev/null and b/docs/html/dir_6cd8491d143eb218b70983dbdb3c58bc_dep.png differ diff --git a/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333.html b/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333.html new file mode 100644 index 000000000..2c49b37ba --- /dev/null +++ b/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333.html @@ -0,0 +1,154 @@ + + + + + + + +Kafka-1C Connector: Содержание директории src/cache + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Содержание директории cache
+
+
+
+Директория графа зависимостей cache:
+
+
src/cache
+ + + + +
+ + + +

+Файлы

 
sqlite_cache.hpp
+
+
+ +
+ + + + diff --git a/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333.js b/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333.js new file mode 100644 index 000000000..186d29a1a --- /dev/null +++ b/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333.js @@ -0,0 +1,4 @@ +var dir_6dd2d287d08a289e9849dd6e2f6b9333 = +[ + [ "sqlite_cache.hpp", "sqlite__cache_8hpp.html", "sqlite__cache_8hpp" ] +]; \ No newline at end of file diff --git a/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333_dep.dot b/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333_dep.dot new file mode 100644 index 000000000..c81dec597 --- /dev/null +++ b/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333_dep.dot @@ -0,0 +1,12 @@ +digraph "src/cache" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_68267d1309a1af8e8297ef4c3efbcdba { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="src", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_68267d1309a1af8e8297ef4c3efbcdba.html",tooltip=""] + dir_6dd2d287d08a289e9849dd6e2f6b9333 [label="cache", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_6dd2d287d08a289e9849dd6e2f6b9333.html",tooltip=""]; + } +} diff --git a/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333_dep.map b/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333_dep.map new file mode 100644 index 000000000..241ddc61c --- /dev/null +++ b/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333_dep.md5 b/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333_dep.md5 new file mode 100644 index 000000000..1d242afd4 --- /dev/null +++ b/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333_dep.md5 @@ -0,0 +1 @@ +7288e7636fa9a43c836c07812b0a3bc9 \ No newline at end of file diff --git a/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333_dep.png b/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333_dep.png new file mode 100644 index 000000000..0df7b1487 Binary files /dev/null and b/docs/html/dir_6dd2d287d08a289e9849dd6e2f6b9333_dep.png differ diff --git a/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699.html b/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699.html new file mode 100644 index 000000000..df02db459 --- /dev/null +++ b/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699.html @@ -0,0 +1,157 @@ + + + + + + + +Kafka-1C Connector: Содержание директории src/config + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Содержание директории config
+
+
+
+Директория графа зависимостей config:
+
+
src/config
+ + + + + + + +
+ + + +

+Файлы

 
config.hpp
+
+
+ +
+ + + + diff --git a/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699.js b/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699.js new file mode 100644 index 000000000..5c7d3825c --- /dev/null +++ b/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699.js @@ -0,0 +1,4 @@ +var dir_7e83d1792d529f4aa7126ac7e0b3b699 = +[ + [ "config.hpp", "config_8hpp.html", "config_8hpp" ] +]; \ No newline at end of file diff --git a/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699_dep.dot b/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699_dep.dot new file mode 100644 index 000000000..d81432ecf --- /dev/null +++ b/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699_dep.dot @@ -0,0 +1,14 @@ +digraph "src/config" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_68267d1309a1af8e8297ef4c3efbcdba { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="src", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_68267d1309a1af8e8297ef4c3efbcdba.html",tooltip=""] + dir_803ee67260c130b45d29089798491ab2 [label="database", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_803ee67260c130b45d29089798491ab2.html",tooltip=""]; + dir_7e83d1792d529f4aa7126ac7e0b3b699 [label="config", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_7e83d1792d529f4aa7126ac7e0b3b699.html",tooltip=""]; + } + dir_7e83d1792d529f4aa7126ac7e0b3b699->dir_803ee67260c130b45d29089798491ab2 [headlabel="1", labeldistance=1.5 headhref="dir_000001_000002.html" href="dir_000001_000002.html" color="steelblue1" fontcolor="steelblue1"]; +} diff --git a/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699_dep.map b/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699_dep.map new file mode 100644 index 000000000..c4f079bd3 --- /dev/null +++ b/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699_dep.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699_dep.md5 b/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699_dep.md5 new file mode 100644 index 000000000..15ea4bf12 --- /dev/null +++ b/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699_dep.md5 @@ -0,0 +1 @@ +221b41d76c81de93ba286b1e853170ff \ No newline at end of file diff --git a/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699_dep.png b/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699_dep.png new file mode 100644 index 000000000..47f1eb40e Binary files /dev/null and b/docs/html/dir_7e83d1792d529f4aa7126ac7e0b3b699_dep.png differ diff --git a/docs/html/dir_803ee67260c130b45d29089798491ab2.html b/docs/html/dir_803ee67260c130b45d29089798491ab2.html new file mode 100644 index 000000000..46566b153 --- /dev/null +++ b/docs/html/dir_803ee67260c130b45d29089798491ab2.html @@ -0,0 +1,158 @@ + + + + + + + +Kafka-1C Connector: Содержание директории src/database + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Содержание директории database
+
+
+
+Директория графа зависимостей database:
+
+
src/database
+ + + + + + + +
+ + + + +

+Файлы

 
postgresql.cpp
 
postgresql.hpp
+
+
+ +
+ + + + diff --git a/docs/html/dir_803ee67260c130b45d29089798491ab2.js b/docs/html/dir_803ee67260c130b45d29089798491ab2.js new file mode 100644 index 000000000..b3a8dff1f --- /dev/null +++ b/docs/html/dir_803ee67260c130b45d29089798491ab2.js @@ -0,0 +1,5 @@ +var dir_803ee67260c130b45d29089798491ab2 = +[ + [ "postgresql.cpp", "postgresql_8cpp.html", null ], + [ "postgresql.hpp", "postgresql_8hpp.html", "postgresql_8hpp" ] +]; \ No newline at end of file diff --git a/docs/html/dir_803ee67260c130b45d29089798491ab2_dep.dot b/docs/html/dir_803ee67260c130b45d29089798491ab2_dep.dot new file mode 100644 index 000000000..6666f33df --- /dev/null +++ b/docs/html/dir_803ee67260c130b45d29089798491ab2_dep.dot @@ -0,0 +1,14 @@ +digraph "src/database" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_68267d1309a1af8e8297ef4c3efbcdba { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="src", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_68267d1309a1af8e8297ef4c3efbcdba.html",tooltip=""] + dir_313caf1132e152dd9b58bea13a4052ca [label="utils", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_313caf1132e152dd9b58bea13a4052ca.html",tooltip=""]; + dir_803ee67260c130b45d29089798491ab2 [label="database", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_803ee67260c130b45d29089798491ab2.html",tooltip=""]; + } + dir_803ee67260c130b45d29089798491ab2->dir_313caf1132e152dd9b58bea13a4052ca [headlabel="1", labeldistance=1.5 headhref="dir_000002_000007.html" href="dir_000002_000007.html" color="steelblue1" fontcolor="steelblue1"]; +} diff --git a/docs/html/dir_803ee67260c130b45d29089798491ab2_dep.map b/docs/html/dir_803ee67260c130b45d29089798491ab2_dep.map new file mode 100644 index 000000000..b4c64da66 --- /dev/null +++ b/docs/html/dir_803ee67260c130b45d29089798491ab2_dep.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/dir_803ee67260c130b45d29089798491ab2_dep.md5 b/docs/html/dir_803ee67260c130b45d29089798491ab2_dep.md5 new file mode 100644 index 000000000..3d70a9869 --- /dev/null +++ b/docs/html/dir_803ee67260c130b45d29089798491ab2_dep.md5 @@ -0,0 +1 @@ +bdaeb2b128824ce97560127040ae21eb \ No newline at end of file diff --git a/docs/html/dir_803ee67260c130b45d29089798491ab2_dep.png b/docs/html/dir_803ee67260c130b45d29089798491ab2_dep.png new file mode 100644 index 000000000..7713aa23c Binary files /dev/null and b/docs/html/dir_803ee67260c130b45d29089798491ab2_dep.png differ diff --git a/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe.html b/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe.html new file mode 100644 index 000000000..fbe90a27f --- /dev/null +++ b/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe.html @@ -0,0 +1,159 @@ + + + + + + + +Kafka-1C Connector: Содержание директории src/kafka + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Содержание директории kafka
+
+
+
+Директория графа зависимостей kafka:
+
+
src/kafka
+ + + + + + + +
+ + + + + +

+Файлы

 
consumer.cpp
 
consumer.hpp
 
producer.hpp
+
+
+ +
+ + + + diff --git a/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe.js b/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe.js new file mode 100644 index 000000000..0eb553d78 --- /dev/null +++ b/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe.js @@ -0,0 +1,6 @@ +var dir_b1f85b4500d4f866a4815ca77f1375fe = +[ + [ "consumer.cpp", "consumer_8cpp.html", null ], + [ "consumer.hpp", "consumer_8hpp.html", "consumer_8hpp" ], + [ "producer.hpp", "producer_8hpp.html", "producer_8hpp" ] +]; \ No newline at end of file diff --git a/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe_dep.dot b/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe_dep.dot new file mode 100644 index 000000000..930f6d633 --- /dev/null +++ b/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe_dep.dot @@ -0,0 +1,14 @@ +digraph "src/kafka" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + compound=true + subgraph clusterdir_68267d1309a1af8e8297ef4c3efbcdba { + graph [ bgcolor="#edf0f7", pencolor="grey25", label="src", fontname=Helvetica,fontsize=10 style="filled,dashed", URL="dir_68267d1309a1af8e8297ef4c3efbcdba.html",tooltip=""] + dir_313caf1132e152dd9b58bea13a4052ca [label="utils", fillcolor="#a2b4d6", color="grey25", style="filled", URL="dir_313caf1132e152dd9b58bea13a4052ca.html",tooltip=""]; + dir_b1f85b4500d4f866a4815ca77f1375fe [label="kafka", fillcolor="#edf0f7", color="grey25", style="filled,bold", URL="dir_b1f85b4500d4f866a4815ca77f1375fe.html",tooltip=""]; + } + dir_b1f85b4500d4f866a4815ca77f1375fe->dir_313caf1132e152dd9b58bea13a4052ca [headlabel="1", labeldistance=1.5 headhref="dir_000003_000007.html" href="dir_000003_000007.html" color="steelblue1" fontcolor="steelblue1"]; +} diff --git a/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe_dep.map b/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe_dep.map new file mode 100644 index 000000000..fdf9ee637 --- /dev/null +++ b/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe_dep.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe_dep.md5 b/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe_dep.md5 new file mode 100644 index 000000000..be6b6e134 --- /dev/null +++ b/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe_dep.md5 @@ -0,0 +1 @@ +9c0e5f074fa78277a35b5855bddd2c8a \ No newline at end of file diff --git a/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe_dep.png b/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe_dep.png new file mode 100644 index 000000000..112f180a6 Binary files /dev/null and b/docs/html/dir_b1f85b4500d4f866a4815ca77f1375fe_dep.png differ diff --git a/docs/html/doxygen.css b/docs/html/doxygen.css new file mode 100644 index 000000000..5d05adf98 --- /dev/null +++ b/docs/html/doxygen.css @@ -0,0 +1,2567 @@ +/* The standard CSS for doxygen 1.17.0*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #3D578C; +--page-external-link-color: #334975; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--group-header-separator-color: #D9E0EE; +--group-header-color: #354C7B; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 75px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #C4CFE5; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #C4CFE5; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-folder-open-fill-color: #C4CFE5; +--icon-folder-fill-color: #D8DFEE; +--icon-folder-border-color: #4665A2; +--icon-doc-fill-color: #D8DFEE; +--icon-doc-border-color: #4665A2; + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; +--memdecl-border-color: #D5DDEC; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-proto-background-color: #EEF1F7; +--memdef-proto-text-color: #253555; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-border-color: #C4CFE5; +--nav-breadcrumb-separator-color: #C4CFE5; +--nav-breadcrumb-active-bg: #EEF1F7; +--nav-breadcrumb-color: #354C7B; +--nav-splitbar-bg-color: #DCE2EF; +--nav-splitbar-handle-color: #9CAFD4; +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-active-bg: #DCE2EF; +--nav-menu-active-color: #9CAFD4; +--nav-arrow-color: #B6C4DF; +--nav-arrow-selected-color: #90A5CE; + +/* sync icon */ +--sync-icon-border-color: #C4CFE5; +--sync-icon-background-color: #F9FAFC; +--sync-icon-selected-background-color: #EEF1F7; +--sync-icon-color: #C4CFE5; +--sync-icon-selected-color: #6884BD; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-active-color: black; +--search-filter-background-color: rgba(255,255,255,.7); +--search-filter-backdrop-filter: blur(4px); +--search-filter-foreground-color: black; +--search-filter-border-color: rgba(150,150,150,.4); +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: rgba(255,255,255,.8); +--search-results-backdrop-filter: blur(4px); +--search-results-border-color: rgba(150,150,150,.4); +--search-box-border-color: #B6C4DF; +--search-close-icon-bg-color: #A0A0A0; +--search-close-icon-fg-color: white; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--fragment-copy-ok-color: #2EC82E; +--fragment-highlight-filter: -3; +--tooltip-foreground-color: black; +--tooltip-background-color: rgba(255,255,255,0.8); +--tooltip-arrow-background-color: white; +--tooltip-border-color: rgba(150,150,150,0.7); +--tooltip-backdrop-filter: blur(3px); +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 0 4px 8px 0 rgba(0,0,0,.25); +--fold-line-color: #808080; + +/** font-family */ +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #f8d1cc; +--warning-color-hl: #b61825; +--warning-color-text: #75070f; +--note-color-bg: #faf3d8; +--note-color-hl: #f3a600; +--note-color-text: #5f4204; +--todo-color-bg: #e4f3ff; +--todo-color-hl: #1879C4; +--todo-color-text: #274a5c; +--test-color-bg: #e8e8ff; +--test-color-hl: #3939C4; +--test-color-text: #1a1a5c; +--deprecated-color-bg: #ecf0f3; +--deprecated-color-hl: #5b6269; +--deprecated-color-text: #43454a; +--bug-color-bg: #e4dafd; +--bug-color-hl: #5b2bdd; +--bug-color-text: #2a0d72; +--invariant-color-bg: #d8f1e3; +--invariant-color-hl: #44b86f; +--invariant-color-text: #265532; +--satisfies-color-hl: #b61825; +--satisfies-color-bg: #f8d1cc; +--verifies-color-hl: #b61825; +--verifies-color-bg: #f8d1cc; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #90A5CE; +--page-external-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--group-header-separator-color: #1D2A43; +--group-header-color: #90A5CE; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #212F4B; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #2C3F65; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-folder-open-fill-color: #4665A2; +--icon-folder-fill-color: #5373B4; +--icon-folder-border-color: #C4CFE5; +--icon-doc-fill-color: #6884BD; +--icon-doc-border-color: #C4CFE5; + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; +--memdecl-border-color: #233250; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-border-color: #212F4B; +--nav-breadcrumb-separator-color: #212F4B; +--nav-breadcrumb-active-bg: #1D2A43; +--nav-breadcrumb-color: #90A5CE; +--nav-splitbar-bg-color: #283A5D; +--nav-splitbar-handle-color: #4665A2; +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-active-bg: #1D2A43; +--nav-menu-active-color: #C9D3E7; +--nav-arrow-color: #4665A2; +--nav-arrow-selected-color: #6884BD; + +/* sync icon */ +--sync-icon-border-color: #212F4B; +--sync-icon-background-color: #101826; +--sync-icon-selected-background-color: #1D2A43; +--sync-icon-color: #4665A2; +--sync-icon-selected-color: #5373B4; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-active-color: #F5F5F5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-backdrop-filter: none; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: black; +--search-results-foreground-color: #90A5CE; +--search-results-backdrop-filter: none; +--search-results-border-color: #334975; +--search-box-border-color: #334975; +--search-close-icon-bg-color: #909090; +--search-close-icon-fg-color: black; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: #090D16; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--fragment-copy-ok-color: #0EA80E; +--fragment-highlight-filter: 5; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-arrow-background-color: #202020; +--tooltip-backdrop-filter: none; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; + +/** font-family */ +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #2e1917; +--warning-color-hl: #ad2617; +--warning-color-text: #f5b1aa; +--note-color-bg: #3b2e04; +--note-color-hl: #f1b602; +--note-color-text: #ceb670; +--todo-color-bg: #163750; +--todo-color-hl: #1982D2; +--todo-color-text: #dcf0fa; +--test-color-bg: #121258; +--test-color-hl: #4242cf; +--test-color-text: #c0c0da; +--deprecated-color-bg: #2e323b; +--deprecated-color-hl: #738396; +--deprecated-color-text: #abb0bd; +--bug-color-bg: #2a2536; +--bug-color-hl: #7661b3; +--bug-color-text: #ae9ed6; +--invariant-color-bg: #303a35; +--invariant-color-hl: #76ce96; +--invariant-color-text: #cceed5; +--satisfies-color-hl: #ad2617; +--satisfies-color-bg: #2e1917; +--verifies-color-hl: #ad2617; +--verifies-color-bg: #2e1917; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +body.resizing { + user-select: none; + -webkit-user-select: none; +} + +#doc-content { + scrollbar-width: thin; +} + +/* @group Heading Levels */ + +.title { + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 160%; + font-weight: 400; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + box-shadow: 12px 0 var(--page-background-color), + -12px 0 var(--page-background-color), + 12px 1px var(--group-header-separator-color), + -12px 1px var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +td h2.groupheader { + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; + margin-bottom: 0px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + margin-right: 6px; + padding-right: 6px; + text-align: right; + line-height: 110%; + background-color: var(--nav-background-color); +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + padding-right: 6px; + padding-left: 6px; + border-radius: 0 6px 6px 0; + background-color: var(--nav-menu-active-bg); +} + +div.alphasepar:before{ + content: " | " ; + width: 14px; + display: inline-block; + text-align: center; + line-height: 140%; + font-size: 130%; +} + +div.alphasepar{ + display: inline-block; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +span.label a:hover { + text-decoration: none; + background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.el, a.el:visited, a.code, a.code:visited, a.line, a.line:visited { + color: var(--page-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--page-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +div.embeddoc { + font-family: var(--font-family-monospace); + padding-left: 10px; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul.check { + list-style: none; + padding-left: 40px; + margin: 0; +} + +ul.check li { + position: relative; +} + +li.unchecked::before, li.checked::before { + position: absolute; + left: -18px; + top: 0; +} + +li.unchecked::before { + content: "☐"; +} + +li.checked::before { + content: "☑"; +} + +ul.check li > p { + display: inline; +} + +ul.check li > p:not(:first-child) { + display: block; +} + +ol { + text-indent: 0px; +} + +ul { + text-indent: 0px; + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; + overflow-y: hidden; + position: relative; + min-height: 12px; + margin: 10px 0px; + padding: 10px 10px; + border: 1px solid var(--fragment-border-color); + border-radius: 4px; + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); +} + +pre.fragment { + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +span.tt { + white-space: pre; + font-family: var(--font-family-monospace); + background-color: var(--fragment-background-color); +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; + overflow: hidden; + justify-content: center; + align-items: center; + cursor: pointer; +} + +.clipboard.success { + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .4; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: var(--fragment-copy-ok-color); +} + +.clipboard.success { + border-color: var(--fragment-copy-ok-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: wrap; + word-break: break-all; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -62px; + padding-left: 62px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + display: inline-block; + width: 12px; + height: 12px; + margin-left: 4px; + margin-right: 1px; +} + +span.foldnone { + display: inline-block; + position: relative; + cursor: pointer; + user-select: none; +} + +span.fold.plus, span.fold.minus { + width: 10px; + height: 10px; + background-color: var(--fragment-background-color); + position: relative; + border: 1px solid var(--fold-line-color); + margin-right: 1px; +} + +span.fold.plus::before, span.fold.minus::before { + content: ''; + position: absolute; + background-color: var(--fold-line-color); +} + +span.fold.plus::before { + width: 2px; + height: 6px; + top: 2px; + left: 4px; +} + +span.fold.plus::after { + content: ''; + position: absolute; + width: 6px; + height: 2px; + top: 4px; + left: 2px; + background-color: var(--fold-line-color); +} + +span.fold.minus::before { + width: 6px; + height: 2px; + top: 4px; + left: 2px; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 110%; + font-weight: 500; + margin-left: 0px; + margin-top: 0em; + margin-bottom: 6px; + padding-top: 8px; + padding-bottom: 4px; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 12px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + border: none; + margin-top: 16px; + margin-bottom: 16px; + height: 1px; + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight { + padding-top: 2px; + padding-bottom: 2px; +} + +.memTemplParams { + padding-left: 10px; + padding-top: 5px; +} + +.memItemLeft, .memItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +tr[class^='memdesc'] { + box-shadow: inset 0px 1px 3px 0px rgba(0,0,0,.075); +} + +.mdescLeft { + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); +} + +.mdescRight { + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; + border-left: 1px solid var(--memdecl-border-color); + border-right: 1px solid var(--memdecl-border-color); +} + +td.ititle { + border: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; + padding-left: 10px; +} + +tr:not(:first-child) > td.ititle { + border-top: 0; + border-radius: 0; +} + +.memItemLeft { + white-space: nowrap; + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-left: 10px; + transition: none; + vertical-align: top; + text-align: right; +} + +.memItemRight { + width: 100%; + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-right: 10px; + transition: none; + vertical-align: bottom; +} + +tr.heading + tr[class^='memitem'] td.memItemLeft, +tr.groupHeader + tr[class^='memitem'] td.memItemLeft, +tr.inherit_header + tr[class^='memitem'] td.memItemLeft { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memItemRight, +tr.groupHeader + tr[class^='memitem'] td.memItemRight, +tr.inherit_header + tr[class^='memitem'] td.memItemRight { + border-top: 1px solid var(--memdecl-border-color); + border-top-right-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memTemplParams, +tr.heading + tr td.ititle, +tr.groupHeader + tr[class^='memitem'] td.memTemplParams, +tr.groupHeader + tr td.ititle, +tr.inherit_header + tr[class^='memitem'] td.memTemplParams { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemLeft, +table.memberdecls tr:last-child td.mdescLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescLeft { + border-bottom-left-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemRight, +table.memberdecls tr:last-child td.mdescRight, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemRight, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescRight { + border-bottom-right-radius: 4px; +} + +tr.template .memItemLeft, tr.template .memItemRight { + border-top: none; + padding-top: 0; +} + + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-color: var(--memdef-proto-background-color); + line-height: 1.25; + font-family: var(--font-family-monospace); + font-weight: 500; + font-size: 16px; + float:left; + box-shadow: 0 10px 0 -1px var(--memdef-proto-background-color), + 0 2px 8px 0 rgba(0,0,0,.075); + position: relative; +} + +.memtitle:after { + content: ''; + display: block; + background: var(--memdef-proto-background-color); + height: 10px; + bottom: -10px; + left: 0px; + right: -14px; + position: absolute; + border-top-right-radius: 6px; +} + +.permalink +{ + font-family: var(--font-family-monospace); + font-weight: 500; + line-height: 1.25; + font-size: 16px; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-family: var(--font-family-monospace); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + display: table !important; + width: 100%; + box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + border-radius: 4px; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-family: var(--font-family-monospace); + font-size: 13px; + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + background-color: var(--memdef-proto-background-color); + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; +} + +.paramname { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; + margin-left: 2px; +} + +.paramname em { + color: var(--memdef-param-name-color); + font-style: normal; + margin-right: 1px; +} + +.paramname .paramdefval { + font-family: var(--font-family-monospace); +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-background-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 14px; + transition: opacity 0.3s ease; +} + +span.arrowhead { + position: relative; + padding: 0; + margin: 0 0 0 2px; + display: inline-block; + width: 5px; + height: 5px; + border-right: 2px solid var(--nav-arrow-color); + border-bottom: 2px solid var(--nav-arrow-color); + transform: rotate(-45deg); + transition: transform 0.3s ease; +} + +span.arrowhead.opened { + transform: rotate(45deg); +} + +.selected span.arrowhead { + border-right: 2px solid var(--nav-arrow-selected-color); + border-bottom: 2px solid var(--nav-arrow-selected-color); +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfolder { + width: 24px; + height: 18px; + margin-top: 6px; + vertical-align:top; + display: inline-block; + position: relative; +} + +.icondoc { + width: 24px; + height: 18px; + margin-top: 3px; + vertical-align:top; + display: inline-block; + position: relative; +} + +.folder-icon { + width: 16px; + height: 11px; + background-color: var(--icon-folder-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 0 2px 2px 2px; + position: relative; + box-sizing: content-box; +} + +.folder-icon::after { + content: ''; + position: absolute; + top: 2px; + left: -1px; + width: 16px; + height: 7px; + background-color: var(--icon-folder-open-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 7px 7px 2px 2px; + transform-origin: top left; + opacity: 0; + transition: all 0.3s linear; +} + +.folder-icon::before { + content: ''; + position: absolute; + top: -3px; + left: -1px; + width: 6px; + height: 2px; + background-color: var(--icon-folder-fill-color); + border-top: 1px solid var(--icon-folder-border-color); + border-left: 1px solid var(--icon-folder-border-color); + border-right: 1px solid var(--icon-folder-border-color); + border-radius: 2px 2px 0 0; +} + +.folder-icon.open::after { + top: 3px; + opacity: 1; +} + +.doc-icon { + left: 6px; + width: 12px; + height: 16px; + background-color: var(--icon-doc-border-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: relative; + display: inline-block; +} +.doc-icon::before { + content: ""; + left: 1px; + top: 1px; + width: 10px; + height: 14px; + background-color: var(--icon-doc-fill-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: absolute; + box-sizing: border-box; +} +.doc-icon::after { + content: ""; + left: 7px; + top: 0px; + width: 3px; + height: 3px; + background-color: transparent; + position: absolute; + border: 1px solid var(--icon-doc-border-color); +} + + + + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +span.dynarrow { + position: relative; + display: inline-block; + width: 12px; + bottom: 1px; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fieldinit { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fieldinit { + padding-top: 3px; + text-align: right; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + +/* style requirements page */ + +div.req_title { + text-decoration-line: underline; + text-decoration-style: solid; + text-decoration-color: var(--table-cell-border-color); + text-decoration-thickness: 1px; + font-weight: bold; +} + +table.reqlist tr > td:first-child { + text-align: right; + font-weight: bold; +} + +div.missing_satisfies { + border-left: 8px solid var(--satisfies-color-hl); + border-radius: 4px; + background: var(--satisfies-color-bg); + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; +} + +div.missing_verifies { + border-left: 8px solid var(--verifies-color-hl); + border-radius: 4px; + background: var(--verifies-color-bg); + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; +} + +/* ----------- navigation breadcrumb styling ----------- */ + +#nav-path ul { + height: 30px; + line-height: 30px; + color: var(--nav-text-normal-color); + overflow: hidden; + margin: 0px; + padding-left: 4px; + background-image: none; + background: var(--page-background-color); + border-bottom: 1px solid var(--nav-breadcrumb-separator-color); + font-size: var(--nav-font-size-level1); + font-family: var(--font-family-nav); + position: relative; + z-index: 100; +} + +#main-nav { + border-bottom: 1px solid var(--nav-border-color); +} + +.navpath li { + list-style-type:none; + float:left; + color: var(--nav-foreground-color); +} + +.navpath li.footer { + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + font-size: 8pt; + color: var(--footer-foreground-color); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; + padding-left: 15px; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--nav-breadcrumb-color); + position: relative; + top: 0px; + height: 30px; + margin-right: -20px; +} + +#nav-path li.navelem:after { + content: ''; + display: inline-block; + position: relative; + top: 0; + right: -15px; + width: 30px; + height: 30px; + transform: scaleX(0.5) scale(0.707) rotate(45deg); + z-index: 10; + background: var(--page-background-color); + box-shadow: 2px -2px 0 2px var(--nav-breadcrumb-separator-color); + border-radius: 0 5px 0 50px; +} + +#nav-path li.navelem:first-child { + margin-left: -6px; +} + +#nav-path li.navelem:hover, +#nav-path li.navelem:hover:after { + background-color: var(--nav-breadcrumb-active-bg); +} + +/* ---------------------- */ + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + margin: 0px; + background-color: var(--header-background-color); + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl { + padding: 0 0 0 0; +} + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.important, dl.note, dl.deprecated, dl.bug, +dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; + border-radius: 4px; +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention, dl.important { + background: var(--warning-color-bg); + border-left: 8px solid var(--warning-color-hl); + color: var(--warning-color-text); +} + +dl.warning dt, dl.attention dt, dl.important dt { + color: var(--warning-color-hl); +} + +dl.warning .tt, dl.attention .tt, dl.important .tt { + background-color: hsl(from var(--warning-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.note, dl.remark { + background: var(--note-color-bg); + border-left: 8px solid var(--note-color-hl); + color: var(--note-color-text); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-hl); +} + +dl.note .tt, dl.remark .tt { + background-color: hsl(from var(--note-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.todo { + background: var(--todo-color-bg); + border-left: 8px solid var(--todo-color-hl); + color: var(--todo-color-text); +} + +dl.todo dt { + color: var(--todo-color-hl); +} + +dl.todo .tt { + background-color: hsl(from var(--todo-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.test { + background: var(--test-color-bg); + border-left: 8px solid var(--test-color-hl); + color: var(--test-color-text); +} + +dl.test dt { + color: var(--test-color-hl); +} + +dl.test .tt { + background-color: hsl(from var(--test-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug { + background: var(--bug-color-bg); + border-left: 8px solid var(--bug-color-hl); + color: var(--bug-color-text); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug .tt { + background-color: hsl(from var(--bug-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.deprecated { + background: var(--deprecated-color-bg); + border-left: 8px solid var(--deprecated-color-hl); + color: var(--deprecated-color-text); +} + +dl.deprecated dt a { + color: var(--deprecated-color-hl) !important; +} + +dl.deprecated .tt { + background-color: hsl(from var(--deprecated-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color-bg); + border-left: 8px solid var(--invariant-color-hl); + color: var(--invariant-color-text); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-hl); +} + +dl.invariant .tt, dl.pre .tt, dl.post .tt { + background-color: hsl(from var(--invariant-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.note dd, dl.warning dd, dl.pre dd, dl.post dd, +dl.remark dd, dl.attention dd, dl.important dd, dl.invariant dd, +dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { + margin-inline-start: 0px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0; + padding: 0; +} + +#side-nav #projectname +{ + font-size: 130%; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0 0 0 5px; + margin: 0px; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li[class^='level'] { + margin-left: 15px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.empty { + background-image: none; + margin-top: 0px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: 400; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0 2px 0; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 12px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + backdrop-filter: var(--tooltip-backdrop-filter); + -webkit-backdrop-filter: var(--tooltip-backdrop-filter); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-arrow-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-arrow-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd +{ + display: inline-block; +} +tt, code, kbd +{ + vertical-align: top; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; + display: inline-block; + transform: rotate(-90deg); +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; + display: inline-block; + transform: rotate(0deg); +} + +html { +--timestamp: 'Вт 4 Авг 2026 20:11:27'; +} +span.timestamp { content: ' '; } +span.timestamp:before { content: var(--timestamp); } + +:root { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +:root.dark-mode { + color-scheme: dark; +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/docs/html/doxygen.svg b/docs/html/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/docs/html/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/doxygen_crawl.html b/docs/html/doxygen_crawl.html new file mode 100644 index 000000000..835f39c72 --- /dev/null +++ b/docs/html/doxygen_crawl.html @@ -0,0 +1,266 @@ + + + +Validator / crawler helper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/files.html b/docs/html/files.html new file mode 100644 index 000000000..fbab66698 --- /dev/null +++ b/docs/html/files.html @@ -0,0 +1,157 @@ + + + + + + + +Kafka-1C Connector: Файлы + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Файлы
+
+ +
+
+ + + + diff --git a/docs/html/files_dup.js b/docs/html/files_dup.js new file mode 100644 index 000000000..c3b39c499 --- /dev/null +++ b/docs/html/files_dup.js @@ -0,0 +1,4 @@ +var files_dup = +[ + [ "src", "dir_68267d1309a1af8e8297ef4c3efbcdba.html", "dir_68267d1309a1af8e8297ef4c3efbcdba" ] +]; \ No newline at end of file diff --git a/docs/html/functions.html b/docs/html/functions.html new file mode 100644 index 000000000..a55ceb97f --- /dev/null +++ b/docs/html/functions.html @@ -0,0 +1,334 @@ + + + + + + + +Kafka-1C Connector: Члены классов + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Список всех членов классов со ссылками на классы, к которым они принадлежат.

+ + + +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- k -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- q -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- v -

+ + +

- w -

+ + +

- ~ -

+
+
+
+ + + + diff --git a/docs/html/functions_enum.html b/docs/html/functions_enum.html new file mode 100644 index 000000000..6d2082967 --- /dev/null +++ b/docs/html/functions_enum.html @@ -0,0 +1,134 @@ + + + + + + + +Kafka-1C Connector: Члены классов - Перечисления + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Список всех перечислителей со ссылками на классы, к которым они относятся:

+ + +
+
+
+ + + + diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html new file mode 100644 index 000000000..98ec98f92 --- /dev/null +++ b/docs/html/functions_func.html @@ -0,0 +1,258 @@ + + + + + + + +Kafka-1C Connector: Члены классов - Функции + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Список всех функций со ссылками на классы, к которым они относятся:

+ + + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- k -

+ + +

- l -

+ + +

- m -

+ + +

- o -

+ + +

- p -

+ + +

- q -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- v -

+ + +

- w -

+ + +

- ~ -

+
+
+
+ + + + diff --git a/docs/html/functions_type.html b/docs/html/functions_type.html new file mode 100644 index 000000000..291a47fe4 --- /dev/null +++ b/docs/html/functions_type.html @@ -0,0 +1,135 @@ + + + + + + + +Kafka-1C Connector: Члены классов - Определения типов + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Список всех определений типов со ссылками на классы, к которым они относятся:

+ + +
+
+
+ + + + diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html new file mode 100644 index 000000000..51113b7dd --- /dev/null +++ b/docs/html/functions_vars.html @@ -0,0 +1,260 @@ + + + + + + + +Kafka-1C Connector: Члены классов - Переменные + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Список всех переменных со ссылками на классы, к которым они относятся:

+ + + +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- k -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- q -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+
+
+
+ + + + diff --git a/docs/html/globals.html b/docs/html/globals.html new file mode 100644 index 000000000..16d0dabb2 --- /dev/null +++ b/docs/html/globals.html @@ -0,0 +1,144 @@ + + + + + + + +Kafka-1C Connector: Список членов всех файлов + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Список всех членов файлов со ссылками на файлы, к которым они принадлежат.

+ + +
+
+
+ + + + diff --git a/docs/html/globals_func.html b/docs/html/globals_func.html new file mode 100644 index 000000000..44dee2136 --- /dev/null +++ b/docs/html/globals_func.html @@ -0,0 +1,139 @@ + + + + + + + +Kafka-1C Connector: Список членов всех файлов + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Список всех функций соссылками на файлы, к которым они относятся:

+ + +
+
+
+ + + + diff --git a/docs/html/globals_type.html b/docs/html/globals_type.html new file mode 100644 index 000000000..041b1efb3 --- /dev/null +++ b/docs/html/globals_type.html @@ -0,0 +1,134 @@ + + + + + + + +Kafka-1C Connector: Список членов всех файлов + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Список всех определений типов соссылками на файлы, к которым они относятся:

+ + +
+
+
+ + + + diff --git a/docs/html/globals_vars.html b/docs/html/globals_vars.html new file mode 100644 index 000000000..128343994 --- /dev/null +++ b/docs/html/globals_vars.html @@ -0,0 +1,137 @@ + + + + + + + +Kafka-1C Connector: Список членов всех файлов + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Список всех переменных соссылками на файлы, к которым они относятся:

+ + +
+
+
+ + + + diff --git a/docs/html/graph_legend.dot b/docs/html/graph_legend.dot new file mode 100644 index 000000000..5ed66aaa2 --- /dev/null +++ b/docs/html/graph_legend.dot @@ -0,0 +1,24 @@ +digraph "Легенда" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node9 [id="Node000009",label="Inherited",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node10 -> Node9 [dir="back",color="steelblue1",style="solid" tooltip=" "]; + Node10 [id="Node000010",label="PublicBase",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",tooltip=" "]; + Node11 -> Node10 [dir="back",color="steelblue1",style="solid" tooltip=" "]; + Node11 [id="Node000011",label="Truncated",height=0.2,width=0.4,color="red", fillcolor="#FFF0F0", style="filled",tooltip=" "]; + Node13 -> Node9 [dir="back",color="darkgreen",style="solid" tooltip=" "]; + Node13 [label="ProtectedBase",color="gray40",fillcolor="white",style="filled" tooltip=" "]; + Node14 -> Node9 [dir="back",color="firebrick4",style="solid" tooltip=" "]; + Node14 [label="PrivateBase",color="gray40",fillcolor="white",style="filled" tooltip=" "]; + Node15 -> Node9 [dir="back",color="steelblue1",style="solid" tooltip=" "]; + Node15 [id="Node000015",label="Undocumented",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node16 -> Node9 [dir="back",color="steelblue1",style="solid" tooltip=" "]; + Node16 [label="Templ\< int \>",color="gray40",fillcolor="white",style="filled" tooltip=" "]; + Node17 -> Node16 [dir="back",color="orange",style="dashed",label="< int >",fontcolor="grey" tooltip=" "]; + Node17 [label="Templ\< T \>",color="gray40",fillcolor="white",style="filled" tooltip=" "]; + Node18 -> Node9 [dir="back",color="darkorchid3",style="dashed",label="m_usedClass",fontcolor="grey" tooltip=" "]; + Node18 [label="Used",color="gray40",fillcolor="white",style="filled" tooltip=" "]; +} diff --git a/docs/html/graph_legend.dot.cmapx b/docs/html/graph_legend.dot.cmapx new file mode 100644 index 000000000..042cf3d77 --- /dev/null +++ b/docs/html/graph_legend.dot.cmapx @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/graph_legend.html b/docs/html/graph_legend.html new file mode 100644 index 000000000..6070fde5d --- /dev/null +++ b/docs/html/graph_legend.html @@ -0,0 +1,190 @@ + + + + + + + +Kafka-1C Connector: Легенда + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Легенда
+
+
+

Обозначения, используемые в графах.

+

Рассмотрим следующий пример:

/*! Невидимый класс из-за усечения */
+
class Invisible { };
+
+
/*! Усеченный класс, отношение наследования скрыто */
+
class Truncated : public Invisible { };
+
+
/* Недокументированный класс */
+
class Undocumented { };
+
+
/*! Открытое наследование */
+
class PublicBase : public Truncated { };
+
+
/*! Шаблон класса */
+
template<class T> class Templ {};
+
+
/*! Защищенное наследование */
+
class ProtectedBase { };
+
+
/*! Закрытое наследование */
+
class PrivateBase { };
+
+
/*! Класс, используемый классом Inherited */
+
class Used { };
+
+
/*! Класс, порожденный от других классов */
+
class Inherited : public PublicBase,
+
protected ProtectedBase,
+
private PrivateBase,
+
public Undocumented,
+
public Templ<int>
+
{
+
private:
+
Used *m_usedClass;
+
};
+

Получится следующий граф:

+

Прямоугольники в этом графе имеют следующее значение:

    +
  • +Заполненный черный прямоугольник представляет структуру или класс, для которого создан граф.
  • +
  • +Прямоугольник с черной границей обозначает документированную структуру или класс.
  • +
  • +Прямоугольник с серой границей обозначает недокументированную структуру или класс.
  • +
  • +Прямоугольник с красной границей обозначает документированную структуру или класс, для которого не все отношения наследования/содержания показаны. Граф усечен, если он не поместился в указанных границах.
  • +
+

Стрелки имеют следующее значение:

    +
  • +Темно-синяя стрелка используется для изображения отношения открытого наследования между двумя классами.
  • +
  • +Темно-зеленая стрелка используется при защищенном наследовании.
  • +
  • +Темно-красная стрелка используется при закрытом наследовании.
  • +
  • +Фиолетовая стрелка используется, если класс содержится вдругом класе или используется другим классом.Со стрелкой указывается переменная, через которую доступен указываемый класс или структура.
  • +
  • +Желтая стрелка используется для связи подстановки шаблона и шаблона, на основе которого эта подстановка выполнена. С шаблономуказывается параметр подстановки.
  • +
+
+
+
+ + + + diff --git a/docs/html/graph_legend.md5 b/docs/html/graph_legend.md5 new file mode 100644 index 000000000..c7f5f78ae --- /dev/null +++ b/docs/html/graph_legend.md5 @@ -0,0 +1 @@ +3b44d2cf5ab29a1e5747a04c104f7965 \ No newline at end of file diff --git a/docs/html/graph_legend.png b/docs/html/graph_legend.png new file mode 100644 index 000000000..feea22ab1 Binary files /dev/null and b/docs/html/graph_legend.png differ diff --git a/docs/html/index.html b/docs/html/index.html new file mode 100644 index 000000000..997be9cb7 --- /dev/null +++ b/docs/html/index.html @@ -0,0 +1,133 @@ + + + + + + + +Kafka-1C Connector: Титульная страница + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Kafka-1C Connector Документация
+
+
+ +
+
+
+ + + + diff --git a/docs/html/json__parser_8hpp.html b/docs/html/json__parser_8hpp.html new file mode 100644 index 000000000..0012188d8 --- /dev/null +++ b/docs/html/json__parser_8hpp.html @@ -0,0 +1,181 @@ + + + + + + + +Kafka-1C Connector: Файл src/parser/json_parser.hpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Файл json_parser.hpp
+
+
+
#include <string>
+#include <vector>
+#include <nlohmann/json.hpp>
+
+Граф включаемых заголовочных файлов для json_parser.hpp:
+
+
+ + + + + + + + + +
+
+Граф файлов, в которые включается этот файл:
+
+
+ + + + + + + + + + +
+
+

См. исходные тексты.

+ + + + + +

+Классы

struct  OrderItem
struct  OrderData
class  JsonParser
+
+
+ +
+ + + + diff --git a/docs/html/json__parser_8hpp.js b/docs/html/json__parser_8hpp.js new file mode 100644 index 000000000..dbbb484f5 --- /dev/null +++ b/docs/html/json__parser_8hpp.js @@ -0,0 +1,6 @@ +var json__parser_8hpp = +[ + [ "OrderItem", "struct_order_item.html", "struct_order_item" ], + [ "OrderData", "struct_order_data.html", "struct_order_data" ], + [ "JsonParser", "class_json_parser.html", null ] +]; \ No newline at end of file diff --git a/docs/html/json__parser_8hpp__dep__incl.dot b/docs/html/json__parser_8hpp__dep__incl.dot new file mode 100644 index 000000000..7d10c1e44 --- /dev/null +++ b/docs/html/json__parser_8hpp__dep__incl.dot @@ -0,0 +1,15 @@ +digraph "src/parser/json_parser.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/parser/json_parser.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="src/main.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="src/processor/order\l_processor.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$order__processor_8hpp.html",tooltip=" "]; + Node3 -> Node2 [id="edge3_Node000003_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 -> Node4 [id="edge4_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="src/processor/order\l_processor.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$order__processor_8cpp.html",tooltip=" "]; +} diff --git a/docs/html/json__parser_8hpp__dep__incl.map b/docs/html/json__parser_8hpp__dep__incl.map new file mode 100644 index 000000000..d3e4d566d --- /dev/null +++ b/docs/html/json__parser_8hpp__dep__incl.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/html/json__parser_8hpp__dep__incl.md5 b/docs/html/json__parser_8hpp__dep__incl.md5 new file mode 100644 index 000000000..3c67b65f4 --- /dev/null +++ b/docs/html/json__parser_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +2eba083cc325f3a382f67d421956c653 \ No newline at end of file diff --git a/docs/html/json__parser_8hpp__dep__incl.png b/docs/html/json__parser_8hpp__dep__incl.png new file mode 100644 index 000000000..cad24901f Binary files /dev/null and b/docs/html/json__parser_8hpp__dep__incl.png differ diff --git a/docs/html/json__parser_8hpp__incl.dot b/docs/html/json__parser_8hpp__incl.dot new file mode 100644 index 000000000..fe3a8f04d --- /dev/null +++ b/docs/html/json__parser_8hpp__incl.dot @@ -0,0 +1,14 @@ +digraph "src/parser/json_parser.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/parser/json_parser.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="string",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="vector",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="nlohmann/json.hpp",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; +} diff --git a/docs/html/json__parser_8hpp__incl.map b/docs/html/json__parser_8hpp__incl.map new file mode 100644 index 000000000..c35cd14fa --- /dev/null +++ b/docs/html/json__parser_8hpp__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/json__parser_8hpp__incl.md5 b/docs/html/json__parser_8hpp__incl.md5 new file mode 100644 index 000000000..5a0ce40d9 --- /dev/null +++ b/docs/html/json__parser_8hpp__incl.md5 @@ -0,0 +1 @@ +98331e9870fdee3ca84e58f1b0caab7b \ No newline at end of file diff --git a/docs/html/json__parser_8hpp__incl.png b/docs/html/json__parser_8hpp__incl.png new file mode 100644 index 000000000..372c9bc99 Binary files /dev/null and b/docs/html/json__parser_8hpp__incl.png differ diff --git a/docs/html/json__parser_8hpp_source.html b/docs/html/json__parser_8hpp_source.html new file mode 100644 index 000000000..1924b0ff0 --- /dev/null +++ b/docs/html/json__parser_8hpp_source.html @@ -0,0 +1,214 @@ + + + + + + + +Kafka-1C Connector: Исходный файл src/parser/json_parser.hpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
json_parser.hpp
+
+
+См. документацию.
1#pragma once
+
2
+
3#include <string>
+
4#include <vector>
+
5#include <nlohmann/json.hpp>
+
6
+
7// ============================================================
+
8// Структура: OrderItem
+
9// Один товар в заказе
+
10// ============================================================
+
11using json = nlohmann::json;
+
12
+
+
13struct OrderItem {
+
14 std::string sku; // Артикул товара
+
15 double quantity; // Количество
+
16 double price; // Цена за единицу
+
17 double sum; // Сумма (quantity * price)
+
18};
+
+
19
+
20// ============================================================
+
21// Структура: OrderData
+
22// Полный заказ (контрагент + товары)
+
23// ============================================================
+
+
24struct OrderData {
+
25 std::string tin; // ИНН контрагента
+
26 std::string trrc; // КПП контрагента
+
27 std::string contractor; // Наименование контрагента
+
28 std::string date; // Дата документа
+
29 std::string number; // Номер документа
+
30 std::vector<OrderItem> goods; // Массив товаров
+
31
+
32 // Преобразование в JSON строку
+
33 std::string toJson() const;
+
34 // Создание из JSON строки
+
35 static OrderData fromJson(const std::string& json_str);
+
36 // Создание из JSON объекта
+
37 static OrderData fromJson(const json& j);
+
38};
+
+
39
+
40// ============================================================
+
41// Класс: JsonParser
+
42// Парсинг JSON файлов
+
43// ============================================================
+
+ +
45public:
+
46 // Парсинг одного файла
+
47 static OrderData parseOrder(const std::string& filename);
+
48 // Парсинг из строки
+
49 static OrderData parseOrderFromString(const std::string& json_str);
+
50 // Парсинг всех файлов в папке
+
51 static std::vector<OrderData> parseDirectory(const std::string& directory);
+
52 // Валидация заказа (проверка обязательных полей)
+
53 static bool validate(const OrderData& order);
+
54};
+
+
Определения json_parser.hpp:44
+
static bool validate(const OrderData &order)
+
static OrderData parseOrderFromString(const std::string &json_str)
+
static std::vector< OrderData > parseDirectory(const std::string &directory)
+
static OrderData parseOrder(const std::string &filename)
+
nlohmann::json json
Определения config.hpp:8
+
Определения json_parser.hpp:24
+
std::string trrc
Определения json_parser.hpp:26
+
static OrderData fromJson(const std::string &json_str)
+
std::string number
Определения json_parser.hpp:29
+
static OrderData fromJson(const json &j)
+
std::vector< OrderItem > goods
Определения json_parser.hpp:30
+
std::string contractor
Определения json_parser.hpp:27
+
std::string toJson() const
+
std::string tin
Определения json_parser.hpp:25
+
std::string date
Определения json_parser.hpp:28
+
Определения json_parser.hpp:13
+
double price
Определения json_parser.hpp:16
+
double sum
Определения json_parser.hpp:17
+
double quantity
Определения json_parser.hpp:15
+
std::string sku
Определения json_parser.hpp:14
+
+
+
+ + + + diff --git a/docs/html/logger_8hpp.html b/docs/html/logger_8hpp.html new file mode 100644 index 000000000..3d25b03b1 --- /dev/null +++ b/docs/html/logger_8hpp.html @@ -0,0 +1,189 @@ + + + + + + + +Kafka-1C Connector: Файл src/utils/logger.hpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Файл logger.hpp
+
+
+
#include <string>
+#include <iostream>
+#include <chrono>
+#include <iomanip>
+#include <sstream>
+#include <mutex>
+
+Граф включаемых заголовочных файлов для logger.hpp:
+
+
+ + + + + + + + + + + + + + + +
+
+Граф файлов, в которые включается этот файл:
+
+
+ + + + + + + + + + + +
+
+

См. исходные тексты.

+ + + +

+Классы

class  Logger
+
+
+ +
+ + + + diff --git a/docs/html/logger_8hpp.js b/docs/html/logger_8hpp.js new file mode 100644 index 000000000..bb3f75fcd --- /dev/null +++ b/docs/html/logger_8hpp.js @@ -0,0 +1,4 @@ +var logger_8hpp = +[ + [ "Logger", "class_logger.html", "class_logger" ] +]; \ No newline at end of file diff --git a/docs/html/logger_8hpp__dep__incl.dot b/docs/html/logger_8hpp__dep__incl.dot new file mode 100644 index 000000000..b17d3b0e7 --- /dev/null +++ b/docs/html/logger_8hpp__dep__incl.dot @@ -0,0 +1,16 @@ +digraph "src/utils/logger.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/utils/logger.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="src/database/postgresql.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$postgresql_8cpp.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="src/kafka/consumer.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$consumer_8cpp.html",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="src/main.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="src/processor/order\l_processor.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$order__processor_8cpp.html",tooltip=" "]; +} diff --git a/docs/html/logger_8hpp__dep__incl.map b/docs/html/logger_8hpp__dep__incl.map new file mode 100644 index 000000000..2d9667d65 --- /dev/null +++ b/docs/html/logger_8hpp__dep__incl.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/html/logger_8hpp__dep__incl.md5 b/docs/html/logger_8hpp__dep__incl.md5 new file mode 100644 index 000000000..5cc93594b --- /dev/null +++ b/docs/html/logger_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +370dd11f7e878d2046e362b74913f408 \ No newline at end of file diff --git a/docs/html/logger_8hpp__dep__incl.png b/docs/html/logger_8hpp__dep__incl.png new file mode 100644 index 000000000..5e88cd8e4 Binary files /dev/null and b/docs/html/logger_8hpp__dep__incl.png differ diff --git a/docs/html/logger_8hpp__incl.dot b/docs/html/logger_8hpp__incl.dot new file mode 100644 index 000000000..ed2d8004d --- /dev/null +++ b/docs/html/logger_8hpp__incl.dot @@ -0,0 +1,20 @@ +digraph "src/utils/logger.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/utils/logger.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="string",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="iostream",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="chrono",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="iomanip",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node6 [id="edge5_Node000001_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="sstream",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node7 [id="edge6_Node000001_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="mutex",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; +} diff --git a/docs/html/logger_8hpp__incl.map b/docs/html/logger_8hpp__incl.map new file mode 100644 index 000000000..2ba3c5925 --- /dev/null +++ b/docs/html/logger_8hpp__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/html/logger_8hpp__incl.md5 b/docs/html/logger_8hpp__incl.md5 new file mode 100644 index 000000000..e4348e4db --- /dev/null +++ b/docs/html/logger_8hpp__incl.md5 @@ -0,0 +1 @@ +d7112d57729da45d908ea81d9e49c176 \ No newline at end of file diff --git a/docs/html/logger_8hpp__incl.png b/docs/html/logger_8hpp__incl.png new file mode 100644 index 000000000..a87a5af7a Binary files /dev/null and b/docs/html/logger_8hpp__incl.png differ diff --git a/docs/html/logger_8hpp_source.html b/docs/html/logger_8hpp_source.html new file mode 100644 index 000000000..ab62a0a37 --- /dev/null +++ b/docs/html/logger_8hpp_source.html @@ -0,0 +1,240 @@ + + + + + + + +Kafka-1C Connector: Исходный файл src/utils/logger.hpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
logger.hpp
+
+
+См. документацию.
1#pragma once
+
2
+
3#include <string>
+
4#include <iostream>
+
5#include <chrono>
+
6#include <iomanip>
+
7#include <sstream>
+
8#include <mutex>
+
9
+
10// ============================================================
+
11// Класс: Logger
+
12// Логирование с временными метками
+
13// ============================================================
+
+
14class Logger {
+
15public:
+
+
16 enum class Level {
+ + + + +
21 };
+
+
22
+
23 static void setLevel(Level level) { current_level_ = level; }
+
24
+
+
25 static void info(const std::string& message) {
+
26 log(Level::INFO, message);
+
27 }
+
+
28
+
+
29 static void warning(const std::string& message) {
+
30 log(Level::WARNING, message);
+
31 }
+
+
32
+
+
33 static void error(const std::string& message) {
+
34 log(Level::ERROR, message);
+
35 }
+
+
36
+
+
37 static void debug(const std::string& message) {
+
38 log(Level::DEBUG, message);
+
39 }
+
+
40
+
41private:
+
42 static Level current_level_;
+
43 static std::mutex mutex_;
+
44
+
45 static void log(Level level, const std::string& message) {
+
46 if (level < current_level_) return; // Если уровень ниже текущего - пропускаем
+
47
+
48 std::lock_guard<std::mutex> lock(mutex_); // Защита от перемешивания логов
+
49
+
50 std::string prefix;
+
51 switch (level) {
+
52 case Level::INFO: prefix = "[INFO] "; break;
+
53 case Level::WARNING: prefix = "[WARN] "; break;
+
54 case Level::ERROR: prefix = "[ERROR] "; break;
+
55 case Level::DEBUG: prefix = "[DEBUG] "; break;
+
56 }
+
57
+
58 std::cout << prefix << getTimestamp() << " " << message << std::endl;
+
59 }
+
60
+
61 static std::string getTimestamp() {
+
62 auto now = std::chrono::system_clock::now();
+
63 auto time_t = std::chrono::system_clock::to_time_t(now);
+
64 auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
+
65 now.time_since_epoch()
+
66 ) % 1000;
+
67
+
68 std::tm tm;
+
69#ifdef _WIN32
+
70 localtime_s(&tm, &time_t);
+
71#else
+
72 localtime_r(&time_t, &tm);
+
73#endif
+
74
+
75 std::ostringstream oss;
+
76 oss << std::put_time(&tm, "%Y-%m-%d %H:%M:%S")
+
77 << "." << std::setfill('0') << std::setw(3) << ms.count();
+
78 return oss.str();
+
79 }
+
80};
+
+
81
+
82// Инициализация статических членов
+
83inline Logger::Level Logger::current_level_ = Logger::Level::INFO;
+
84inline std::mutex Logger::mutex_;
+
Определения logger.hpp:14
+
static void info(const std::string &message)
Определения logger.hpp:25
+
static void warning(const std::string &message)
Определения logger.hpp:29
+
static void setLevel(Level level)
Определения logger.hpp:23
+
static void error(const std::string &message)
Определения logger.hpp:33
+
Level
Определения logger.hpp:16
+
@ WARNING
Определения logger.hpp:18
+
@ INFO
Определения logger.hpp:17
+
@ ERROR
Определения logger.hpp:19
+
@ DEBUG
Определения logger.hpp:20
+
static void debug(const std::string &message)
Определения logger.hpp:37
+
+
+
+ + + + diff --git a/docs/html/main_8cpp.html b/docs/html/main_8cpp.html new file mode 100644 index 000000000..ad99ecd12 --- /dev/null +++ b/docs/html/main_8cpp.html @@ -0,0 +1,765 @@ + + + + + + + +Kafka-1C Connector: Файл src/main.cpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Файл main.cpp
+
+
+
#include <iostream>
+#include <string>
+#include <thread>
+#include <vector>
+#include <atomic>
+#include <chrono>
+#include <filesystem>
+#include <csignal>
+#include <iomanip>
+#include "config/config.hpp"
+#include "kafka/producer.hpp"
+#include "kafka/consumer.hpp"
+#include "parser/json_parser.hpp"
+#include "cache/sqlite_cache.hpp"
+#include "database/postgresql.hpp"
+#include "processor/order_processor.hpp"
+#include "utils/logger.hpp"
+
+Граф включаемых заголовочных файлов для main.cpp:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

См. исходные тексты.

+ + + + + + + + +

+Функции

void signalHandler (int signal)
std::vector< std::string > getJsonFiles (const std::string &directory)
void processFiles (const std::string &directory, KafkaProducer &producer, MessageCache &cache, const std::string &topic, std::atomic< size_t > &next_index, const std::vector< std::string > &files)
void runProducer (AppConfig &config, KafkaProducer &producer, MessageCache &cache)
void runConsumer (AppConfig &config, database::PostgreSQL &db, MessageCache &cache, KafkaProducer &error_producer)
int main (int argc, char *argv[])
+ + + + + +

+Переменные

std::atomic< bool > running {true}
std::atomic< size_t > producer_count {0}
std::atomic< size_t > consumer_count {0}
std::atomic< size_t > error_count {0}
+

Функции

+ +

◆ getJsonFiles()

+ +
+
+ + + + + + + +
std::vector< std::string > getJsonFiles (const std::string & directory)
+
+ +

См. определение в файле main.cpp строка 45

+
+Граф вызовов:
+
+
+ + + + + +
+
+Граф вызова функции:
+
+
+ + + + + + + +
+ +
+
+ +

◆ main()

+ +
+
+ + + + + + + + + + + +
int main (int argc,
char * argv[] )
+
+ +

См. определение в файле main.cpp строка 255

+
+Граф вызовов:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +

◆ processFiles()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void processFiles (const std::string & directory,
KafkaProducer & producer,
MessageCache & cache,
const std::string & topic,
std::atomic< size_t > & next_index,
const std::vector< std::string > & files )
+
+ +

См. определение в файле main.cpp строка 69

+
+Граф вызовов:
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+Граф вызова функции:
+
+
+ + + + + + + +
+ +
+
+ +

◆ runConsumer()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
void runConsumer (AppConfig & config,
database::PostgreSQL & db,
MessageCache & cache,
KafkaProducer & error_producer )
+
+ +

См. определение в файле main.cpp строка 198

+
+Граф вызовов:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+Граф вызова функции:
+
+
+ + + + + +
+ +
+
+ +

◆ runProducer()

+ +
+
+ + + + + + + + + + + + + + + + +
void runProducer (AppConfig & config,
KafkaProducer & producer,
MessageCache & cache )
+
+ +

См. определение в файле main.cpp строка 138

+
+Граф вызовов:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+Граф вызова функции:
+
+
+ + + + + +
+ +
+
+ +

◆ signalHandler()

+ +
+
+ + + + + + + +
void signalHandler (int signal)
+
+ +

См. определение в файле main.cpp строка 35

+
+Граф вызовов:
+
+
+ + + + + +
+
+Граф вызова функции:
+
+
+ + + + + +
+ +
+
+

Переменные

+ +

◆ consumer_count

+ +
+
+ + + + +
std::atomic<size_t> consumer_count {0}
+
+ +

См. определение в файле main.cpp строка 28

+ +
+
+ +

◆ error_count

+ +
+
+ + + + +
std::atomic<size_t> error_count {0}
+
+ +

См. определение в файле main.cpp строка 29

+ +
+
+ +

◆ producer_count

+ +
+
+ + + + +
std::atomic<size_t> producer_count {0}
+
+ +

См. определение в файле main.cpp строка 27

+ +
+
+ +

◆ running

+ +
+
+ + + + +
std::atomic<bool> running {true}
+
+ +

См. определение в файле main.cpp строка 26

+ +
+
+
+
+ +
+ + + + diff --git a/docs/html/main_8cpp.js b/docs/html/main_8cpp.js new file mode 100644 index 000000000..af05feb39 --- /dev/null +++ b/docs/html/main_8cpp.js @@ -0,0 +1,13 @@ +var main_8cpp = +[ + [ "getJsonFiles", "main_8cpp.html#a5a216c3284e0a72fe4f8101cd8b12b60", null ], + [ "main", "main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97", null ], + [ "processFiles", "main_8cpp.html#a5bc44c4396b63ff16c6a74bb1c394478", null ], + [ "runConsumer", "main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854", null ], + [ "runProducer", "main_8cpp.html#a046be377067f3f52c8b9516cdb1e47b5", null ], + [ "signalHandler", "main_8cpp.html#ad2e59c7203b3bddc1bc9a2224b52e8e7", null ], + [ "consumer_count", "main_8cpp.html#a8a2b3452989432f0e06d48049de87e33", null ], + [ "error_count", "main_8cpp.html#a77c334a9669f26a519f128b8f85765a6", null ], + [ "producer_count", "main_8cpp.html#a658b214911501898d6087b601d6b152e", null ], + [ "running", "main_8cpp.html#af53701aded99286de42137bffab9561a", null ] +]; \ No newline at end of file diff --git a/docs/html/main_8cpp__incl.dot b/docs/html/main_8cpp__incl.dot new file mode 100644 index 000000000..eee865a22 --- /dev/null +++ b/docs/html/main_8cpp__incl.dot @@ -0,0 +1,94 @@ +digraph "src/main.cpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/main.cpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="iostream",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="string",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="thread",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="vector",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node6 [id="edge5_Node000001_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="atomic",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node7 [id="edge6_Node000001_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="chrono",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node8 [id="edge7_Node000001_Node000008",color="steelblue1",style="solid",tooltip=" "]; + Node8 [id="Node000008",label="filesystem",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node9 [id="edge8_Node000001_Node000009",color="steelblue1",style="solid",tooltip=" "]; + Node9 [id="Node000009",label="csignal",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node10 [id="edge9_Node000001_Node000010",color="steelblue1",style="solid",tooltip=" "]; + Node10 [id="Node000010",label="iomanip",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node11 [id="edge10_Node000001_Node000011",color="steelblue1",style="solid",tooltip=" "]; + Node11 [id="Node000011",label="config/config.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$config_8hpp.html",tooltip=" "]; + Node11 -> Node3 [id="edge11_Node000011_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node11 -> Node5 [id="edge12_Node000011_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node11 -> Node12 [id="edge13_Node000011_Node000012",color="steelblue1",style="solid",tooltip=" "]; + Node12 [id="Node000012",label="nlohmann/json.hpp",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node11 -> Node13 [id="edge14_Node000011_Node000013",color="steelblue1",style="solid",tooltip=" "]; + Node13 [id="Node000013",label="../database/postgresql.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$postgresql_8hpp.html",tooltip=" "]; + Node13 -> Node14 [id="edge15_Node000013_Node000014",color="steelblue1",style="solid",tooltip=" "]; + Node14 [id="Node000014",label="pqxx/pqxx",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node13 -> Node3 [id="edge16_Node000013_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node13 -> Node15 [id="edge17_Node000013_Node000015",color="steelblue1",style="solid",tooltip=" "]; + Node15 [id="Node000015",label="memory",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node13 -> Node16 [id="edge18_Node000013_Node000016",color="steelblue1",style="solid",tooltip=" "]; + Node16 [id="Node000016",label="optional",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node13 -> Node5 [id="edge19_Node000013_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node17 [id="edge20_Node000001_Node000017",color="steelblue1",style="solid",tooltip=" "]; + Node17 [id="Node000017",label="kafka/producer.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$producer_8hpp.html",tooltip=" "]; + Node17 -> Node18 [id="edge21_Node000017_Node000018",color="steelblue1",style="solid",tooltip=" "]; + Node18 [id="Node000018",label="librdkafka/rdkafkacpp.h",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node17 -> Node3 [id="edge22_Node000017_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node17 -> Node15 [id="edge23_Node000017_Node000015",color="steelblue1",style="solid",tooltip=" "]; + Node17 -> Node19 [id="edge24_Node000017_Node000019",color="steelblue1",style="solid",tooltip=" "]; + Node19 [id="Node000019",label="functional",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node17 -> Node6 [id="edge25_Node000017_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node20 [id="edge26_Node000001_Node000020",color="steelblue1",style="solid",tooltip=" "]; + Node20 [id="Node000020",label="kafka/consumer.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$consumer_8hpp.html",tooltip=" "]; + Node20 -> Node18 [id="edge27_Node000020_Node000018",color="steelblue1",style="solid",tooltip=" "]; + Node20 -> Node3 [id="edge28_Node000020_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node20 -> Node15 [id="edge29_Node000020_Node000015",color="steelblue1",style="solid",tooltip=" "]; + Node20 -> Node19 [id="edge30_Node000020_Node000019",color="steelblue1",style="solid",tooltip=" "]; + Node20 -> Node6 [id="edge31_Node000020_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node20 -> Node4 [id="edge32_Node000020_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node21 [id="edge33_Node000001_Node000021",color="steelblue1",style="solid",tooltip=" "]; + Node21 [id="Node000021",label="parser/json_parser.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$json__parser_8hpp.html",tooltip=" "]; + Node21 -> Node3 [id="edge34_Node000021_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node21 -> Node5 [id="edge35_Node000021_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node21 -> Node12 [id="edge36_Node000021_Node000012",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node22 [id="edge37_Node000001_Node000022",color="steelblue1",style="solid",tooltip=" "]; + Node22 [id="Node000022",label="cache/sqlite_cache.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$sqlite__cache_8hpp.html",tooltip=" "]; + Node22 -> Node23 [id="edge38_Node000022_Node000023",color="steelblue1",style="solid",tooltip=" "]; + Node23 [id="Node000023",label="sqlite3.h",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node22 -> Node3 [id="edge39_Node000022_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node22 -> Node5 [id="edge40_Node000022_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node22 -> Node24 [id="edge41_Node000022_Node000024",color="steelblue1",style="solid",tooltip=" "]; + Node24 [id="Node000024",label="tuple",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node22 -> Node25 [id="edge42_Node000022_Node000025",color="steelblue1",style="solid",tooltip=" "]; + Node25 [id="Node000025",label="mutex",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node22 -> Node19 [id="edge43_Node000022_Node000019",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node13 [id="edge44_Node000001_Node000013",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node26 [id="edge45_Node000001_Node000026",color="steelblue1",style="solid",tooltip=" "]; + Node26 [id="Node000026",label="processor/order_processor.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$order__processor_8hpp.html",tooltip=" "]; + Node26 -> Node13 [id="edge46_Node000026_Node000013",color="steelblue1",style="solid",tooltip=" "]; + Node26 -> Node21 [id="edge47_Node000026_Node000021",color="steelblue1",style="solid",tooltip=" "]; + Node26 -> Node22 [id="edge48_Node000026_Node000022",color="steelblue1",style="solid",tooltip=" "]; + Node26 -> Node17 [id="edge49_Node000026_Node000017",color="steelblue1",style="solid",tooltip=" "]; + Node26 -> Node3 [id="edge50_Node000026_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node26 -> Node16 [id="edge51_Node000026_Node000016",color="steelblue1",style="solid",tooltip=" "]; + Node26 -> Node5 [id="edge52_Node000026_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node27 [id="edge53_Node000001_Node000027",color="steelblue1",style="solid",tooltip=" "]; + Node27 [id="Node000027",label="utils/logger.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$logger_8hpp.html",tooltip=" "]; + Node27 -> Node3 [id="edge54_Node000027_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node27 -> Node2 [id="edge55_Node000027_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node27 -> Node7 [id="edge56_Node000027_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node27 -> Node10 [id="edge57_Node000027_Node000010",color="steelblue1",style="solid",tooltip=" "]; + Node27 -> Node28 [id="edge58_Node000027_Node000028",color="steelblue1",style="solid",tooltip=" "]; + Node28 [id="Node000028",label="sstream",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node27 -> Node25 [id="edge59_Node000027_Node000025",color="steelblue1",style="solid",tooltip=" "]; +} diff --git a/docs/html/main_8cpp__incl.map b/docs/html/main_8cpp__incl.map new file mode 100644 index 000000000..95f346b30 --- /dev/null +++ b/docs/html/main_8cpp__incl.map @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/main_8cpp__incl.md5 b/docs/html/main_8cpp__incl.md5 new file mode 100644 index 000000000..619bdebdf --- /dev/null +++ b/docs/html/main_8cpp__incl.md5 @@ -0,0 +1 @@ +6dd761e931ddfa2b000f16457006bc38 \ No newline at end of file diff --git a/docs/html/main_8cpp__incl.png b/docs/html/main_8cpp__incl.png new file mode 100644 index 000000000..5990324b3 Binary files /dev/null and b/docs/html/main_8cpp__incl.png differ diff --git a/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_cgraph.dot b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_cgraph.dot new file mode 100644 index 000000000..c91f5a3eb --- /dev/null +++ b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_cgraph.dot @@ -0,0 +1,31 @@ +digraph "runProducer" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="runProducer",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="getJsonFiles",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a5a216c3284e0a72fe4f8101cd8b12b60",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="Logger::error",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aafe8b4f6ed1259fbde150ab59e0785e7",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="Logger::info",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a474176e6966186566a2a321cb5cbd739",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="processFiles",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a5bc44c4396b63ff16c6a74bb1c394478",tooltip=" "]; + Node5 -> Node6 [id="edge5_Node000005_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="Logger::debug",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aed78385ee0ad9d124521735894abab46",tooltip=" "]; + Node5 -> Node3 [id="edge6_Node000005_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node5 -> Node4 [id="edge7_Node000005_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node5 -> Node7 [id="edge8_Node000005_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="JsonParser::parseOrder",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_json_parser.html#af18e9188a3948e4c5b3d9c17a76bcd74",tooltip=" "]; + Node5 -> Node8 [id="edge9_Node000005_Node000008",color="steelblue1",style="solid",tooltip=" "]; + Node8 [id="Node000008",label="MessageCache::save",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_message_cache.html#a699e48cdd16aaf9e8a67d25d30925a24",tooltip=" "]; + Node5 -> Node9 [id="edge10_Node000005_Node000009",color="steelblue1",style="solid",tooltip=" "]; + Node9 [id="Node000009",label="KafkaProducer::send",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_producer.html#a5c01eb2a998310bbfe16ebc77666af8f",tooltip=" "]; + Node5 -> Node10 [id="edge11_Node000005_Node000010",color="steelblue1",style="solid",tooltip=" "]; + Node10 [id="Node000010",label="JsonParser::validate",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_json_parser.html#a1d6b83be5c0757b3a628a7c1737e4628",tooltip=" "]; + Node5 -> Node11 [id="edge12_Node000005_Node000011",color="steelblue1",style="solid",tooltip=" "]; + Node11 [id="Node000011",label="Logger::warning",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a5025d14c1f40cc23e9cbb48f98f0d9a6",tooltip=" "]; +} diff --git a/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_cgraph.map b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_cgraph.map new file mode 100644 index 000000000..14fdb3413 --- /dev/null +++ b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_cgraph.map @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_cgraph.md5 b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_cgraph.md5 new file mode 100644 index 000000000..f686a0513 --- /dev/null +++ b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_cgraph.md5 @@ -0,0 +1 @@ +cd494853a9c28aaad0b733f9fae8c118 \ No newline at end of file diff --git a/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_cgraph.png b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_cgraph.png new file mode 100644 index 000000000..e97e675da Binary files /dev/null and b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_cgraph.png differ diff --git a/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_icgraph.dot b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_icgraph.dot new file mode 100644 index 000000000..feef839d8 --- /dev/null +++ b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_icgraph.dot @@ -0,0 +1,11 @@ +digraph "runProducer" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="runProducer",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_icgraph.map b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_icgraph.map new file mode 100644 index 000000000..e12a841c8 --- /dev/null +++ b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_icgraph.md5 b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_icgraph.md5 new file mode 100644 index 000000000..fa96dde94 --- /dev/null +++ b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_icgraph.md5 @@ -0,0 +1 @@ +8d9765b06492b4802f666a4509016acf \ No newline at end of file diff --git a/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_icgraph.png b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_icgraph.png new file mode 100644 index 000000000..019512b70 Binary files /dev/null and b/docs/html/main_8cpp_a046be377067f3f52c8b9516cdb1e47b5_icgraph.png differ diff --git a/docs/html/main_8cpp_a0ddf1224851353fc92bfbff6f499fa97_cgraph.dot b/docs/html/main_8cpp_a0ddf1224851353fc92bfbff6f499fa97_cgraph.dot new file mode 100644 index 000000000..80bae2017 --- /dev/null +++ b/docs/html/main_8cpp_a0ddf1224851353fc92bfbff6f499fa97_cgraph.dot @@ -0,0 +1,95 @@ +digraph "main" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="main",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="MessageCache::cleanup",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_message_cache.html#a50c216e984ae61005f4daf4b8c124a22",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="database::PostgreSQL\l::connect",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$classdatabase_1_1_postgre_s_q_l.html#a785b7fa2f3259b5258c06bfbd9e8b2c3",tooltip=" "]; + Node3 -> Node4 [id="edge3_Node000003_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="Logger::error",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aafe8b4f6ed1259fbde150ab59e0785e7",tooltip=" "]; + Node3 -> Node5 [id="edge4_Node000003_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="Logger::info",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a474176e6966186566a2a321cb5cbd739",tooltip=" "]; + Node1 -> Node6 [id="edge5_Node000001_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="Logger::debug",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aed78385ee0ad9d124521735894abab46",tooltip=" "]; + Node1 -> Node4 [id="edge6_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node7 [id="edge7_Node000001_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="KafkaProducer::flush",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_producer.html#a6266bb25d0bbec95a32243d88006ea55",tooltip=" "]; + Node1 -> Node8 [id="edge8_Node000001_Node000008",color="steelblue1",style="solid",tooltip=" "]; + Node8 [id="Node000008",label="MessageCache::getPending\lCount",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_message_cache.html#ab3729d708193c6be1460fb7a2860e03a",tooltip=" "]; + Node1 -> Node9 [id="edge9_Node000001_Node000009",color="steelblue1",style="solid",tooltip=" "]; + Node9 [id="Node000009",label="MessageCache::getTotalCount",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_message_cache.html#aba79bed3c66e3fe011ae25ed45bb9f8b",tooltip=" "]; + Node1 -> Node5 [id="edge10_Node000001_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node10 [id="edge11_Node000001_Node000010",color="steelblue1",style="solid",tooltip=" "]; + Node10 [id="Node000010",label="KafkaProducer::init",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_producer.html#a6012cf74b1de379e1110c0db1690b64c",tooltip=" "]; + Node1 -> Node11 [id="edge12_Node000001_Node000011",color="steelblue1",style="solid",tooltip=" "]; + Node11 [id="Node000011",label="MessageCache::init",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_message_cache.html#ae986415d8621c4d18493379325ce04cc",tooltip=" "]; + Node1 -> Node12 [id="edge13_Node000001_Node000012",color="steelblue1",style="solid",tooltip=" "]; + Node12 [id="Node000012",label="AppConfig::load",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$struct_app_config.html#ad5f556af8ec235c8f58b14d1125b9d23",tooltip=" "]; + Node1 -> Node13 [id="edge14_Node000001_Node000013",color="steelblue1",style="solid",tooltip=" "]; + Node13 [id="Node000013",label="runConsumer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854",tooltip=" "]; + Node13 -> Node4 [id="edge15_Node000013_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node13 -> Node5 [id="edge16_Node000013_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node13 -> Node14 [id="edge17_Node000013_Node000014",color="steelblue1",style="solid",tooltip=" "]; + Node14 [id="Node000014",label="KafkaConsumer::init",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_consumer.html#ad3e3608060a00e4429a2e14d24ad09c8",tooltip=" "]; + Node14 -> Node4 [id="edge18_Node000014_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node14 -> Node5 [id="edge19_Node000014_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node13 -> Node15 [id="edge20_Node000013_Node000015",color="steelblue1",style="solid",tooltip=" "]; + Node15 [id="Node000015",label="OrderProcessor::processMessage",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_order_processor.html#a6f8aa8e2aeb597be492065036c2f23f5",tooltip=" "]; + Node15 -> Node6 [id="edge21_Node000015_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node15 -> Node4 [id="edge22_Node000015_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node15 -> Node16 [id="edge23_Node000015_Node000016",color="steelblue1",style="solid",tooltip=" "]; + Node16 [id="Node000016",label="OrderData::fromJson",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$struct_order_data.html#a3e88570de45cee6e214655aa12ed42f3",tooltip=" "]; + Node15 -> Node5 [id="edge24_Node000015_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node15 -> Node17 [id="edge25_Node000015_Node000017",color="steelblue1",style="solid",tooltip=" "]; + Node17 [id="Node000017",label="JsonParser::validate",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_json_parser.html#a1d6b83be5c0757b3a628a7c1737e4628",tooltip=" "]; + Node15 -> Node18 [id="edge26_Node000015_Node000018",color="steelblue1",style="solid",tooltip=" "]; + Node18 [id="Node000018",label="Logger::warning",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a5025d14c1f40cc23e9cbb48f98f0d9a6",tooltip=" "]; + Node13 -> Node19 [id="edge27_Node000013_Node000019",color="steelblue1",style="solid",tooltip=" "]; + Node19 [id="Node000019",label="OrderProcessor::reprocess\lPendingMessages",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_order_processor.html#af7a710bdbf4bd5c4578db73437477a5f",tooltip=" "]; + Node19 -> Node4 [id="edge28_Node000019_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node19 -> Node16 [id="edge29_Node000019_Node000016",color="steelblue1",style="solid",tooltip=" "]; + Node19 -> Node5 [id="edge30_Node000019_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node19 -> Node17 [id="edge31_Node000019_Node000017",color="steelblue1",style="solid",tooltip=" "]; + Node13 -> Node20 [id="edge32_Node000013_Node000020",color="steelblue1",style="solid",tooltip=" "]; + Node20 [id="Node000020",label="KafkaConsumer::setMessage\lCallback",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_consumer.html#a21535be303ced919722a21c8a10646ba",tooltip=" "]; + Node13 -> Node21 [id="edge33_Node000013_Node000021",color="steelblue1",style="solid",tooltip=" "]; + Node21 [id="Node000021",label="KafkaConsumer::start",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_consumer.html#a56ee2ca2d7d35993b23f95d1dee846c1",tooltip=" "]; + Node21 -> Node5 [id="edge34_Node000021_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node13 -> Node22 [id="edge35_Node000013_Node000022",color="steelblue1",style="solid",tooltip=" "]; + Node22 [id="Node000022",label="KafkaConsumer::stop",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_consumer.html#a4b681b6d27e4cb550a35f61c7acf279a",tooltip=" "]; + Node22 -> Node5 [id="edge36_Node000022_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node23 [id="edge37_Node000001_Node000023",color="steelblue1",style="solid",tooltip=" "]; + Node23 [id="Node000023",label="runProducer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a046be377067f3f52c8b9516cdb1e47b5",tooltip=" "]; + Node23 -> Node24 [id="edge38_Node000023_Node000024",color="steelblue1",style="solid",tooltip=" "]; + Node24 [id="Node000024",label="getJsonFiles",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a5a216c3284e0a72fe4f8101cd8b12b60",tooltip=" "]; + Node24 -> Node4 [id="edge39_Node000024_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node23 -> Node5 [id="edge40_Node000023_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node23 -> Node25 [id="edge41_Node000023_Node000025",color="steelblue1",style="solid",tooltip=" "]; + Node25 [id="Node000025",label="processFiles",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a5bc44c4396b63ff16c6a74bb1c394478",tooltip=" "]; + Node25 -> Node6 [id="edge42_Node000025_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node25 -> Node4 [id="edge43_Node000025_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node25 -> Node5 [id="edge44_Node000025_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node25 -> Node26 [id="edge45_Node000025_Node000026",color="steelblue1",style="solid",tooltip=" "]; + Node26 [id="Node000026",label="JsonParser::parseOrder",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_json_parser.html#af18e9188a3948e4c5b3d9c17a76bcd74",tooltip=" "]; + Node25 -> Node27 [id="edge46_Node000025_Node000027",color="steelblue1",style="solid",tooltip=" "]; + Node27 [id="Node000027",label="MessageCache::save",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_message_cache.html#a699e48cdd16aaf9e8a67d25d30925a24",tooltip=" "]; + Node25 -> Node28 [id="edge47_Node000025_Node000028",color="steelblue1",style="solid",tooltip=" "]; + Node28 [id="Node000028",label="KafkaProducer::send",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_producer.html#a5c01eb2a998310bbfe16ebc77666af8f",tooltip=" "]; + Node25 -> Node17 [id="edge48_Node000025_Node000017",color="steelblue1",style="solid",tooltip=" "]; + Node25 -> Node18 [id="edge49_Node000025_Node000018",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node29 [id="edge50_Node000001_Node000029",color="steelblue1",style="solid",tooltip=" "]; + Node29 [id="Node000029",label="KafkaProducer::setDelivery\lCallback",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_producer.html#a848df41ef97ff523fc21c3b12285c26c",tooltip=" "]; + Node1 -> Node30 [id="edge51_Node000001_Node000030",color="steelblue1",style="solid",tooltip=" "]; + Node30 [id="Node000030",label="MessageCache::setReprocess\lDelay",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_message_cache.html#abe7996aada9f77e39d9ed2d830dcddb9",tooltip=" "]; + Node1 -> Node31 [id="edge52_Node000001_Node000031",color="steelblue1",style="solid",tooltip=" "]; + Node31 [id="Node000031",label="MessageCache::setSourcePrefix",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_message_cache.html#a7d8db594bd5c90375565decd61911596",tooltip=" "]; + Node1 -> Node32 [id="edge53_Node000001_Node000032",color="steelblue1",style="solid",tooltip=" "]; + Node32 [id="Node000032",label="signalHandler",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#ad2e59c7203b3bddc1bc9a2224b52e8e7",tooltip=" "]; + Node32 -> Node5 [id="edge54_Node000032_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node18 [id="edge55_Node000001_Node000018",color="steelblue1",style="solid",tooltip=" "]; +} diff --git a/docs/html/main_8cpp_a0ddf1224851353fc92bfbff6f499fa97_cgraph.map b/docs/html/main_8cpp_a0ddf1224851353fc92bfbff6f499fa97_cgraph.map new file mode 100644 index 000000000..27d6bb783 --- /dev/null +++ b/docs/html/main_8cpp_a0ddf1224851353fc92bfbff6f499fa97_cgraph.map @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/main_8cpp_a0ddf1224851353fc92bfbff6f499fa97_cgraph.md5 b/docs/html/main_8cpp_a0ddf1224851353fc92bfbff6f499fa97_cgraph.md5 new file mode 100644 index 000000000..661d1ad6c --- /dev/null +++ b/docs/html/main_8cpp_a0ddf1224851353fc92bfbff6f499fa97_cgraph.md5 @@ -0,0 +1 @@ +a62859ba6d365ded6458bb0cf3e96d23 \ No newline at end of file diff --git a/docs/html/main_8cpp_a0ddf1224851353fc92bfbff6f499fa97_cgraph.png b/docs/html/main_8cpp_a0ddf1224851353fc92bfbff6f499fa97_cgraph.png new file mode 100644 index 000000000..c3d0584c3 Binary files /dev/null and b/docs/html/main_8cpp_a0ddf1224851353fc92bfbff6f499fa97_cgraph.png differ diff --git a/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_cgraph.dot b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_cgraph.dot new file mode 100644 index 000000000..a7b74796a --- /dev/null +++ b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_cgraph.dot @@ -0,0 +1,11 @@ +digraph "getJsonFiles" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="getJsonFiles",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Logger::error",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aafe8b4f6ed1259fbde150ab59e0785e7",tooltip=" "]; +} diff --git a/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_cgraph.map b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_cgraph.map new file mode 100644 index 000000000..821c65aba --- /dev/null +++ b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_cgraph.md5 b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_cgraph.md5 new file mode 100644 index 000000000..958736d6a --- /dev/null +++ b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_cgraph.md5 @@ -0,0 +1 @@ +2aa0ed07b57f04b56db3dcc01cde869a \ No newline at end of file diff --git a/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_cgraph.png b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_cgraph.png new file mode 100644 index 000000000..2b300d2f5 Binary files /dev/null and b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_cgraph.png differ diff --git a/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_icgraph.dot b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_icgraph.dot new file mode 100644 index 000000000..b49111ff1 --- /dev/null +++ b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_icgraph.dot @@ -0,0 +1,13 @@ +digraph "getJsonFiles" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="getJsonFiles",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="runProducer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a046be377067f3f52c8b9516cdb1e47b5",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_icgraph.map b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_icgraph.map new file mode 100644 index 000000000..a929fc136 --- /dev/null +++ b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_icgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_icgraph.md5 b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_icgraph.md5 new file mode 100644 index 000000000..e03a4ede1 --- /dev/null +++ b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_icgraph.md5 @@ -0,0 +1 @@ +667295df8009a6982371ec60897a7276 \ No newline at end of file diff --git a/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_icgraph.png b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_icgraph.png new file mode 100644 index 000000000..12c60b87d Binary files /dev/null and b/docs/html/main_8cpp_a5a216c3284e0a72fe4f8101cd8b12b60_icgraph.png differ diff --git a/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_cgraph.dot b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_cgraph.dot new file mode 100644 index 000000000..50bfce8fc --- /dev/null +++ b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_cgraph.dot @@ -0,0 +1,25 @@ +digraph "processFiles" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="processFiles",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Logger::debug",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aed78385ee0ad9d124521735894abab46",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="Logger::error",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aafe8b4f6ed1259fbde150ab59e0785e7",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="Logger::info",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a474176e6966186566a2a321cb5cbd739",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="JsonParser::parseOrder",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_json_parser.html#af18e9188a3948e4c5b3d9c17a76bcd74",tooltip=" "]; + Node1 -> Node6 [id="edge5_Node000001_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="MessageCache::save",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_message_cache.html#a699e48cdd16aaf9e8a67d25d30925a24",tooltip=" "]; + Node1 -> Node7 [id="edge6_Node000001_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="KafkaProducer::send",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_producer.html#a5c01eb2a998310bbfe16ebc77666af8f",tooltip=" "]; + Node1 -> Node8 [id="edge7_Node000001_Node000008",color="steelblue1",style="solid",tooltip=" "]; + Node8 [id="Node000008",label="JsonParser::validate",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_json_parser.html#a1d6b83be5c0757b3a628a7c1737e4628",tooltip=" "]; + Node1 -> Node9 [id="edge8_Node000001_Node000009",color="steelblue1",style="solid",tooltip=" "]; + Node9 [id="Node000009",label="Logger::warning",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a5025d14c1f40cc23e9cbb48f98f0d9a6",tooltip=" "]; +} diff --git a/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_cgraph.map b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_cgraph.map new file mode 100644 index 000000000..23bc54fa2 --- /dev/null +++ b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_cgraph.map @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_cgraph.md5 b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_cgraph.md5 new file mode 100644 index 000000000..bb3b91db7 --- /dev/null +++ b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_cgraph.md5 @@ -0,0 +1 @@ +7523bdcfe60a2affe11c2126e1dec312 \ No newline at end of file diff --git a/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_cgraph.png b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_cgraph.png new file mode 100644 index 000000000..9e245331c Binary files /dev/null and b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_cgraph.png differ diff --git a/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_icgraph.dot b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_icgraph.dot new file mode 100644 index 000000000..f308aae8b --- /dev/null +++ b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_icgraph.dot @@ -0,0 +1,13 @@ +digraph "processFiles" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="processFiles",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="runProducer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a046be377067f3f52c8b9516cdb1e47b5",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_icgraph.map b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_icgraph.map new file mode 100644 index 000000000..561da8f9e --- /dev/null +++ b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_icgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_icgraph.md5 b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_icgraph.md5 new file mode 100644 index 000000000..cc3a56f96 --- /dev/null +++ b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_icgraph.md5 @@ -0,0 +1 @@ +97878eedb9205c2cf144b453f46c0b5e \ No newline at end of file diff --git a/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_icgraph.png b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_icgraph.png new file mode 100644 index 000000000..739a079bc Binary files /dev/null and b/docs/html/main_8cpp_a5bc44c4396b63ff16c6a74bb1c394478_icgraph.png differ diff --git a/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_cgraph.dot b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_cgraph.dot new file mode 100644 index 000000000..2c8b3a66b --- /dev/null +++ b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_cgraph.dot @@ -0,0 +1,43 @@ +digraph "runConsumer" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="runConsumer",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Logger::error",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aafe8b4f6ed1259fbde150ab59e0785e7",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="Logger::info",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a474176e6966186566a2a321cb5cbd739",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="KafkaConsumer::init",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_consumer.html#ad3e3608060a00e4429a2e14d24ad09c8",tooltip=" "]; + Node4 -> Node2 [id="edge4_Node000004_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node4 -> Node3 [id="edge5_Node000004_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node5 [id="edge6_Node000001_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="OrderProcessor::processMessage",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_order_processor.html#a6f8aa8e2aeb597be492065036c2f23f5",tooltip=" "]; + Node5 -> Node6 [id="edge7_Node000005_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="Logger::debug",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#aed78385ee0ad9d124521735894abab46",tooltip=" "]; + Node5 -> Node2 [id="edge8_Node000005_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node5 -> Node7 [id="edge9_Node000005_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="OrderData::fromJson",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$struct_order_data.html#a3e88570de45cee6e214655aa12ed42f3",tooltip=" "]; + Node5 -> Node3 [id="edge10_Node000005_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node5 -> Node8 [id="edge11_Node000005_Node000008",color="steelblue1",style="solid",tooltip=" "]; + Node8 [id="Node000008",label="JsonParser::validate",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_json_parser.html#a1d6b83be5c0757b3a628a7c1737e4628",tooltip=" "]; + Node5 -> Node9 [id="edge12_Node000005_Node000009",color="steelblue1",style="solid",tooltip=" "]; + Node9 [id="Node000009",label="Logger::warning",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a5025d14c1f40cc23e9cbb48f98f0d9a6",tooltip=" "]; + Node1 -> Node10 [id="edge13_Node000001_Node000010",color="steelblue1",style="solid",tooltip=" "]; + Node10 [id="Node000010",label="OrderProcessor::reprocess\lPendingMessages",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_order_processor.html#af7a710bdbf4bd5c4578db73437477a5f",tooltip=" "]; + Node10 -> Node2 [id="edge14_Node000010_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node10 -> Node7 [id="edge15_Node000010_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node10 -> Node3 [id="edge16_Node000010_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node10 -> Node8 [id="edge17_Node000010_Node000008",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node11 [id="edge18_Node000001_Node000011",color="steelblue1",style="solid",tooltip=" "]; + Node11 [id="Node000011",label="KafkaConsumer::setMessage\lCallback",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_consumer.html#a21535be303ced919722a21c8a10646ba",tooltip=" "]; + Node1 -> Node12 [id="edge19_Node000001_Node000012",color="steelblue1",style="solid",tooltip=" "]; + Node12 [id="Node000012",label="KafkaConsumer::start",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_consumer.html#a56ee2ca2d7d35993b23f95d1dee846c1",tooltip=" "]; + Node12 -> Node3 [id="edge20_Node000012_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node13 [id="edge21_Node000001_Node000013",color="steelblue1",style="solid",tooltip=" "]; + Node13 [id="Node000013",label="KafkaConsumer::stop",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_kafka_consumer.html#a4b681b6d27e4cb550a35f61c7acf279a",tooltip=" "]; + Node13 -> Node3 [id="edge22_Node000013_Node000003",color="steelblue1",style="solid",tooltip=" "]; +} diff --git a/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_cgraph.map b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_cgraph.map new file mode 100644 index 000000000..a4542f9ac --- /dev/null +++ b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_cgraph.map @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_cgraph.md5 b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_cgraph.md5 new file mode 100644 index 000000000..37fe6cbea --- /dev/null +++ b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_cgraph.md5 @@ -0,0 +1 @@ +741058894960310f02eb561f0ba0cfe0 \ No newline at end of file diff --git a/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_cgraph.png b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_cgraph.png new file mode 100644 index 000000000..3ea895edc Binary files /dev/null and b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_cgraph.png differ diff --git a/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_icgraph.dot b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_icgraph.dot new file mode 100644 index 000000000..305559cb2 --- /dev/null +++ b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_icgraph.dot @@ -0,0 +1,11 @@ +digraph "runConsumer" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="runConsumer",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_icgraph.map b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_icgraph.map new file mode 100644 index 000000000..37323fdf0 --- /dev/null +++ b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_icgraph.md5 b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_icgraph.md5 new file mode 100644 index 000000000..d0b10803a --- /dev/null +++ b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_icgraph.md5 @@ -0,0 +1 @@ +386fb173b3fc1eb010b4354887790835 \ No newline at end of file diff --git a/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_icgraph.png b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_icgraph.png new file mode 100644 index 000000000..793bfb5b9 Binary files /dev/null and b/docs/html/main_8cpp_a9e945a592fa4a0f1706ea24ebb2ab854_icgraph.png differ diff --git a/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_cgraph.dot b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_cgraph.dot new file mode 100644 index 000000000..94b073139 --- /dev/null +++ b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_cgraph.dot @@ -0,0 +1,11 @@ +digraph "signalHandler" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="signalHandler",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="Logger::info",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_logger.html#a474176e6966186566a2a321cb5cbd739",tooltip=" "]; +} diff --git a/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_cgraph.map b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_cgraph.map new file mode 100644 index 000000000..721b78cf2 --- /dev/null +++ b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_cgraph.md5 b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_cgraph.md5 new file mode 100644 index 000000000..5d92d5cf4 --- /dev/null +++ b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_cgraph.md5 @@ -0,0 +1 @@ +02e85cf7024d1317c4af8396a3b3a4d6 \ No newline at end of file diff --git a/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_cgraph.png b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_cgraph.png new file mode 100644 index 000000000..e9369d960 Binary files /dev/null and b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_cgraph.png differ diff --git a/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_icgraph.dot b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_icgraph.dot new file mode 100644 index 000000000..afb335451 --- /dev/null +++ b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_icgraph.dot @@ -0,0 +1,11 @@ +digraph "signalHandler" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="signalHandler",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_icgraph.map b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_icgraph.map new file mode 100644 index 000000000..aa21062f1 --- /dev/null +++ b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_icgraph.md5 b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_icgraph.md5 new file mode 100644 index 000000000..5a1ded379 --- /dev/null +++ b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_icgraph.md5 @@ -0,0 +1 @@ +1fc77b03b4bffe1f45dd0fb5ad0f4be4 \ No newline at end of file diff --git a/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_icgraph.png b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_icgraph.png new file mode 100644 index 000000000..c748f852c Binary files /dev/null and b/docs/html/main_8cpp_ad2e59c7203b3bddc1bc9a2224b52e8e7_icgraph.png differ diff --git a/docs/html/main_8cpp_source.html b/docs/html/main_8cpp_source.html new file mode 100644 index 000000000..96dfbb7ba --- /dev/null +++ b/docs/html/main_8cpp_source.html @@ -0,0 +1,604 @@ + + + + + + + +Kafka-1C Connector: Исходный файл src/main.cpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
main.cpp
+
+
+См. документацию.
1#include <iostream>
+
2#include <string>
+
3#include <thread>
+
4#include <vector>
+
5#include <atomic>
+
6#include <chrono>
+
7#include <filesystem>
+
8#include <csignal>
+
9#include <iomanip>
+
10
+
11#include "config/config.hpp"
+
12#include "kafka/producer.hpp"
+
13#include "kafka/consumer.hpp"
+ + + + +
18#include "utils/logger.hpp"
+
19
+
20namespace fs = std::filesystem;
+
21
+
22// ============================================================
+
23// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
+
24// ============================================================
+
25
+
26std::atomic<bool> running{true};
+
27std::atomic<size_t> producer_count{0};
+
28std::atomic<size_t> consumer_count{0};
+
29std::atomic<size_t> error_count{0};
+
30
+
31// ============================================================
+
32// ОБРАБОТЧИК СИГНАЛОВ (Ctrl+C)
+
33// ============================================================
+
34
+
+
35void signalHandler(int signal)
+
36{
+
37 Logger::info("Received signal " + std::to_string(signal) + ", shutting down...");
+
38 running = false;
+
39}
+
+
40
+
41// ============================================================
+
42// ВСПОМОГАТЕЛЬНАЯ ФУНКЦИЯ — ПОЛУЧЕНИЕ СПИСКА ФАЙЛОВ
+
43// ============================================================
+
44
+
+
45std::vector<std::string> getJsonFiles(const std::string &directory)
+
46{
+
47 std::vector<std::string> files;
+
48 try
+
49 {
+
50 for (const auto &entry : fs::directory_iterator(directory))
+
51 {
+
52 if (entry.path().extension() == ".json")
+
53 {
+
54 files.push_back(entry.path().string());
+
55 }
+
56 }
+
57 }
+
58 catch (const std::exception &e)
+
59 {
+
60 Logger::error("Directory read error: " + std::string(e.what()));
+
61 }
+
62 return files;
+
63}
+
+
64
+
65// ============================================================
+
66// ФУНКЦИЯ PRODUCER (отправка файлов в Kafka)
+
67// ============================================================
+
68
+
+
69void processFiles(const std::string &directory,
+
70 KafkaProducer &producer,
+
71 MessageCache &cache,
+
72 const std::string &topic,
+
73 std::atomic<size_t> &next_index,
+
74 const std::vector<std::string> &files)
+
75{
+
76
+
77 size_t idx;
+
78 while ((idx = next_index.fetch_add(1)) < files.size())
+
79 {
+
80 const std::string &filepath = files[idx];
+
81
+
82 try
+
83 {
+
84 Logger::debug("[Producer] Processing: " + filepath);
+
85
+
86 auto order = JsonParser::parseOrder(filepath);
+
87 if (!JsonParser::validate(order))
+
88 {
+
89 Logger::error("[Producer] Invalid order: " + filepath);
+
90 error_count.fetch_add(1);
+
91 continue;
+
92 }
+
93
+
94 std::string json_message = order.toJson();
+
95 std::string key = order.tin + "-" + order.number;
+
96 std::string source_type = "producer";
+
97
+
98 if (!cache.save(filepath, topic, json_message, order.tin, order.trrc, source_type))
+
99 {
+
100 Logger::error("[Producer] Failed to cache: " + filepath);
+
101 error_count.fetch_add(1);
+
102 continue;
+
103 }
+
104
+
105 if (producer.send(key, json_message))
+
106 {
+
107 producer_count.fetch_add(1);
+
108 Logger::info("[Producer] Sent: " + key + " (" + std::to_string(producer_count.load()) + ")");
+
109
+
110 try
+
111 {
+
112 fs::remove(filepath);
+
113 Logger::debug("[Producer] Deleted: " + filepath);
+
114 }
+
115 catch (const std::exception &e)
+
116 {
+
117 Logger::warning("[Producer] Failed to delete: " + filepath + " - " + e.what());
+
118 }
+
119 }
+
120 else
+
121 {
+
122 Logger::error("[Producer] Failed to send: " + key);
+
123 error_count.fetch_add(1);
+
124 }
+
125 }
+
126 catch (const std::exception &e)
+
127 {
+
128 Logger::error("[Producer] Error processing " + filepath + ": " + e.what());
+
129 error_count.fetch_add(1);
+
130 }
+
131 }
+
132}
+
+
133
+
134// ============================================================
+
135// ФУНКЦИЯ PRODUCER — ЗАПУСК В ОТДЕЛЬНОМ ПОТОКЕ
+
136// ============================================================
+
137
+
+
138void runProducer(AppConfig &config, KafkaProducer &producer, MessageCache &cache)
+
139{
+
140 Logger::info("[Producer] Thread started");
+
141
+
142 const int MAX_WORKERS = config.processing.max_workers;
+
143 std::vector<std::thread> workers;
+
144
+
145 while (running)
+
146 {
+
147 for (const auto &group : config.groups)
+
148 {
+
149 if (!group.enabled)
+
150 continue;
+
151
+
152 auto files = getJsonFiles(group.input_directory);
+
153 if (files.empty())
+
154 {
+
155 std::this_thread::sleep_for(std::chrono::milliseconds(100));
+
156 continue;
+
157 }
+
158
+
159 Logger::info("[Producer] Found " + std::to_string(files.size()) + " files in " + group.input_directory);
+
160
+
161 std::atomic<size_t> next_index{0};
+
162
+
163 for (int i = 0; i < MAX_WORKERS && running; ++i)
+
164 {
+
165 workers.emplace_back([&]()
+
166 { processFiles(
+
167 group.input_directory,
+
168 producer,
+
169 cache,
+
170 group.kafka_topic,
+
171 std::ref(next_index),
+
172 std::cref(files)); });
+
173 }
+
174
+
175 for (auto &worker : workers)
+
176 {
+
177 if (worker.joinable())
+
178 {
+
179 worker.join();
+
180 }
+
181 }
+
182 workers.clear();
+
183 }
+
184
+
185 if (running)
+
186 {
+
187 std::this_thread::sleep_for(std::chrono::seconds(1));
+
188 }
+
189 }
+
190
+
191 Logger::info("[Producer] Thread stopped");
+
192}
+
+
193
+
194// ============================================================
+
195// ФУНКЦИЯ CONSUMER — ЗАПУСК В ОТДЕЛЬНОМ ПОТОКЕ
+
196// ============================================================
+
197
+
+
198void runConsumer(AppConfig &config, database::PostgreSQL &db, MessageCache &cache, KafkaProducer &error_producer)
+
199{
+
200 Logger::info("[Consumer] Thread started");
+
201
+
202 try
+
203 {
+
204 KafkaConsumer consumer( // Создание consumer
+ +
206 config.kafka.consumer.group_id,
+
207 config.kafka.topics.input);
+
208
+
209 if (!consumer.init())
+
210 { // Инициализация
+
211 Logger::error("[Consumer] Failed to initialize");
+
212 return;
+
213 }
+
214
+
215 OrderProcessor processor(db, cache, error_producer); // Создание processor
+
216
+
217 Logger::info("[Consumer] Checking for pending messages in cache...");
+
218 processor.reprocessPendingMessages(); // Восстановление
+
219
+
220 // Устанавливаем callback для обработки сообщений
+
221 consumer.setMessageCallback([&processor](const std::string &key,
+
222 const std::string &value,
+
223 int64_t timestamp)
+
224 {
+
225 if (processor.processMessage(key, value, timestamp)) {
+
226 consumer_count.fetch_add(1);
+
227 } else {
+
228 error_count.fetch_add(1);
+
229 } });
+
230
+
231 // Запускаем consumer (блокирующий вызов в отдельном потоке)
+
232 consumer.start(); // Запуск consumer
+
233
+
234 // Ждем завершения (while running)
+
235 while (running)
+
236 {
+
237 std::this_thread::sleep_for(std::chrono::milliseconds(100));
+
238 }
+
239
+
240 // Останавливаем consumer (он автоматически закоммитит offset)
+
241 consumer.stop();
+
242 }
+
243 catch (const std::exception &e)
+
244 {
+
245 Logger::error("[Consumer] Error: " + std::string(e.what()));
+
246 }
+
247
+
248 Logger::info("[Consumer] Thread stopped");
+
249}
+
+
250
+
251// ============================================================
+
252// ГЛАВНАЯ ФУНКЦИЯ
+
253// ============================================================
+
254
+
+
255int main(int argc, char *argv[])
+
256{
+
257 // 1. Устанавливаем обработчик сигналов
+
258 signal(SIGINT, signalHandler);
+
259 signal(SIGTERM, signalHandler);
+
260
+
261 try
+
262 {
+
263 Logger::info("=== Kafka-1C Connector (Producer + Consumer) ===");
+
264 Logger::info("Version: 1.0.0");
+
265
+
266 // 2. Загружаем конфигурацию
+
267 AppConfig config = AppConfig::load("./config/settings.json");
+
268 Logger::info("Config loaded successfully");
+
269
+
270 // 3. Инициализируем SQLite кэш
+
271 MessageCache cache(config.cache.path);
+
272 if (!cache.init())
+
273 {
+
274 Logger::error("Failed to initialize cache");
+
275 return 1;
+
276 }
+
277
+
278 // УСТАНАВЛИВАЕМ НАСТРОЙКИ
+
279 cache.setSourcePrefix(config.cache.source_prefix);
+ +
281
+
282 Logger::info("Cache initialized: " + config.cache.path);
+
283
+
284 // 4. Инициализируем PostgreSQL
+ +
286 if (!db.connect())
+
287 {
+
288 Logger::error("Failed to connect to PostgreSQL");
+
289 return 1;
+
290 }
+
291 Logger::info("PostgreSQL connected: " + config.database.postgresql.database);
+
292
+
293 // 5. Инициализируем Kafka Producer (основной)
+
294 KafkaProducer producer(
+ +
296 config.kafka.topics.input);
+
297
+
298 if (!producer.init(config.kafka.producer.acks, config.kafka.producer.retries))
+
299 {
+
300 Logger::error("Failed to initialize Kafka producer");
+
301 return 1;
+
302 }
+
303
+
304 // 6. Инициализируем Kafka Producer для ошибок
+
305 KafkaProducer error_producer(
+ +
307 config.kafka.topics.errors);
+
308
+
309 if (!error_producer.init(config.kafka.producer.acks, config.kafka.producer.retries))
+
310 {
+
311 Logger::error("Failed to initialize Kafka error producer");
+
312 return 1;
+
313 }
+
314
+
315 // 7. Устанавливаем callback для подтверждения доставки
+
316 producer.setDeliveryCallback([](const std::string &key, int error, int64_t offset)
+
317 {
+
318 if (error == 0) {
+
319 Logger::debug("[Producer] Delivered: " + key + " (offset: " + std::to_string(offset) + ")");
+
320 } else {
+
321 Logger::warning("[Producer] Delivery failed: " + key + " (error: " + std::to_string(error) + ")");
+
322 } });
+
323
+
324 // 8. Определяем режим работы
+
325 std::string mode = config.mode;
+
326 if (argc > 1)
+
327 {
+
328 mode = argv[1];
+
329 }
+
330
+
331 Logger::info("Mode: " + mode);
+
332
+
333 // 9. Запускаем потоки в зависимости от режима
+
334 std::thread producer_thread;
+
335 std::thread consumer_thread;
+
336
+
337 if (mode == "producer" || mode == "both")
+
338 {
+
339 Logger::info("Starting Producer thread...");
+
340 producer_thread = std::thread(runProducer, std::ref(config), std::ref(producer), std::ref(cache));
+
341 }
+
342
+
343 if (mode == "consumer" || mode == "both")
+
344 {
+
345 Logger::info("Starting Consumer thread...");
+
346 std::this_thread::sleep_for(std::chrono::seconds(2));
+
347 consumer_thread = std::thread(runConsumer, std::ref(config), std::ref(db), std::ref(cache), std::ref(error_producer));
+
348 }
+
349
+
350 // 10. Ждем завершения (Ctrl+C)
+
351 while (running)
+
352 {
+
353 std::this_thread::sleep_for(std::chrono::seconds(1));
+
354 }
+
355
+
356 // 11. Остановка потоков
+
357 Logger::info("Stopping threads...");
+
358
+
359 if (producer_thread.joinable())
+
360 {
+
361 producer_thread.join();
+
362 }
+
363
+
364 if (consumer_thread.joinable())
+
365 {
+
366 consumer_thread.join();
+
367 }
+
368
+
369 // 12. Завершение
+
370 producer.flush();
+
371 error_producer.flush();
+
372 cache.cleanup(7);
+
373
+
374 Logger::info("=== Summary ===");
+
375 Logger::info("Producer sent: " + std::to_string(producer_count.load()));
+
376 Logger::info("Consumer processed: " + std::to_string(consumer_count.load()));
+
377 Logger::info("Errors: " + std::to_string(error_count.load()));
+
378 Logger::info("Pending in cache: " + std::to_string(cache.getPendingCount()));
+
379 Logger::info("Total in cache: " + std::to_string(cache.getTotalCount()));
+
380 Logger::info("Shutdown complete");
+
381 }
+
382 catch (const std::exception &e)
+
383 {
+
384 Logger::error("Fatal error: " + std::string(e.what()));
+
385 return 1;
+
386 }
+
387
+
388 return 0;
+
389}
+
+
static bool validate(const OrderData &order)
+
static OrderData parseOrder(const std::string &filename)
+
Определения consumer.hpp:11
+
void setMessageCallback(MessageCallback cb)
Определения consumer.cpp:69
+
void stop()
Определения consumer.cpp:53
+
void start()
Определения consumer.cpp:45
+
bool init()
Определения consumer.cpp:15
+
Определения producer.hpp:9
+
bool send(const std::string &message)
+
bool init(const std::string &acks="all", int retries=3)
+
void flush(int timeout_ms=5000)
+
void setDeliveryCallback(DeliveryCallback cb)
+
static void info(const std::string &message)
Определения logger.hpp:25
+
static void warning(const std::string &message)
Определения logger.hpp:29
+
static void error(const std::string &message)
Определения logger.hpp:33
+
static void debug(const std::string &message)
Определения logger.hpp:37
+
Определения sqlite_cache.hpp:15
+
void cleanup(int days=7)
+
bool save(const std::string &filename, const std::string &topic, const std::string &message, const std::string &tin="", const std::string &trrc="", const std::string &source="")
+
void setSourcePrefix(const std::string &prefix)
Определения sqlite_cache.hpp:28
+
size_t getPendingCount()
+
size_t getTotalCount()
+
void setReprocessDelay(int seconds)
Определения sqlite_cache.hpp:29
+ + +
bool processMessage(const std::string &key, const std::string &value, int64_t timestamp)
Определения order_processor.cpp:90
+
void reprocessPendingMessages()
Определения order_processor.cpp:179
+ +
bool connect()
Определения postgresql.cpp:32
+ + + + +
void runProducer(AppConfig &config, KafkaProducer &producer, MessageCache &cache)
Определения main.cpp:138
+
int main(int argc, char *argv[])
Определения main.cpp:255
+
std::vector< std::string > getJsonFiles(const std::string &directory)
Определения main.cpp:45
+
void processFiles(const std::string &directory, KafkaProducer &producer, MessageCache &cache, const std::string &topic, std::atomic< size_t > &next_index, const std::vector< std::string > &files)
Определения main.cpp:69
+
std::atomic< size_t > producer_count
Определения main.cpp:27
+
std::atomic< size_t > error_count
Определения main.cpp:29
+
std::atomic< size_t > consumer_count
Определения main.cpp:28
+
void runConsumer(AppConfig &config, database::PostgreSQL &db, MessageCache &cache, KafkaProducer &error_producer)
Определения main.cpp:198
+
void signalHandler(int signal)
Определения main.cpp:35
+
std::atomic< bool > running
Определения main.cpp:26
+ + + + +
Определения config.hpp:82
+
std::vector< GroupConfig > groups
Определения config.hpp:87
+
ProcessingConfig processing
Определения config.hpp:85
+
KafkaConfig kafka
Определения config.hpp:83
+
std::string mode
Определения config.hpp:88
+
CacheConfig cache
Определения config.hpp:86
+
DatabaseConfig database
Определения config.hpp:84
+
static AppConfig load(const std::string &filename)
+
int reprocess_delay_seconds
Определения config.hpp:63
+
std::string source_prefix
Определения config.hpp:64
+
std::string path
Определения config.hpp:61
+
database::ConnectionParams postgresql
Определения config.hpp:42
+
std::string group_id
Определения config.hpp:31
+
std::string acks
Определения config.hpp:24
+
int retries
Определения config.hpp:25
+
std::string input
Определения config.hpp:18
+
std::string errors
Определения config.hpp:20
+
std::string bootstrap_servers
Определения config.hpp:15
+
struct KafkaConfig::Consumer consumer
+
struct KafkaConfig::Producer producer
+
struct KafkaConfig::Topics topics
+
int max_workers
Определения config.hpp:50
+
std::string database
Определения postgresql.hpp:16
+
+
+
+ + + + diff --git a/docs/html/menu.js b/docs/html/menu.js new file mode 100644 index 000000000..8172efef4 --- /dev/null +++ b/docs/html/menu.js @@ -0,0 +1,569 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,treeview) { + + const SHOW_DELAY = 250; // 250ms delay before showing + const HIDE_DELAY = 500; // 500ms delay before hiding + const SLIDE_DELAY = 250; // 250ms slide up/down delay + const WHEEL_STEP = 30; // 30 pixel per mouse wheel tick + const ARROW_STEP = 5; // 5 pixel when hovering arrow up/down + const ARROW_POLL_INTERVAL = 20; // 20ms per arrow up/down check + const MOBILE_WIDTH = 768; // switch point for mobile/desktop mode + + // Helper function for slideDown animation + function slideDown(element, duration, callback) { + if (element.dataset.animating) return; + element.dataset.animating = 'true'; + + element.style.removeProperty('display'); + let display = window.getComputedStyle(element).display; + if (display === 'none') display = 'block'; + element.style.display = display; + const height = element.offsetHeight; + element.style.overflow = 'hidden'; + element.style.height = 0; + element.offsetHeight; // force reflow + element.style.transitionProperty = 'height'; + element.style.transitionDuration = duration + 'ms'; + element.style.height = height + 'px'; + window.setTimeout(() => { + element.style.removeProperty('height'); + element.style.removeProperty('overflow'); + element.style.removeProperty('transition-duration'); + element.style.removeProperty('transition-property'); + delete element.dataset.animating; + if (callback) callback(); + }, duration); + } + + // Helper function for slideUp animation + function slideUp(element, duration, callback) { + if (element.dataset.animating) return; + element.dataset.animating = 'true'; + + element.style.transitionProperty = 'height'; + element.style.transitionDuration = duration + 'ms'; + element.style.height = element.offsetHeight + 'px'; + element.offsetHeight; // force reflow + element.style.overflow = 'hidden'; + element.style.height = 0; + window.setTimeout(() => { + element.style.display = 'none'; + element.style.removeProperty('height'); + element.style.removeProperty('overflow'); + element.style.removeProperty('transition-duration'); + element.style.removeProperty('transition-property'); + delete element.dataset.animating; + if (callback) callback(); + }, duration); + } + + // Helper to create the menu tree structure + function makeTree(data,relPath,topLevel=false) { + let result=''; + if ('children' in data) { + if (!topLevel) { + result+='
    '; + } + for (let i in data.children) { + let url; + const link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + if (!topLevel) { + result+='
'; + } + } + return result; + } + + const mainNav = document.getElementById('main-nav'); + if (mainNav && mainNav.children.length > 0) { + const firstChild = mainNav.children[0]; + firstChild.insertAdjacentHTML('afterbegin', makeTree(menudata, relPath, true)); + } + + const searchBoxPos2 = document.getElementById('searchBoxPos2'); + let searchBoxContents = searchBoxPos2 ? searchBoxPos2.innerHTML : ''; + const mainMenuState = document.getElementById('main-menu-state'); + let prevWidth = 0; + + const initResizableIfExists = function() { + if (typeof initResizableFunc === 'function') initResizableFunc(treeview); + } + + // Dropdown menu functionality to replace smartmenus + let closeAllDropdowns = null; // Will be set by initDropdownMenu + + const isMobile = () => window.innerWidth < MOBILE_WIDTH; + + if (mainMenuState) { + const mainMenu = document.getElementById('main-menu'); + const searchBoxPos1 = document.getElementById('searchBoxPos1'); + + // animate mobile main menu + mainMenuState.addEventListener('change', function() { + if (this.checked) { + slideDown(mainMenu, SLIDE_DELAY, () => { + mainMenu.style.display = 'block'; + initResizableIfExists(); + }); + } else { + slideUp(mainMenu, SLIDE_DELAY, () => { + mainMenu.style.display = 'none'; + }); + } + }); + + // set default menu visibility + const resetState = function() { + const newWidth = window.innerWidth; + if (newWidth !== prevWidth) { + // Close all open dropdown menus when switching between mobile/desktop modes + if (closeAllDropdowns) { + closeAllDropdowns(); + } + + if (newWidth < MOBILE_WIDTH) { + mainMenuState.checked = false; + mainMenu.style.display = 'none'; + if (searchBoxPos2) { + searchBoxPos2.innerHTML = ''; + searchBoxPos2.style.display = 'none'; + } + if (searchBoxPos1) { + searchBoxPos1.innerHTML = searchBoxContents; + searchBoxPos1.style.display = ''; + } + } else { + mainMenu.style.display = ''; + if (searchBoxPos1) { + searchBoxPos1.innerHTML = ''; + searchBoxPos1.style.display = 'none'; + } + if (searchBoxPos2) { + searchBoxPos2.innerHTML = searchBoxContents; + searchBoxPos2.style.display = ''; + } + } + if (typeof searchBox !== 'undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', function() { + resetState(); + initResizableIfExists(); + }); + } else { + resetState(); + initResizableIfExists(); + } + window.addEventListener('resize', resetState); + } else { + initResizableIfExists(); + } + + function initDropdownMenu() { + const mainMenu = document.getElementById('main-menu'); + if (!mainMenu) return; + + const menuItems = mainMenu.querySelectorAll('li'); + + // Helper function to position nested submenu with viewport checking + function positionNestedSubmenu(submenu, link) { + const viewport = { + height: window.innerHeight, + scrollY: window.scrollY + }; + + // Set initial position - top aligned with parent (next to arrow) + submenu.style.top = '0'; + if (isMobile()) { + submenu.style.marginLeft = 0; + } else { + submenu.style.marginLeft = link.offsetWidth + 'px'; + } + + // Get submenu dimensions and position + const submenuRect = submenu.getBoundingClientRect(); + const submenuHeight = submenuRect.height; + const submenuTop = submenuRect.top; + const submenuBottom = submenuRect.bottom+1; // add space for border + + // Check if submenu fits in viewport + const fitsAbove = submenuTop >= 0; + const fitsBelow = submenuBottom <= viewport.height; + + if (!fitsAbove || !fitsBelow) { + // Submenu doesn't fit - try to adjust position + // Overflows bottom, try to shift up + const overflow = submenuBottom - viewport.height; + const newTop = Math.max(0, submenuTop-overflow)-submenuTop; + submenu.style.top = newTop + 'px'; + + // Re-check after adjustment + const adjustedRect = submenu.getBoundingClientRect(); + if (adjustedRect.height > viewport.height) { + // Still doesn't fit - enable scrolling + enableSubmenuScrolling(submenu, link); + } + } + } + + // Helper function to enable scrolling for tall submenus + function enableSubmenuScrolling(submenu, link) { + // Check if scroll arrows already exist + if (submenu.dataset.scrollEnabled) return; + + submenu.dataset.scrollEnabled = 'true'; + + const viewport = { + height: window.innerHeight, + scrollY: window.scrollY + }; + + // Position submenu to fill available viewport space + const parentRect = link.getBoundingClientRect(); + const availableHeight = viewport.height - 2; // Leave some margin + + submenu.style.maxHeight = availableHeight + 'px'; + submenu.style.overflow = 'hidden'; + submenu.style.position = 'absolute'; + + // Create scroll arrows + const scrollUpArrow = document.createElement('div'); + scrollUpArrow.className = 'submenu-scroll-arrow submenu-scroll-up'; + scrollUpArrow.innerHTML = '';//''; + scrollUpArrow.style.cssText = 'position:absolute;top:0;left:0;right:0;height:30px;background:transparent;text-align:center;line-height:30px;color:#fff;cursor:pointer;z-index:1000;display:none;'; + + const scrollDownArrow = document.createElement('div'); + scrollDownArrow.className = 'submenu-scroll-arrow submenu-scroll-down'; + scrollDownArrow.innerHTML = ''; + scrollDownArrow.style.cssText = 'position:absolute;bottom:0;left:0;right:0;height:30px;background:transparent;text-align:center;line-height:30px;color:#fff;cursor:pointer;z-index:1000;'; + + // Create wrapper for submenu content + const scrollWrapper = document.createElement('div'); + scrollWrapper.className = 'submenu-scroll-wrapper'; + scrollWrapper.style.cssText = 'height:100vh;overflow:hidden;position:relative;'; + + // Move submenu children to wrapper + while (submenu.firstChild) { + scrollWrapper.appendChild(submenu.firstChild); + } + + submenu.appendChild(scrollUpArrow); + submenu.appendChild(scrollWrapper); + submenu.appendChild(scrollDownArrow); + + let scrollPosition = 0; + let scrollInterval = null; + + function updateScrollArrows() { + const maxScroll = scrollWrapper.scrollHeight - availableHeight; + scrollUpArrow.style.display = scrollPosition > 0 ? 'block' : 'none'; + scrollDownArrow.style.display = scrollPosition < maxScroll ? 'block' : 'none'; + } + + function startScrolling(direction) { + if (scrollInterval) return; + + scrollInterval = setInterval(() => { + const maxScroll = scrollWrapper.scrollHeight - availableHeight; + + if (direction === 'up') { + scrollPosition = Math.max(0, scrollPosition - ARROW_STEP); + } else { + scrollPosition = Math.min(maxScroll, scrollPosition + ARROW_STEP); + } + + scrollWrapper.scrollTop = scrollPosition; + updateScrollArrows(); + + if ((direction === 'up' && scrollPosition === 0) || + (direction === 'down' && scrollPosition === maxScroll)) { + stopScrolling(); + } + }, ARROW_POLL_INTERVAL); + } + + function stopScrolling() { + if (scrollInterval) { + clearInterval(scrollInterval); + scrollInterval = null; + } + } + + scrollUpArrow.addEventListener('mouseenter', () => startScrolling('up')); + scrollUpArrow.addEventListener('mouseleave', stopScrolling); + scrollDownArrow.addEventListener('mouseenter', () => startScrolling('down')); + scrollDownArrow.addEventListener('mouseleave', stopScrolling); + + function wheelEvent(e) { + e.preventDefault(); + e.stopPropagation(); + + const maxScroll = scrollWrapper.scrollHeight - availableHeight; + const wheelDelta = e.deltaY; + const scrollAmount = wheelDelta > 0 ? WHEEL_STEP : -WHEEL_STEP; // Scroll 30px per wheel tick + + scrollPosition = Math.max(0, Math.min(maxScroll, scrollPosition + scrollAmount)); + scrollWrapper.scrollTop = scrollPosition; + updateScrollArrows(); + } + + // Add mouse wheel scrolling support + scrollWrapper.addEventListener('wheel', (e) => wheelEvent(e)); + + // Also add wheel event to submenu itself to catch events + submenu.addEventListener('wheel', function(e) { + // Only handle if scrolling is enabled + if (submenu.dataset.scrollEnabled) { + wheelEvent(e); + } + }); + + // Initial arrow state + updateScrollArrows(); + } + + // Helper function to clean up scroll arrows + function disableSubmenuScrolling(submenu) { + if (!submenu.dataset.scrollEnabled) return; + + delete submenu.dataset.scrollEnabled; + + // Find and remove scroll elements + const scrollArrows = submenu.querySelectorAll('.submenu-scroll-arrow'); + const scrollWrapper = submenu.querySelector('.submenu-scroll-wrapper'); + + if (scrollWrapper) { + // Move children back to submenu + while (scrollWrapper.firstChild) { + submenu.appendChild(scrollWrapper.firstChild); + } + scrollWrapper.remove(); + } + + scrollArrows.forEach(arrow => arrow.remove()); + + // Reset styles + submenu.style.maxHeight = ''; + submenu.style.overflow = ''; + } + + menuItems.forEach(item => { + const submenu = item.querySelector('ul'); + if (submenu) { + const link = item.querySelector('a'); + if (link) { + // Add class and ARIA attributes for accessibility + link.classList.add('has-submenu'); + link.setAttribute('aria-haspopup', 'true'); + link.setAttribute('aria-expanded', 'false'); + + // Add sub-arrow indicator + const span = document.createElement('span'); + span.classList.add('sub-arrow'); + link.append(span); + + // Calculate nesting level for z-index + // Root menu (main-menu) is level 200 (above the search box at 102), + // first submenus are level 201, etc. + let nestingLevel = 200; + let currentElement = item.parentElement; + while (currentElement && currentElement.id !== 'main-menu') { + if (currentElement.tagName === 'UL') { + nestingLevel++; + } + currentElement = currentElement.parentElement; + } + + // Apply z-index based on nesting level + // This ensures child menus with shadows appear above parent menus + submenu.style.zIndex = nestingLevel + 1; + + // Check if this is a level 2+ submenu (nested within another dropdown) + const isNestedSubmenu = item.parentElement && item.parentElement.id !== 'main-menu'; + + // Timeout management for smooth menu navigation + let showTimeout = null; + let hideTimeout = null; + + // Desktop: show on hover + item.addEventListener('mouseenter', function() { + if (!isMobile()) { + // Clear any pending hide timeout + if (hideTimeout) { + clearTimeout(hideTimeout); + hideTimeout = null; + } + + // Set show timeout + showTimeout = setTimeout(() => { + // Hide all sibling menus at the same level before showing this one + const parentElement = item.parentElement; + if (parentElement) { + const siblings = parentElement.querySelectorAll(':scope > li'); + siblings.forEach(sibling => { + if (sibling !== item) { + const siblingSubmenu = sibling.querySelector('ul'); + const siblingLink = sibling.querySelector('a'); + if (siblingSubmenu && siblingLink) { + siblingSubmenu.style.display = 'none'; + siblingLink.setAttribute('aria-expanded', 'false'); + disableSubmenuScrolling(siblingSubmenu); + } + } + }); + } + + submenu.style.display = 'block'; + // Only apply positioning for nested submenus (level 2+) + if (isNestedSubmenu) { + positionNestedSubmenu(submenu, link); + } + link.setAttribute('aria-expanded', 'true'); + showTimeout = null; + }, SHOW_DELAY); + } + }); + + item.addEventListener('mouseleave', function() { + if (!isMobile()) { + // Clear any pending show timeout + if (showTimeout) { + clearTimeout(showTimeout); + showTimeout = null; + } + + // Set hide timeout + hideTimeout = setTimeout(() => { + submenu.style.display = 'none'; + link.setAttribute('aria-expanded', 'false'); + // Clean up scrolling if enabled + disableSubmenuScrolling(submenu); + hideTimeout = null; + }, HIDE_DELAY); + } + }); + + if (isMobile() && isNestedSubmenu) { + positionNestedSubmenu(submenu, link); + } + + function toggleMenu() { + const isExpanded = link.getAttribute('aria-expanded') === 'true'; + if (isExpanded) { + slideUp(submenu, SLIDE_DELAY, () => { + submenu.style.display = 'none'; + link.setAttribute('aria-expanded', 'false'); + link.classList.remove('highlighted') + disableSubmenuScrolling(submenu); + }); + } else { + slideDown(submenu, SLIDE_DELAY, () => { + submenu.style.display = 'block'; + link.classList.add('highlighted') + link.setAttribute('aria-expanded', 'true'); + }); + } + } + + // Mobile/Touch: toggle on click + link.addEventListener('click', function(e) { + if (isMobile()) { + e.preventDefault(); + toggleMenu(); + } + }); + + // Keyboard navigation + link.addEventListener('keydown', function(e) { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + toggleMenu(); + } else if (e.key === 'Escape') { + submenu.style.display = 'none'; + link.setAttribute('aria-expanded', 'false'); + disableSubmenuScrolling(submenu); + link.focus(); + } + }); + } + } + }); + + // Helper function to close all open dropdown menus + closeAllDropdowns = function() { + menuItems.forEach(item => { + const submenu = item.querySelector('ul'); + const link = item.querySelector('a.has-submenu'); + if (submenu && link) { + disableSubmenuScrolling(submenu); + submenu.style.display = 'none'; + submenu.style.marginLeft = 0; + link.setAttribute('aria-expanded', 'false'); + link.classList.remove('highlighted'); + } + }); + }; + + // Close all dropdown menus when clicking a link (navigation to new page or anchor) + const allLinks = mainMenu.querySelectorAll('a'); + allLinks.forEach(link => { + link.addEventListener('click', function() { + // Close dropdowns when navigating (unless it's a has-submenu link in mobile mode) + if (!link.classList.contains('has-submenu') || !isMobile()) { + if (closeAllDropdowns) { + closeAllDropdowns(); + } + } + }); + }); + } + + // Initialize dropdown menu behavior + initDropdownMenu(); + + // Close all open menus when browser back button is pressed + window.addEventListener('popstate', function() { + if (closeAllDropdowns) { + closeAllDropdowns(); + } + }); +} + +/* @license-end */ diff --git a/docs/html/menudata.js b/docs/html/menudata.js new file mode 100644 index 000000000..feb78af14 --- /dev/null +++ b/docs/html/menudata.js @@ -0,0 +1,107 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Титульная страница",url:"index.html"}, +{text:"Пространства имен",url:"namespaces.html",children:[ +{text:"Пространства имен",url:"namespaces.html"}, +{text:"Члены пространств имен",url:"namespacemembers.html",children:[ +{text:"Указатель",url:"namespacemembers.html"}, +{text:"Функции",url:"namespacemembers_func.html"}]}]}, +{text:"Классы",url:"annotated.html",children:[ +{text:"Классы",url:"annotated.html"}, +{text:"Алфавитный указатель классов",url:"classes.html"}, +{text:"Члены классов",url:"functions.html",children:[ +{text:"Указатель",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions.html#index_b"}, +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"h",url:"functions.html#index_h"}, +{text:"i",url:"functions.html#index_i"}, +{text:"k",url:"functions.html#index_k"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"q",url:"functions.html#index_q"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"u",url:"functions.html#index_u"}, +{text:"v",url:"functions.html#index_v"}, +{text:"w",url:"functions.html#index_w"}, +{text:"~",url:"functions.html#index__7E"}]}, +{text:"Функции",url:"functions_func.html",children:[ +{text:"c",url:"functions_func.html#index_c"}, +{text:"d",url:"functions_func.html#index_d"}, +{text:"e",url:"functions_func.html#index_e"}, +{text:"f",url:"functions_func.html#index_f"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"i",url:"functions_func.html#index_i"}, +{text:"k",url:"functions_func.html#index_k"}, +{text:"l",url:"functions_func.html#index_l"}, +{text:"m",url:"functions_func.html#index_m"}, +{text:"o",url:"functions_func.html#index_o"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"q",url:"functions_func.html#index_q"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"t",url:"functions_func.html#index_t"}, +{text:"v",url:"functions_func.html#index_v"}, +{text:"w",url:"functions_func.html#index_w"}, +{text:"~",url:"functions_func.html#index__7E"}]}, +{text:"Переменные",url:"functions_vars.html",children:[ +{text:"a",url:"functions_vars.html#index_a"}, +{text:"b",url:"functions_vars.html#index_b"}, +{text:"c",url:"functions_vars.html#index_c"}, +{text:"d",url:"functions_vars.html#index_d"}, +{text:"e",url:"functions_vars.html#index_e"}, +{text:"g",url:"functions_vars.html#index_g"}, +{text:"h",url:"functions_vars.html#index_h"}, +{text:"i",url:"functions_vars.html#index_i"}, +{text:"k",url:"functions_vars.html#index_k"}, +{text:"l",url:"functions_vars.html#index_l"}, +{text:"m",url:"functions_vars.html#index_m"}, +{text:"n",url:"functions_vars.html#index_n"}, +{text:"o",url:"functions_vars.html#index_o"}, +{text:"p",url:"functions_vars.html#index_p"}, +{text:"q",url:"functions_vars.html#index_q"}, +{text:"r",url:"functions_vars.html#index_r"}, +{text:"s",url:"functions_vars.html#index_s"}, +{text:"t",url:"functions_vars.html#index_t"}, +{text:"u",url:"functions_vars.html#index_u"}]}, +{text:"Определения типов",url:"functions_type.html"}, +{text:"Перечисления",url:"functions_enum.html"}]}]}, +{text:"Файлы",url:"files.html",children:[ +{text:"Файлы",url:"files.html"}, +{text:"Список членов всех файлов",url:"globals.html",children:[ +{text:"Указатель",url:"globals.html"}, +{text:"Функции",url:"globals_func.html"}, +{text:"Переменные",url:"globals_vars.html"}, +{text:"Определения типов",url:"globals_type.html"}]}]}]} diff --git a/docs/html/namespacedatabase.html b/docs/html/namespacedatabase.html new file mode 100644 index 000000000..4e7d45319 --- /dev/null +++ b/docs/html/namespacedatabase.html @@ -0,0 +1,149 @@ + + + + + + + +Kafka-1C Connector: Пространство имен database + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Пространство имен database
+
+
+ + + + + + + +

+Классы

struct  ConnectionParams
struct  Client
struct  Product
struct  OrderItem
class  PostgreSQL
+
+
+ +
+ + + + diff --git a/docs/html/namespacedatabase.js b/docs/html/namespacedatabase.js new file mode 100644 index 000000000..a0545f946 --- /dev/null +++ b/docs/html/namespacedatabase.js @@ -0,0 +1,8 @@ +var namespacedatabase = +[ + [ "ConnectionParams", "structdatabase_1_1_connection_params.html", "structdatabase_1_1_connection_params" ], + [ "Client", "structdatabase_1_1_client.html", "structdatabase_1_1_client" ], + [ "Product", "structdatabase_1_1_product.html", "structdatabase_1_1_product" ], + [ "OrderItem", "structdatabase_1_1_order_item.html", "structdatabase_1_1_order_item" ], + [ "PostgreSQL", "classdatabase_1_1_postgre_s_q_l.html", "classdatabase_1_1_postgre_s_q_l" ] +]; \ No newline at end of file diff --git a/docs/html/namespacemembers.html b/docs/html/namespacemembers.html new file mode 100644 index 000000000..194941234 --- /dev/null +++ b/docs/html/namespacemembers.html @@ -0,0 +1,132 @@ + + + + + + + +Kafka-1C Connector: Члены пространств имен + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Полный список членов простанств имен.
    +
  • generateUUID() : utils
  • +
+
+
+
+ + + + diff --git a/docs/html/namespacemembers_func.html b/docs/html/namespacemembers_func.html new file mode 100644 index 000000000..beea6ba90 --- /dev/null +++ b/docs/html/namespacemembers_func.html @@ -0,0 +1,132 @@ + + + + + + + +Kafka-1C Connector: Члены пространств имен + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Список всех функций со ссылками на документацию пространства имён для каждого функции:
    +
  • generateUUID() : utils
  • +
+
+
+
+ + + + diff --git a/docs/html/namespaces.html b/docs/html/namespaces.html new file mode 100644 index 000000000..7f43c4739 --- /dev/null +++ b/docs/html/namespaces.html @@ -0,0 +1,138 @@ + + + + + + + +Kafka-1C Connector: Пространства имен + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Пространства имен
+
+
+
Полный список пространств имен.
+ + + +
 Ndatabase
 Nutils
+
+
+
+
+ + + + diff --git a/docs/html/namespaces_dup.js b/docs/html/namespaces_dup.js new file mode 100644 index 000000000..0445f6b66 --- /dev/null +++ b/docs/html/namespaces_dup.js @@ -0,0 +1,7 @@ +var namespaces_dup = +[ + [ "database", "namespacedatabase.html", "namespacedatabase" ], + [ "utils", "namespaceutils.html", [ + [ "generateUUID", "namespaceutils.html#adbc7a6520ceec292a43e3b89c7efba92", null ] + ] ] +]; \ No newline at end of file diff --git a/docs/html/namespaceutils.html b/docs/html/namespaceutils.html new file mode 100644 index 000000000..6799f28e1 --- /dev/null +++ b/docs/html/namespaceutils.html @@ -0,0 +1,169 @@ + + + + + + + +Kafka-1C Connector: Пространство имен utils + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Пространство имен utils
+
+
+ + + + +

+Функции

std::string generateUUID ()
 Генерирует UUID версии 4 (случайный).
+

Функции

+ +

◆ generateUUID()

+ +
+
+ + + + + + + +
std::string utils::generateUUID ()
+
+ +

Генерирует UUID версии 4 (случайный).

+
Возвращает
UUID в формате: 550e8400-e29b-41d4-a716-446655440000
+ +

См. определение в файле uuid.hpp строка 14

+ +
+
+
+
+ +
+ + + + diff --git a/docs/html/navtree.css b/docs/html/navtree.css new file mode 100644 index 000000000..0ea3a07a5 --- /dev/null +++ b/docs/html/navtree.css @@ -0,0 +1,327 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0; + padding:0; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + position: relative; + background-color: var(--nav-menu-active-bg); + border-radius: 0 6px 6px 0; + /*margin-right: 5px;*/ +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px var(--font-family-nav); + line-height: 22px; +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:var(--page-link-color); +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin: 0 6px 0 -5px; + padding: 0 0 0 5px; + height: 22px; +} + +#nav-tree { + padding: 0px 0px; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + overflow : hidden; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; +} + +.ui-resizable-e:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +.ui-resizable-e:hover { + opacity: 1; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-color: var(--nav-background-color); + -webkit-overflow-scrolling : touch; /* iOS 5+ */ + scrollbar-width: thin; + border-right: 1px solid var(--nav-border-color); + padding-left: 5px; +} + +#nav-sync { + position:absolute; + top:0px; + right:0px; + z-index:1; +} + +#nav-sync img { + opacity:0.3; +} + +div.nav-sync-icon { + position: relative; + width: 24px; + height: 17px; + left: -6px; + top: -1px; + opacity: 0.7; + display: inline-block; + background-color: var(--sync-icon-background-color); + border: 1px solid var(--sync-icon-border-color); + box-sizing: content-box; +} + +div.nav-sync-icon:hover { + background-color: var(--sync-icon-selected-background-color); + opacity: 1.0; +} + +div.nav-sync-icon.active:after { + content: ''; + background-color: var(--sync-icon-background-color); + border-top: 2px solid var(--sync-icon-color); + position: absolute; + width: 16px; + height: 0px; + top: 7px; + left: 4px; +} + +div.nav-sync-icon.active:hover:after { + border-top: 2px solid var(--sync-icon-selected-color); +} + +span.sync-icon-left { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 4px; + display: inline-block; + width: 8px; + height: 8px; + border-left: 2px solid var(--sync-icon-color); + border-top: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +span.sync-icon-right { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 10px; + display: inline-block; + width: 8px; + height: 8px; + border-right: 2px solid var(--sync-icon-color); + border-bottom: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +div.nav-sync-icon:hover span.sync-icon-left { + border-left: 2px solid var(--sync-icon-selected-color); + border-top: 2px solid var(--sync-icon-selected-color); +} + +div.nav-sync-icon:hover span.sync-icon-right { + border-right: 2px solid var(--sync-icon-selected-color); + border-bottom: 2px solid var(--sync-icon-selected-color); +} + +#nav-path ul { + border-top: 1px solid var(--nav-breadcrumb-separator-color); +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + +/*---------------------------*/ +#container { + display: grid; + grid-template-columns: auto auto; + overflow: hidden; +} + +#page-nav { + background: var(--nav-background-color); + display: block; + width: 250px; + box-sizing: content-box; + position: relative; + border-left: 1px solid var(--nav-border-color); +} + +#page-nav-tree { + display: inline-block; +} + +#page-nav-resize-handle { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; + z-index: 1; + user-select: none; +} + +#page-nav-resize-handle:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +#page-nav-resize-handle.dragging, +#page-nav-resize-handle:hover { + opacity: 1; +} + +#page-nav-contents { + padding: 0; + margin: 0; + display: block; + top: 0; + left: 0; + height: 100%; + width: 100%; + position: absolute; + overflow: auto; + scrollbar-width: thin; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +ul.page-outline, +ul.page-outline ul { + text-indent: 0; + list-style: none outside none; + padding: 0 0 0 4px; +} + +ul.page-outline { + margin: 0 4px 4px 6px; +} + +ul.page-outline div.item { + font: 12px var(--font-family-nav); + line-height: 22px; +} + +ul.page-outline li { + white-space: nowrap; +} + +ul.page-outline li.vis { + background-color: var(--nav-breadcrumb-active-bg); +} + +#container.resizing { + cursor: col-resize; + user-select: none; +} diff --git a/docs/html/navtree.js b/docs/html/navtree.js new file mode 100644 index 000000000..4567fd502 --- /dev/null +++ b/docs/html/navtree.js @@ -0,0 +1,1161 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +let initResizableFunc; + +function initNavTree(toroot,relpath,allMembersFile) { + let navTreeSubIndices = []; + const ARROW_DOWN = ''; + const ARROW_RIGHT = ''; + const NAVPATH_COOKIE_NAME = ''+'navpath'; + const fullSidebar = typeof page_layout!=='undefined' && page_layout==1; + + // Helper functions to replace jQuery + const $ = (selector) => document.querySelector(selector); + const $$ = (selector) => Array.from(document.querySelectorAll(selector)); + const hasClass = (el, className) => el ? el.classList.contains(className) : false; + const offsetTop = (el) => el ? (el.getBoundingClientRect().top + window.pageYOffset) : 0; + + const slideUp = function(el, duration, callback) { + if (!el) return; + el.style.overflow = 'hidden'; + el.style.transition = `height ${duration}ms ease`; + el.style.height = el.scrollHeight + 'px'; + setTimeout(() => { + el.style.height = '0'; + setTimeout(() => { + el.style.display = 'none'; + el.style.transition = ''; + el.style.overflow = ''; + el.style.height = ''; + if (callback) callback(); + }, duration); + }, 10); + }; + + const slideDown = function(el, duration, callback) { + if (!el) return; + el.style.display = 'block'; + const height = el.scrollHeight; + el.style.overflow = 'hidden'; + el.style.height = '0'; + el.style.transition = `height ${duration}ms ease`; + setTimeout(() => { + el.style.height = height + 'px'; + setTimeout(() => { + el.style.transition = ''; + el.style.overflow = ''; + el.style.height = ''; + if (callback) callback(); + }, duration); + }, 10); + }; + + const animateScrolling = function(el, targetPos, duration, callback) { + if (!el) return; + const start = performance.now(); + const startVal = el.scrollTop; + const tick = (now) => { + const elapsed = now - start; + const progress = Math.min(elapsed / duration, 1); + const endVal = targetPos; + el.scrollTop = startVal + (endVal - startVal) * progress; + + if (progress < 1) { + requestAnimationFrame(tick); + } else if (callback) { + callback(); + } + }; + requestAnimationFrame(tick); + }; + + function getScrollBarWidth () { + const outer = document.createElement('div'); + outer.style.visibility='hidden'; + outer.style.width='100px'; + outer.style.overflow='scroll'; + outer.style.scrollbarWidth='thin'; + document.body.appendChild(outer); + + const inner = document.createElement('div'); + inner.style.width='100%'; + outer.appendChild(inner); + + const widthWithScroll = inner.offsetWidth; + document.body.removeChild(outer); + return 100 - widthWithScroll; + } + const scrollbarWidth = getScrollBarWidth(); + + function adjustSyncIconPosition() { + if (!fullSidebar) { + const nt = document.getElementById("nav-tree"); + const hasVerticalScrollbar = nt.scrollHeight > nt.clientHeight; + const navSync = $("#nav-sync"); + navSync.style.right = (hasVerticalScrollbar ? scrollbarWidth : 0) + 'px'; + } + } + + const getData = function(varName) { + const i = varName.lastIndexOf('/'); + const n = i>=0 ? varName.substring(i+1) : varName; + const e = n.replace(/-/g,'_'); + return window[e]; + } + + const stripPath = (uri) => uri.substring(uri.lastIndexOf('/')+1); + + const stripPath2 = function(uri) { + const i = uri.lastIndexOf('/'); + const s = uri.substring(i+1); + const m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; + } + + const hashValue = () => location.hash.substring(1).replace(/[^\w-]/g,''); + const hashUrl = () => '#'+hashValue(); + const pathName = () => location.pathname.replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;()]/g, ''); + + const storeLink = function(link) { + const navSync = $("#nav-sync"); + if (!hasClass(navSync, 'sync')) { + Cookie.writeSetting(NAVPATH_COOKIE_NAME,link,0); + } + } + + const deleteLink = function() { + Cookie.eraseSetting(NAVPATH_COOKIE_NAME); + } + + const cachedLink = () => Cookie.readSetting(NAVPATH_COOKIE_NAME,''); + + const getScript = function(scriptName,func) { + const head = document.getElementsByTagName("head")[0]; + const script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = function() { func(); adjustSyncIconPosition(); } + script.src = scriptName+'.js'; + head.appendChild(script); + } + + const createIndent = function(o,domNode,node) { + let level=-1; + let n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + const imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=ARROW_RIGHT; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + slideUp(node.getChildrenUL(), 200, adjustSyncIconPosition); + const child0 = node.plus_img.childNodes[0] + if (child0) { + child0.classList.remove('opened'); + child0.classList.add('closed'); + } + node.expanded = false; + } else { + expandNode(o, node, false, true); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + let span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } + } + + let animationInProgress = false; + + const gotoAnchor = function(anchor,aname) { + if (!anchor) return; + let pos, docContent = $('#doc-content'); + if (!docContent) return; + + const anchorParent = anchor.parentElement; + if (!anchorParent) return; + + const parentClass = anchorParent.className; + if (hasClass(anchorParent, 'memItemLeft') || hasClass(anchorParent, 'memtitle') || + hasClass(anchorParent, 'fieldname') || hasClass(anchorParent, 'fieldtype') || + anchorParent.tagName.match(/^H[1-6]$/)) { + pos = offsetTop(anchorParent); // goto anchor's parent + } else { + pos = offsetTop(anchor); // goto anchor + } + if (pos) { + const dcOffset = offsetTop(docContent); + const dcHeight = docContent.clientHeight; + const dcScrHeight = docContent.scrollHeight; + const dcScrTop = docContent.scrollTop; + let dist = Math.abs(Math.min(pos-dcOffset,dcScrHeight-dcHeight-dcScrTop)); + animationInProgress = true; + animateScrolling(docContent, pos+dcScrTop-dcOffset, Math.max(50,Math.min(500,dist)), function() { + animationInProgress=false; + if (parentClass=='memItemLeft') { + const rows = $$('.memberdecls tr[class$="'+hashValue()+'"]'); + rows.forEach(row => { + const children = Array.from(row.children); + children.forEach(child => glowEffect(child, 300)); + }); + } else if (parentClass=='fieldname') { + glowEffect(anchorParent.parentElement, 1000); // enum value + } else if (parentClass=='fieldtype') { + glowEffect(anchorParent.parentElement, 1000); // struct field + } else if (anchorParent.tagName.match(/^H[1-6]$/)) { + glowEffect(anchorParent, 1000); // section header + } else { + glowEffect(anchor.nextElementSibling, 1000); // normal member + } + }); + } + } + + function htmlToNode(html) { + const template = document.createElement('template'); + template.innerHTML = html; + const nNodes = template.content.childNodes.length; + if (nNodes !== 1) { + throw new Error(`html parameter must represent a single node; got ${nNodes}. `); + } + return template.content.firstChild; + } + + const newNode = function(o, po, text, link, childrenData, lastNode) { + const node = { + children : [], + childrenData : childrenData, + depth : po.depth + 1, + relpath : po.relpath, + isLast : lastNode, + li : document.createElement("li"), + parentNode : po, + itemDiv : document.createElement("div"), + labelSpan : document.createElement("span"), + expanded : false, + childrenUL : null, + getChildrenUL : function() { + if (!this.childrenUL) { + this.childrenUL = document.createElement("ul"); + this.childrenUL.className = "children_ul"; + this.childrenUL.style.display = "none"; + this.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }, + }; + + node.itemDiv.className = "item"; + node.labelSpan.className = "label"; + createIndent(o,node.itemDiv,node); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + const a = document.createElement("a"); + node.labelSpan.appendChild(a); + po.getChildrenUL().appendChild(node.li); + a.appendChild(htmlToNode(''+text+'')); + if (link) { + let url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + const aname = '#'+link.split('#')[1]; + const srcPage = stripPath(pathName()); + const targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : aname; + a.onclick = function() { + storeLink(link); + const aPPar = a.parentElement.parentElement; + if (!hasClass(aPPar, 'selected')) { + $$('.item').forEach(item => { + item.classList.remove('selected'); + item.removeAttribute('id'); + }); + aPPar.classList.add('selected'); + aPPar.setAttribute('id', 'selected'); + } + const anchor = document.querySelector(aname); + gotoAnchor(anchor,aname); + }; + } else { + a.href = url; + a.onclick = () => storeLink(link); + } + } else if (childrenData != null) { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + return node; + } + + const showRoot = function() { + const top = $("#top"); + const navPath = $("#nav-path"); + const headerHeight = top ? top.clientHeight : 0; + const footerHeight = navPath ? navPath.clientHeight : 0; + const windowHeight = window.innerHeight - headerHeight - footerHeight; + (function retry() { // retry until we can scroll to the selected item + try { + const navtree = $('#nav-tree'); + if (navtree) { + const selected = navtree.querySelector('#selected'); + if (selected) { + const offset = -windowHeight/2; + const targetPos = selected.offsetTop + offset; + animateScrolling(navtree, Math.max(0, targetPos), 100); + } + } + } catch (err) { + setTimeout(retry, 0); + } + })(); + } + + const expandNode = function(o, node, imm, setFocus) { + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + expandNode(o, node, imm, setFocus); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + slideDown(node.getChildrenUL(), 200, adjustSyncIconPosition); + const child0 = node.plus_img.childNodes[0] + if (child0) { + child0.classList.add('opened'); + child0.classList.remove('closed'); + } + node.expanded = true; + if (setFocus) { + node.expandToggle.focus(); + } + } + } + } + + const glowEffect = function(n, duration) { + if (!n) return; + n.classList.add('glow'); + setTimeout(() => { + n.classList.remove('glow'); + }, duration); + } + + const highlightAnchor = function() { + const aname = hashUrl(); + const anchor = document.querySelector(aname); + gotoAnchor(anchor,aname); + } + + const selectAndHighlight = function(hash,n) { + let a; + if (hash) { + const link=stripPath(pathName())+':'+hash.substring(1); + a=document.querySelector('.item a[class$="'+link+'"]'); + } + if (a) { + const parent = a.parentElement.parentElement; + if (parent) { + parent.classList.add('selected'); + parent.setAttribute('id', 'selected'); + } + highlightAnchor(); + } else if (n && n.itemDiv) { + n.itemDiv.classList.add('selected'); + n.itemDiv.setAttribute('id', 'selected'); + } + let topOffset=5; + const firstItem = document.querySelector('#nav-tree-contents .item:first-child'); + if (firstItem && hasClass(firstItem, 'selected')) { + topOffset+=25; + } + showRoot(); + } + + const showNode = function(o, node, index, hash) { + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + showNode(o,node,index,hash); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + const childUL = node.getChildrenUL(); + if (childUL) { + childUL.style.display='block'; + } + const child0 = node.plus_img.childNodes[0]; + if (child0) { + child0.classList.remove('closed'); + child0.classList.add('opened'); + } + node.expanded = true; + const n = node.children[o.breadcrumbs[index]]; + if (index+10) { // try root page without hash as fallback + gotoUrl(o,root,'',relpath); + } else { + o.breadcrumbs = nti ? JSON.parse(JSON.stringify(nti)) : null; + if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index + navTo(o,NAVTREE[0][1],"",relpath); + $$('.item').forEach(item => { + item.classList.remove('selected'); + item.removeAttribute('id'); + }); + } + if (o.breadcrumbs) { + o.breadcrumbs.unshift(0); // add 0 for root node + showNode(o, o.node, 0, hash); + } + } + } + + const gotoUrl = function(o,root,hash,relpath) { + const url=root+hash; + let i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function() { + navTreeSubIndices[i] = window['NAVTREEINDEX'+i]; + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + }); + } + } + + const navTo = function(o,root,hash,relpath) { + const link = cachedLink(); + if (link) { + const parts = link.split('#'); + root = parts[0]; + hash = parts.length>1 ? '#'+parts[1].replace(/[^\w-]/g,'') : ''; + } + if (hash.match(/^#l\d+$/)) { + const anchor = document.querySelector('a[name='+hash.substring(1)+']'); + if (anchor && anchor.parentElement) { + glowEffect(anchor.parentElement, 1000); // line number + } + hash=''; // strip line number anchors + } + gotoUrl(o,root,hash,relpath); + } + + const showSyncOff = function(n,relpath) { + if (n) n.innerHTML = ''; + } + + const showSyncOn = function(n,relpath) { + if (n) n.innerHTML = ''; + } + + const o = { + toroot : toroot, + node : { + childrenData : NAVTREE, + children : [], + childrenUL : document.createElement("ul"), + getChildrenUL : function() { return this.childrenUL }, + li : document.getElementById("nav-tree-contents"), + depth : 0, + relpath : relpath, + expanded : false, + isLast : true, + plus_img : document.createElement("span"), + }, + }; + o.node.li.appendChild(o.node.childrenUL); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = ARROW_RIGHT; + + const navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.classList.remove('sync'); + } else { + showSyncOn(navSync,relpath); + } + + if (navSync) { + navSync.addEventListener('click', () => { + const navSync = $('#nav-sync'); + if (hasClass(navSync, 'sync')) { + navSync.classList.remove('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.classList.add('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } + }); + } + + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + + window.addEventListener('hashchange', () => { + if (!animationInProgress) { + if (window.location.hash && window.location.hash.length>1) { + let a; + if (location.hash) { + const clslink=stripPath(pathName())+':'+hashValue(); + a=document.querySelector('.item a[class$="'+clslink.replace(/ { + item.classList.remove('selected'); + item.removeAttribute('id'); + }); + } + const link=stripPath2(pathName()); + navTo(o,link,hashUrl(),relpath); + } else { + const docContent = $('#doc-content'); + if (docContent) docContent.scrollTop = 0; + $$('.item').forEach(item => { + item.classList.remove('selected'); + item.removeAttribute('id'); + }); + navTo(o,toroot,hashUrl(),relpath); + } + } + }); + + window.addEventListener('resize', function() { adjustSyncIconPosition(); }); + + let navtree_trampoline = { + updateContentTop : function() {} + } + + function initResizable() { + let sidenav,mainnav,pagenav,container,navtree,content,header,footer,barWidth=6; + const RESIZE_COOKIE_NAME = ''+'width'; + const PAGENAV_COOKIE_NAME = ''+'pagenav'; + const fullSidebar = typeof page_layout!=='undefined' && page_layout==1; + + function showHideNavBar() { + const bar = document.querySelector('div.sm-dox'); + if (fullSidebar && mainnav && bar) { + if (mainnav.clientWidth < 768) { + bar.style.display = 'none'; + } else { + bar.style.display = ''; + } + } + } + + function constrainPanelWidths(leftPanelWidth,rightPanelWidth,dragLeft) { + const contentWidth = container.clientWidth - leftPanelWidth - rightPanelWidth; + const minContentWidth = 250; + const minPanelWidth = barWidth; + if (contentWidth try to keep right panel width + const shrinkLeft = Math.min(deficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + const remainingDeficit = deficit - shrinkLeft; + const shrinkRight = Math.min(remainingDeficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + } else { // dragging right handle -> try to keep left panel width + const shrinkRight = Math.min(deficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + const remainingDeficit = deficit - shrinkRight; + const shrinkLeft = Math.min(remainingDeficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + } + } else { + rightPanelWidth = pagenav ? Math.max(minPanelWidth,rightPanelWidth) : 0; + leftPanelWidth = Math.max(minPanelWidth,leftPanelWidth); + } + return { leftPanelWidth, rightPanelWidth } + } + + function updateWidths(sidenavWidth,pagenavWidth,dragLeft) + { + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,dragLeft); + const widthStr = parseFloat(widths.leftPanelWidth)+"px"; + content.style.marginLeft = widthStr; + if (fullSidebar) { + footer.style.marginLeft = widthStr; + if (mainnav) { + mainnav.style.marginLeft = widthStr; + } + } + sidenav.style.width = widthStr; + if (pagenav) { + container.style.gridTemplateColumns = 'auto '+parseFloat(widths.rightPanelWidth)+'px'; + if (!dragLeft) { + pagenav.style.width = parseFloat(widths.rightPanelWidth-1)+'px'; + } + } + return widths; + } + + function resizeWidth(dragLeft) { + const sidenavWidth = sidenav.offsetWidth - barWidth; + let pagenavWidth = pagenav ? pagenav.offsetWidth : 0; + const widths = updateWidths(sidenavWidth,pagenavWidth,dragLeft); + Cookie.writeSetting(RESIZE_COOKIE_NAME,widths.leftPanelWidth-barWidth); + if (pagenav) { + Cookie.writeSetting(PAGENAV_COOKIE_NAME,widths.rightPanelWidth); + } + } + + function restoreWidth(sidenavWidth,pagenavWidth) { + updateWidths(sidenavWidth,pagenavWidth,false); + showHideNavBar(); + } + + function resizeHeight() { + const headerHeight = header.offsetHeight; + const windowHeight = window.innerHeight; + let contentHeight; + const footerHeight = footer.offsetHeight; + let navtreeHeight,sideNavHeight; + if (!fullSidebar) { + contentHeight = windowHeight - headerHeight - footerHeight - 1; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (fullSidebar) { + contentHeight = windowHeight - footerHeight - 1; + navtreeHeight = windowHeight - headerHeight - 1; + sideNavHeight = windowHeight - 1; + if (mainnav) { + contentHeight -= mainnav.offsetHeight; + } + } + navtree.style.height = navtreeHeight + "px"; + sidenav.style.height = sideNavHeight + "px"; + content.style.height = contentHeight + "px"; + resizeWidth(false); + showHideNavBar(); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + header = $("#top"); + content = $("#doc-content"); + footer = $("#nav-path"); + sidenav = $("#side-nav"); + if (document.getElementById('main-nav')) { + mainnav = $("#main-nav"); + } + navtree = $("#nav-tree"); + pagenav = $("#page-nav"); + container = $("#container"); + + // Native JavaScript implementation for resizable side navigation + const splitbar = $("#splitbar"); + if (splitbar) { + // Add the ui-resizable-e class to make the splitbar visible and styled correctly + splitbar.classList.add('ui-resizable-e'); + splitbar.style.zIndex = 90; + + let isResizing = false; + let startX = 0; + let startWidth = 0; + + const startResize = (e) => { + startX = e.clientX ?? e.touches?.[0]?.clientX; + startWidth = sidenav.offsetWidth - barWidth; + document.body.classList.add('resizing'); + document.body.style.cursor = 'col-resize'; + + const doResize = (e) => { + const clientX = e.clientX ?? e.touches?.[0]?.clientX; + if (clientX === undefined) return; + const delta = clientX - startX; + const newWidth = startWidth + delta; + sidenav.style.width = newWidth + 'px'; + resizeWidth(true); + }; + + const stopResize = () => { + document.body.classList.remove('resizing'); + document.body.style.cursor = 'auto'; + document.removeEventListener('mousemove', doResize); + document.removeEventListener('touchmove', doResize); + document.removeEventListener('mouseup', stopResize); + document.removeEventListener('touchend', stopResize); + }; + + document.addEventListener('mousemove', doResize); + document.addEventListener('touchmove', doResize); + document.addEventListener('mouseup', stopResize); + document.addEventListener('touchend', stopResize); + }; + + splitbar.addEventListener('mousedown', startResize); + splitbar.addEventListener('touchstart', startResize, { passive: false }); + } + + if (pagenav) { + const pagehandle = $("#page-nav-resize-handle"); + if (pagehandle) { + const startDrag = (e) => { + document.body.classList.add('resizing'); + pagehandle.classList.add('dragging'); + + const mouseMoveHandler = (e) => { + const clientX = e.clientX ?? e.touches?.[0]?.clientX; + if (clientX === undefined) return; + let pagenavWidth = container.offsetWidth - clientX + barWidth/2; + const sidenavWidth = sidenav.clientWidth; + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,false); + container.style.gridTemplateColumns = 'auto '+parseFloat(widths.rightPanelWidth)+'px'; + pagenav.style.width = parseFloat(widths.rightPanelWidth-1)+'px'; + content.style.marginLeft = parseFloat(widths.leftPanelWidth - barWidth)+'px'; + Cookie.writeSetting(PAGENAV_COOKIE_NAME,pagenavWidth); + }; + + const mouseUpHandler = (e) => { + document.body.classList.remove('resizing'); + pagehandle.classList.remove('dragging'); + document.removeEventListener('mousemove', mouseMoveHandler); + document.removeEventListener('mouseup', mouseUpHandler); + document.removeEventListener('touchmove', mouseMoveHandler); + document.removeEventListener('touchend', mouseUpHandler); + }; + + document.addEventListener('mousemove', mouseMoveHandler); + document.addEventListener('touchmove', mouseMoveHandler); + document.addEventListener('mouseup', mouseUpHandler); + document.addEventListener('touchend', mouseUpHandler); + }; + + pagehandle.addEventListener('mousedown', startDrag); + pagehandle.addEventListener('touchstart', startDrag, { passive: false }); + } + } else { + container.style.gridTemplateColumns = 'auto'; + } + const width = parseInt(Cookie.readSetting(RESIZE_COOKIE_NAME,250)); + const pagenavWidth = parseInt(Cookie.readSetting(PAGENAV_COOKIE_NAME,250)); + if (width) { restoreWidth(width+barWidth,pagenavWidth); } else { resizeWidth(); } + const url = location.href; + const i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + + + let lastWidth = -1; + let lastHeight = -1; + window.addEventListener('resize', function() { + const newWidth = window.innerWidth; + const newHeight = window.innerHeight; + if (newWidth!=lastWidth || newHeight!=lastHeight) { + resizeHeight(); + navtree_trampoline.updateContentTop(); + lastWidth = newWidth; + lastHeight = newHeight; + } + }); + resizeHeight(); + lastWidth = window.innerWidth; + lastHeight = window.innerHeight; + if (content) { + content.addEventListener('scroll', function() { + navtree_trampoline.updateContentTop(); + }); + } + } + + function initPageToc() { + const topMapping = []; + const toc_contents = $('#page-nav-contents'); + const content = document.createElement('ul'); + content.className = 'page-outline'; + + var entityMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '/': '/', + '`': '`', + '=': '=' + }; + function escapeHtml (string) { + return String(string).replace(/[&<>"'`=\/]/g, function (s) { + return entityMap[s]; + }); + } + + // for ClassDef/GroupDef/ModuleDef/ConceptDef/DirDef + const groupSections = []; + let currentGroup = null; + $$('h2.groupheader, h2.memtitle').forEach(function(element){ + if (hasClass(element, 'groupheader')) { + currentGroup = { groupHeader: element, memTitles: [] }; + groupSections.push(currentGroup); + } else if (hasClass(element, 'memtitle') && currentGroup) { + currentGroup.memTitles.push(element); + } + }); + groupSections.forEach(function(item){ + const title = item.groupHeader.textContent.trim(); + let id = item.groupHeader.getAttribute('id'); + let table = item.groupHeader.closest('table.memberdecls'); + let rows = []; + if (table) { + rows = Array.from(table.querySelectorAll("tr[class^='memitem:'] td.memItemRight, tr[class^='memitem:'] td.memItemLeft.anon, tr[class=groupHeader] td")); + } + function hasSubItems() { + return item.memTitles.length>0 || rows.some(function(el) { + return el.offsetParent !== null; // check if visible + }); + } + const li = document.createElement('li'); + li.setAttribute('id', 'nav-'+id); + const div = document.createElement('div'); + div.classList.add('item'); + const span = document.createElement('span'); + span.classList.add('arrow'); + span.style.paddingLeft='0px'; + if (hasSubItems()) { + const arrowSpan = document.createElement('span'); + arrowSpan.classList.add('arrowhead', 'opened'); + span.appendChild(arrowSpan); + } + const ahref = document.createElement('a'); + ahref.setAttribute('href', '#'+id); + ahref.textContent = title; + div.appendChild(span); + div.appendChild(ahref); + li.appendChild(div); + content.appendChild(li); + topMapping.push(id); + const ulStack = []; + ulStack.push(content); + if (hasSubItems()) { + let last_id = undefined; + let inMemberGroup = false; + // declaration sections have rows for items + rows.forEach(function(td) { + let tr = td.parentElement; + const firstChild = td.childNodes[0]; + const is_anon_enum = firstChild && firstChild.textContent.trim()=='{'; + if (hasClass(tr, 'template')) { + tr = tr.previousElementSibling; + } + id = tr.getAttribute('id'); + let text = is_anon_enum ? 'anonymous enum' : (td.querySelector(':first-child') ? td.querySelector(':first-child').textContent : ''); + let isMemberGroupHeader = hasClass(tr, 'groupHeader'); + if (tr.offsetParent !== null && last_id!=id && id!==undefined) { + if (isMemberGroupHeader && inMemberGroup) { + ulStack.pop(); + inMemberGroup=false; + } + const li2 = document.createElement('li'); + li2.setAttribute('id', 'nav-'+id); + const div2 = document.createElement('div'); + div2.classList.add('item'); + const span2 = document.createElement('span'); + span2.classList.add('arrow'); + span2.style.paddingLeft = parseInt(ulStack.length*16)+'px'; + const ahref = document.createElement('a'); + ahref.setAttribute('href', '#'+id); + ahref.textContent = escapeHtml(text); + div2.appendChild(span2); + div2.appendChild(ahref); + li2.appendChild(div2); + topMapping.push(id); + if (isMemberGroupHeader) { + const arrowSpan = document.createElement('span'); + arrowSpan.classList.add('arrowhead','opened'); + span2.appendChild(arrowSpan); + ulStack[ulStack.length-1].appendChild(li2); + const ul2 = document.createElement('ul'); + ulStack.push(ul2); + li2.appendChild(ul2); + inMemberGroup=true; + } else { + ulStack[ulStack.length-1].appendChild(li2); + } + last_id=id; + } + }); + // detailed documentation has h2.memtitle sections for items + item.memTitles.forEach(function(data) { + const childNodes = Array.from(data.childNodes); + const firstChild = data.children[0]; + let text = ''; + childNodes.forEach(node => { + if (node !== firstChild) { + text += node.textContent || ''; + } + }); + const name = text.replace(/\(\)(\s*\[\d+\/\d+\])?$/, '') // func() [2/8] -> func + const permalinkAnchor = data.querySelector('span.permalink a'); + id = permalinkAnchor ? permalinkAnchor.getAttribute('href') : undefined; + if (id!==undefined && name!==undefined) { + const li2 = document.createElement('li'); + li2.setAttribute('id', 'nav-'+id.substring(1)); + const div2 = document.createElement('div'); + div2.classList.add('item'); + const span2 = document.createElement('span'); + span2.classList.add('arrow'); + span2.style.paddingLeft = parseInt(ulStack.length*16)+'px'; + const ahref = document.createElement('a'); + ahref.setAttribute('href', id); + ahref.textContent = escapeHtml(name); + div2.appendChild(span2); + div2.appendChild(ahref); + li2.appendChild(div2); + ulStack[ulStack.length-1].appendChild(li2); + topMapping.push(id.substring(1)); + } + }); + } + }); + if (allMembersFile.length) { // add entry linking to all members page + const url = location.href; + let srcBaseUrl = ''; + let dstBaseUrl = ''; + if (relpath.length) { // CREATE_SUBDIRS=YES -> find target location + srcBaseUrl = url.substring(0, url.lastIndexOf('/')) + '/' + relpath; + dstBaseUrl = allMembersFile.substr(0, allMembersFile.lastIndexOf('/'))+'/'; + } + const pageName = url.split('/').pop().split('#')[0].replace(/(\.[^/.]+)$/, '-members$1'); + const li = document.createElement('li'); + const div = document.createElement('div'); + div.classList.add('item'); + const span = document.createElement('span'); + span.classList.add('arrow'); + span.style.paddingLeft='0px'; + const ahref = document.createElement('a'); + ahref.setAttribute('href', srcBaseUrl+dstBaseUrl+pageName); + ahref.classList.add('noscroll'); + ahref.textContent = LISTOFALLMEMBERS; + div.appendChild(span); + div.appendChild(ahref); + li.appendChild(div); + content.appendChild(li); + } + + if (groupSections.length==0) { + // for PageDef + const sectionTree = [], sectionStack = []; + $$('h1.doxsection, h2.doxsection, h3.doxsection, h4.doxsection, h5.doxsection, h6.doxsection').forEach(function(element){ + const level = parseInt(element.tagName[1]); + const anchorEl = element.querySelector('a.anchor'); + const anchor = anchorEl ? anchorEl.getAttribute('id') : null; + // Note: innerHTML is used here to preserve HTML formatting in section headings + // This content is generated by doxygen, not from user input + const node = { text: element.innerHTML, id: anchor, children: [] }; + while (sectionStack.length && sectionStack[sectionStack.length - 1].level >= level) sectionStack.pop(); + (sectionStack.length ? sectionStack[sectionStack.length - 1].children : sectionTree).push(node); + sectionStack.push({ ...node, level }); + }); + if (sectionTree.length>0) { + function render(nodes, level=0) { + nodes.map(n => { + const li = document.createElement('li'); + li.setAttribute('id', 'nav-'+n.id); + const div = document.createElement('div'); + div.classList.add('item'); + const span = document.createElement('span'); + span.classList.add('arrow'); + span.setAttribute('style', 'padding-left:'+parseInt(level*16)+'px;'); + if (n.children.length > 0) { + const arrowSpan = document.createElement('span'); + arrowSpan.classList.add('arrowhead','opened'); + span.appendChild(arrowSpan); + } + const url = document.createElement('a'); + url.setAttribute('href', '#'+n.id); + // innerHTML used to preserve HTML formatting from doxygen-generated content + url.innerHTML = n.text; + div.appendChild(span); + div.appendChild(url); + li.appendChild(div); + content.appendChild(li); + topMapping.push(n.id); + render(n.children,level+1); + }); + } + render(sectionTree); + } + } + + if (toc_contents) { + toc_contents.appendChild(content); + } + + $$(".page-outline a[href]:not(.noscroll)").forEach(function(anchor) { + anchor.addEventListener('click', function(e) { + e.preventDefault(); + const aname = this.getAttribute("href"); + gotoAnchor(document.querySelector(aname), aname); + }); + }); + + let lastScrollSourceOffset = -1; + let lastScrollTargetOffset = -1; + let lastScrollTargetId = ''; + + navtree_trampoline.updateContentTop = function() { + const pagenavcontents = $("#page-nav-contents"); + if (pagenavcontents) { + const content = $("#doc-content"); + const height = content ? content.clientHeight : 0; + const navy = pagenavcontents ? offsetTop(pagenavcontents) : 0; + const yc = content ? offsetTop(content) : 0; + let offsets = [] + for (let i=0;imargin || ye>margin) && (yslastScrollTargetOffset) || + (!scrollDown && targetOffset { + navtree_trampoline.updateContentTop(); + },200); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', function() { + initPageToc(); + initResizable(); + }); + } else { + initPageToc(); + initResizable(); + } + + initResizableFunc = initResizable; + +} +/* @license-end */ diff --git a/docs/html/navtreedata.js b/docs/html/navtreedata.js new file mode 100644 index 000000000..9c63d9d32 --- /dev/null +++ b/docs/html/navtreedata.js @@ -0,0 +1,65 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var NAVTREE = +[ + [ "Kafka-1C Connector", "index.html", [ + [ "Пространства имен", "namespaces.html", [ + [ "Пространства имен", "namespaces.html", "namespaces_dup" ], + [ "Члены пространств имен", "namespacemembers.html", [ + [ "Указатель", "namespacemembers.html", null ], + [ "Функции", "namespacemembers_func.html", null ] + ] ] + ] ], + [ "Классы", "annotated.html", [ + [ "Классы", "annotated.html", "annotated_dup" ], + [ "Алфавитный указатель классов", "classes.html", null ], + [ "Члены классов", "functions.html", [ + [ "Указатель", "functions.html", null ], + [ "Функции", "functions_func.html", null ], + [ "Переменные", "functions_vars.html", null ], + [ "Определения типов", "functions_type.html", null ], + [ "Перечисления", "functions_enum.html", null ] + ] ] + ] ], + [ "Файлы", "files.html", [ + [ "Файлы", "files.html", "files_dup" ], + [ "Список членов всех файлов", "globals.html", [ + [ "Указатель", "globals.html", null ], + [ "Функции", "globals_func.html", null ], + [ "Переменные", "globals_vars.html", null ], + [ "Определения типов", "globals_type.html", null ] + ] ] + ] ] + ] ] +]; + +var NAVTREEINDEX = +[ +"annotated.html" +]; + +const SYNCONMSG = 'нажмите на выключить для синхронизации панелей'; +const SYNCOFFMSG = 'нажмите на включить для синхронизации панелей'; +const LISTOFALLMEMBERS = 'Полный список членов класса'; \ No newline at end of file diff --git a/docs/html/navtreeindex0.js b/docs/html/navtreeindex0.js new file mode 100644 index 000000000..b841935ba --- /dev/null +++ b/docs/html/navtreeindex0.js @@ -0,0 +1,246 @@ +var NAVTREEINDEX0 = +{ +"annotated.html":[1,0], +"class_json_parser.html":[1,0,5], +"class_kafka_consumer.html":[1,0,7], +"class_kafka_consumer.html#a11206b927d21acae545fb51b155d0b86":[1,0,7,1], +"class_kafka_consumer.html#a21535be303ced919722a21c8a10646ba":[1,0,7,5], +"class_kafka_consumer.html#a46990adceb2dd354969ab9df76ccf288":[1,0,7,4], +"class_kafka_consumer.html#a4b681b6d27e4cb550a35f61c7acf279a":[1,0,7,7], +"class_kafka_consumer.html#a4dd0e33f7341f6de09f7f470fa785dca":[1,0,7,2], +"class_kafka_consumer.html#a56ee2ca2d7d35993b23f95d1dee846c1":[1,0,7,6], +"class_kafka_consumer.html#a5a6cbea7cd95c9b71b9d99e2df550cbc":[1,0,7,0], +"class_kafka_consumer.html#ad3e3608060a00e4429a2e14d24ad09c8":[1,0,7,3], +"class_kafka_producer.html":[1,0,8], +"class_kafka_producer.html#a5c01eb2a998310bbfe16ebc77666af8f":[1,0,8,8], +"class_kafka_producer.html#a6012cf74b1de379e1110c0db1690b64c":[1,0,8,6], +"class_kafka_producer.html#a6266bb25d0bbec95a32243d88006ea55":[1,0,8,3], +"class_kafka_producer.html#a7b50ec53a1b4e433a6674519376d8c27":[1,0,8,1], +"class_kafka_producer.html#a848df41ef97ff523fc21c3b12285c26c":[1,0,8,9], +"class_kafka_producer.html#a8f20c25ada021053e6a9752b6ebe3cad":[1,0,8,5], +"class_kafka_producer.html#a93934ddc34c83e74fd7adb110c1b3f2c":[1,0,8,4], +"class_kafka_producer.html#ab3ca45833957d458b67df80abcc60f2a":[1,0,8,0], +"class_kafka_producer.html#acb41ef37ae06e2f660fcc38e614843ce":[1,0,8,2], +"class_kafka_producer.html#afcc3fa74dced31f8fab9bb198a26414e":[1,0,8,7], +"class_logger.html":[1,0,9], +"class_logger.html#ad766a24576ea8b27ad9d5649cef46d8f":[1,0,9,0], +"class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fa059e9861e0400dfbe05c98a841f3f96b":[1,0,9,0,1], +"class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fa551b723eafd6a31d444fcb2f5920fbd3":[1,0,9,0,0], +"class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fabb1ca97ec761fc37101737ba0aa2e7c5":[1,0,9,0,2], +"class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fadc30ec20708ef7b0f641ef78b7880a15":[1,0,9,0,3], +"class_message_cache.html":[1,0,10], +"class_message_cache.html#a201b93a9b56bc038a470a05483566e55":[1,0,10,4], +"class_message_cache.html#a50c216e984ae61005f4daf4b8c124a22":[1,0,10,2], +"class_message_cache.html#a56f1f38d36817479eab94ada855e2e4e":[1,0,10,8], +"class_message_cache.html#a699e48cdd16aaf9e8a67d25d30925a24":[1,0,10,10], +"class_message_cache.html#a6ba6cafac1143389d777172aed9f9fbd":[1,0,10,1], +"class_message_cache.html#a6e8847a867b6750273845c3a6ca57c65":[1,0,10,9], +"class_message_cache.html#a765eefeba20b5cc7298a7d10def84903":[1,0,10,7], +"class_message_cache.html#a7d8db594bd5c90375565decd61911596":[1,0,10,12], +"class_message_cache.html#ab3729d708193c6be1460fb7a2860e03a":[1,0,10,3], +"class_message_cache.html#aba79bed3c66e3fe011ae25ed45bb9f8b":[1,0,10,5], +"class_message_cache.html#abe7996aada9f77e39d9ed2d830dcddb9":[1,0,10,11], +"class_message_cache.html#ad3ecc4f9d87a5f147db6eb8d02a83cd9":[1,0,10,0], +"class_message_cache.html#ae986415d8621c4d18493379325ce04cc":[1,0,10,6], +"class_order_processor.html":[1,0,13], +"class_order_processor.html#a6f8aa8e2aeb597be492065036c2f23f5":[1,0,13,1], +"class_order_processor.html#a7686bf7d98b381b0fe4db4039766d255":[1,0,13,0], +"class_order_processor.html#af7a710bdbf4bd5c4578db73437477a5f":[1,0,13,2], +"classdatabase_1_1_postgre_s_q_l.html":[0,0,0,4], +"classdatabase_1_1_postgre_s_q_l.html":[1,0,0,4], +"classdatabase_1_1_postgre_s_q_l.html#a1b682272e817f53fe4f0ccfcb727e253":[0,0,0,4,8], +"classdatabase_1_1_postgre_s_q_l.html#a1b682272e817f53fe4f0ccfcb727e253":[1,0,0,4,8], +"classdatabase_1_1_postgre_s_q_l.html#a372a7ea6dc198d0ed42190d114980e39":[0,0,0,4,2], +"classdatabase_1_1_postgre_s_q_l.html#a372a7ea6dc198d0ed42190d114980e39":[1,0,0,4,2], +"classdatabase_1_1_postgre_s_q_l.html#a4a090045c1149fcfef8b05415d41e6fb":[0,0,0,4,10], +"classdatabase_1_1_postgre_s_q_l.html#a4a090045c1149fcfef8b05415d41e6fb":[1,0,0,4,10], +"classdatabase_1_1_postgre_s_q_l.html#a6773124fa34e1abd8758791867453058":[0,0,0,4,5], +"classdatabase_1_1_postgre_s_q_l.html#a6773124fa34e1abd8758791867453058":[1,0,0,4,5], +"classdatabase_1_1_postgre_s_q_l.html#a785b7fa2f3259b5258c06bfbd9e8b2c3":[0,0,0,4,3], +"classdatabase_1_1_postgre_s_q_l.html#a785b7fa2f3259b5258c06bfbd9e8b2c3":[1,0,0,4,3], +"classdatabase_1_1_postgre_s_q_l.html#a78e26c9484a4cda19507c89600f609b6":[0,0,0,4,9], +"classdatabase_1_1_postgre_s_q_l.html#a78e26c9484a4cda19507c89600f609b6":[1,0,0,4,9], +"classdatabase_1_1_postgre_s_q_l.html#a95022441d5201d81365056c401ec2474":[0,0,0,4,13], +"classdatabase_1_1_postgre_s_q_l.html#a95022441d5201d81365056c401ec2474":[1,0,0,4,13], +"classdatabase_1_1_postgre_s_q_l.html#aa38b062a15f9d260deb2b39f8f72f8e7":[0,0,0,4,1], +"classdatabase_1_1_postgre_s_q_l.html#aa38b062a15f9d260deb2b39f8f72f8e7":[1,0,0,4,1], +"classdatabase_1_1_postgre_s_q_l.html#aae16b58e807cbaf423edb361275dc018":[0,0,0,4,7], +"classdatabase_1_1_postgre_s_q_l.html#aae16b58e807cbaf423edb361275dc018":[1,0,0,4,7], +"classdatabase_1_1_postgre_s_q_l.html#ac22c54f52920ec67e8579bb70f360949":[0,0,0,4,4], +"classdatabase_1_1_postgre_s_q_l.html#ac22c54f52920ec67e8579bb70f360949":[1,0,0,4,4], +"classdatabase_1_1_postgre_s_q_l.html#af10309b83ba66fdfdbf86871653cbab7":[0,0,0,4,12], +"classdatabase_1_1_postgre_s_q_l.html#af10309b83ba66fdfdbf86871653cbab7":[1,0,0,4,12], +"classdatabase_1_1_postgre_s_q_l.html#af41a6c8beb9e194a4c1bdfa346d0712d":[0,0,0,4,6], +"classdatabase_1_1_postgre_s_q_l.html#af41a6c8beb9e194a4c1bdfa346d0712d":[1,0,0,4,6], +"classdatabase_1_1_postgre_s_q_l.html#af9b6445361883ff9a3dd155fc9bf1b52":[0,0,0,4,11], +"classdatabase_1_1_postgre_s_q_l.html#af9b6445361883ff9a3dd155fc9bf1b52":[1,0,0,4,11], +"classdatabase_1_1_postgre_s_q_l.html#afa4286fcc9ddb506fc30b9d934615b0f":[0,0,0,4,0], +"classdatabase_1_1_postgre_s_q_l.html#afa4286fcc9ddb506fc30b9d934615b0f":[1,0,0,4,0], +"classes.html":[1,1], +"config_8hpp.html":[2,0,0,1,0], +"config_8hpp.html#ab701e3ac61a85b337ec5c1abaad6742d":[2,0,0,1,0,9], +"config_8hpp_source.html":[2,0,0,1,0], +"consumer_8cpp.html":[2,0,0,3,0], +"consumer_8cpp_source.html":[2,0,0,3,0], +"consumer_8hpp.html":[2,0,0,3,1], +"consumer_8hpp_source.html":[2,0,0,3,1], +"dir_1de7975868b084fd11f0850c7fb44b67.html":[2,0,0,5], +"dir_313caf1132e152dd9b58bea13a4052ca.html":[2,0,0,6], +"dir_68267d1309a1af8e8297ef4c3efbcdba.html":[2,0,0], +"dir_6cd8491d143eb218b70983dbdb3c58bc.html":[2,0,0,4], +"dir_6dd2d287d08a289e9849dd6e2f6b9333.html":[2,0,0,0], +"dir_7e83d1792d529f4aa7126ac7e0b3b699.html":[2,0,0,1], +"dir_803ee67260c130b45d29089798491ab2.html":[2,0,0,2], +"dir_b1f85b4500d4f866a4815ca77f1375fe.html":[2,0,0,3], +"files.html":[2,0], +"functions.html":[1,2,0], +"functions_enum.html":[1,2,4], +"functions_func.html":[1,2,1], +"functions_type.html":[1,2,3], +"functions_vars.html":[1,2,2], +"globals.html":[2,1,0], +"globals_func.html":[2,1,1], +"globals_type.html":[2,1,3], +"globals_vars.html":[2,1,2], +"index.html":[], +"json__parser_8hpp.html":[2,0,0,4,0], +"json__parser_8hpp_source.html":[2,0,0,4,0], +"logger_8hpp.html":[2,0,0,6,0], +"logger_8hpp_source.html":[2,0,0,6,0], +"main_8cpp.html":[2,0,0,7], +"main_8cpp.html#a046be377067f3f52c8b9516cdb1e47b5":[2,0,0,7,4], +"main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97":[2,0,0,7,1], +"main_8cpp.html#a5a216c3284e0a72fe4f8101cd8b12b60":[2,0,0,7,0], +"main_8cpp.html#a5bc44c4396b63ff16c6a74bb1c394478":[2,0,0,7,2], +"main_8cpp.html#a658b214911501898d6087b601d6b152e":[2,0,0,7,8], +"main_8cpp.html#a77c334a9669f26a519f128b8f85765a6":[2,0,0,7,7], +"main_8cpp.html#a8a2b3452989432f0e06d48049de87e33":[2,0,0,7,6], +"main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854":[2,0,0,7,3], +"main_8cpp.html#ad2e59c7203b3bddc1bc9a2224b52e8e7":[2,0,0,7,5], +"main_8cpp.html#af53701aded99286de42137bffab9561a":[2,0,0,7,9], +"main_8cpp_source.html":[2,0,0,7], +"namespacedatabase.html":[0,0,0], +"namespacemembers.html":[0,1,0], +"namespacemembers_func.html":[0,1,1], +"namespaces.html":[0,0], +"namespaceutils.html":[0,0,1], +"namespaceutils.html#adbc7a6520ceec292a43e3b89c7efba92":[0,0,1,0], +"order__processor_8cpp.html":[2,0,0,5,0], +"order__processor_8cpp_source.html":[2,0,0,5,0], +"order__processor_8hpp.html":[2,0,0,5,1], +"order__processor_8hpp_source.html":[2,0,0,5,1], +"pages.html":[], +"postgresql_8cpp.html":[2,0,0,2,0], +"postgresql_8cpp_source.html":[2,0,0,2,0], +"postgresql_8hpp.html":[2,0,0,2,1], +"postgresql_8hpp_source.html":[2,0,0,2,1], +"producer_8hpp.html":[2,0,0,3,2], +"producer_8hpp_source.html":[2,0,0,3,2], +"sqlite__cache_8hpp.html":[2,0,0,0,0], +"sqlite__cache_8hpp_source.html":[2,0,0,0,0], +"struct_app_config.html":[1,0,1], +"struct_app_config.html#a278bb1ffae10e016c5355964746230f9":[1,0,1,2], +"struct_app_config.html#a317a75e33b14b550d5037863dc12d6a9":[1,0,1,5], +"struct_app_config.html#a6eabe866e9b2dded624221f90e6bec7f":[1,0,1,3], +"struct_app_config.html#a71293784add692e888b81f72d2e27a6a":[1,0,1,4], +"struct_app_config.html#ab61fecf8d49e3d3eae421cfcab3a94bd":[1,0,1,0], +"struct_app_config.html#ad48b440bdfae4964ca599149729d09ec":[1,0,1,1], +"struct_cache_config.html":[1,0,2], +"struct_cache_config.html#a789469e676460aba92e45f59634c9baa":[1,0,2,1], +"struct_cache_config.html#a7e8c2d3a69fd12df4809602ec825c62e":[1,0,2,3], +"struct_cache_config.html#a811e7654983743415a50f817813ca293":[1,0,2,2], +"struct_cache_config.html#a906e9e3cebb56102ef80e04ae332b6b8":[1,0,2,0], +"struct_database_config.html":[1,0,3], +"struct_database_config.html#a466fbc3aae51e96a09e18a610510ddda":[1,0,3,0], +"struct_group_config.html":[1,0,4], +"struct_group_config.html#a1961ea5cd382a8eb95ba35f8b0d30085":[1,0,4,0], +"struct_group_config.html#a4f11116931abc7703ea5d03f6496bce6":[1,0,4,1], +"struct_group_config.html#ab0a5a3b7ddd836ed4fb3708518ccaff4":[1,0,4,3], +"struct_group_config.html#ae612e29e9519757dd70db5b75484e666":[1,0,4,2], +"struct_kafka_config.html":[1,0,6], +"struct_kafka_config.html#a2348a03b02fe3fd8603b36d0668a466d":[1,0,6,3], +"struct_kafka_config.html#a28fc38d804239de7371366e113fe82ea":[1,0,6,4], +"struct_kafka_config.html#a44989757e6df2b612ba641b15444030a":[1,0,6,5], +"struct_kafka_config.html#ab1be7681f0d61eb354db018745e25c1f":[1,0,6,6], +"struct_kafka_config_1_1_consumer.html":[1,0,6,2], +"struct_kafka_config_1_1_consumer.html#a038ca3598f8aca14524c11bc9e1c6730":[1,0,6,2,2], +"struct_kafka_config_1_1_consumer.html#aefe2c1f841e4badd0b345ca5fd309c6f":[1,0,6,2,0], +"struct_kafka_config_1_1_consumer.html#afd3d5f25ef1e08466f864f70cd4170da":[1,0,6,2,1], +"struct_kafka_config_1_1_producer.html":[1,0,6,1], +"struct_kafka_config_1_1_producer.html#a11c8f76401938e0d921885ac4b721044":[1,0,6,1,1], +"struct_kafka_config_1_1_producer.html#a2fe3aa9fe31856c6b64ff8b2f3c0b361":[1,0,6,1,0], +"struct_kafka_config_1_1_producer.html#ad949a76f16ffbbd833c093bf6832277c":[1,0,6,1,3], +"struct_kafka_config_1_1_producer.html#af52d43fd37e83b1fb83ff88832932025":[1,0,6,1,2], +"struct_kafka_config_1_1_topics.html":[1,0,6,0], +"struct_kafka_config_1_1_topics.html#a1f236a7912500d4677004e28fa94e8b7":[1,0,6,0,2], +"struct_kafka_config_1_1_topics.html#a3512bb9c634bc7bb91b8adac920696d2":[1,0,6,0,1], +"struct_kafka_config_1_1_topics.html#a58392568ff76c07a0d3b70d420089040":[1,0,6,0,0], +"struct_order_data.html":[1,0,11], +"struct_order_data.html#a2bea392e91c64cbc0a6c1cc3292463d6":[1,0,11,6], +"struct_order_data.html#a4afa71012f565dd0bbf3de66eac82b96":[1,0,11,4], +"struct_order_data.html#a6b2ffaadbab3d340ac169f36ed9235af":[1,0,11,3], +"struct_order_data.html#aaa1adf7d56f4e3e3593b93dd29345740":[1,0,11,1], +"struct_order_data.html#adb304d757a97f88a8b0a9e33339ca2f9":[1,0,11,0], +"struct_order_data.html#adf69c9e05d2636695d68e29b776cf73f":[1,0,11,5], +"struct_order_data.html#ae0a6f5fff047998c68e3621a5a163177":[1,0,11,2], +"struct_order_item.html":[1,0,12], +"struct_order_item.html#a223b2394a34be9c984b29c23b6264801":[1,0,12,0], +"struct_order_item.html#a7379b21ebe1ecdd8f16f086074a735bb":[1,0,12,3], +"struct_order_item.html#a83b4d1091409217be7f2b35e38229e26":[1,0,12,1], +"struct_order_item.html#aa127c157e2449c02c68948fde169dd55":[1,0,12,2], +"struct_processing_config.html":[1,0,14], +"struct_processing_config.html#a3f7997e36b3bf9e253ad887ae7c1c8d5":[1,0,14,3], +"struct_processing_config.html#a5fbabda8fc7ddf93b0997b3228a147df":[1,0,14,1], +"struct_processing_config.html#ad5e444469cadb6aa3f141fed824fc2fb":[1,0,14,2], +"struct_processing_config.html#adefd52f2a2e86fd9110b6a76110eb382":[1,0,14,0], +"structdatabase_1_1_client.html":[0,0,0,1], +"structdatabase_1_1_client.html":[1,0,0,1], +"structdatabase_1_1_client.html#a2832335fbe78cdd62a9ecc4c91c57880":[0,0,0,1,1], +"structdatabase_1_1_client.html#a2832335fbe78cdd62a9ecc4c91c57880":[1,0,0,1,1], +"structdatabase_1_1_client.html#a59c09de0aaf09eacd58d9e03cac42d65":[0,0,0,1,0], +"structdatabase_1_1_client.html#a59c09de0aaf09eacd58d9e03cac42d65":[1,0,0,1,0], +"structdatabase_1_1_client.html#a9a61216ce80e3281eaef7cdd8657ec95":[0,0,0,1,4], +"structdatabase_1_1_client.html#a9a61216ce80e3281eaef7cdd8657ec95":[1,0,0,1,4], +"structdatabase_1_1_client.html#ad0fe81a6ecf278fe23d280e96cc308c7":[0,0,0,1,3], +"structdatabase_1_1_client.html#ad0fe81a6ecf278fe23d280e96cc308c7":[1,0,0,1,3], +"structdatabase_1_1_client.html#af5fd482be6f1c6ac9af6a60d4fbbffe5":[0,0,0,1,2], +"structdatabase_1_1_client.html#af5fd482be6f1c6ac9af6a60d4fbbffe5":[1,0,0,1,2], +"structdatabase_1_1_connection_params.html":[0,0,0,0], +"structdatabase_1_1_connection_params.html":[1,0,0,0], +"structdatabase_1_1_connection_params.html#a190de2967f826558a7ad5a9fdbc8f5de":[0,0,0,0,1], +"structdatabase_1_1_connection_params.html#a190de2967f826558a7ad5a9fdbc8f5de":[1,0,0,0,1], +"structdatabase_1_1_connection_params.html#a47cebdaa3263697a49a810e32126ddcb":[0,0,0,0,4], +"structdatabase_1_1_connection_params.html#a47cebdaa3263697a49a810e32126ddcb":[1,0,0,0,4], +"structdatabase_1_1_connection_params.html#a5a1b946ed57e96a6e623e508479070e2":[0,0,0,0,5], +"structdatabase_1_1_connection_params.html#a5a1b946ed57e96a6e623e508479070e2":[1,0,0,0,5], +"structdatabase_1_1_connection_params.html#aac294a88bf4a434b9f7af573a9eac43d":[0,0,0,0,2], +"structdatabase_1_1_connection_params.html#aac294a88bf4a434b9f7af573a9eac43d":[1,0,0,0,2], +"structdatabase_1_1_connection_params.html#ac5df7de1f780cee25408e4d5c310b0d1":[0,0,0,0,3], +"structdatabase_1_1_connection_params.html#ac5df7de1f780cee25408e4d5c310b0d1":[1,0,0,0,3], +"structdatabase_1_1_connection_params.html#adf642f06affe1750bd495f50fee2241d":[0,0,0,0,0], +"structdatabase_1_1_connection_params.html#adf642f06affe1750bd495f50fee2241d":[1,0,0,0,0], +"structdatabase_1_1_order_item.html":[0,0,0,3], +"structdatabase_1_1_order_item.html":[1,0,0,3], +"structdatabase_1_1_order_item.html#a0ee59553b20ae7d4ee663938e1d46500":[0,0,0,3,2], +"structdatabase_1_1_order_item.html#a0ee59553b20ae7d4ee663938e1d46500":[1,0,0,3,2], +"structdatabase_1_1_order_item.html#a8d8598ac204f2c3dccc257042ab282d0":[0,0,0,3,3], +"structdatabase_1_1_order_item.html#a8d8598ac204f2c3dccc257042ab282d0":[1,0,0,3,3], +"structdatabase_1_1_order_item.html#ad66ee06cad1bfdc160fe922b89defac0":[0,0,0,3,1], +"structdatabase_1_1_order_item.html#ad66ee06cad1bfdc160fe922b89defac0":[1,0,0,3,1], +"structdatabase_1_1_order_item.html#afe42d8211d06bdba512bb3f49d6c1c6a":[0,0,0,3,0], +"structdatabase_1_1_order_item.html#afe42d8211d06bdba512bb3f49d6c1c6a":[1,0,0,3,0], +"structdatabase_1_1_product.html":[0,0,0,2], +"structdatabase_1_1_product.html":[1,0,0,2], +"structdatabase_1_1_product.html#a537c128b62c8ef01b1561d01cb7bb06b":[0,0,0,2,2], +"structdatabase_1_1_product.html#a537c128b62c8ef01b1561d01cb7bb06b":[1,0,0,2,2], +"structdatabase_1_1_product.html#a55f1bef2aac730c71a64e19daafeb12a":[0,0,0,2,1], +"structdatabase_1_1_product.html#a55f1bef2aac730c71a64e19daafeb12a":[1,0,0,2,1], +"structdatabase_1_1_product.html#a996eaac83fc96ed18f8638b3e3b7f627":[0,0,0,2,4], +"structdatabase_1_1_product.html#a996eaac83fc96ed18f8638b3e3b7f627":[1,0,0,2,4], +"structdatabase_1_1_product.html#acf8cf48c48ddc009d50b32934b24b6c8":[0,0,0,2,3], +"structdatabase_1_1_product.html#acf8cf48c48ddc009d50b32934b24b6c8":[1,0,0,2,3], +"structdatabase_1_1_product.html#af8dc8d1177ca8b6768561dd109a3d6d3":[0,0,0,2,0], +"structdatabase_1_1_product.html#af8dc8d1177ca8b6768561dd109a3d6d3":[1,0,0,2,0], +"uuid_8hpp.html":[2,0,0,6,1], +"uuid_8hpp_source.html":[2,0,0,6,1] +}; diff --git a/docs/html/order__processor_8cpp.html b/docs/html/order__processor_8cpp.html new file mode 100644 index 000000000..cee5498d7 --- /dev/null +++ b/docs/html/order__processor_8cpp.html @@ -0,0 +1,225 @@ + + + + + + + +Kafka-1C Connector: Файл src/processor/order_processor.cpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Файл order_processor.cpp
+
+
+
#include "order_processor.hpp"
+#include "../utils/logger.hpp"
+#include "../utils/uuid.hpp"
+#include <chrono>
+#include <ctime>
+#include <sstream>
+#include <nlohmann/json.hpp>
+
+Граф включаемых заголовочных файлов для order_processor.cpp:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

См. исходные тексты.

+
+
+ +
+ + + + diff --git a/docs/html/order__processor_8cpp__incl.dot b/docs/html/order__processor_8cpp__incl.dot new file mode 100644 index 000000000..cd8453e7c --- /dev/null +++ b/docs/html/order__processor_8cpp__incl.dot @@ -0,0 +1,76 @@ +digraph "src/processor/order_processor.cpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/processor/order\l_processor.cpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="order_processor.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$order__processor_8hpp.html",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="../database/postgresql.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$postgresql_8hpp.html",tooltip=" "]; + Node3 -> Node4 [id="edge3_Node000003_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="pqxx/pqxx",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node3 -> Node5 [id="edge4_Node000003_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="string",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node3 -> Node6 [id="edge5_Node000003_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="memory",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node3 -> Node7 [id="edge6_Node000003_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="optional",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node3 -> Node8 [id="edge7_Node000003_Node000008",color="steelblue1",style="solid",tooltip=" "]; + Node8 [id="Node000008",label="vector",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node9 [id="edge8_Node000002_Node000009",color="steelblue1",style="solid",tooltip=" "]; + Node9 [id="Node000009",label="../parser/json_parser.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$json__parser_8hpp.html",tooltip=" "]; + Node9 -> Node5 [id="edge9_Node000009_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node9 -> Node8 [id="edge10_Node000009_Node000008",color="steelblue1",style="solid",tooltip=" "]; + Node9 -> Node10 [id="edge11_Node000009_Node000010",color="steelblue1",style="solid",tooltip=" "]; + Node10 [id="Node000010",label="nlohmann/json.hpp",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node11 [id="edge12_Node000002_Node000011",color="steelblue1",style="solid",tooltip=" "]; + Node11 [id="Node000011",label="../cache/sqlite_cache.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$sqlite__cache_8hpp.html",tooltip=" "]; + Node11 -> Node12 [id="edge13_Node000011_Node000012",color="steelblue1",style="solid",tooltip=" "]; + Node12 [id="Node000012",label="sqlite3.h",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node11 -> Node5 [id="edge14_Node000011_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node11 -> Node8 [id="edge15_Node000011_Node000008",color="steelblue1",style="solid",tooltip=" "]; + Node11 -> Node13 [id="edge16_Node000011_Node000013",color="steelblue1",style="solid",tooltip=" "]; + Node13 [id="Node000013",label="tuple",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node11 -> Node14 [id="edge17_Node000011_Node000014",color="steelblue1",style="solid",tooltip=" "]; + Node14 [id="Node000014",label="mutex",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node11 -> Node15 [id="edge18_Node000011_Node000015",color="steelblue1",style="solid",tooltip=" "]; + Node15 [id="Node000015",label="functional",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node16 [id="edge19_Node000002_Node000016",color="steelblue1",style="solid",tooltip=" "]; + Node16 [id="Node000016",label="../kafka/producer.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$producer_8hpp.html",tooltip=" "]; + Node16 -> Node17 [id="edge20_Node000016_Node000017",color="steelblue1",style="solid",tooltip=" "]; + Node17 [id="Node000017",label="librdkafka/rdkafkacpp.h",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node16 -> Node5 [id="edge21_Node000016_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node16 -> Node6 [id="edge22_Node000016_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node16 -> Node15 [id="edge23_Node000016_Node000015",color="steelblue1",style="solid",tooltip=" "]; + Node16 -> Node18 [id="edge24_Node000016_Node000018",color="steelblue1",style="solid",tooltip=" "]; + Node18 [id="Node000018",label="atomic",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node5 [id="edge25_Node000002_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node2 -> Node7 [id="edge26_Node000002_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node2 -> Node8 [id="edge27_Node000002_Node000008",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node19 [id="edge28_Node000001_Node000019",color="steelblue1",style="solid",tooltip=" "]; + Node19 [id="Node000019",label="../utils/logger.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$logger_8hpp.html",tooltip=" "]; + Node19 -> Node5 [id="edge29_Node000019_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node19 -> Node20 [id="edge30_Node000019_Node000020",color="steelblue1",style="solid",tooltip=" "]; + Node20 [id="Node000020",label="iostream",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node19 -> Node21 [id="edge31_Node000019_Node000021",color="steelblue1",style="solid",tooltip=" "]; + Node21 [id="Node000021",label="chrono",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node19 -> Node22 [id="edge32_Node000019_Node000022",color="steelblue1",style="solid",tooltip=" "]; + Node22 [id="Node000022",label="iomanip",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node19 -> Node23 [id="edge33_Node000019_Node000023",color="steelblue1",style="solid",tooltip=" "]; + Node23 [id="Node000023",label="sstream",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node19 -> Node14 [id="edge34_Node000019_Node000014",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node24 [id="edge35_Node000001_Node000024",color="steelblue1",style="solid",tooltip=" "]; + Node24 [id="Node000024",label="../utils/uuid.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$uuid_8hpp.html",tooltip=" "]; + Node24 -> Node5 [id="edge36_Node000024_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node24 -> Node25 [id="edge37_Node000024_Node000025",color="steelblue1",style="solid",tooltip=" "]; + Node25 [id="Node000025",label="random",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node24 -> Node23 [id="edge38_Node000024_Node000023",color="steelblue1",style="solid",tooltip=" "]; + Node24 -> Node22 [id="edge39_Node000024_Node000022",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node21 [id="edge40_Node000001_Node000021",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node26 [id="edge41_Node000001_Node000026",color="steelblue1",style="solid",tooltip=" "]; + Node26 [id="Node000026",label="ctime",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node23 [id="edge42_Node000001_Node000023",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node10 [id="edge43_Node000001_Node000010",color="steelblue1",style="solid",tooltip=" "]; +} diff --git a/docs/html/order__processor_8cpp__incl.map b/docs/html/order__processor_8cpp__incl.map new file mode 100644 index 000000000..0f84c360a --- /dev/null +++ b/docs/html/order__processor_8cpp__incl.map @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/order__processor_8cpp__incl.md5 b/docs/html/order__processor_8cpp__incl.md5 new file mode 100644 index 000000000..141641e64 --- /dev/null +++ b/docs/html/order__processor_8cpp__incl.md5 @@ -0,0 +1 @@ +43f0cff574e25d9da657515bb5b77fc1 \ No newline at end of file diff --git a/docs/html/order__processor_8cpp__incl.png b/docs/html/order__processor_8cpp__incl.png new file mode 100644 index 000000000..0491107da Binary files /dev/null and b/docs/html/order__processor_8cpp__incl.png differ diff --git a/docs/html/order__processor_8cpp_source.html b/docs/html/order__processor_8cpp_source.html new file mode 100644 index 000000000..627f720e1 --- /dev/null +++ b/docs/html/order__processor_8cpp_source.html @@ -0,0 +1,510 @@ + + + + + + + +Kafka-1C Connector: Исходный файл src/processor/order_processor.cpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
order_processor.cpp
+
+
+См. документацию.
1#include "order_processor.hpp"
+
2#include "../utils/logger.hpp"
+
3#include "../utils/uuid.hpp"
+
4#include <chrono>
+
5#include <ctime>
+
6#include <sstream>
+
7#include <nlohmann/json.hpp>
+
8
+
9// ============================================================
+
10// Конструктор
+
11// ============================================================
+
+ +
13 MessageCache &cache,
+
14 KafkaProducer &error_producer)
+
15 : db_(db), cache_(cache), error_producer_(error_producer) {}
+
+
16
+
17// ============================================================
+
18// Получение Linux времени (миллисекунды с 1970)
+
19// ============================================================
+
20long long OrderProcessor::getLinuxTime()
+
21{
+
22 auto now = std::chrono::system_clock::now();
+
23 auto duration = now.time_since_epoch();
+
24 return std::chrono::duration_cast<std::chrono::milliseconds>(duration).count();
+
25}
+
26
+
27// ============================================================
+
28// Отправка ошибки в топик orders.errors
+
29// ============================================================
+
30void OrderProcessor::sendError(const std::string &error_type,
+
31 const std::string &description,
+
32 const std::string &original_message)
+
33{
+
34 try
+
35 {
+
36 std::string uuid = utils::generateUUID(); // Генерация UUID
+
37 std::string key = error_type + " " + uuid;
+
38
+
39 nlohmann::json error_json; // Формирование JSON
+
40 error_json["error_type"] = error_type;
+
41 error_json["uuid"] = uuid;
+
42 error_json["timestamp"] = getLinuxTime();
+
43 error_json["description"] = description;
+
44 if (!original_message.empty())
+
45 {
+
46 error_json["original_message"] = original_message;
+
47 }
+
48
+
49 std::string error_str = error_json.dump();
+
50
+
51 if (error_producer_.send(key, error_str)) // Отправка в Kafka
+
52 {
+
53 Logger::debug("Error sent to Kafka: " + key);
+
54 }
+
55 else
+
56 {
+
57 Logger::error("Failed to send error to Kafka: " + key);
+
58 }
+
59 }
+
60 catch (const std::exception &e)
+
61 {
+
62 Logger::error("sendError failed: " + std::string(e.what()));
+
63 }
+
64}
+
65
+
66bool OrderProcessor::isOrderAlreadyProcessed(const std::string &key)
+
67{
+
68 // Проверяем в SQLite, есть ли уже обработанное сообщение с таким ключом
+
69 auto pending = cache_.getPendingMessages(1000);
+
70 for (const auto &[id, topic, message, filename] : pending)
+
71 {
+
72 // Проверяем, содержит ли сообщение этот ключ
+
73 if (message.find(key) != std::string::npos)
+
74 {
+
75 // Нашли сообщение с таким ключом - значит уже обрабатывали
+
76 Logger::warning("Order already in cache: " + key);
+
77 return true;
+
78 }
+
79 }
+
80
+
81 // Также можно проверить в PostgreSQL (по номеру заказа и ИНН)
+
82 // Но это отдельный запрос, который может замедлить работу
+
83
+
84 return false;
+
85}
+
86
+
87// ============================================================
+
88// Обработка одного сообщения из Kafka
+
89// ============================================================
+
+
90bool OrderProcessor::processMessage(const std::string &key,
+
91 const std::string &value,
+
92 int64_t timestamp)
+
93{
+
94 Logger::debug("Processing message: " + key);
+
95
+
96 try
+
97 {
+
98 // 1. Проверяем не обработан ли уже заказ
+
99 if (isOrderAlreadyProcessed(key))
+
100 {
+
101 Logger::warning("Order already processed, skipping: " + key);
+
102 return true; // Возвращаем true, чтобы не считать ошибкой
+
103 }
+
104
+
105 // 2. Проверяем, что это JSON
+
106 if (value.empty() || (value[0] != '{' && value[0] != '['))
+
107 {
+
108 std::string error_msg = "Message is not valid JSON: " + value.substr(0, 100);
+
109 Logger::warning(error_msg);
+
110 sendError("Kafka read error", error_msg, value);
+
111 return false;
+
112 }
+
113
+
114 // 3. Парсим JSON
+
115 OrderData order = OrderData::fromJson(value);
+
116 if (!JsonParser::validate(order))
+
117 {
+
118 std::string error_msg = "Invalid order structure: missing TIN, TRRC or goods";
+
119 Logger::error(error_msg);
+
120 sendError("Kafka read error", error_msg, value);
+
121 return false;
+
122 }
+
123
+
124 // 4. Сохраняем в SQLite кэш (на случай сбоя БД)
+
125 std::string cache_key = "order_" + order.tin + "_" + order.number;
+
126 std::string source_type = "consumer";
+
127 if (!cache_.save(cache_key, "processing", value, order.tin, order.trrc, source_type))
+
128 {
+
129 Logger::warning("Failed to save to cache, continuing...");
+
130 }
+
131
+
132 // 5. Логируем в регистр сведений
+
133 logToRegister(order, value);
+
134
+
135 // 6. Обрабатываем контрагента
+
136 auto client_id = processClient(order);
+
137 if (!client_id)
+
138 {
+
139 std::string error_msg = "Client not found and could not be created: TIN=" + order.tin;
+
140 Logger::error(error_msg);
+
141 sendError("PostgreSQL write error", error_msg, value);
+
142 return false;
+
143 }
+
144
+
145 // 7. Обрабатываем товары
+
146 auto items = processProducts(order);
+
147 if (items.empty())
+
148 {
+
149 std::string error_msg = "No valid products found in order";
+
150 Logger::error(error_msg);
+
151 sendError("PostgreSQL write error", error_msg, value);
+
152 return false;
+
153 }
+
154
+
155 // 8. Создаем заказ
+
156 if (!createOrder(order, *client_id, items))
+
157 {
+
158 std::string error_msg = "Failed to create order in PostgreSQL";
+
159 Logger::error(error_msg);
+
160 sendError("PostgreSQL write error", error_msg, value);
+
161 return false;
+
162 }
+
163
+
164 Logger::info("Order processed successfully: " + order.number);
+
165 return true;
+
166 }
+
167 catch (const std::exception &e)
+
168 {
+
169 std::string error_msg = "Exception: " + std::string(e.what());
+
170 Logger::error("processMessage error: " + error_msg);
+
171 sendError("Kafka read error", error_msg, value);
+
172 return false;
+
173 }
+
174}
+
+
175
+
176// ============================================================
+
177// Повторная обработка сообщений из кэша
+
178// ============================================================
+
+ +
180{
+
181 auto pending = cache_.getPendingMessages(1000); // Получение pending
+
182 if (pending.empty())
+
183 {
+
184 Logger::info("No pending messages to reprocess");
+
185 return;
+
186 }
+
187
+
188 Logger::info("Found " + std::to_string(pending.size()) + " pending messages to reprocess");
+
189
+
190 for (const auto &[id, topic, message, filename] : pending) // Цикл по pending
+
191 {
+
192 Logger::info("Reprocessing: " + filename);
+
193
+
194 try
+
195 {
+
196 OrderData order = OrderData::fromJson(message); // Парсинг
+
197 if (!JsonParser::validate(order))
+
198 {
+
199 Logger::error("Invalid cached order: " + filename);
+
200 cache_.markError(id, "Invalid JSON in cache");
+
201 sendError("PostgreSQL write error", "Invalid cached order: " + filename, message);
+
202 continue;
+
203 }
+
204
+
205 logToRegister(order, message);
+
206
+
207 auto client_id = processClient(order);
+
208 if (!client_id)
+
209 {
+
210 Logger::error("Failed to reprocess client: " + order.tin);
+
211 cache_.markError(id, "Client not found");
+
212 sendError("PostgreSQL write error", "Client not found: TIN=" + order.tin, message);
+
213 continue;
+
214 }
+
215
+
216 auto items = processProducts(order);
+
217 if (items.empty())
+
218 {
+
219 Logger::error("No valid products in cached order: " + filename);
+
220 cache_.markError(id, "No products found");
+
221 sendError("PostgreSQL write error", "No products found in order", message);
+
222 continue;
+
223 }
+
224
+
225 if (!createOrder(order, *client_id, items))
+
226 {
+
227 Logger::error("Failed to reprocess order: " + filename);
+
228 cache_.markError(id, "Order creation failed");
+
229 sendError("PostgreSQL write error", "Order creation failed", message);
+
230 continue;
+
231 }
+
232
+
233 cache_.markSent(id); // Обновление статуса
+
234 Logger::info("Reprocessed successfully: " + filename);
+
235 }
+
236 catch (const std::exception &e)
+
237 {
+
238 Logger::error("Reprocess error: " + std::string(e.what()));
+
239 cache_.markError(id, e.what());
+
240 sendError("PostgreSQL write error", "Reprocess error: " + std::string(e.what()), message);
+
241 }
+
242 }
+
243}
+
+
244
+
245// ============================================================
+
246// Обработка контрагента (поиск или создание)
+
247// ============================================================
+
248std::optional<std::string> OrderProcessor::processClient(const OrderData &order)
+
249{
+
250 Logger::info("processClient: TIN=" + order.tin + ", TRRC=" + order.trrc);
+
251
+
252 auto client = db_.findClient(order.tin, order.trrc);
+
253
+
254 if (client)
+
255 {
+
256 Logger::info("Client found: " + client->id);
+
257 return client->id;
+
258 }
+
259
+
260 // ★ НЕ НАЙДЕН - СОЗДАЕМ ★
+
261 Logger::info("Client NOT found, creating new client...");
+
262 std::string name = order.contractor.empty() ? "Контрагент " + order.tin : order.contractor;
+
263 std::string client_id = db_.createClient(order.tin, order.trrc, name);
+
264
+
265 if (client_id.empty())
+
266 {
+
267 Logger::error("Failed to create client: " + order.tin);
+
268 return std::nullopt;
+
269 }
+
270
+
271 Logger::info("Client created: " + client_id);
+
272 return client_id;
+
273}
+
274
+
275// ============================================================
+
276// Обработка товаров (поиск по артикулам)
+
277// ============================================================
+
278std::vector<database::OrderItem> OrderProcessor::processProducts(const OrderData &order)
+
279{
+
280 std::vector<database::OrderItem> items;
+
281
+
282 for (const auto &item : order.goods) // Цикл по товарам
+
283 {
+
284 auto product = db_.findProductByArticle(item.sku);
+
285
+
286 if (!product) // Товар не найден
+
287 {
+
288 Logger::warning("Product not found: " + item.sku);
+
289 continue;
+
290 }
+
291
+
292 database::OrderItem db_item;
+
293 db_item.product_id = product->id;
+
294 db_item.quantity = item.quantity;
+
295 db_item.price = item.price;
+
296 db_item.sum = item.sum;
+
297
+
298 items.push_back(db_item); // Добавление товара
+
299 Logger::debug("Product added: " + item.sku + " (x" + std::to_string(item.quantity) + ")");
+
300 }
+
301
+
302 return items;
+
303}
+
304
+
305// ============================================================
+
306// Создание заказа
+
307// ============================================================
+
308bool OrderProcessor::createOrder(const OrderData &order,
+
309 const std::string &client_id,
+
310 const std::vector<database::OrderItem> &items)
+
311{
+
312 if (items.empty()) // Проверка товаров
+
313 {
+
314 Logger::error("Cannot create order with empty items");
+
315 return false;
+
316 }
+
317
+
318 std::string order_number = order.number;
+
319 if (order_number.empty())
+
320 {
+
321 auto now = std::chrono::system_clock::now();
+
322 auto time_t = std::chrono::system_clock::to_time_t(now);
+
323 order_number = "AUTO-" + std::to_string(time_t); // Генерация номера
+
324 }
+
325
+
326 std::string order_id = db_.createOrder( // Создание в БД
+
327 client_id,
+
328 order.date,
+
329 order_number,
+
330 items);
+
331
+
332 return !order_id.empty();
+
333}
+
334
+
335// ============================================================
+
336// Логирование в регистр сведений
+
337// ============================================================
+
338void OrderProcessor::logToRegister(const OrderData &order, const std::string &json_str)
+
339{
+
340 long long linux_time = getLinuxTime();
+
341 db_.logKafkaMessage(linux_time, order.tin, order.trrc, json_str);
+
342 Logger::debug("Logged to register: " + order.tin);
+
343}
+
static bool validate(const OrderData &order)
+
Определения producer.hpp:9
+
static void info(const std::string &message)
Определения logger.hpp:25
+
static void warning(const std::string &message)
Определения logger.hpp:29
+
static void error(const std::string &message)
Определения logger.hpp:33
+
static void debug(const std::string &message)
Определения logger.hpp:37
+
Определения sqlite_cache.hpp:15
+
bool processMessage(const std::string &key, const std::string &value, int64_t timestamp)
Определения order_processor.cpp:90
+
OrderProcessor(database::PostgreSQL &db, MessageCache &cache, KafkaProducer &error_producer)
Определения order_processor.cpp:12
+
void reprocessPendingMessages()
Определения order_processor.cpp:179
+ +
std::optional< Client > findClient(const std::string &inn, const std::string &kpp="")
Определения postgresql.cpp:307
+ +
std::string generateUUID()
Генерирует UUID версии 4 (случайный).
Определения uuid.hpp:14
+ +
Определения json_parser.hpp:24
+
std::string trrc
Определения json_parser.hpp:26
+
static OrderData fromJson(const std::string &json_str)
+
std::string number
Определения json_parser.hpp:29
+
std::vector< OrderItem > goods
Определения json_parser.hpp:30
+
std::string contractor
Определения json_parser.hpp:27
+
std::string tin
Определения json_parser.hpp:25
+
std::string date
Определения json_parser.hpp:28
+
double quantity
Определения postgresql.hpp:55
+
double sum
Определения postgresql.hpp:57
+
std::string product_id
Определения postgresql.hpp:54
+
double price
Определения postgresql.hpp:56
+ +
+
+
+ + + + diff --git a/docs/html/order__processor_8hpp.html b/docs/html/order__processor_8hpp.html new file mode 100644 index 000000000..49c0cee01 --- /dev/null +++ b/docs/html/order__processor_8hpp.html @@ -0,0 +1,216 @@ + + + + + + + +Kafka-1C Connector: Файл src/processor/order_processor.hpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Файл order_processor.hpp
+
+
+
#include "../database/postgresql.hpp"
+#include "../parser/json_parser.hpp"
+#include "../cache/sqlite_cache.hpp"
+#include "../kafka/producer.hpp"
+#include <string>
+#include <optional>
+#include <vector>
+
+Граф включаемых заголовочных файлов для order_processor.hpp:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+Граф файлов, в которые включается этот файл:
+
+
+ + + + + + + +
+
+

См. исходные тексты.

+ + + +

+Классы

class  OrderProcessor
+
+
+ +
+ + + + diff --git a/docs/html/order__processor_8hpp.js b/docs/html/order__processor_8hpp.js new file mode 100644 index 000000000..4d93544e1 --- /dev/null +++ b/docs/html/order__processor_8hpp.js @@ -0,0 +1,4 @@ +var order__processor_8hpp = +[ + [ "OrderProcessor", "class_order_processor.html", "class_order_processor" ] +]; \ No newline at end of file diff --git a/docs/html/order__processor_8hpp__dep__incl.dot b/docs/html/order__processor_8hpp__dep__incl.dot new file mode 100644 index 000000000..ff0e9e890 --- /dev/null +++ b/docs/html/order__processor_8hpp__dep__incl.dot @@ -0,0 +1,12 @@ +digraph "src/processor/order_processor.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/processor/order\l_processor.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="src/main.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="src/processor/order\l_processor.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$order__processor_8cpp.html",tooltip=" "]; +} diff --git a/docs/html/order__processor_8hpp__dep__incl.map b/docs/html/order__processor_8hpp__dep__incl.map new file mode 100644 index 000000000..502380543 --- /dev/null +++ b/docs/html/order__processor_8hpp__dep__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/order__processor_8hpp__dep__incl.md5 b/docs/html/order__processor_8hpp__dep__incl.md5 new file mode 100644 index 000000000..362dd2376 --- /dev/null +++ b/docs/html/order__processor_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +cf1f05899372077fc93cd50e527bdc11 \ No newline at end of file diff --git a/docs/html/order__processor_8hpp__dep__incl.png b/docs/html/order__processor_8hpp__dep__incl.png new file mode 100644 index 000000000..1c55c46a5 Binary files /dev/null and b/docs/html/order__processor_8hpp__dep__incl.png differ diff --git a/docs/html/order__processor_8hpp__incl.dot b/docs/html/order__processor_8hpp__incl.dot new file mode 100644 index 000000000..a9e0004c7 --- /dev/null +++ b/docs/html/order__processor_8hpp__incl.dot @@ -0,0 +1,50 @@ +digraph "src/processor/order_processor.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/processor/order\l_processor.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="../database/postgresql.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$postgresql_8hpp.html",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="pqxx/pqxx",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node4 [id="edge3_Node000002_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="string",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node5 [id="edge4_Node000002_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="memory",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node6 [id="edge5_Node000002_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="optional",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node7 [id="edge6_Node000002_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="vector",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node8 [id="edge7_Node000001_Node000008",color="steelblue1",style="solid",tooltip=" "]; + Node8 [id="Node000008",label="../parser/json_parser.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$json__parser_8hpp.html",tooltip=" "]; + Node8 -> Node4 [id="edge8_Node000008_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node8 -> Node7 [id="edge9_Node000008_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node8 -> Node9 [id="edge10_Node000008_Node000009",color="steelblue1",style="solid",tooltip=" "]; + Node9 [id="Node000009",label="nlohmann/json.hpp",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node10 [id="edge11_Node000001_Node000010",color="steelblue1",style="solid",tooltip=" "]; + Node10 [id="Node000010",label="../cache/sqlite_cache.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$sqlite__cache_8hpp.html",tooltip=" "]; + Node10 -> Node11 [id="edge12_Node000010_Node000011",color="steelblue1",style="solid",tooltip=" "]; + Node11 [id="Node000011",label="sqlite3.h",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node10 -> Node4 [id="edge13_Node000010_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node10 -> Node7 [id="edge14_Node000010_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node10 -> Node12 [id="edge15_Node000010_Node000012",color="steelblue1",style="solid",tooltip=" "]; + Node12 [id="Node000012",label="tuple",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node10 -> Node13 [id="edge16_Node000010_Node000013",color="steelblue1",style="solid",tooltip=" "]; + Node13 [id="Node000013",label="mutex",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node10 -> Node14 [id="edge17_Node000010_Node000014",color="steelblue1",style="solid",tooltip=" "]; + Node14 [id="Node000014",label="functional",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node15 [id="edge18_Node000001_Node000015",color="steelblue1",style="solid",tooltip=" "]; + Node15 [id="Node000015",label="../kafka/producer.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$producer_8hpp.html",tooltip=" "]; + Node15 -> Node16 [id="edge19_Node000015_Node000016",color="steelblue1",style="solid",tooltip=" "]; + Node16 [id="Node000016",label="librdkafka/rdkafkacpp.h",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node15 -> Node4 [id="edge20_Node000015_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node15 -> Node5 [id="edge21_Node000015_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node15 -> Node14 [id="edge22_Node000015_Node000014",color="steelblue1",style="solid",tooltip=" "]; + Node15 -> Node17 [id="edge23_Node000015_Node000017",color="steelblue1",style="solid",tooltip=" "]; + Node17 [id="Node000017",label="atomic",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node4 [id="edge24_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node6 [id="edge25_Node000001_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node7 [id="edge26_Node000001_Node000007",color="steelblue1",style="solid",tooltip=" "]; +} diff --git a/docs/html/order__processor_8hpp__incl.map b/docs/html/order__processor_8hpp__incl.map new file mode 100644 index 000000000..9c7b3b045 --- /dev/null +++ b/docs/html/order__processor_8hpp__incl.map @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/order__processor_8hpp__incl.md5 b/docs/html/order__processor_8hpp__incl.md5 new file mode 100644 index 000000000..8b4c882a7 --- /dev/null +++ b/docs/html/order__processor_8hpp__incl.md5 @@ -0,0 +1 @@ +b32f445ea35d18416dd18588c7662623 \ No newline at end of file diff --git a/docs/html/order__processor_8hpp__incl.png b/docs/html/order__processor_8hpp__incl.png new file mode 100644 index 000000000..d7bf4a86a Binary files /dev/null and b/docs/html/order__processor_8hpp__incl.png differ diff --git a/docs/html/order__processor_8hpp_source.html b/docs/html/order__processor_8hpp_source.html new file mode 100644 index 000000000..29bc892ae --- /dev/null +++ b/docs/html/order__processor_8hpp_source.html @@ -0,0 +1,183 @@ + + + + + + + +Kafka-1C Connector: Исходный файл src/processor/order_processor.hpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
order_processor.hpp
+
+
+См. документацию.
1#pragma once
+
2
+ + + + +
7#include <string>
+
8#include <optional>
+
9#include <vector>
+
10
+
+ +
12{
+
13public:
+ +
15
+
16 // Обработка одного сообщения из Kafka
+
17 bool processMessage(const std::string &key, const std::string &value, int64_t timestamp);
+
18
+
19 // Повторная обработка сообщений из кэша
+ +
21
+
22private:
+ +
24 MessageCache &cache_;
+
25 KafkaProducer &error_producer_;
+
26
+
27 // Отправка ошибки в топик orders.errors
+
28 void sendError(const std::string &error_type, const std::string &description, const std::string &original_message = "");
+
29
+
30 long long getLinuxTime();
+
31 std::optional<std::string> processClient(const OrderData &order);
+
32 std::vector<database::OrderItem> processProducts(const OrderData &order);
+
33 bool createOrder(const OrderData &order, const std::string &client_id,
+
34 const std::vector<database::OrderItem> &items);
+
35 void logToRegister(const OrderData &order, const std::string &json_str);
+
36 bool isOrderAlreadyProcessed(const std::string &key);
+
37};
+
+
Определения producer.hpp:9
+
Определения sqlite_cache.hpp:15
+
bool processMessage(const std::string &key, const std::string &value, int64_t timestamp)
Определения order_processor.cpp:90
+
OrderProcessor(database::PostgreSQL &db, MessageCache &cache, KafkaProducer &error_producer)
Определения order_processor.cpp:12
+
void reprocessPendingMessages()
Определения order_processor.cpp:179
+ + + + + +
Определения json_parser.hpp:24
+
+
+
+ + + + diff --git a/docs/html/postgresql_8cpp.html b/docs/html/postgresql_8cpp.html new file mode 100644 index 000000000..270c07add --- /dev/null +++ b/docs/html/postgresql_8cpp.html @@ -0,0 +1,197 @@ + + + + + + + +Kafka-1C Connector: Файл src/database/postgresql.cpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Файл postgresql.cpp
+
+
+
#include "postgresql.hpp"
+#include "../utils/logger.hpp"
+#include <sstream>
+#include <iomanip>
+#include <chrono>
+#include <random>
+#include <ctime>
+#include <algorithm>
+
+Граф включаемых заголовочных файлов для postgresql.cpp:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

См. исходные тексты.

+ + + +

+Пространства имен

namespace  database
+
+
+ +
+ + + + diff --git a/docs/html/postgresql_8cpp__incl.dot b/docs/html/postgresql_8cpp__incl.dot new file mode 100644 index 000000000..cd870d1fd --- /dev/null +++ b/docs/html/postgresql_8cpp__incl.dot @@ -0,0 +1,42 @@ +digraph "src/database/postgresql.cpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/database/postgresql.cpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="postgresql.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$postgresql_8hpp.html",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="pqxx/pqxx",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node4 [id="edge3_Node000002_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="string",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node5 [id="edge4_Node000002_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="memory",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node6 [id="edge5_Node000002_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="optional",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node2 -> Node7 [id="edge6_Node000002_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="vector",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node8 [id="edge7_Node000001_Node000008",color="steelblue1",style="solid",tooltip=" "]; + Node8 [id="Node000008",label="../utils/logger.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$logger_8hpp.html",tooltip=" "]; + Node8 -> Node4 [id="edge8_Node000008_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node8 -> Node9 [id="edge9_Node000008_Node000009",color="steelblue1",style="solid",tooltip=" "]; + Node9 [id="Node000009",label="iostream",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node8 -> Node10 [id="edge10_Node000008_Node000010",color="steelblue1",style="solid",tooltip=" "]; + Node10 [id="Node000010",label="chrono",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node8 -> Node11 [id="edge11_Node000008_Node000011",color="steelblue1",style="solid",tooltip=" "]; + Node11 [id="Node000011",label="iomanip",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node8 -> Node12 [id="edge12_Node000008_Node000012",color="steelblue1",style="solid",tooltip=" "]; + Node12 [id="Node000012",label="sstream",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node8 -> Node13 [id="edge13_Node000008_Node000013",color="steelblue1",style="solid",tooltip=" "]; + Node13 [id="Node000013",label="mutex",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node12 [id="edge14_Node000001_Node000012",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node11 [id="edge15_Node000001_Node000011",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node10 [id="edge16_Node000001_Node000010",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node14 [id="edge17_Node000001_Node000014",color="steelblue1",style="solid",tooltip=" "]; + Node14 [id="Node000014",label="random",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node15 [id="edge18_Node000001_Node000015",color="steelblue1",style="solid",tooltip=" "]; + Node15 [id="Node000015",label="ctime",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node16 [id="edge19_Node000001_Node000016",color="steelblue1",style="solid",tooltip=" "]; + Node16 [id="Node000016",label="algorithm",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; +} diff --git a/docs/html/postgresql_8cpp__incl.map b/docs/html/postgresql_8cpp__incl.map new file mode 100644 index 000000000..07c392fd7 --- /dev/null +++ b/docs/html/postgresql_8cpp__incl.map @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/postgresql_8cpp__incl.md5 b/docs/html/postgresql_8cpp__incl.md5 new file mode 100644 index 000000000..9e58c1cb1 --- /dev/null +++ b/docs/html/postgresql_8cpp__incl.md5 @@ -0,0 +1 @@ +cb14428d75f2b4dd2a0c8f5db7d1f8c4 \ No newline at end of file diff --git a/docs/html/postgresql_8cpp__incl.png b/docs/html/postgresql_8cpp__incl.png new file mode 100644 index 000000000..74e3a5024 Binary files /dev/null and b/docs/html/postgresql_8cpp__incl.png differ diff --git a/docs/html/postgresql_8cpp_source.html b/docs/html/postgresql_8cpp_source.html new file mode 100644 index 000000000..1dea395bd --- /dev/null +++ b/docs/html/postgresql_8cpp_source.html @@ -0,0 +1,780 @@ + + + + + + + +Kafka-1C Connector: Исходный файл src/database/postgresql.cpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
postgresql.cpp
+
+
+См. документацию.
1#include "postgresql.hpp"
+
2#include "../utils/logger.hpp"
+
3#include <sstream>
+
4#include <iomanip>
+
5#include <chrono>
+
6#include <random>
+
7#include <ctime>
+
8#include <algorithm>
+
9
+
+
10namespace database
+
11{
+
12
+
13 // ============================================================
+
14 // Конструкторы / Деструктор
+
15 // ============================================================
+
16
+
+ +
18 : conn_(nullptr), connected_(false) {}
+
+
19
+
+ +
21 : params_(params), conn_(nullptr), connected_(false) {}
+
+
22
+
+ +
24 {
+
25 disconnect();
+
26 }
+
+
27
+
28 // ============================================================
+
29 // Подключение к БД
+
30 // ============================================================
+
31
+
+ +
33 {
+
34 try
+
35 {
+
36 if (params_.host.empty())
+
37 {
+
38 conn_ = std::make_unique<pqxx::connection>("");
+
39 }
+
40 else
+
41 {
+
42 conn_ = std::make_unique<pqxx::connection>(params_.connectionString());
+
43 }
+
44
+
45 if (!conn_->is_open())
+
46 {
+
47 Logger::error("Failed to connect to PostgreSQL");
+
48 return false;
+
49 }
+
50
+
51 // УСТАНАВЛИВАЕМ КОДИРОВКУ
+
52 {
+
53 pqxx::work txn(*conn_);
+
54
+
55 // Проверяем кодировку
+
56 pqxx::result res = txn.exec("SHOW client_encoding;");
+
57 std::string encoding = res[0][0].as<std::string>();
+
58 Logger::info("PostgreSQL client_encoding: " + encoding);
+
59
+
60 txn.exec("SET client_encoding = 'UTF8';");
+
61 txn.exec("SET standard_conforming_strings = on;");
+
62 txn.commit();
+
63 }
+
64
+
65 connected_ = true;
+
66 Logger::info("Connected to PostgreSQL");
+
67 return true;
+
68 }
+
69 catch (const std::exception &e)
+
70 {
+
71 Logger::error("PostgreSQL connection error: " + std::string(e.what()));
+
72 return false;
+
73 }
+
74 }
+
+
75
+
+ +
77 {
+
78 return connected_ && conn_ && conn_->is_open();
+
79 }
+
+
80
+
+ +
82 {
+
83 if (conn_ && conn_->is_open())
+
84 {
+
85 conn_->close();
+
86 }
+
87 conn_.reset();
+
88 connected_ = false;
+
89 }
+
+
90
+
91 // ============================================================
+
92 // Выполнение SQL запросов
+
93 // ============================================================
+
94
+
+
95 bool PostgreSQL::execute(const std::string &sql)
+
96 {
+
97 if (!isConnected())
+
98 {
+
99 Logger::error("Not connected to PostgreSQL");
+
100 return false;
+
101 }
+
102
+
103 try
+
104 {
+
105 pqxx::work txn(*conn_);
+
106 txn.exec(sql);
+
107 txn.commit();
+
108 return true;
+
109 }
+
110 catch (const std::exception &e)
+
111 {
+
112 Logger::error("SQL error: " + std::string(e.what()));
+
113 Logger::error("SQL: " + sql);
+
114 return false;
+
115 }
+
116 }
+
+
117
+
+
118 bool PostgreSQL::executeParams(const std::string &sql, const std::vector<std::string> &params)
+
119 {
+
120 if (!isConnected())
+
121 {
+
122 Logger::error("Not connected to PostgreSQL");
+
123 return false;
+
124 }
+
125
+
126 try
+
127 {
+
128 pqxx::work txn(*conn_);
+
129
+
130 std::string query = sql;
+
131 for (size_t i = 0; i < params.size(); ++i)
+
132 {
+
133 std::string placeholder = "$" + std::to_string(i + 1);
+
134 size_t pos = query.find(placeholder);
+
135 if (pos != std::string::npos)
+
136 {
+
137 query.replace(pos, placeholder.length(), "'" + escape(params[i]) + "'");
+
138 }
+
139 }
+
140
+
141 txn.exec(query);
+
142 txn.commit();
+
143 return true;
+
144 }
+
145 catch (const std::exception &e)
+
146 {
+
147 Logger::error("SQL error: " + std::string(e.what()));
+
148 Logger::error("SQL: " + sql);
+
149 return false;
+
150 }
+
151 }
+
+
152
+
+
153 pqxx::result PostgreSQL::query(const std::string &sql)
+
154 {
+
155 if (!isConnected())
+
156 {
+
157 Logger::error("Not connected to PostgreSQL");
+
158 return pqxx::result();
+
159 }
+
160
+
161 try
+
162 {
+
163 pqxx::work txn(*conn_);
+
164 pqxx::result result = txn.exec(sql);
+
165 txn.commit();
+
166 return result;
+
167 }
+
168 catch (const std::exception &e)
+
169 {
+
170 Logger::error("SQL error: " + std::string(e.what()));
+
171 Logger::error("SQL: " + sql);
+
172 return pqxx::result();
+
173 }
+
174 }
+
+
175
+
176 // ============================================================
+
177 // Вспомогательные функции
+
178 // ============================================================
+
179
+
180 std::string PostgreSQL::escape(const std::string &str)
+
181 {
+
182 Logger::debug("escape input: " + str);
+
183
+
184 std::string result = str;
+
185 size_t pos = 0;
+
186 while ((pos = result.find("'", pos)) != std::string::npos)
+
187 {
+
188 result.replace(pos, 1, "''");
+
189 pos += 2;
+
190 }
+
191 return result;
+
192 }
+
193
+
194 std::string PostgreSQL::generateUUID()
+
195 {
+
196 std::random_device rd;
+
197 std::mt19937_64 gen(rd());
+
198 std::uniform_int_distribution<int> dist(0, 15);
+
199
+
200 std::stringstream ss;
+
201 ss << std::hex << std::setfill('0');
+
202 for (int i = 0; i < 36; ++i)
+
203 {
+
204 if (i == 8 || i == 13 || i == 18 || i == 23)
+
205 {
+
206 ss << '-';
+
207 }
+
208 else
+
209 {
+
210 ss << dist(gen);
+
211 }
+
212 }
+
213 return ss.str();
+
214 }
+
215
+
216 // ============================================================
+
217 // UUID → HEX (с обратным слешем)
+
218 // ============================================================
+
219
+
220 std::string PostgreSQL::convertToHex(const std::string &uuid)
+
221 {
+
222 if (uuid.length() != 36)
+
223 {
+
224 return uuid;
+
225 }
+
226
+
227 // Удаляем дефисы
+
228 std::string clean = uuid;
+
229 clean.erase(std::remove(clean.begin(), clean.end(), '-'), clean.end());
+
230
+
231 // Добавляем \x в начало (экранируем слэш для C++)
+
232 return "\\x" + clean;
+
233 }
+
234
+
235 // ============================================================
+
236 // ★ HEX → UUID (с дефисами, перевернутый) ★
+
237 // ============================================================
+
238
+
239 std::string PostgreSQL::convertTo1CUUID(const std::string &hex)
+
240 {
+
241 // Если это HEX с \x - убираем префикс
+
242 std::string clean = hex;
+
243 if (clean.find("\\x") == 0)
+
244 {
+
245 clean = clean.substr(2);
+
246 }
+
247 if (clean.find("0x") == 0)
+
248 {
+
249 clean = clean.substr(2);
+
250 }
+
251
+
252 if (clean.length() != 32)
+
253 {
+
254 return hex;
+
255 }
+
256
+
257 // Разбиваем на группы: a362345a60c3974211f18e88975e67cc
+
258 // a362345a | 60c3 | 9742 | 11f1 | 8e88975e67cc
+
259 std::string part1 = clean.substr(0, 8);
+
260 std::string part2 = clean.substr(8, 4);
+
261 std::string part3 = clean.substr(12, 4);
+
262 std::string part4 = clean.substr(16, 4);
+
263 std::string part5 = clean.substr(20, 12);
+
264
+
265 // Переворачиваем первые 3 группы
+
266 std::string reversed =
+
267 part1.substr(6, 2) + part1.substr(4, 2) + part1.substr(2, 2) + part1.substr(0, 2) + "-" +
+
268 part2.substr(2, 2) + part2.substr(0, 2) + "-" +
+
269 part3.substr(2, 2) + part3.substr(0, 2) + "-" +
+
270 part4 + "-" +
+
271 part5;
+
272
+
273 return reversed;
+
274 }
+
275
+
276 std::string PostgreSQL::formatDate(const std::string &date)
+
277 {
+
278 if (date.find('T') != std::string::npos)
+
279 {
+
280 std::string result = date;
+
281 std::replace(result.begin(), result.end(), 'T', ' ');
+
282 if (result.find('.') == std::string::npos)
+
283 {
+
284 result += ".000";
+
285 }
+
286 return result;
+
287 }
+
288
+
289 auto now = std::chrono::system_clock::now();
+
290 std::time_t now_time = std::chrono::system_clock::to_time_t(now);
+
291 std::tm tm;
+
292#ifdef _WIN32
+
293 localtime_s(&tm, &now_time);
+
294#else
+
295 localtime_r(&now_time, &tm);
+
296#endif
+
297
+
298 std::stringstream ss;
+
299 ss << std::put_time(&tm, "%Y-%m-%d %H:%M:%S.000");
+
300 return ss.str();
+
301 }
+
302
+
303 // ============================================================
+
304 // Поиск контрагента
+
305 // ============================================================
+
306
+
+
307 std::optional<Client> PostgreSQL::findClient(const std::string &inn, const std::string &kpp)
+
308 {
+
309 try
+
310 {
+
311 std::string sql;
+
312
+
313 if (kpp.empty())
+
314 {
+
315 sql = R"(
+
316 SELECT _IDRRef, _Description, _Fld50, _Fld51, _Marked
+
317 FROM _Reference47
+
318 WHERE _Fld50 = ')" +
+
319 escape(inn) +
+
320 R"('
+
321 AND (_Fld51 = '' OR _Fld51 IS NULL)
+
322 AND _Marked = FALSE
+
323 )";
+
324 }
+
325 else
+
326 {
+
327 sql = R"(
+
328 SELECT _IDRRef, _Description, _Fld50, _Fld51, _Marked
+
329 FROM _Reference47
+
330 WHERE _Fld50 = ')" +
+
331 escape(inn) +
+
332 R"('
+
333 AND _Fld51 = ')" +
+
334 escape(kpp) +
+
335 R"('
+
336 AND _Marked = FALSE
+
337 )";
+
338 }
+
339
+
340 Logger::debug("findClient SQL: " + sql);
+
341
+
342 pqxx::result result = query(sql);
+
343 if (result.empty())
+
344 {
+
345 Logger::warning("Client not found: INN=" + inn + ", KPP=" + kpp);
+
346 return std::nullopt;
+
347 }
+
348
+
349 Client client;
+
350 for (const auto &row : result)
+
351 {
+
352 client.id = row[0].as<std::string>(); // УЖЕ В HEX ФОРМАТЕ (\x...)
+
353 client.name = row[1].as<std::string>();
+
354 client.inn = row[2].as<std::string>();
+
355 client.kpp = row[3].as<std::string>();
+
356 client.marked = row[4].as<bool>();
+
+
357 break;
+
358 }
+
359
+
360 Logger::info("Client found: " + client.inn + " (" + client.name + ")");
+
361 return client;
+
+ +
363 catch (const std::exception &e)
+
364 {
+
365 Logger::error("findClient error: " + std::string(e.what()));
+
366 return std::nullopt;
+
367 }
+
368 }
+
369
+
370 // ============================================================
+
371 // Создание контрагента
+
372 // ============================================================
+
373
+
374 std::string PostgreSQL::createClient(const std::string &inn, const std::string &kpp, const std::string &name)
+
375 {
+
376 try
+
377 {
+
378
+
379 // ОБРЕЗАЕМ ИМЯ ДО 25 СИМВОЛОВ ТАК КАК ДЛИНА НАИМЕНОВАНИЯ 25 СИМВОЛОВ
+
380 std::string short_name = name;
+
381 if (short_name.length() > 25)
+
382 {
+
383 short_name = short_name.substr(0, 25);
+
384 Logger::warning("Name truncated to 25 chars: " + name + " -> " + short_name);
+
385 }
+
386
+
387 std::string id = generateUUID();
+
388 std::string id_hex = convertToHex(id); // HEX с \x
+
389
+
390 // ДОПОЛНЯЕМ _Code ДО 9 СИМВОЛОВ
+
391 std::string code = inn.substr(0, 8);
+
392 while (code.length() < 9)
+
393 {
+
394 code = "0" + code;
+
395 }
+
396
+
397 Logger::debug("Creating client with name: " + name);
+
398
+
399 // НУЛЕВОЙ UUID ДЛЯ _PredefinedID
+
400 std::string empty_uuid = "00000000-0000-0000-0000-000000000000";
+
401 std::string empty_hex = convertToHex(empty_uuid); // ★ HEX с \x ★
+
402
+
403 std::string sql = R"(
+
404 INSERT INTO _Reference47 (_IDRRef, _Code, _Description, _Fld50, _Fld51, _Marked, _PredefinedID)
+
405 VALUES (')" + id_hex +
+
406 R"(', ')" + code +
+
407 R"(', ')" + escape(name) +
+
408 R"(', ')" + escape(inn) +
+
409 R"(', ')" + escape(kpp) +
+
410 R"(', FALSE, ')" + empty_hex + R"(')
+
411 )";
+
412
+
413 Logger::debug("createClient SQL: " + sql);
+
414
+
+
415 if (!execute(sql))
+
416 {
+
417 Logger::error("Failed to create client: " + inn);
+
418 return "";
+
419 }
+
+ +
421 Logger::info("Created client: " + inn + " (" + name + "), ID: " + id);
+
422 return id_hex; // ВОЗВРАЩАЕМ HEX
+
423 }
+
424 catch (const std::exception &e)
+
425 {
+
426 Logger::error("createClient error: " + std::string(e.what()));
+
427 return "";
+
428 }
+
429 }
+
430
+
431 // ============================================================
+
432 // Поиск товара по артикулу
+
433 // ============================================================
+
434
+
435 std::optional<Product> PostgreSQL::findProductByArticle(const std::string &article)
+
436 {
+
437 try
+
438 {
+
439 std::string sql = R"(
+
440 SELECT _IDRRef, _Code, _Description, _Fld52, _Marked
+
441 FROM _Reference48
+
442 WHERE _Fld52 = ')" +
+
443 escape(article) +
+
444 R"('
+
445 AND _Marked = FALSE
+
446 )";
+
447
+
448 Logger::debug("findProductByArticle SQL: " + sql);
+
449
+
450 pqxx::result result = query(sql);
+
451 if (result.empty())
+
452 {
+
453 Logger::warning("Product not found: article=" + article);
+
454 return std::nullopt;
+
455 }
+
456
+
+
457 Product product;
+
458 for (const auto &row : result)
+
459 {
+
460 product.id = row[0].as<std::string>(); // УЖЕ В HEX ФОРМАТЕ (\x...)
+
461 product.code = row[1].as<std::string>();
+
+
462 product.name = row[2].as<std::string>();
+
463 product.article = row[3].as<std::string>();
+
464 product.marked = row[4].as<bool>();
+
465 break;
+
466 }
+
467
+
468 Logger::info("Product found: " + product.article + " (" + product.name + ")");
+
469 return product;
+
470 }
+
471 catch (const std::exception &e)
+
472 {
+
473 Logger::error("findProductByArticle error: " + std::string(e.what()));
+
474 return std::nullopt;
+
475 }
+
476 }
+
477
+
478 // ============================================================
+
479 // Создание заказа
+
480 // ============================================================
+
481
+
482 std::string PostgreSQL::createOrder(
+
483 const std::string &client_id,
+
484 const std::string &date,
+
485 const std::string &number,
+
486 const std::vector<OrderItem> &items)
+
487 {
+
488 try
+
489 {
+
490 if (items.empty())
+
491 {
+
492 Logger::error("Cannot create order with empty items");
+
493 return "";
+
494 }
+
495
+
496 if (!isConnected())
+
497 {
+
498 Logger::error("Not connected to PostgreSQL");
+
499 return "";
+
500 }
+
501
+
502 std::string order_id = generateUUID();
+
503 std::string order_id_hex = convertToHex(order_id); // ★ HEX с \x ★
+
504 std::string order_date = formatDate(date);
+
505 std::string order_number = number.empty() ? "AUTO-" + std::to_string(std::time(nullptr)) : number;
+
506
+
507 // ТРАНЗАКЦИЯ
+
508 pqxx::work txn(*conn_);
+
509
+
510 // 1. Создаем документ (шапку заказа)
+
511 std::string sql_order = R"(
+
512 INSERT INTO _Document49 (_IDRRef, _Date_Time, _Number, _Posted, _Marked, _Fld53RRef)
+
513 VALUES (')" + order_id_hex +
+
514 R"(', ')" + order_date +
+
515 R"(', ')" + escape(order_number) +
+
516 R"(', TRUE, FALSE, ')" + escape(client_id) + R"(')
+
517 )";
+
518
+
519 Logger::debug("createOrder - header SQL: " + sql_order);
+
520 txn.exec(sql_order);
+
521 Logger::info("Created order header: " + order_number);
+
522
+
523 // 2. Создаем строки товаров
+
524 int lineNo = 1;
+
525 for (const auto &item : items)
+
526 {
+
527 // НЕ КОНВЕРТИРУЕМ - product_id УЖЕ В HEX ФОРМАТЕ
+
528 std::string product_id_hex = item.product_id;
+
529
+
530 std::string sql_item = R"(
+
531 INSERT INTO _Document49_VT54 (_Document49_IDRRef, _Fld56RRef, _Fld57, _Fld58, _Fld59, _KeyField, _LineNo55)
+
+
532 VALUES (')" + order_id_hex +
+
533 R"(', ')" + escape(product_id_hex) +
+
534 R"(', )" + std::to_string(item.quantity) +
+
535 R"(, )" + std::to_string(item.price) +
+
536 R"(, )" + std::to_string(item.sum) +
+
+
537 R"(, ')" + order_id_hex +
+
538 R"(', )" + std::to_string(lineNo) + R"()
+
539 )";
+
540
+
541 Logger::debug("createOrder - item SQL: " + sql_item);
+
542 txn.exec(sql_item);
+
543 lineNo++;
+
544 }
+
545
+
546 // ФИКСИРУЕМ ТРАНЗАКЦИЮ
+
547 txn.commit();
+
548
+
549 Logger::info("Order " + order_number + " created with " + std::to_string(items.size()) + " items");
+
550 return order_id_hex; // ВОЗВРАЩАЕМ HEX
+
551 }
+
552 catch (const std::exception &e)
+
553 {
+
554 Logger::error("createOrder error: " + std::string(e.what()));
+
555 return "";
+
556 }
+
557 }
+
558
+
559 // ============================================================
+
+
560 // Запись в регистр сведений
+
561 // ============================================================
+
562
+ +
564 long long linux_time,
+
565 const std::string &tin,
+
566 const std::string &trrc,
+
567 const std::string &json_data)
+
568 {
+
569 try
+
570 {
+
571 std::string sql = R"(
+
572 INSERT INTO _InfoRg60 (_Fld61, _Fld62, _Fld63, _Fld64)
+
573 VALUES ()" + std::to_string(linux_time) +
+
574 R"(, ')" + escape(tin) +
+
575 R"(', ')" + escape(trrc) +
+
576 R"(', ')" + escape(json_data) + R"(')
+
577 )";
+
578
+
579 Logger::debug("logKafkaMessage SQL: " + sql);
+
580
+
581 execute(sql);
+
582 Logger::debug("Logged Kafka message for TIN: " + tin);
+
583 }
+
584 catch (const std::exception &e)
+
585 {
+
586 Logger::error("logKafkaMessage error: " + std::string(e.what()));
+
587 }
+
588 }
+
589
+
590} // namespace database
+
+
static void info(const std::string &message)
Определения logger.hpp:25
+
static void warning(const std::string &message)
Определения logger.hpp:29
+
static void error(const std::string &message)
Определения logger.hpp:33
+
static void debug(const std::string &message)
Определения logger.hpp:37
+
bool executeParams(const std::string &sql, const std::vector< std::string > &params)
Определения postgresql.cpp:118
+
~PostgreSQL()
Определения postgresql.cpp:23
+
std::optional< Product > findProductByArticle(const std::string &article)
Определения postgresql.cpp:420
+
std::string createOrder(const std::string &client_id, const std::string &date, const std::string &number, const std::vector< OrderItem > &items)
Определения postgresql.cpp:462
+
bool connect()
Определения postgresql.cpp:32
+
std::optional< Client > findClient(const std::string &inn, const std::string &kpp="")
Определения postgresql.cpp:307
+
pqxx::result query(const std::string &sql)
Определения postgresql.cpp:153
+
bool execute(const std::string &sql)
Определения postgresql.cpp:95
+
std::string createClient(const std::string &inn, const std::string &kpp, const std::string &name)
Определения postgresql.cpp:362
+
void logKafkaMessage(long long linux_time, const std::string &tin, const std::string &trrc, const std::string &json_data)
Определения postgresql.cpp:537
+
void disconnect()
Определения postgresql.cpp:81
+
bool isConnected() const
Определения postgresql.cpp:76
+
PostgreSQL()
Определения postgresql.cpp:17
+ +
Определения postgresql.cpp:11
+ +
Определения postgresql.hpp:35
+
std::string inn
Определения postgresql.hpp:37
+
std::string id
Определения postgresql.hpp:36
+
std::string name
Определения postgresql.hpp:39
+
bool marked
Определения postgresql.hpp:40
+
std::string kpp
Определения postgresql.hpp:38
+ +
+
+
+ + + + diff --git a/docs/html/postgresql_8hpp.html b/docs/html/postgresql_8hpp.html new file mode 100644 index 000000000..07859fab3 --- /dev/null +++ b/docs/html/postgresql_8hpp.html @@ -0,0 +1,198 @@ + + + + + + + +Kafka-1C Connector: Файл src/database/postgresql.hpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Файл postgresql.hpp
+
+
+
#include <pqxx/pqxx>
+#include <string>
+#include <memory>
+#include <optional>
+#include <vector>
+
+Граф включаемых заголовочных файлов для postgresql.hpp:
+
+
+ + + + + + + + + + + + + +
+
+Граф файлов, в которые включается этот файл:
+
+
+ + + + + + + + + + + + + + + +
+
+

См. исходные тексты.

+ + + + + + + +

+Классы

struct  database::ConnectionParams
struct  database::Client
struct  database::Product
struct  database::OrderItem
class  database::PostgreSQL
+ + +

+Пространства имен

namespace  database
+
+
+ +
+ + + + diff --git a/docs/html/postgresql_8hpp.js b/docs/html/postgresql_8hpp.js new file mode 100644 index 000000000..01d3f2009 --- /dev/null +++ b/docs/html/postgresql_8hpp.js @@ -0,0 +1,8 @@ +var postgresql_8hpp = +[ + [ "database::ConnectionParams", "structdatabase_1_1_connection_params.html", "structdatabase_1_1_connection_params" ], + [ "database::Client", "structdatabase_1_1_client.html", "structdatabase_1_1_client" ], + [ "database::Product", "structdatabase_1_1_product.html", "structdatabase_1_1_product" ], + [ "database::OrderItem", "structdatabase_1_1_order_item.html", "structdatabase_1_1_order_item" ], + [ "database::PostgreSQL", "classdatabase_1_1_postgre_s_q_l.html", "classdatabase_1_1_postgre_s_q_l" ] +]; \ No newline at end of file diff --git a/docs/html/postgresql_8hpp__dep__incl.dot b/docs/html/postgresql_8hpp__dep__incl.dot new file mode 100644 index 000000000..dc68cc7ee --- /dev/null +++ b/docs/html/postgresql_8hpp__dep__incl.dot @@ -0,0 +1,20 @@ +digraph "src/database/postgresql.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/database/postgresql.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="src/config/config.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$config_8hpp.html",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="src/main.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="src/database/postgresql.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$postgresql_8cpp.html",tooltip=" "]; + Node1 -> Node3 [id="edge4_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node1 -> Node5 [id="edge5_Node000001_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="src/processor/order\l_processor.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$order__processor_8hpp.html",tooltip=" "]; + Node5 -> Node3 [id="edge6_Node000005_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 -> Node6 [id="edge7_Node000005_Node000006",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="src/processor/order\l_processor.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$order__processor_8cpp.html",tooltip=" "]; +} diff --git a/docs/html/postgresql_8hpp__dep__incl.map b/docs/html/postgresql_8hpp__dep__incl.map new file mode 100644 index 000000000..cf731efb7 --- /dev/null +++ b/docs/html/postgresql_8hpp__dep__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/html/postgresql_8hpp__dep__incl.md5 b/docs/html/postgresql_8hpp__dep__incl.md5 new file mode 100644 index 000000000..48d445a64 --- /dev/null +++ b/docs/html/postgresql_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +82b7471f5492a859fd86d30443971a32 \ No newline at end of file diff --git a/docs/html/postgresql_8hpp__dep__incl.png b/docs/html/postgresql_8hpp__dep__incl.png new file mode 100644 index 000000000..7b0920667 Binary files /dev/null and b/docs/html/postgresql_8hpp__dep__incl.png differ diff --git a/docs/html/postgresql_8hpp__incl.dot b/docs/html/postgresql_8hpp__incl.dot new file mode 100644 index 000000000..47ff11705 --- /dev/null +++ b/docs/html/postgresql_8hpp__incl.dot @@ -0,0 +1,18 @@ +digraph "src/database/postgresql.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/database/postgresql.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="pqxx/pqxx",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="string",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="memory",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="optional",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node6 [id="edge5_Node000001_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="vector",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; +} diff --git a/docs/html/postgresql_8hpp__incl.map b/docs/html/postgresql_8hpp__incl.map new file mode 100644 index 000000000..08379203e --- /dev/null +++ b/docs/html/postgresql_8hpp__incl.map @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/html/postgresql_8hpp__incl.md5 b/docs/html/postgresql_8hpp__incl.md5 new file mode 100644 index 000000000..240c9b8b6 --- /dev/null +++ b/docs/html/postgresql_8hpp__incl.md5 @@ -0,0 +1 @@ +2a265e214ff76352378aca610b36ffd0 \ No newline at end of file diff --git a/docs/html/postgresql_8hpp__incl.png b/docs/html/postgresql_8hpp__incl.png new file mode 100644 index 000000000..0d3e434c6 Binary files /dev/null and b/docs/html/postgresql_8hpp__incl.png differ diff --git a/docs/html/postgresql_8hpp_source.html b/docs/html/postgresql_8hpp_source.html new file mode 100644 index 000000000..4174cbce0 --- /dev/null +++ b/docs/html/postgresql_8hpp_source.html @@ -0,0 +1,307 @@ + + + + + + + +Kafka-1C Connector: Исходный файл src/database/postgresql.hpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
postgresql.hpp
+
+
+См. документацию.
1#pragma once
+
2
+
3#include <pqxx/pqxx>
+
4#include <string>
+
5#include <memory>
+
6#include <optional>
+
7#include <vector>
+
8
+
9namespace database
+
10{
+
11
+
+ +
13 {
+
14 std::string host;
+
15 int port;
+
16 std::string database;
+
17 std::string username;
+
18 std::string password;
+
19
+
+
20 std::string connectionString() const
+
21 {
+
22 return "host=" + host +
+
23 " port=" + std::to_string(port) +
+
24 " dbname=" + database +
+
25 " user=" + username +
+
26 " password=" + password;
+
27 }
+
+
28 };
+
+
29
+
30 // ============================================================
+
31 // Структуры для работы с 1С таблицами
+
32 // ============================================================
+
33
+
+
34 struct Client
+
35 {
+
36 std::string id; // _IDRRef (HEX с \x)
+
37 std::string inn; // _Fld50
+
38 std::string kpp; // _Fld51
+
39 std::string name; // _Description
+
40 bool marked; // _Marked
+
41 };
+
+
42
+
+
43 struct Product
+
44 {
+
45 std::string id; // _IDRRef (HEX с \x)
+
46 std::string code; // _Code
+
47 std::string name; // _Description
+
48 std::string article; // _Fld52
+
49 bool marked; // _Marked
+
50 };
+
+
51
+
+
52 struct OrderItem
+
53 {
+
54 std::string product_id; // _Fld56RRef (HEX с \x)
+
55 double quantity; // _Fld57
+
56 double price; // _Fld58
+
57 double sum; // _Fld59
+
58 };
+
+
59
+
60 // ============================================================
+
61 // Класс для работы с PostgreSQL через libpqxx
+
62 // ============================================================
+
63
+
+ +
65 {
+
66 public:
+
67 PostgreSQL();
+
68 PostgreSQL(const ConnectionParams &params);
+ +
70
+
71 bool connect();
+
72 bool isConnected() const;
+
73 void disconnect();
+
74
+
75 // Выполнение SQL запроса (без результата)
+
76 bool execute(const std::string &sql);
+
77
+
78 // Выполнение запроса с параметрами
+
79 bool executeParams(const std::string &sql, const std::vector<std::string> &params);
+
80
+
81 // Выполнение запроса с результатом
+
82 pqxx::result query(const std::string &sql);
+
83
+
84 // ============================================================
+
85 // Работа с контрагентами
+
86 // ============================================================
+
87 std::optional<Client> findClient(const std::string &inn, const std::string &kpp = "");
+
88 std::string createClient(const std::string &inn, const std::string &kpp, const std::string &name);
+
89
+
90 // ============================================================
+
91 // Работа с номенклатурой
+
92 // ============================================================
+
93 std::optional<Product> findProductByArticle(const std::string &article);
+
94
+
95 // ============================================================
+
96 // Работа с заказами
+
97 // ============================================================
+
98 std::string createOrder(
+
99 const std::string &client_id,
+
100 const std::string &date,
+
101 const std::string &number,
+
102 const std::vector<OrderItem> &items);
+
103
+
104 // ============================================================
+
105 // Запись в регистр сведений
+
106 // ============================================================
+
107 void logKafkaMessage(
+
108 long long linux_time,
+
109 const std::string &tin,
+
110 const std::string &trrc,
+
111 const std::string &json_data);
+
112
+
113 private:
+
114 ConnectionParams params_;
+
115 std::unique_ptr<pqxx::connection> conn_;
+
116 bool connected_;
+
117
+
118 std::string escape(const std::string &str);
+
119 std::string generateUUID();
+
120 std::string convertToHex(const std::string &uuid); // UUID → HEX с \x
+
121 std::string convertTo1CUUID(const std::string &hex); // HEX → UUID с дефисами
+
122 std::string formatDate(const std::string &date);
+
123 };
+
+
124
+
125} // namespace database
+
bool executeParams(const std::string &sql, const std::vector< std::string > &params)
Определения postgresql.cpp:118
+
~PostgreSQL()
Определения postgresql.cpp:23
+
std::optional< Product > findProductByArticle(const std::string &article)
Определения postgresql.cpp:420
+
std::string createOrder(const std::string &client_id, const std::string &date, const std::string &number, const std::vector< OrderItem > &items)
Определения postgresql.cpp:462
+
bool connect()
Определения postgresql.cpp:32
+
std::optional< Client > findClient(const std::string &inn, const std::string &kpp="")
Определения postgresql.cpp:307
+
pqxx::result query(const std::string &sql)
Определения postgresql.cpp:153
+
bool execute(const std::string &sql)
Определения postgresql.cpp:95
+
std::string createClient(const std::string &inn, const std::string &kpp, const std::string &name)
Определения postgresql.cpp:362
+
void logKafkaMessage(long long linux_time, const std::string &tin, const std::string &trrc, const std::string &json_data)
Определения postgresql.cpp:537
+
void disconnect()
Определения postgresql.cpp:81
+
bool isConnected() const
Определения postgresql.cpp:76
+
PostgreSQL()
Определения postgresql.cpp:17
+
Определения postgresql.cpp:11
+
Определения postgresql.hpp:35
+
std::string inn
Определения postgresql.hpp:37
+
std::string id
Определения postgresql.hpp:36
+
std::string name
Определения postgresql.hpp:39
+
bool marked
Определения postgresql.hpp:40
+
std::string kpp
Определения postgresql.hpp:38
+ + +
std::string username
Определения postgresql.hpp:17
+
std::string host
Определения postgresql.hpp:14
+
std::string password
Определения postgresql.hpp:18
+
std::string connectionString() const
Определения postgresql.hpp:20
+ +
double quantity
Определения postgresql.hpp:55
+
double sum
Определения postgresql.hpp:57
+
std::string product_id
Определения postgresql.hpp:54
+
double price
Определения postgresql.hpp:56
+
Определения postgresql.hpp:44
+
std::string id
Определения postgresql.hpp:45
+
std::string code
Определения postgresql.hpp:46
+
std::string name
Определения postgresql.hpp:47
+
bool marked
Определения postgresql.hpp:49
+
std::string article
Определения postgresql.hpp:48
+
+
+
+ + + + diff --git a/docs/html/producer_8hpp.html b/docs/html/producer_8hpp.html new file mode 100644 index 000000000..803ec8401 --- /dev/null +++ b/docs/html/producer_8hpp.html @@ -0,0 +1,185 @@ + + + + + + + +Kafka-1C Connector: Файл src/kafka/producer.hpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
Файл producer.hpp
+
+
+
#include <librdkafka/rdkafkacpp.h>
+#include <string>
+#include <memory>
+#include <functional>
+#include <atomic>
+
+Граф включаемых заголовочных файлов для producer.hpp:
+
+
+ + + + + + + + + + + + + +
+
+Граф файлов, в которые включается этот файл:
+
+
+ + + + + + + + + + +
+
+

См. исходные тексты.

+ + + +

+Классы

class  KafkaProducer
+
+
+ +
+ + + + diff --git a/docs/html/producer_8hpp.js b/docs/html/producer_8hpp.js new file mode 100644 index 000000000..202d733f8 --- /dev/null +++ b/docs/html/producer_8hpp.js @@ -0,0 +1,4 @@ +var producer_8hpp = +[ + [ "KafkaProducer", "class_kafka_producer.html", "class_kafka_producer" ] +]; \ No newline at end of file diff --git a/docs/html/producer_8hpp__dep__incl.dot b/docs/html/producer_8hpp__dep__incl.dot new file mode 100644 index 000000000..9b2555ab7 --- /dev/null +++ b/docs/html/producer_8hpp__dep__incl.dot @@ -0,0 +1,15 @@ +digraph "src/kafka/producer.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/kafka/producer.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="src/main.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="src/processor/order\l_processor.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$order__processor_8hpp.html",tooltip=" "]; + Node3 -> Node2 [id="edge3_Node000003_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 -> Node4 [id="edge4_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="src/processor/order\l_processor.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$order__processor_8cpp.html",tooltip=" "]; +} diff --git a/docs/html/producer_8hpp__dep__incl.map b/docs/html/producer_8hpp__dep__incl.map new file mode 100644 index 000000000..ce267ece7 --- /dev/null +++ b/docs/html/producer_8hpp__dep__incl.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/html/producer_8hpp__dep__incl.md5 b/docs/html/producer_8hpp__dep__incl.md5 new file mode 100644 index 000000000..7192dedd9 --- /dev/null +++ b/docs/html/producer_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +c9ab8f4b7cc5581a87c9bcd7bd833804 \ No newline at end of file diff --git a/docs/html/producer_8hpp__dep__incl.png b/docs/html/producer_8hpp__dep__incl.png new file mode 100644 index 000000000..70c0d8728 Binary files /dev/null and b/docs/html/producer_8hpp__dep__incl.png differ diff --git a/docs/html/producer_8hpp__incl.dot b/docs/html/producer_8hpp__incl.dot new file mode 100644 index 000000000..752809369 --- /dev/null +++ b/docs/html/producer_8hpp__incl.dot @@ -0,0 +1,18 @@ +digraph "src/kafka/producer.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/kafka/producer.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="librdkafka/rdkafkacpp.h",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="string",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="memory",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="functional",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node6 [id="edge5_Node000001_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="atomic",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; +} diff --git a/docs/html/producer_8hpp__incl.map b/docs/html/producer_8hpp__incl.map new file mode 100644 index 000000000..50cb0edf2 --- /dev/null +++ b/docs/html/producer_8hpp__incl.map @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/html/producer_8hpp__incl.md5 b/docs/html/producer_8hpp__incl.md5 new file mode 100644 index 000000000..563a6b3e0 --- /dev/null +++ b/docs/html/producer_8hpp__incl.md5 @@ -0,0 +1 @@ +c65a5231862dc98d3265f09529e7a737 \ No newline at end of file diff --git a/docs/html/producer_8hpp__incl.png b/docs/html/producer_8hpp__incl.png new file mode 100644 index 000000000..5cbd6fab0 Binary files /dev/null and b/docs/html/producer_8hpp__incl.png differ diff --git a/docs/html/producer_8hpp_source.html b/docs/html/producer_8hpp_source.html new file mode 100644 index 000000000..9454a1249 --- /dev/null +++ b/docs/html/producer_8hpp_source.html @@ -0,0 +1,190 @@ + + + + + + + +Kafka-1C Connector: Исходный файл src/kafka/producer.hpp + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Kafka-1C Connector 1.0.0 +
+
High-performance Kafka-1C integration microservice
+
+
+ + + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Загрузка...
+
Поиск...
+
Не найдено
+
+
+
+
+ +
+
producer.hpp
+
+
+См. документацию.
1#pragma once
+
2
+
3#include <librdkafka/rdkafkacpp.h>
+
4#include <string>
+
5#include <memory>
+
6#include <functional>
+
7#include <atomic>
+
8
+
+ +
10public:
+
11 using DeliveryCallback = std::function<void(const std::string&, int, int64_t)>;
+
12
+
13 KafkaProducer(const std::string& brokers, const std::string& topic);
+ +
15
+
16 bool init(const std::string& acks = "all", int retries = 3);
+
17 bool send(const std::string& message);
+
18 bool send(const std::string& key, const std::string& message);
+ +
20 void flush(int timeout_ms = 5000);
+
21
+
22 // Статистика
+
23 size_t getSentCount() const { return sent_count_.load(); }
+
24 size_t getFailedCount() const { return failed_count_.load(); }
+
25
+
26private:
+
27 class DeliveryReportCb : public RdKafka::DeliveryReportCb {
+
28 public:
+
29 DeliveryReportCb(KafkaProducer* producer);
+
30 void dr_cb(RdKafka::Message& msg) override;
+
31 private:
+
32 KafkaProducer* producer_;
+
33 };
+
34
+
35 std::string brokers_;
+
36 std::string topic_;
+
37 std::unique_ptr<RdKafka::Producer> producer_;
+
38 std::unique_ptr<DeliveryReportCb> delivery_cb_;
+
39 DeliveryCallback callback_;
+
40 std::string errstr_;
+
41
+
42 std::atomic<size_t> sent_count_{0};
+
43 std::atomic<size_t> failed_count_{0};
+
44};
+
+
Определения producer.hpp:9
+
bool send(const std::string &message)
+
bool init(const std::string &acks="all", int retries=3)
+
void flush(int timeout_ms=5000)
+
KafkaProducer(const std::string &brokers, const std::string &topic)
+
void setDeliveryCallback(DeliveryCallback cb)
+
size_t getSentCount() const
Определения producer.hpp:23
+
size_t getFailedCount() const
Определения producer.hpp:24
+
std::function< void(const std::string &, int, int64_t)> DeliveryCallback
Определения producer.hpp:11
+ +
bool send(const std::string &key, const std::string &message)
+
+
+
+ + + + diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js new file mode 100644 index 000000000..8bf9e954c --- /dev/null +++ b/docs/html/search/all_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['acks_0',['acks',['../struct_kafka_config_1_1_producer.html#a2fe3aa9fe31856c6b64ff8b2f3c0b361',1,'KafkaConfig::Producer']]], + ['appconfig_1',['AppConfig',['../struct_app_config.html',1,'']]], + ['article_2',['article',['../structdatabase_1_1_product.html#af8dc8d1177ca8b6768561dd109a3d6d3',1,'database::Product']]], + ['auto_5foffset_5freset_3',['auto_offset_reset',['../struct_kafka_config_1_1_consumer.html#aefe2c1f841e4badd0b345ca5fd309c6f',1,'KafkaConfig::Consumer']]] +]; diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js new file mode 100644 index 000000000..0cb4499fb --- /dev/null +++ b/docs/html/search/all_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['batch_5fsize_0',['batch_size',['../struct_kafka_config_1_1_producer.html#a11c8f76401938e0d921885ac4b721044',1,'KafkaConfig::Producer::batch_size'],['../struct_processing_config.html#adefd52f2a2e86fd9110b6a76110eb382',1,'ProcessingConfig::batch_size']]], + ['bootstrap_5fservers_1',['bootstrap_servers',['../struct_kafka_config.html#a2348a03b02fe3fd8603b36d0668a466d',1,'KafkaConfig']]] +]; diff --git a/docs/html/search/all_10.js b/docs/html/search/all_10.js new file mode 100644 index 000000000..ca9d55ef8 --- /dev/null +++ b/docs/html/search/all_10.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['quantity_0',['quantity',['../structdatabase_1_1_order_item.html#a0ee59553b20ae7d4ee663938e1d46500',1,'database::OrderItem::quantity'],['../struct_order_item.html#a83b4d1091409217be7f2b35e38229e26',1,'OrderItem::quantity']]], + ['query_1',['query',['../classdatabase_1_1_postgre_s_q_l.html#a95022441d5201d81365056c401ec2474',1,'database::PostgreSQL']]] +]; diff --git a/docs/html/search/all_11.js b/docs/html/search/all_11.js new file mode 100644 index 000000000..1f36d9af1 --- /dev/null +++ b/docs/html/search/all_11.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['removesent_0',['removeSent',['../class_message_cache.html#a6e8847a867b6750273845c3a6ca57c65',1,'MessageCache']]], + ['reprocess_5fdelay_5fseconds_1',['reprocess_delay_seconds',['../struct_cache_config.html#a789469e676460aba92e45f59634c9baa',1,'CacheConfig']]], + ['reprocesspendingmessages_2',['reprocessPendingMessages',['../class_order_processor.html#af7a710bdbf4bd5c4578db73437477a5f',1,'OrderProcessor']]], + ['retention_5fdays_3',['retention_days',['../struct_cache_config.html#a811e7654983743415a50f817813ca293',1,'CacheConfig']]], + ['retries_4',['retries',['../struct_kafka_config_1_1_producer.html#ad949a76f16ffbbd833c093bf6832277c',1,'KafkaConfig::Producer']]], + ['retry_5finterval_5fseconds_5',['retry_interval_seconds',['../struct_processing_config.html#a3f7997e36b3bf9e253ad887ae7c1c8d5',1,'ProcessingConfig']]], + ['runconsumer_6',['runConsumer',['../main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854',1,'main.cpp']]], + ['running_7',['running',['../main_8cpp.html#af53701aded99286de42137bffab9561a',1,'main.cpp']]], + ['runproducer_8',['runProducer',['../main_8cpp.html#a046be377067f3f52c8b9516cdb1e47b5',1,'main.cpp']]] +]; diff --git a/docs/html/search/all_12.js b/docs/html/search/all_12.js new file mode 100644 index 000000000..349772dbb --- /dev/null +++ b/docs/html/search/all_12.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['save_0',['save',['../class_message_cache.html#a699e48cdd16aaf9e8a67d25d30925a24',1,'MessageCache']]], + ['send_1',['send',['../class_kafka_producer.html#a5c01eb2a998310bbfe16ebc77666af8f',1,'KafkaProducer::send(const std::string &message)'],['../class_kafka_producer.html#afcc3fa74dced31f8fab9bb198a26414e',1,'KafkaProducer::send(const std::string &key, const std::string &message)']]], + ['setdeliverycallback_2',['setDeliveryCallback',['../class_kafka_producer.html#a848df41ef97ff523fc21c3b12285c26c',1,'KafkaProducer']]], + ['setlevel_3',['setLevel',['../class_logger.html#a57acd0f5576b2f784d3c42a6e99c230b',1,'Logger']]], + ['setmessagecallback_4',['setMessageCallback',['../class_kafka_consumer.html#a21535be303ced919722a21c8a10646ba',1,'KafkaConsumer']]], + ['setreprocessdelay_5',['setReprocessDelay',['../class_message_cache.html#abe7996aada9f77e39d9ed2d830dcddb9',1,'MessageCache']]], + ['setsourceprefix_6',['setSourcePrefix',['../class_message_cache.html#a7d8db594bd5c90375565decd61911596',1,'MessageCache']]], + ['signalhandler_7',['signalHandler',['../main_8cpp.html#ad2e59c7203b3bddc1bc9a2224b52e8e7',1,'main.cpp']]], + ['sku_8',['sku',['../struct_order_item.html#aa127c157e2449c02c68948fde169dd55',1,'OrderItem']]], + ['source_5fprefix_9',['source_prefix',['../struct_cache_config.html#a7e8c2d3a69fd12df4809602ec825c62e',1,'CacheConfig']]], + ['sqlite_5fcache_2ehpp_10',['sqlite_cache.hpp',['../sqlite__cache_8hpp.html',1,'']]], + ['start_11',['start',['../class_kafka_consumer.html#a56ee2ca2d7d35993b23f95d1dee846c1',1,'KafkaConsumer']]], + ['stop_12',['stop',['../class_kafka_consumer.html#a4b681b6d27e4cb550a35f61c7acf279a',1,'KafkaConsumer']]], + ['sum_13',['sum',['../structdatabase_1_1_order_item.html#a8d8598ac204f2c3dccc257042ab282d0',1,'database::OrderItem::sum'],['../struct_order_item.html#a7379b21ebe1ecdd8f16f086074a735bb',1,'OrderItem::sum']]] +]; diff --git a/docs/html/search/all_13.js b/docs/html/search/all_13.js new file mode 100644 index 000000000..59c6932dc --- /dev/null +++ b/docs/html/search/all_13.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['tin_0',['tin',['../struct_order_data.html#adf69c9e05d2636695d68e29b776cf73f',1,'OrderData']]], + ['tojson_1',['toJson',['../struct_order_data.html#adb304d757a97f88a8b0a9e33339ca2f9',1,'OrderData']]], + ['topics_2',['Topics',['../struct_kafka_config_1_1_topics.html',1,'KafkaConfig']]], + ['topics_3',['topics',['../struct_kafka_config.html#ab1be7681f0d61eb354db018745e25c1f',1,'KafkaConfig']]], + ['trrc_4',['trrc',['../struct_order_data.html#a2bea392e91c64cbc0a6c1cc3292463d6',1,'OrderData']]] +]; diff --git a/docs/html/search/all_14.js b/docs/html/search/all_14.js new file mode 100644 index 000000000..b860448b0 --- /dev/null +++ b/docs/html/search/all_14.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['username_0',['username',['../structdatabase_1_1_connection_params.html#a5a1b946ed57e96a6e623e508479070e2',1,'database::ConnectionParams']]], + ['utils_1',['utils',['../namespaceutils.html',1,'']]], + ['uuid_2ehpp_2',['uuid.hpp',['../uuid_8hpp.html',1,'']]] +]; diff --git a/docs/html/search/all_15.js b/docs/html/search/all_15.js new file mode 100644 index 000000000..387435274 --- /dev/null +++ b/docs/html/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['validate_0',['validate',['../class_json_parser.html#a1d6b83be5c0757b3a628a7c1737e4628',1,'JsonParser']]] +]; diff --git a/docs/html/search/all_16.js b/docs/html/search/all_16.js new file mode 100644 index 000000000..bfd871a17 --- /dev/null +++ b/docs/html/search/all_16.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['warning_0',['WARNING',['../class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fa059e9861e0400dfbe05c98a841f3f96b',1,'Logger']]], + ['warning_1',['warning',['../class_logger.html#a5025d14c1f40cc23e9cbb48f98f0d9a6',1,'Logger']]] +]; diff --git a/docs/html/search/all_17.js b/docs/html/search/all_17.js new file mode 100644 index 000000000..b1c87928b --- /dev/null +++ b/docs/html/search/all_17.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['_7ekafkaconsumer_0',['~KafkaConsumer',['../class_kafka_consumer.html#a4dd0e33f7341f6de09f7f470fa785dca',1,'KafkaConsumer']]], + ['_7ekafkaproducer_1',['~KafkaProducer',['../class_kafka_producer.html#acb41ef37ae06e2f660fcc38e614843ce',1,'KafkaProducer']]], + ['_7emessagecache_2',['~MessageCache',['../class_message_cache.html#a6ba6cafac1143389d777172aed9f9fbd',1,'MessageCache']]], + ['_7epostgresql_3',['~PostgreSQL',['../classdatabase_1_1_postgre_s_q_l.html#a372a7ea6dc198d0ed42190d114980e39',1,'database::PostgreSQL']]] +]; diff --git a/docs/html/search/all_2.js b/docs/html/search/all_2.js new file mode 100644 index 000000000..2e168b7e8 --- /dev/null +++ b/docs/html/search/all_2.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['cache_0',['cache',['../struct_app_config.html#ab61fecf8d49e3d3eae421cfcab3a94bd',1,'AppConfig']]], + ['cacheconfig_1',['CacheConfig',['../struct_cache_config.html',1,'']]], + ['cleanup_2',['cleanup',['../class_message_cache.html#a50c216e984ae61005f4daf4b8c124a22',1,'MessageCache']]], + ['client_3',['Client',['../structdatabase_1_1_client.html',1,'database']]], + ['code_4',['code',['../structdatabase_1_1_product.html#a55f1bef2aac730c71a64e19daafeb12a',1,'database::Product']]], + ['config_2ehpp_5',['config.hpp',['../config_8hpp.html',1,'']]], + ['connect_6',['connect',['../classdatabase_1_1_postgre_s_q_l.html#a785b7fa2f3259b5258c06bfbd9e8b2c3',1,'database::PostgreSQL']]], + ['connectionparams_7',['ConnectionParams',['../structdatabase_1_1_connection_params.html',1,'database']]], + ['connectionstring_8',['connectionString',['../structdatabase_1_1_connection_params.html#adf642f06affe1750bd495f50fee2241d',1,'database::ConnectionParams']]], + ['consumer_9',['Consumer',['../struct_kafka_config_1_1_consumer.html',1,'KafkaConfig']]], + ['consumer_10',['consumer',['../struct_kafka_config.html#a28fc38d804239de7371366e113fe82ea',1,'KafkaConfig']]], + ['consumer_2ecpp_11',['consumer.cpp',['../consumer_8cpp.html',1,'']]], + ['consumer_2ehpp_12',['consumer.hpp',['../consumer_8hpp.html',1,'']]], + ['consumer_5fcount_13',['consumer_count',['../main_8cpp.html#a8a2b3452989432f0e06d48049de87e33',1,'main.cpp']]], + ['contractor_14',['contractor',['../struct_order_data.html#aaa1adf7d56f4e3e3593b93dd29345740',1,'OrderData']]], + ['createclient_15',['createClient',['../classdatabase_1_1_postgre_s_q_l.html#ac22c54f52920ec67e8579bb70f360949',1,'database::PostgreSQL']]], + ['createorder_16',['createOrder',['../classdatabase_1_1_postgre_s_q_l.html#a6773124fa34e1abd8758791867453058',1,'database::PostgreSQL']]] +]; diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js new file mode 100644 index 000000000..4249d266a --- /dev/null +++ b/docs/html/search/all_3.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['database_0',['database',['../namespacedatabase.html',1,'database'],['../struct_app_config.html#ad48b440bdfae4964ca599149729d09ec',1,'AppConfig::database'],['../structdatabase_1_1_connection_params.html#a190de2967f826558a7ad5a9fdbc8f5de',1,'database::ConnectionParams::database']]], + ['databaseconfig_1',['DatabaseConfig',['../struct_database_config.html',1,'']]], + ['date_2',['date',['../struct_order_data.html#ae0a6f5fff047998c68e3621a5a163177',1,'OrderData']]], + ['debug_3',['DEBUG',['../class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fadc30ec20708ef7b0f641ef78b7880a15',1,'Logger']]], + ['debug_4',['debug',['../class_logger.html#aed78385ee0ad9d124521735894abab46',1,'Logger']]], + ['delete_5fafter_5fsend_5',['delete_after_send',['../struct_processing_config.html#a5fbabda8fc7ddf93b0997b3228a147df',1,'ProcessingConfig']]], + ['deliverycallback_6',['DeliveryCallback',['../class_kafka_producer.html#ab3ca45833957d458b67df80abcc60f2a',1,'KafkaProducer']]], + ['disconnect_7',['disconnect',['../classdatabase_1_1_postgre_s_q_l.html#af41a6c8beb9e194a4c1bdfa346d0712d',1,'database::PostgreSQL']]] +]; diff --git a/docs/html/search/all_4.js b/docs/html/search/all_4.js new file mode 100644 index 000000000..ba0a8ec22 --- /dev/null +++ b/docs/html/search/all_4.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['enable_5fauto_5fcommit_0',['enable_auto_commit',['../struct_kafka_config_1_1_consumer.html#afd3d5f25ef1e08466f864f70cd4170da',1,'KafkaConfig::Consumer']]], + ['enabled_1',['enabled',['../struct_group_config.html#a1961ea5cd382a8eb95ba35f8b0d30085',1,'GroupConfig']]], + ['error_2',['ERROR',['../class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fabb1ca97ec761fc37101737ba0aa2e7c5',1,'Logger']]], + ['error_3',['error',['../class_logger.html#aafe8b4f6ed1259fbde150ab59e0785e7',1,'Logger']]], + ['error_5fcount_4',['error_count',['../main_8cpp.html#a77c334a9669f26a519f128b8f85765a6',1,'main.cpp']]], + ['errors_5',['errors',['../struct_kafka_config_1_1_topics.html#a58392568ff76c07a0d3b70d420089040',1,'KafkaConfig::Topics']]], + ['execute_6',['execute',['../classdatabase_1_1_postgre_s_q_l.html#aae16b58e807cbaf423edb361275dc018',1,'database::PostgreSQL']]], + ['executeparams_7',['executeParams',['../classdatabase_1_1_postgre_s_q_l.html#a1b682272e817f53fe4f0ccfcb727e253',1,'database::PostgreSQL']]] +]; diff --git a/docs/html/search/all_5.js b/docs/html/search/all_5.js new file mode 100644 index 000000000..6fd548f51 --- /dev/null +++ b/docs/html/search/all_5.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['findclient_0',['findClient',['../classdatabase_1_1_postgre_s_q_l.html#a78e26c9484a4cda19507c89600f609b6',1,'database::PostgreSQL']]], + ['findproductbyarticle_1',['findProductByArticle',['../classdatabase_1_1_postgre_s_q_l.html#a4a090045c1149fcfef8b05415d41e6fb',1,'database::PostgreSQL']]], + ['flush_2',['flush',['../class_kafka_producer.html#a6266bb25d0bbec95a32243d88006ea55',1,'KafkaProducer']]], + ['fromjson_3',['fromJson',['../struct_order_data.html#a3e88570de45cee6e214655aa12ed42f3',1,'OrderData::fromJson(const std::string &json_str)'],['../struct_order_data.html#a5765541bdbee66eba9de94aaf95f22b5',1,'OrderData::fromJson(const json &j)']]] +]; diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js new file mode 100644 index 000000000..0163e9152 --- /dev/null +++ b/docs/html/search/all_6.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['generateuuid_0',['generateUUID',['../namespaceutils.html#adbc7a6520ceec292a43e3b89c7efba92',1,'utils']]], + ['getfailedcount_1',['getFailedCount',['../class_kafka_producer.html#a93934ddc34c83e74fd7adb110c1b3f2c',1,'KafkaProducer']]], + ['getjsonfiles_2',['getJsonFiles',['../main_8cpp.html#a5a216c3284e0a72fe4f8101cd8b12b60',1,'main.cpp']]], + ['getpendingcount_3',['getPendingCount',['../class_message_cache.html#ab3729d708193c6be1460fb7a2860e03a',1,'MessageCache']]], + ['getpendingmessages_4',['getPendingMessages',['../class_message_cache.html#a201b93a9b56bc038a470a05483566e55',1,'MessageCache']]], + ['getsentcount_5',['getSentCount',['../class_kafka_producer.html#a8f20c25ada021053e6a9752b6ebe3cad',1,'KafkaProducer']]], + ['gettotalcount_6',['getTotalCount',['../class_message_cache.html#aba79bed3c66e3fe011ae25ed45bb9f8b',1,'MessageCache']]], + ['goods_7',['goods',['../struct_order_data.html#a6b2ffaadbab3d340ac169f36ed9235af',1,'OrderData']]], + ['group_5fid_8',['group_id',['../struct_kafka_config_1_1_consumer.html#a038ca3598f8aca14524c11bc9e1c6730',1,'KafkaConfig::Consumer']]], + ['groupconfig_9',['GroupConfig',['../struct_group_config.html',1,'']]], + ['groups_10',['groups',['../struct_app_config.html#a278bb1ffae10e016c5355964746230f9',1,'AppConfig']]] +]; diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js new file mode 100644 index 000000000..b3afa9e18 --- /dev/null +++ b/docs/html/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['host_0',['host',['../structdatabase_1_1_connection_params.html#aac294a88bf4a434b9f7af573a9eac43d',1,'database::ConnectionParams']]] +]; diff --git a/docs/html/search/all_8.js b/docs/html/search/all_8.js new file mode 100644 index 000000000..e47d1157f --- /dev/null +++ b/docs/html/search/all_8.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['id_0',['id',['../structdatabase_1_1_client.html#a59c09de0aaf09eacd58d9e03cac42d65',1,'database::Client::id'],['../structdatabase_1_1_product.html#a537c128b62c8ef01b1561d01cb7bb06b',1,'database::Product::id']]], + ['info_1',['INFO',['../class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fa551b723eafd6a31d444fcb2f5920fbd3',1,'Logger']]], + ['info_2',['info',['../class_logger.html#a474176e6966186566a2a321cb5cbd739',1,'Logger']]], + ['init_3',['init',['../class_message_cache.html#ae986415d8621c4d18493379325ce04cc',1,'MessageCache::init()'],['../class_kafka_consumer.html#ad3e3608060a00e4429a2e14d24ad09c8',1,'KafkaConsumer::init()'],['../class_kafka_producer.html#a6012cf74b1de379e1110c0db1690b64c',1,'KafkaProducer::init()']]], + ['inn_4',['inn',['../structdatabase_1_1_client.html#a2832335fbe78cdd62a9ecc4c91c57880',1,'database::Client']]], + ['input_5',['input',['../struct_kafka_config_1_1_topics.html#a3512bb9c634bc7bb91b8adac920696d2',1,'KafkaConfig::Topics']]], + ['input_5fdirectory_6',['input_directory',['../struct_group_config.html#a4f11116931abc7703ea5d03f6496bce6',1,'GroupConfig']]], + ['isconnected_7',['isConnected',['../classdatabase_1_1_postgre_s_q_l.html#af9b6445361883ff9a3dd155fc9bf1b52',1,'database::PostgreSQL']]], + ['isrunning_8',['isRunning',['../class_kafka_consumer.html#a46990adceb2dd354969ab9df76ccf288',1,'KafkaConsumer']]] +]; diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js new file mode 100644 index 000000000..4c4904f71 --- /dev/null +++ b/docs/html/search/all_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['json_0',['json',['../config_8hpp.html#ab701e3ac61a85b337ec5c1abaad6742d',1,'config.hpp']]], + ['json_5fparser_2ehpp_1',['json_parser.hpp',['../json__parser_8hpp.html',1,'']]], + ['jsonparser_2',['JsonParser',['../class_json_parser.html',1,'']]] +]; diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js new file mode 100644 index 000000000..6c183185f --- /dev/null +++ b/docs/html/search/all_a.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['kafka_0',['kafka',['../struct_app_config.html#a6eabe866e9b2dded624221f90e6bec7f',1,'AppConfig']]], + ['kafka_5ftopic_1',['kafka_topic',['../struct_group_config.html#ae612e29e9519757dd70db5b75484e666',1,'GroupConfig']]], + ['kafkaconfig_2',['KafkaConfig',['../struct_kafka_config.html',1,'']]], + ['kafkaconsumer_3',['KafkaConsumer',['../class_kafka_consumer.html',1,'KafkaConsumer'],['../class_kafka_consumer.html#a11206b927d21acae545fb51b155d0b86',1,'KafkaConsumer::KafkaConsumer()']]], + ['kafkaproducer_4',['KafkaProducer',['../class_kafka_producer.html',1,'KafkaProducer'],['../class_kafka_producer.html#a7b50ec53a1b4e433a6674519376d8c27',1,'KafkaProducer::KafkaProducer()']]], + ['kpp_5',['kpp',['../structdatabase_1_1_client.html#af5fd482be6f1c6ac9af6a60d4fbbffe5',1,'database::Client']]] +]; diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js new file mode 100644 index 000000000..6723324fd --- /dev/null +++ b/docs/html/search/all_b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['level_0',['Level',['../class_logger.html#ad766a24576ea8b27ad9d5649cef46d8f',1,'Logger']]], + ['linger_5fms_1',['linger_ms',['../struct_kafka_config_1_1_producer.html#af52d43fd37e83b1fb83ff88832932025',1,'KafkaConfig::Producer']]], + ['load_2',['load',['../struct_app_config.html#ad5f556af8ec235c8f58b14d1125b9d23',1,'AppConfig']]], + ['logger_3',['Logger',['../class_logger.html',1,'']]], + ['logger_2ehpp_4',['logger.hpp',['../logger_8hpp.html',1,'']]], + ['logkafkamessage_5',['logKafkaMessage',['../classdatabase_1_1_postgre_s_q_l.html#af10309b83ba66fdfdbf86871653cbab7',1,'database::PostgreSQL']]] +]; diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js new file mode 100644 index 000000000..979c69daf --- /dev/null +++ b/docs/html/search/all_c.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['main_0',['main',['../main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main.cpp']]], + ['main_2ecpp_1',['main.cpp',['../main_8cpp.html',1,'']]], + ['marked_2',['marked',['../structdatabase_1_1_client.html#ad0fe81a6ecf278fe23d280e96cc308c7',1,'database::Client::marked'],['../structdatabase_1_1_product.html#acf8cf48c48ddc009d50b32934b24b6c8',1,'database::Product::marked']]], + ['markerror_3',['markError',['../class_message_cache.html#a765eefeba20b5cc7298a7d10def84903',1,'MessageCache']]], + ['marksent_4',['markSent',['../class_message_cache.html#a56f1f38d36817479eab94ada855e2e4e',1,'MessageCache']]], + ['max_5fworkers_5',['max_workers',['../struct_processing_config.html#ad5e444469cadb6aa3f141fed824fc2fb',1,'ProcessingConfig']]], + ['messagecache_6',['MessageCache',['../class_message_cache.html',1,'MessageCache'],['../class_message_cache.html#ad3ecc4f9d87a5f147db6eb8d02a83cd9',1,'MessageCache::MessageCache()']]], + ['messagecallback_7',['MessageCallback',['../class_kafka_consumer.html#a5a6cbea7cd95c9b71b9d99e2df550cbc',1,'KafkaConsumer']]], + ['mode_8',['mode',['../struct_app_config.html#a71293784add692e888b81f72d2e27a6a',1,'AppConfig']]] +]; diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js new file mode 100644 index 000000000..29fda7d41 --- /dev/null +++ b/docs/html/search/all_d.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['name_0',['name',['../struct_group_config.html#ab0a5a3b7ddd836ed4fb3708518ccaff4',1,'GroupConfig::name'],['../structdatabase_1_1_client.html#a9a61216ce80e3281eaef7cdd8657ec95',1,'database::Client::name'],['../structdatabase_1_1_product.html#a996eaac83fc96ed18f8638b3e3b7f627',1,'database::Product::name']]], + ['number_1',['number',['../struct_order_data.html#a4afa71012f565dd0bbf3de66eac82b96',1,'OrderData']]] +]; diff --git a/docs/html/search/all_e.js b/docs/html/search/all_e.js new file mode 100644 index 000000000..1edb101fb --- /dev/null +++ b/docs/html/search/all_e.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['order_5fprocessor_2ecpp_0',['order_processor.cpp',['../order__processor_8cpp.html',1,'']]], + ['order_5fprocessor_2ehpp_1',['order_processor.hpp',['../order__processor_8hpp.html',1,'']]], + ['orderdata_2',['OrderData',['../struct_order_data.html',1,'']]], + ['orderitem_3',['OrderItem',['../structdatabase_1_1_order_item.html',1,'database::OrderItem'],['../struct_order_item.html',1,'OrderItem']]], + ['orderprocessor_4',['OrderProcessor',['../class_order_processor.html',1,'OrderProcessor'],['../class_order_processor.html#a7686bf7d98b381b0fe4db4039766d255',1,'OrderProcessor::OrderProcessor()']]], + ['output_5',['output',['../struct_kafka_config_1_1_topics.html#a1f236a7912500d4677004e28fa94e8b7',1,'KafkaConfig::Topics']]] +]; diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js new file mode 100644 index 000000000..281e28019 --- /dev/null +++ b/docs/html/search/all_f.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['parsedirectory_0',['parseDirectory',['../class_json_parser.html#a8a166977a57546f86a930c0d0b0dc7da',1,'JsonParser']]], + ['parseorder_1',['parseOrder',['../class_json_parser.html#af18e9188a3948e4c5b3d9c17a76bcd74',1,'JsonParser']]], + ['parseorderfromstring_2',['parseOrderFromString',['../class_json_parser.html#a4489225b87ac5a0e5bf3a23d6207a361',1,'JsonParser']]], + ['password_3',['password',['../structdatabase_1_1_connection_params.html#ac5df7de1f780cee25408e4d5c310b0d1',1,'database::ConnectionParams']]], + ['path_4',['path',['../struct_cache_config.html#a906e9e3cebb56102ef80e04ae332b6b8',1,'CacheConfig']]], + ['port_5',['port',['../structdatabase_1_1_connection_params.html#a47cebdaa3263697a49a810e32126ddcb',1,'database::ConnectionParams']]], + ['postgresql_6',['PostgreSQL',['../classdatabase_1_1_postgre_s_q_l.html',1,'database::PostgreSQL'],['../classdatabase_1_1_postgre_s_q_l.html#afa4286fcc9ddb506fc30b9d934615b0f',1,'database::PostgreSQL::PostgreSQL()'],['../classdatabase_1_1_postgre_s_q_l.html#aa38b062a15f9d260deb2b39f8f72f8e7',1,'database::PostgreSQL::PostgreSQL(const ConnectionParams &params)']]], + ['postgresql_7',['postgresql',['../struct_database_config.html#a466fbc3aae51e96a09e18a610510ddda',1,'DatabaseConfig']]], + ['postgresql_2ecpp_8',['postgresql.cpp',['../postgresql_8cpp.html',1,'']]], + ['postgresql_2ehpp_9',['postgresql.hpp',['../postgresql_8hpp.html',1,'']]], + ['price_10',['price',['../structdatabase_1_1_order_item.html#afe42d8211d06bdba512bb3f49d6c1c6a',1,'database::OrderItem::price'],['../struct_order_item.html#a223b2394a34be9c984b29c23b6264801',1,'OrderItem::price']]], + ['processfiles_11',['processFiles',['../main_8cpp.html#a5bc44c4396b63ff16c6a74bb1c394478',1,'main.cpp']]], + ['processing_12',['processing',['../struct_app_config.html#a317a75e33b14b550d5037863dc12d6a9',1,'AppConfig']]], + ['processingconfig_13',['ProcessingConfig',['../struct_processing_config.html',1,'']]], + ['processmessage_14',['processMessage',['../class_order_processor.html#a6f8aa8e2aeb597be492065036c2f23f5',1,'OrderProcessor']]], + ['producer_15',['Producer',['../struct_kafka_config_1_1_producer.html',1,'KafkaConfig']]], + ['producer_16',['producer',['../struct_kafka_config.html#a44989757e6df2b612ba641b15444030a',1,'KafkaConfig']]], + ['producer_2ehpp_17',['producer.hpp',['../producer_8hpp.html',1,'']]], + ['producer_5fcount_18',['producer_count',['../main_8cpp.html#a658b214911501898d6087b601d6b152e',1,'main.cpp']]], + ['product_19',['Product',['../structdatabase_1_1_product.html',1,'database']]], + ['product_5fid_20',['product_id',['../structdatabase_1_1_order_item.html#ad66ee06cad1bfdc160fe922b89defac0',1,'database::OrderItem']]] +]; diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js new file mode 100644 index 000000000..188b4c8da --- /dev/null +++ b/docs/html/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['appconfig_0',['AppConfig',['../struct_app_config.html',1,'']]] +]; diff --git a/docs/html/search/classes_1.js b/docs/html/search/classes_1.js new file mode 100644 index 000000000..be0c8c9a6 --- /dev/null +++ b/docs/html/search/classes_1.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['cacheconfig_0',['CacheConfig',['../struct_cache_config.html',1,'']]], + ['client_1',['Client',['../structdatabase_1_1_client.html',1,'database']]], + ['connectionparams_2',['ConnectionParams',['../structdatabase_1_1_connection_params.html',1,'database']]], + ['consumer_3',['Consumer',['../struct_kafka_config_1_1_consumer.html',1,'KafkaConfig']]] +]; diff --git a/docs/html/search/classes_2.js b/docs/html/search/classes_2.js new file mode 100644 index 000000000..0f6c5ff81 --- /dev/null +++ b/docs/html/search/classes_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['databaseconfig_0',['DatabaseConfig',['../struct_database_config.html',1,'']]] +]; diff --git a/docs/html/search/classes_3.js b/docs/html/search/classes_3.js new file mode 100644 index 000000000..7a5098074 --- /dev/null +++ b/docs/html/search/classes_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['groupconfig_0',['GroupConfig',['../struct_group_config.html',1,'']]] +]; diff --git a/docs/html/search/classes_4.js b/docs/html/search/classes_4.js new file mode 100644 index 000000000..0689720a6 --- /dev/null +++ b/docs/html/search/classes_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['jsonparser_0',['JsonParser',['../class_json_parser.html',1,'']]] +]; diff --git a/docs/html/search/classes_5.js b/docs/html/search/classes_5.js new file mode 100644 index 000000000..d8aa1bb04 --- /dev/null +++ b/docs/html/search/classes_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['kafkaconfig_0',['KafkaConfig',['../struct_kafka_config.html',1,'']]], + ['kafkaconsumer_1',['KafkaConsumer',['../class_kafka_consumer.html',1,'']]], + ['kafkaproducer_2',['KafkaProducer',['../class_kafka_producer.html',1,'']]] +]; diff --git a/docs/html/search/classes_6.js b/docs/html/search/classes_6.js new file mode 100644 index 000000000..e89abac32 --- /dev/null +++ b/docs/html/search/classes_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['logger_0',['Logger',['../class_logger.html',1,'']]] +]; diff --git a/docs/html/search/classes_7.js b/docs/html/search/classes_7.js new file mode 100644 index 000000000..903ada21d --- /dev/null +++ b/docs/html/search/classes_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messagecache_0',['MessageCache',['../class_message_cache.html',1,'']]] +]; diff --git a/docs/html/search/classes_8.js b/docs/html/search/classes_8.js new file mode 100644 index 000000000..bf1497b09 --- /dev/null +++ b/docs/html/search/classes_8.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['orderdata_0',['OrderData',['../struct_order_data.html',1,'']]], + ['orderitem_1',['OrderItem',['../structdatabase_1_1_order_item.html',1,'database::OrderItem'],['../struct_order_item.html',1,'OrderItem']]], + ['orderprocessor_2',['OrderProcessor',['../class_order_processor.html',1,'']]] +]; diff --git a/docs/html/search/classes_9.js b/docs/html/search/classes_9.js new file mode 100644 index 000000000..839afe2fa --- /dev/null +++ b/docs/html/search/classes_9.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['postgresql_0',['PostgreSQL',['../classdatabase_1_1_postgre_s_q_l.html',1,'database']]], + ['processingconfig_1',['ProcessingConfig',['../struct_processing_config.html',1,'']]], + ['producer_2',['Producer',['../struct_kafka_config_1_1_producer.html',1,'KafkaConfig']]], + ['product_3',['Product',['../structdatabase_1_1_product.html',1,'database']]] +]; diff --git a/docs/html/search/classes_a.js b/docs/html/search/classes_a.js new file mode 100644 index 000000000..2a543534f --- /dev/null +++ b/docs/html/search/classes_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['topics_0',['Topics',['../struct_kafka_config_1_1_topics.html',1,'KafkaConfig']]] +]; diff --git a/docs/html/search/enums_0.js b/docs/html/search/enums_0.js new file mode 100644 index 000000000..f9deb3749 --- /dev/null +++ b/docs/html/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['level_0',['Level',['../class_logger.html#ad766a24576ea8b27ad9d5649cef46d8f',1,'Logger']]] +]; diff --git a/docs/html/search/enumvalues_0.js b/docs/html/search/enumvalues_0.js new file mode 100644 index 000000000..571324aed --- /dev/null +++ b/docs/html/search/enumvalues_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['debug_0',['DEBUG',['../class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fadc30ec20708ef7b0f641ef78b7880a15',1,'Logger']]] +]; diff --git a/docs/html/search/enumvalues_1.js b/docs/html/search/enumvalues_1.js new file mode 100644 index 000000000..3bd75d4f6 --- /dev/null +++ b/docs/html/search/enumvalues_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['error_0',['ERROR',['../class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fabb1ca97ec761fc37101737ba0aa2e7c5',1,'Logger']]] +]; diff --git a/docs/html/search/enumvalues_2.js b/docs/html/search/enumvalues_2.js new file mode 100644 index 000000000..1064b75a8 --- /dev/null +++ b/docs/html/search/enumvalues_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['info_0',['INFO',['../class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fa551b723eafd6a31d444fcb2f5920fbd3',1,'Logger']]] +]; diff --git a/docs/html/search/enumvalues_3.js b/docs/html/search/enumvalues_3.js new file mode 100644 index 000000000..be7676120 --- /dev/null +++ b/docs/html/search/enumvalues_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['warning_0',['WARNING',['../class_logger.html#ad766a24576ea8b27ad9d5649cef46d8fa059e9861e0400dfbe05c98a841f3f96b',1,'Logger']]] +]; diff --git a/docs/html/search/files_0.js b/docs/html/search/files_0.js new file mode 100644 index 000000000..7edc2c0be --- /dev/null +++ b/docs/html/search/files_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['config_2ehpp_0',['config.hpp',['../config_8hpp.html',1,'']]], + ['consumer_2ecpp_1',['consumer.cpp',['../consumer_8cpp.html',1,'']]], + ['consumer_2ehpp_2',['consumer.hpp',['../consumer_8hpp.html',1,'']]] +]; diff --git a/docs/html/search/files_1.js b/docs/html/search/files_1.js new file mode 100644 index 000000000..9cdce11ce --- /dev/null +++ b/docs/html/search/files_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['json_5fparser_2ehpp_0',['json_parser.hpp',['../json__parser_8hpp.html',1,'']]] +]; diff --git a/docs/html/search/files_2.js b/docs/html/search/files_2.js new file mode 100644 index 000000000..e99b7d388 --- /dev/null +++ b/docs/html/search/files_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['logger_2ehpp_0',['logger.hpp',['../logger_8hpp.html',1,'']]] +]; diff --git a/docs/html/search/files_3.js b/docs/html/search/files_3.js new file mode 100644 index 000000000..695b4fda3 --- /dev/null +++ b/docs/html/search/files_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['main_2ecpp_0',['main.cpp',['../main_8cpp.html',1,'']]] +]; diff --git a/docs/html/search/files_4.js b/docs/html/search/files_4.js new file mode 100644 index 000000000..a5755197f --- /dev/null +++ b/docs/html/search/files_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['order_5fprocessor_2ecpp_0',['order_processor.cpp',['../order__processor_8cpp.html',1,'']]], + ['order_5fprocessor_2ehpp_1',['order_processor.hpp',['../order__processor_8hpp.html',1,'']]] +]; diff --git a/docs/html/search/files_5.js b/docs/html/search/files_5.js new file mode 100644 index 000000000..5ec132975 --- /dev/null +++ b/docs/html/search/files_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['postgresql_2ecpp_0',['postgresql.cpp',['../postgresql_8cpp.html',1,'']]], + ['postgresql_2ehpp_1',['postgresql.hpp',['../postgresql_8hpp.html',1,'']]], + ['producer_2ehpp_2',['producer.hpp',['../producer_8hpp.html',1,'']]] +]; diff --git a/docs/html/search/files_6.js b/docs/html/search/files_6.js new file mode 100644 index 000000000..c22729725 --- /dev/null +++ b/docs/html/search/files_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['sqlite_5fcache_2ehpp_0',['sqlite_cache.hpp',['../sqlite__cache_8hpp.html',1,'']]] +]; diff --git a/docs/html/search/files_7.js b/docs/html/search/files_7.js new file mode 100644 index 000000000..19f532536 --- /dev/null +++ b/docs/html/search/files_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['uuid_2ehpp_0',['uuid.hpp',['../uuid_8hpp.html',1,'']]] +]; diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js new file mode 100644 index 000000000..713bf1092 --- /dev/null +++ b/docs/html/search/functions_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['cleanup_0',['cleanup',['../class_message_cache.html#a50c216e984ae61005f4daf4b8c124a22',1,'MessageCache']]], + ['connect_1',['connect',['../classdatabase_1_1_postgre_s_q_l.html#a785b7fa2f3259b5258c06bfbd9e8b2c3',1,'database::PostgreSQL']]], + ['connectionstring_2',['connectionString',['../structdatabase_1_1_connection_params.html#adf642f06affe1750bd495f50fee2241d',1,'database::ConnectionParams']]], + ['createclient_3',['createClient',['../classdatabase_1_1_postgre_s_q_l.html#ac22c54f52920ec67e8579bb70f360949',1,'database::PostgreSQL']]], + ['createorder_4',['createOrder',['../classdatabase_1_1_postgre_s_q_l.html#a6773124fa34e1abd8758791867453058',1,'database::PostgreSQL']]] +]; diff --git a/docs/html/search/functions_1.js b/docs/html/search/functions_1.js new file mode 100644 index 000000000..5a860969d --- /dev/null +++ b/docs/html/search/functions_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['debug_0',['debug',['../class_logger.html#aed78385ee0ad9d124521735894abab46',1,'Logger']]], + ['disconnect_1',['disconnect',['../classdatabase_1_1_postgre_s_q_l.html#af41a6c8beb9e194a4c1bdfa346d0712d',1,'database::PostgreSQL']]] +]; diff --git a/docs/html/search/functions_10.js b/docs/html/search/functions_10.js new file mode 100644 index 000000000..f25d3b355 --- /dev/null +++ b/docs/html/search/functions_10.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['warning_0',['warning',['../class_logger.html#a5025d14c1f40cc23e9cbb48f98f0d9a6',1,'Logger']]] +]; diff --git a/docs/html/search/functions_11.js b/docs/html/search/functions_11.js new file mode 100644 index 000000000..b1c87928b --- /dev/null +++ b/docs/html/search/functions_11.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['_7ekafkaconsumer_0',['~KafkaConsumer',['../class_kafka_consumer.html#a4dd0e33f7341f6de09f7f470fa785dca',1,'KafkaConsumer']]], + ['_7ekafkaproducer_1',['~KafkaProducer',['../class_kafka_producer.html#acb41ef37ae06e2f660fcc38e614843ce',1,'KafkaProducer']]], + ['_7emessagecache_2',['~MessageCache',['../class_message_cache.html#a6ba6cafac1143389d777172aed9f9fbd',1,'MessageCache']]], + ['_7epostgresql_3',['~PostgreSQL',['../classdatabase_1_1_postgre_s_q_l.html#a372a7ea6dc198d0ed42190d114980e39',1,'database::PostgreSQL']]] +]; diff --git a/docs/html/search/functions_2.js b/docs/html/search/functions_2.js new file mode 100644 index 000000000..0d7add431 --- /dev/null +++ b/docs/html/search/functions_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['error_0',['error',['../class_logger.html#aafe8b4f6ed1259fbde150ab59e0785e7',1,'Logger']]], + ['execute_1',['execute',['../classdatabase_1_1_postgre_s_q_l.html#aae16b58e807cbaf423edb361275dc018',1,'database::PostgreSQL']]], + ['executeparams_2',['executeParams',['../classdatabase_1_1_postgre_s_q_l.html#a1b682272e817f53fe4f0ccfcb727e253',1,'database::PostgreSQL']]] +]; diff --git a/docs/html/search/functions_3.js b/docs/html/search/functions_3.js new file mode 100644 index 000000000..6fd548f51 --- /dev/null +++ b/docs/html/search/functions_3.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['findclient_0',['findClient',['../classdatabase_1_1_postgre_s_q_l.html#a78e26c9484a4cda19507c89600f609b6',1,'database::PostgreSQL']]], + ['findproductbyarticle_1',['findProductByArticle',['../classdatabase_1_1_postgre_s_q_l.html#a4a090045c1149fcfef8b05415d41e6fb',1,'database::PostgreSQL']]], + ['flush_2',['flush',['../class_kafka_producer.html#a6266bb25d0bbec95a32243d88006ea55',1,'KafkaProducer']]], + ['fromjson_3',['fromJson',['../struct_order_data.html#a3e88570de45cee6e214655aa12ed42f3',1,'OrderData::fromJson(const std::string &json_str)'],['../struct_order_data.html#a5765541bdbee66eba9de94aaf95f22b5',1,'OrderData::fromJson(const json &j)']]] +]; diff --git a/docs/html/search/functions_4.js b/docs/html/search/functions_4.js new file mode 100644 index 000000000..01d3028e5 --- /dev/null +++ b/docs/html/search/functions_4.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['generateuuid_0',['generateUUID',['../namespaceutils.html#adbc7a6520ceec292a43e3b89c7efba92',1,'utils']]], + ['getfailedcount_1',['getFailedCount',['../class_kafka_producer.html#a93934ddc34c83e74fd7adb110c1b3f2c',1,'KafkaProducer']]], + ['getjsonfiles_2',['getJsonFiles',['../main_8cpp.html#a5a216c3284e0a72fe4f8101cd8b12b60',1,'main.cpp']]], + ['getpendingcount_3',['getPendingCount',['../class_message_cache.html#ab3729d708193c6be1460fb7a2860e03a',1,'MessageCache']]], + ['getpendingmessages_4',['getPendingMessages',['../class_message_cache.html#a201b93a9b56bc038a470a05483566e55',1,'MessageCache']]], + ['getsentcount_5',['getSentCount',['../class_kafka_producer.html#a8f20c25ada021053e6a9752b6ebe3cad',1,'KafkaProducer']]], + ['gettotalcount_6',['getTotalCount',['../class_message_cache.html#aba79bed3c66e3fe011ae25ed45bb9f8b',1,'MessageCache']]] +]; diff --git a/docs/html/search/functions_5.js b/docs/html/search/functions_5.js new file mode 100644 index 000000000..de786fb60 --- /dev/null +++ b/docs/html/search/functions_5.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['info_0',['info',['../class_logger.html#a474176e6966186566a2a321cb5cbd739',1,'Logger']]], + ['init_1',['init',['../class_message_cache.html#ae986415d8621c4d18493379325ce04cc',1,'MessageCache::init()'],['../class_kafka_consumer.html#ad3e3608060a00e4429a2e14d24ad09c8',1,'KafkaConsumer::init()'],['../class_kafka_producer.html#a6012cf74b1de379e1110c0db1690b64c',1,'KafkaProducer::init()']]], + ['isconnected_2',['isConnected',['../classdatabase_1_1_postgre_s_q_l.html#af9b6445361883ff9a3dd155fc9bf1b52',1,'database::PostgreSQL']]], + ['isrunning_3',['isRunning',['../class_kafka_consumer.html#a46990adceb2dd354969ab9df76ccf288',1,'KafkaConsumer']]] +]; diff --git a/docs/html/search/functions_6.js b/docs/html/search/functions_6.js new file mode 100644 index 000000000..45f611946 --- /dev/null +++ b/docs/html/search/functions_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['kafkaconsumer_0',['KafkaConsumer',['../class_kafka_consumer.html#a11206b927d21acae545fb51b155d0b86',1,'KafkaConsumer']]], + ['kafkaproducer_1',['KafkaProducer',['../class_kafka_producer.html#a7b50ec53a1b4e433a6674519376d8c27',1,'KafkaProducer']]] +]; diff --git a/docs/html/search/functions_7.js b/docs/html/search/functions_7.js new file mode 100644 index 000000000..d70cb64ca --- /dev/null +++ b/docs/html/search/functions_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['load_0',['load',['../struct_app_config.html#ad5f556af8ec235c8f58b14d1125b9d23',1,'AppConfig']]], + ['logkafkamessage_1',['logKafkaMessage',['../classdatabase_1_1_postgre_s_q_l.html#af10309b83ba66fdfdbf86871653cbab7',1,'database::PostgreSQL']]] +]; diff --git a/docs/html/search/functions_8.js b/docs/html/search/functions_8.js new file mode 100644 index 000000000..980d5a59d --- /dev/null +++ b/docs/html/search/functions_8.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['main_0',['main',['../main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main.cpp']]], + ['markerror_1',['markError',['../class_message_cache.html#a765eefeba20b5cc7298a7d10def84903',1,'MessageCache']]], + ['marksent_2',['markSent',['../class_message_cache.html#a56f1f38d36817479eab94ada855e2e4e',1,'MessageCache']]], + ['messagecache_3',['MessageCache',['../class_message_cache.html#ad3ecc4f9d87a5f147db6eb8d02a83cd9',1,'MessageCache']]] +]; diff --git a/docs/html/search/functions_9.js b/docs/html/search/functions_9.js new file mode 100644 index 000000000..dce49d72c --- /dev/null +++ b/docs/html/search/functions_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['orderprocessor_0',['OrderProcessor',['../class_order_processor.html#a7686bf7d98b381b0fe4db4039766d255',1,'OrderProcessor']]] +]; diff --git a/docs/html/search/functions_a.js b/docs/html/search/functions_a.js new file mode 100644 index 000000000..78c4d1764 --- /dev/null +++ b/docs/html/search/functions_a.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['parsedirectory_0',['parseDirectory',['../class_json_parser.html#a8a166977a57546f86a930c0d0b0dc7da',1,'JsonParser']]], + ['parseorder_1',['parseOrder',['../class_json_parser.html#af18e9188a3948e4c5b3d9c17a76bcd74',1,'JsonParser']]], + ['parseorderfromstring_2',['parseOrderFromString',['../class_json_parser.html#a4489225b87ac5a0e5bf3a23d6207a361',1,'JsonParser']]], + ['postgresql_3',['PostgreSQL',['../classdatabase_1_1_postgre_s_q_l.html#afa4286fcc9ddb506fc30b9d934615b0f',1,'database::PostgreSQL::PostgreSQL()'],['../classdatabase_1_1_postgre_s_q_l.html#aa38b062a15f9d260deb2b39f8f72f8e7',1,'database::PostgreSQL::PostgreSQL(const ConnectionParams &params)']]], + ['processfiles_4',['processFiles',['../main_8cpp.html#a5bc44c4396b63ff16c6a74bb1c394478',1,'main.cpp']]], + ['processmessage_5',['processMessage',['../class_order_processor.html#a6f8aa8e2aeb597be492065036c2f23f5',1,'OrderProcessor']]] +]; diff --git a/docs/html/search/functions_b.js b/docs/html/search/functions_b.js new file mode 100644 index 000000000..d47b0d021 --- /dev/null +++ b/docs/html/search/functions_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['query_0',['query',['../classdatabase_1_1_postgre_s_q_l.html#a95022441d5201d81365056c401ec2474',1,'database::PostgreSQL']]] +]; diff --git a/docs/html/search/functions_c.js b/docs/html/search/functions_c.js new file mode 100644 index 000000000..0b96945c0 --- /dev/null +++ b/docs/html/search/functions_c.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['removesent_0',['removeSent',['../class_message_cache.html#a6e8847a867b6750273845c3a6ca57c65',1,'MessageCache']]], + ['reprocesspendingmessages_1',['reprocessPendingMessages',['../class_order_processor.html#af7a710bdbf4bd5c4578db73437477a5f',1,'OrderProcessor']]], + ['runconsumer_2',['runConsumer',['../main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854',1,'main.cpp']]], + ['runproducer_3',['runProducer',['../main_8cpp.html#a046be377067f3f52c8b9516cdb1e47b5',1,'main.cpp']]] +]; diff --git a/docs/html/search/functions_d.js b/docs/html/search/functions_d.js new file mode 100644 index 000000000..fc71a4b8b --- /dev/null +++ b/docs/html/search/functions_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['save_0',['save',['../class_message_cache.html#a699e48cdd16aaf9e8a67d25d30925a24',1,'MessageCache']]], + ['send_1',['send',['../class_kafka_producer.html#a5c01eb2a998310bbfe16ebc77666af8f',1,'KafkaProducer::send(const std::string &message)'],['../class_kafka_producer.html#afcc3fa74dced31f8fab9bb198a26414e',1,'KafkaProducer::send(const std::string &key, const std::string &message)']]], + ['setdeliverycallback_2',['setDeliveryCallback',['../class_kafka_producer.html#a848df41ef97ff523fc21c3b12285c26c',1,'KafkaProducer']]], + ['setlevel_3',['setLevel',['../class_logger.html#a57acd0f5576b2f784d3c42a6e99c230b',1,'Logger']]], + ['setmessagecallback_4',['setMessageCallback',['../class_kafka_consumer.html#a21535be303ced919722a21c8a10646ba',1,'KafkaConsumer']]], + ['setreprocessdelay_5',['setReprocessDelay',['../class_message_cache.html#abe7996aada9f77e39d9ed2d830dcddb9',1,'MessageCache']]], + ['setsourceprefix_6',['setSourcePrefix',['../class_message_cache.html#a7d8db594bd5c90375565decd61911596',1,'MessageCache']]], + ['signalhandler_7',['signalHandler',['../main_8cpp.html#ad2e59c7203b3bddc1bc9a2224b52e8e7',1,'main.cpp']]], + ['start_8',['start',['../class_kafka_consumer.html#a56ee2ca2d7d35993b23f95d1dee846c1',1,'KafkaConsumer']]], + ['stop_9',['stop',['../class_kafka_consumer.html#a4b681b6d27e4cb550a35f61c7acf279a',1,'KafkaConsumer']]] +]; diff --git a/docs/html/search/functions_e.js b/docs/html/search/functions_e.js new file mode 100644 index 000000000..d603f6f32 --- /dev/null +++ b/docs/html/search/functions_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['tojson_0',['toJson',['../struct_order_data.html#adb304d757a97f88a8b0a9e33339ca2f9',1,'OrderData']]] +]; diff --git a/docs/html/search/functions_f.js b/docs/html/search/functions_f.js new file mode 100644 index 000000000..387435274 --- /dev/null +++ b/docs/html/search/functions_f.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['validate_0',['validate',['../class_json_parser.html#a1d6b83be5c0757b3a628a7c1737e4628',1,'JsonParser']]] +]; diff --git a/docs/html/search/namespaces_0.js b/docs/html/search/namespaces_0.js new file mode 100644 index 000000000..6fafd9d3b --- /dev/null +++ b/docs/html/search/namespaces_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['database_0',['database',['../namespacedatabase.html',1,'']]] +]; diff --git a/docs/html/search/namespaces_1.js b/docs/html/search/namespaces_1.js new file mode 100644 index 000000000..c76a02deb --- /dev/null +++ b/docs/html/search/namespaces_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['utils_0',['utils',['../namespaceutils.html',1,'']]] +]; diff --git a/docs/html/search/search.css b/docs/html/search/search.css new file mode 100644 index 000000000..043d32d98 --- /dev/null +++ b/docs/html/search/search.css @@ -0,0 +1,377 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 43px; + margin-right: 0; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + border: 1px solid var(--search-box-border-color); + z-index: 102; + margin-right: 4px; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.6em; +} + +#MSearchField { + display: inline-block; + vertical-align: top; + width: 7.5em; + height: 22px; + margin: 0 0 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.6em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + margin: 6px 0 0 4px; +} + +.close-icon { + width: 11px; + height: 11px; + background-color: var(--search-close-icon-bg-color); + border-radius: 50%; + position: relative; + display: flex; + justify-content: center; + align-items: center; + box-sizing: content-box; +} + +.close-icon:before, +.close-icon:after { + content: ''; + position: absolute; + width: 7px; + height: 1px; + background-color: var(--search-close-icon-fg-color); +} + +.close-icon:before { + transform: rotate(45deg); +} + +.close-icon:after { + transform: rotate(-45deg); +} + + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + +.search-icon { + width: 20px; + height: 20px; + display: inline-block; + position: relative; + margin-left: 3px; +} + +#MSearchSelectExt.search-icon { + width: 10px; +} + +#MSearchSelectExt + input { + margin-left: 5px; +} + +.search-icon::before, .search-icon::after { + content: ''; + position: absolute; + border: 1.5px solid var(--search-foreground-color); + box-sizing: content-box; +} + +.search-icon::before { + width: 6px; + height: 6px; + border-radius: 50%; + top: 7px; + left: 2px; + background: var(--search-background-color); +} + +.search-icon::after { + border: 1px solid var(--search-foreground-color); + width: 0px; + height: 3px; + border-radius: 2px; + top: 15px; + left: 8px; + transform: rotate(-45deg); + transform-origin: top left; +} + +.search-icon-dropdown { + content: ''; + width: 0; + height: 0; + border-left: 3px solid transparent; + border-right: 3px solid transparent; + border-top: 3px solid var(--search-foreground-color); + top: 8px; + left: 15px; + transform: translateX(-50%); + position: absolute; +} + + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + backdrop-filter: var(--search-filter-backdrop-filter); + -webkit-backdrop-filter: var(--search-filter-backdrop-filter); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + border-radius: 4px; +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: auto; + right: 4px; + top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + backdrop-filter: var(--search-results-backdrop-filter); + -webkit-backdrop-filter: var(--search-results-backdrop-filter); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; + border-radius: 8px; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResults; + box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); +} + + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 10pt; + padding: 2px 5px; +} + +div.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +#searchBoxPos1 dark-mode-toggle { + margin-top: 4px; +} + +/*---------------- External search page results */ + +.pages b { + color: var(--nav-foreground-color); + padding: 5px 5px 3px 5px; + background-color: var(--nav-menu-active-bg); + border-radius: 4px; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/docs/html/search/search.js b/docs/html/search/search.js new file mode 100644 index 000000000..dc14410fb --- /dev/null +++ b/docs/html/search/search.js @@ -0,0 +1,708 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +const SEARCH_COOKIE_NAME = ''+'search_grp'; + +const searchResults = new SearchResults(); + +/* A class handling everything associated with the search panel. + + Parameters: + name - The name of the global variable that will be + storing this instance. Is needed to be able to set timeouts. + resultPath - path to use for external files +*/ +function SearchBox(name, resultsPath, extension) { + if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } + + function getXPos(item) { + let x = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + x += item.offsetLeft; + item = item.offsetParent; + } + } + return x; + } + + function getYPos(item) { + let y = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + y += item.offsetTop; + item = item.offsetParent; + } + } + return y; + } + + // ---------- Instance variables + this.name = name; + this.resultsPath = resultsPath; + this.keyTimeout = 0; + this.keyTimeoutLength = 500; + this.closeSelectionTimeout = 300; + this.lastSearchValue = ""; + this.lastResultsPage = ""; + this.hideTimeout = 0; + this.searchIndex = 0; + this.searchActive = false; + this.extension = extension; + + // ----------- DOM Elements + + this.DOMSearchField = () => document.getElementById("MSearchField"); + this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); + this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); + this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); + this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); + this.DOMSearchClose = () => document.getElementById("MSearchClose"); + this.DOMSearchBox = () => document.getElementById("MSearchBox"); + + // ------------ Event Handlers + + // Called when focus is added or removed from the search field. + this.OnSearchFieldFocus = function(isActive) { + this.Activate(isActive); + } + + this.OnSearchSelectShow = function() { + const searchSelectWindow = this.DOMSearchSelectWindow(); + const searchField = this.DOMSearchSelect(); + + const left = getXPos(searchField); + const top = getYPos(searchField) + searchField.offsetHeight; + + // show search selection popup + searchSelectWindow.style.display='block'; + searchSelectWindow.style.left = left + 'px'; + searchSelectWindow.style.top = top + 'px'; + + // stop selection hide timer + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + this.hideTimeout=0; + } + return false; // to avoid "image drag" default event + } + + this.OnSearchSelectHide = function() { + this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), + this.closeSelectionTimeout); + } + + // Called when the content of the search field is changed. + this.OnSearchFieldChange = function(evt) { + if (this.keyTimeout) { // kill running timer + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + } + + const e = evt ? evt : window.event; // for IE + if (e.keyCode==40 || e.keyCode==13) { + if (e.shiftKey==1) { + this.OnSearchSelectShow(); + const win=this.DOMSearchSelectWindow(); + for (let i=0;i do a search + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) { // Up + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } else if (e.keyCode==13 || e.keyCode==27) { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() { + this.keyTimeout = 0; + + // strip leading whitespace + const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + const code = searchValue.toLowerCase().charCodeAt(0); + let idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair + idxChar = searchValue.substr(0, 2); + } + + let jsFile; + let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + const hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + const loadJS = function(url, impl, loc) { + const scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + const domSearchBox = this.DOMSearchBox(); + const domPopupSearchResults = this.DOMPopupSearchResults(); + const domSearchClose = this.DOMSearchClose(); + const resultsPath = this.resultsPath; + + const handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') { + domSearchClose.style.display = 'inline-block'; + let left = getXPos(domSearchBox) + 150; + let top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + const maxWidth = document.body.clientWidth; + const maxHeight = document.body.clientHeight; + let width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + let height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } else if (!isActive) { // directly remove the panel + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults() { + + function convertToId(search) { + let result = ''; + for (let i=0;i. + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) { + const parentElement = document.getElementById(id); + let element = parentElement.firstChild; + + while (element && element!=parentElement) { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { + element = element.firstChild; + } else if (element.nextSibling) { + element = element.nextSibling; + } else { + do { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) { + const element = this.FindChildElement(id); + if (element) { + if (element.style.display == 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) { + if (!search) { // get search word from URL + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + const resultRows = document.getElementsByTagName("div"); + let matches = 0; + + let i = 0; + while (i < resultRows.length) { + const row = resultRows.item(i); + if (row.className == "SRResult") { + let rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) { + row.style.display = 'block'; + matches++; + } else { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) { // no results + document.getElementById("NoMatches").style.display='block'; + } else { // at least one result + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) { + if (e.type == "keydown") { + this.repeatOn = false; + this.lastKey = e.keyCode; + } else if (e.type == "keypress") { + if (!this.repeatOn) { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } else if (e.type == "keyup") { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + const newIndex = itemIndex-1; + let focusItem = this.NavPrev(newIndex); + if (focusItem) { + let child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') { // children visible + let n=0; + let tmpElem; + for (;;) { // search for last child + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) { + focusItem = tmpElem; + } else { // found it! + break; + } + n++; + } + } + } + if (focusItem) { + focusItem.focus(); + } else { // return focus to search field + document.getElementById("MSearchField").focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = itemIndex+1; + let focusItem; + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') { // children visible + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } else if (this.lastKey==39) { // Right + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } else if (this.lastKey==37) { // Left + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + if (childIndex>0) { + const newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } else { // already at first child, jump to parent + document.getElementById('Item'+itemIndex).focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = childIndex+1; + let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) { // last child, jump to parent next parent + elem = this.NavNext(itemIndex+1); + } + if (elem) { + elem.focus(); + } + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } +} + +function createResults(resultsPath) { + + function setKeyActions(elem,action) { + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); + } + + function setClassAttr(elem,attr) { + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); + } + + const decodeHtml = (html) => { + const txt = document.createElement("textarea"); + txt.innerHTML = html; + return txt.value; + }; + + const results = document.getElementById("SRResults"); + results.innerHTML = ''; + searchData.forEach((elem,index) => { + const id = elem[0]; + const srResult = document.createElement('div'); + srResult.setAttribute('id','SR_'+id); + setClassAttr(srResult,'SRResult'); + const srEntry = document.createElement('div'); + setClassAttr(srEntry,'SREntry'); + const srLink = document.createElement('a'); + srLink.setAttribute('id','Item'+index); + setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); + setClassAttr(srLink,'SRSymbol'); + srLink.innerHTML = decodeHtml(elem[1][0]); + srEntry.appendChild(srLink); + if (elem[1].length==2) { // single result + if (elem[1][1][0].startsWith('http://') || elem[1][1][0].startsWith('https://')) { // absolute path + srLink.setAttribute('href',elem[1][1][0]); + } else { // relative path + srLink.setAttribute('href',resultsPath+elem[1][1][0]); + } + srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); + if (elem[1][1][1]) { + srLink.setAttribute('target','_parent'); + } else { + srLink.setAttribute('target','_blank'); + } + const srScope = document.createElement('span'); + setClassAttr(srScope,'SRScope'); + srScope.innerHTML = decodeHtml(elem[1][1][2]); + srEntry.appendChild(srScope); + } else { // multiple results + srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); + const srChildren = document.createElement('div'); + setClassAttr(srChildren,'SRChildren'); + for (let c=0; c + + + + + + +Kafka-1C Connector: Файл src/cache/sqlite_cache.hpp + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Файл sqlite_cache.hpp
    +
    +
    +
    #include <sqlite3.h>
    +#include <string>
    +#include <vector>
    +#include <tuple>
    +#include <mutex>
    +#include <functional>
    +
    +Граф включаемых заголовочных файлов для sqlite_cache.hpp:
    +
    +
    + + + + + + + + + + + + + + + +
    +
    +Граф файлов, в которые включается этот файл:
    +
    +
    + + + + + + + + + + +
    +
    +

    См. исходные тексты.

    + + + +

    +Классы

    class  MessageCache
    +
    +
    + +
    + + + + diff --git a/docs/html/sqlite__cache_8hpp.js b/docs/html/sqlite__cache_8hpp.js new file mode 100644 index 000000000..05c131837 --- /dev/null +++ b/docs/html/sqlite__cache_8hpp.js @@ -0,0 +1,4 @@ +var sqlite__cache_8hpp = +[ + [ "MessageCache", "class_message_cache.html", "class_message_cache" ] +]; \ No newline at end of file diff --git a/docs/html/sqlite__cache_8hpp__dep__incl.dot b/docs/html/sqlite__cache_8hpp__dep__incl.dot new file mode 100644 index 000000000..a73f8f3bc --- /dev/null +++ b/docs/html/sqlite__cache_8hpp__dep__incl.dot @@ -0,0 +1,15 @@ +digraph "src/cache/sqlite_cache.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/cache/sqlite_cache.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="src/main.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="src/processor/order\l_processor.hpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$order__processor_8hpp.html",tooltip=" "]; + Node3 -> Node2 [id="edge3_Node000003_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 -> Node4 [id="edge4_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="src/processor/order\l_processor.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$order__processor_8cpp.html",tooltip=" "]; +} diff --git a/docs/html/sqlite__cache_8hpp__dep__incl.map b/docs/html/sqlite__cache_8hpp__dep__incl.map new file mode 100644 index 000000000..a106e9b7e --- /dev/null +++ b/docs/html/sqlite__cache_8hpp__dep__incl.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/html/sqlite__cache_8hpp__dep__incl.md5 b/docs/html/sqlite__cache_8hpp__dep__incl.md5 new file mode 100644 index 000000000..03ff3b813 --- /dev/null +++ b/docs/html/sqlite__cache_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +8e59157e95214defbd666f685d150cfe \ No newline at end of file diff --git a/docs/html/sqlite__cache_8hpp__dep__incl.png b/docs/html/sqlite__cache_8hpp__dep__incl.png new file mode 100644 index 000000000..2cc11e8fe Binary files /dev/null and b/docs/html/sqlite__cache_8hpp__dep__incl.png differ diff --git a/docs/html/sqlite__cache_8hpp__incl.dot b/docs/html/sqlite__cache_8hpp__incl.dot new file mode 100644 index 000000000..7e18bffa1 --- /dev/null +++ b/docs/html/sqlite__cache_8hpp__incl.dot @@ -0,0 +1,20 @@ +digraph "src/cache/sqlite_cache.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/cache/sqlite_cache.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="sqlite3.h",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="string",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="vector",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="tuple",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node6 [id="edge5_Node000001_Node000006",color="steelblue1",style="solid",tooltip=" "]; + Node6 [id="Node000006",label="mutex",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node7 [id="edge6_Node000001_Node000007",color="steelblue1",style="solid",tooltip=" "]; + Node7 [id="Node000007",label="functional",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; +} diff --git a/docs/html/sqlite__cache_8hpp__incl.map b/docs/html/sqlite__cache_8hpp__incl.map new file mode 100644 index 000000000..9d3bc0ce0 --- /dev/null +++ b/docs/html/sqlite__cache_8hpp__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/html/sqlite__cache_8hpp__incl.md5 b/docs/html/sqlite__cache_8hpp__incl.md5 new file mode 100644 index 000000000..ec2d41d68 --- /dev/null +++ b/docs/html/sqlite__cache_8hpp__incl.md5 @@ -0,0 +1 @@ +634b1f54cca40f45629ca621f73a1fa4 \ No newline at end of file diff --git a/docs/html/sqlite__cache_8hpp__incl.png b/docs/html/sqlite__cache_8hpp__incl.png new file mode 100644 index 000000000..ac5ff68f1 Binary files /dev/null and b/docs/html/sqlite__cache_8hpp__incl.png differ diff --git a/docs/html/sqlite__cache_8hpp_source.html b/docs/html/sqlite__cache_8hpp_source.html new file mode 100644 index 000000000..42c333da5 --- /dev/null +++ b/docs/html/sqlite__cache_8hpp_source.html @@ -0,0 +1,212 @@ + + + + + + + +Kafka-1C Connector: Исходный файл src/cache/sqlite_cache.hpp + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    sqlite_cache.hpp
    +
    +
    +См. документацию.
    1#pragma once
    +
    2
    +
    3#include <sqlite3.h>
    +
    4#include <string>
    +
    5#include <vector>
    +
    6#include <tuple>
    +
    7#include <mutex>
    +
    8#include <functional> // <-- ДОБАВЛЯЕМ ЭТУ СТРОКУ
    +
    9
    +
    10// ============================================================
    +
    11// Класс: MessageCache
    +
    12// Хранит сообщения в SQLite для надежности
    +
    13// ============================================================
    +
    + +
    15{
    +
    16public:
    +
    17 MessageCache(const std::string &db_path);
    + +
    19
    +
    20 // Инициализация БД (создание таблиц)
    +
    21 bool init();
    +
    22
    +
    23 // Сохранить сообщение перед отправкой
    +
    24 bool save(const std::string &filename, const std::string &topic,
    +
    25 const std::string &message, const std::string &tin = "",
    +
    26 const std::string &trrc = "", const std::string &source = "");
    +
    27
    +
    28 void setSourcePrefix(const std::string &prefix) { source_prefix_ = prefix; }
    +
    29 void setReprocessDelay(int seconds) { reprocess_delay_seconds_ = seconds; }
    +
    30
    +
    31 // Отметить сообщение как отправленное
    +
    32 bool markSent(int64_t id);
    +
    33
    +
    34 // Отметить сообщение как ошибочное
    +
    35 bool markError(int64_t id, const std::string &error);
    +
    36
    +
    37 // Получить ожидающие отправки сообщения
    +
    38 std::vector<std::tuple<int64_t, std::string, std::string, std::string>>
    +
    39 getPendingMessages(int limit = 100);
    +
    40
    +
    41 // Удалить отправленные сообщения
    +
    42 bool removeSent();
    +
    43
    +
    44 // Очистка старых записей (старше N дней)
    +
    45 void cleanup(int days = 7);
    +
    46
    +
    47 // Статистика
    +
    48 size_t getPendingCount(); // Сколько ожидает отправки
    +
    49 size_t getTotalCount(); // Всего записей в БД
    +
    50
    +
    51private:
    +
    52 std::string db_path_; // Путь к файлу БД
    +
    53 sqlite3 *db_; // Указатель на БД
    +
    54 std::mutex mutex_; // Мьютекс для потокобезопасности
    +
    55 std::string source_prefix_;
    +
    56 int reprocess_delay_seconds_ = 0;
    +
    57
    +
    58 // Выполнить SQL запрос (без результата)
    +
    59 bool execute(const std::string &sql);
    +
    60
    +
    61 // Подготовить и выполнить запрос с параметрами
    +
    62 bool prepareAndExecute(const std::string &sql,
    +
    63 std::function<void(sqlite3_stmt *)> binder);
    +
    64};
    +
    +
    std::vector< std::tuple< int64_t, std::string, std::string, std::string > > getPendingMessages(int limit=100)
    +
    void cleanup(int days=7)
    +
    bool markSent(int64_t id)
    +
    bool save(const std::string &filename, const std::string &topic, const std::string &message, const std::string &tin="", const std::string &trrc="", const std::string &source="")
    + +
    bool removeSent()
    +
    bool markError(int64_t id, const std::string &error)
    +
    void setSourcePrefix(const std::string &prefix)
    Определения sqlite_cache.hpp:28
    +
    size_t getPendingCount()
    +
    size_t getTotalCount()
    +
    void setReprocessDelay(int seconds)
    Определения sqlite_cache.hpp:29
    +
    MessageCache(const std::string &db_path)
    + +
    +
    +
    + + + + diff --git a/docs/html/struct_app_config-members.html b/docs/html/struct_app_config-members.html new file mode 100644 index 000000000..9d6dd5fae --- /dev/null +++ b/docs/html/struct_app_config-members.html @@ -0,0 +1,142 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    AppConfig Список членов класса
    +
    +
    + +

    Полный список членов класса AppConfig, включая наследуемые из базового класса

    + + + + + + + + +
    cacheAppConfig
    databaseAppConfig
    groupsAppConfig
    kafkaAppConfig
    load(const std::string &filename)AppConfigstatic
    modeAppConfig
    processingAppConfig
    +
    +
    + + + + diff --git a/docs/html/struct_app_config.html b/docs/html/struct_app_config.html new file mode 100644 index 000000000..27f442178 --- /dev/null +++ b/docs/html/struct_app_config.html @@ -0,0 +1,319 @@ + + + + + + + +Kafka-1C Connector: Структура AppConfig + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Структура AppConfig
    +
    +
    + +

    #include <config.hpp>

    +
    +Граф связей класса AppConfig:
    +
    +
    Collaboration graph
    + + + + + + + + + + + + + + + + + + + +
    [см. легенду]
    + + + +

    +Открытые статические члены

    static AppConfig load (const std::string &filename)
    + + + + + + + +

    +Открытые атрибуты

    KafkaConfig kafka
    DatabaseConfig database
    ProcessingConfig processing
    CacheConfig cache
    std::vector< GroupConfiggroups
    std::string mode
    +

    Подробное описание

    +
    +

    См. определение в файле config.hpp строка 81

    +

    Методы

    + +

    ◆ load()

    + +
    +
    + + + + + +
    + + + + + + + +
    AppConfig AppConfig::load (const std::string & filename)
    +
    +static
    +
    +
    +Граф вызова функции:
    +
    +
    + + + + + +
    + +
    +
    +

    Данные класса

    + +

    ◆ cache

    + +
    +
    + + + + +
    CacheConfig AppConfig::cache
    +
    + +

    См. определение в файле config.hpp строка 86

    + +
    +
    + +

    ◆ database

    + +
    +
    + + + + +
    DatabaseConfig AppConfig::database
    +
    + +

    См. определение в файле config.hpp строка 84

    + +
    +
    + +

    ◆ groups

    + +
    +
    + + + + +
    std::vector<GroupConfig> AppConfig::groups
    +
    + +

    См. определение в файле config.hpp строка 87

    + +
    +
    + +

    ◆ kafka

    + +
    +
    + + + + +
    KafkaConfig AppConfig::kafka
    +
    + +

    См. определение в файле config.hpp строка 83

    + +
    +
    + +

    ◆ mode

    + +
    +
    + + + + +
    std::string AppConfig::mode
    +
    + +

    См. определение в файле config.hpp строка 88

    + +
    +
    + +

    ◆ processing

    + +
    +
    + + + + +
    ProcessingConfig AppConfig::processing
    +
    + +

    См. определение в файле config.hpp строка 85

    + +
    +
    +
    Объявления и описания членов структуры находятся в файле: +
    +
    + +
    + + + + diff --git a/docs/html/struct_app_config.js b/docs/html/struct_app_config.js new file mode 100644 index 000000000..b00b4d863 --- /dev/null +++ b/docs/html/struct_app_config.js @@ -0,0 +1,9 @@ +var struct_app_config = +[ + [ "cache", "struct_app_config.html#ab61fecf8d49e3d3eae421cfcab3a94bd", null ], + [ "database", "struct_app_config.html#ad48b440bdfae4964ca599149729d09ec", null ], + [ "groups", "struct_app_config.html#a278bb1ffae10e016c5355964746230f9", null ], + [ "kafka", "struct_app_config.html#a6eabe866e9b2dded624221f90e6bec7f", null ], + [ "mode", "struct_app_config.html#a71293784add692e888b81f72d2e27a6a", null ], + [ "processing", "struct_app_config.html#a317a75e33b14b550d5037863dc12d6a9", null ] +]; \ No newline at end of file diff --git a/docs/html/struct_app_config__coll__graph.dot b/docs/html/struct_app_config__coll__graph.dot new file mode 100644 index 000000000..ea30b4678 --- /dev/null +++ b/docs/html/struct_app_config__coll__graph.dot @@ -0,0 +1,33 @@ +digraph "AppConfig" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="LR"; + Node1 [id="Node000001",label="AppConfig",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=< +
    kafka
    > ,fontcolor="grey" ]; + Node2 [id="Node000002",label="KafkaConfig",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$struct_kafka_config.html",tooltip=" "]; + Node3 -> Node2 [id="edge2_Node000002_Node000003",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=< +
    topics
    > ,fontcolor="grey" ]; + Node3 [id="Node000003",label="KafkaConfig::Topics",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$struct_kafka_config_1_1_topics.html",tooltip=" "]; + Node4 -> Node2 [id="edge3_Node000002_Node000004",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=< +
    producer
    > ,fontcolor="grey" ]; + Node4 [id="Node000004",label="KafkaConfig::Producer",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$struct_kafka_config_1_1_producer.html",tooltip=" "]; + Node5 -> Node2 [id="edge4_Node000002_Node000005",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=< +
    consumer
    > ,fontcolor="grey" ]; + Node5 [id="Node000005",label="KafkaConfig::Consumer",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$struct_kafka_config_1_1_consumer.html",tooltip=" "]; + Node6 -> Node1 [id="edge5_Node000001_Node000006",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=< +
    database
    > ,fontcolor="grey" ]; + Node6 [id="Node000006",label="DatabaseConfig",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$struct_database_config.html",tooltip=" "]; + Node7 -> Node6 [id="edge6_Node000006_Node000007",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=< +
    postgresql
    > ,fontcolor="grey" ]; + Node7 [id="Node000007",label="database::ConnectionParams",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$structdatabase_1_1_connection_params.html",tooltip=" "]; + Node8 -> Node1 [id="edge7_Node000001_Node000008",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=< +
    processing
    > ,fontcolor="grey" ]; + Node8 [id="Node000008",label="ProcessingConfig",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$struct_processing_config.html",tooltip=" "]; + Node9 -> Node1 [id="edge8_Node000001_Node000009",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=< +
    cache
    > ,fontcolor="grey" ]; + Node9 [id="Node000009",label="CacheConfig",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$struct_cache_config.html",tooltip=" "]; +} diff --git a/docs/html/struct_app_config__coll__graph.map b/docs/html/struct_app_config__coll__graph.map new file mode 100644 index 000000000..05c82f928 --- /dev/null +++ b/docs/html/struct_app_config__coll__graph.map @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/struct_app_config__coll__graph.md5 b/docs/html/struct_app_config__coll__graph.md5 new file mode 100644 index 000000000..518d52b56 --- /dev/null +++ b/docs/html/struct_app_config__coll__graph.md5 @@ -0,0 +1 @@ +15fb2593868e4f97b30f80c392d18667 \ No newline at end of file diff --git a/docs/html/struct_app_config__coll__graph.png b/docs/html/struct_app_config__coll__graph.png new file mode 100644 index 000000000..6aad11c0e Binary files /dev/null and b/docs/html/struct_app_config__coll__graph.png differ diff --git a/docs/html/struct_app_config_ad5f556af8ec235c8f58b14d1125b9d23_icgraph.dot b/docs/html/struct_app_config_ad5f556af8ec235c8f58b14d1125b9d23_icgraph.dot new file mode 100644 index 000000000..c76f5a111 --- /dev/null +++ b/docs/html/struct_app_config_ad5f556af8ec235c8f58b14d1125b9d23_icgraph.dot @@ -0,0 +1,11 @@ +digraph "AppConfig::load" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="AppConfig::load",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; +} diff --git a/docs/html/struct_app_config_ad5f556af8ec235c8f58b14d1125b9d23_icgraph.map b/docs/html/struct_app_config_ad5f556af8ec235c8f58b14d1125b9d23_icgraph.map new file mode 100644 index 000000000..df0044882 --- /dev/null +++ b/docs/html/struct_app_config_ad5f556af8ec235c8f58b14d1125b9d23_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/struct_app_config_ad5f556af8ec235c8f58b14d1125b9d23_icgraph.md5 b/docs/html/struct_app_config_ad5f556af8ec235c8f58b14d1125b9d23_icgraph.md5 new file mode 100644 index 000000000..418c93040 --- /dev/null +++ b/docs/html/struct_app_config_ad5f556af8ec235c8f58b14d1125b9d23_icgraph.md5 @@ -0,0 +1 @@ +218037e504f911f3039749fa0014d829 \ No newline at end of file diff --git a/docs/html/struct_app_config_ad5f556af8ec235c8f58b14d1125b9d23_icgraph.png b/docs/html/struct_app_config_ad5f556af8ec235c8f58b14d1125b9d23_icgraph.png new file mode 100644 index 000000000..7b1fa03da Binary files /dev/null and b/docs/html/struct_app_config_ad5f556af8ec235c8f58b14d1125b9d23_icgraph.png differ diff --git a/docs/html/struct_cache_config-members.html b/docs/html/struct_cache_config-members.html new file mode 100644 index 000000000..4d9bafe9d --- /dev/null +++ b/docs/html/struct_cache_config-members.html @@ -0,0 +1,139 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    CacheConfig Список членов класса
    +
    +
    + +

    Полный список членов класса CacheConfig, включая наследуемые из базового класса

    + + + + + +
    pathCacheConfig
    reprocess_delay_secondsCacheConfig
    retention_daysCacheConfig
    source_prefixCacheConfig
    +
    +
    + + + + diff --git a/docs/html/struct_cache_config.html b/docs/html/struct_cache_config.html new file mode 100644 index 000000000..a728ef935 --- /dev/null +++ b/docs/html/struct_cache_config.html @@ -0,0 +1,221 @@ + + + + + + + +Kafka-1C Connector: Структура CacheConfig + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Структура CacheConfig
    +
    +
    + +

    #include <config.hpp>

    + + + + + + +

    +Открытые атрибуты

    std::string path
    int retention_days = 7
    int reprocess_delay_seconds = 7
    std::string source_prefix
    +

    Подробное описание

    +
    +

    См. определение в файле config.hpp строка 59

    +

    Данные класса

    + +

    ◆ path

    + +
    +
    + + + + +
    std::string CacheConfig::path
    +
    + +

    См. определение в файле config.hpp строка 61

    + +
    +
    + +

    ◆ reprocess_delay_seconds

    + +
    +
    + + + + +
    int CacheConfig::reprocess_delay_seconds = 7
    +
    + +

    См. определение в файле config.hpp строка 63

    + +
    +
    + +

    ◆ retention_days

    + +
    +
    + + + + +
    int CacheConfig::retention_days = 7
    +
    + +

    См. определение в файле config.hpp строка 62

    + +
    +
    + +

    ◆ source_prefix

    + +
    +
    + + + + +
    std::string CacheConfig::source_prefix
    +
    + +

    См. определение в файле config.hpp строка 64

    + +
    +
    +
    Объявления и описания членов структуры находятся в файле: +
    +
    + +
    + + + + diff --git a/docs/html/struct_cache_config.js b/docs/html/struct_cache_config.js new file mode 100644 index 000000000..bd9cc0037 --- /dev/null +++ b/docs/html/struct_cache_config.js @@ -0,0 +1,7 @@ +var struct_cache_config = +[ + [ "path", "struct_cache_config.html#a906e9e3cebb56102ef80e04ae332b6b8", null ], + [ "reprocess_delay_seconds", "struct_cache_config.html#a789469e676460aba92e45f59634c9baa", null ], + [ "retention_days", "struct_cache_config.html#a811e7654983743415a50f817813ca293", null ], + [ "source_prefix", "struct_cache_config.html#a7e8c2d3a69fd12df4809602ec825c62e", null ] +]; \ No newline at end of file diff --git a/docs/html/struct_database_config-members.html b/docs/html/struct_database_config-members.html new file mode 100644 index 000000000..c31e3aa4e --- /dev/null +++ b/docs/html/struct_database_config-members.html @@ -0,0 +1,136 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    DatabaseConfig Список членов класса
    +
    +
    + +

    Полный список членов класса DatabaseConfig, включая наследуемые из базового класса

    + + +
    postgresqlDatabaseConfig
    +
    +
    + + + + diff --git a/docs/html/struct_database_config.html b/docs/html/struct_database_config.html new file mode 100644 index 000000000..bf41d947a --- /dev/null +++ b/docs/html/struct_database_config.html @@ -0,0 +1,180 @@ + + + + + + + +Kafka-1C Connector: Структура DatabaseConfig + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Структура DatabaseConfig
    +
    +
    + +

    #include <config.hpp>

    +
    +Граф связей класса DatabaseConfig:
    +
    +
    Collaboration graph
    + + + + + +
    [см. легенду]
    + + + +

    +Открытые атрибуты

    database::ConnectionParams postgresql
    +

    Подробное описание

    +
    +

    См. определение в файле config.hpp строка 40

    +

    Данные класса

    + +

    ◆ postgresql

    + +
    +
    + + + + +
    database::ConnectionParams DatabaseConfig::postgresql
    +
    + +

    См. определение в файле config.hpp строка 42

    + +
    +
    +
    Объявления и описания членов структуры находятся в файле: +
    +
    + +
    + + + + diff --git a/docs/html/struct_database_config.js b/docs/html/struct_database_config.js new file mode 100644 index 000000000..a65554d17 --- /dev/null +++ b/docs/html/struct_database_config.js @@ -0,0 +1,4 @@ +var struct_database_config = +[ + [ "postgresql", "struct_database_config.html#a466fbc3aae51e96a09e18a610510ddda", null ] +]; \ No newline at end of file diff --git a/docs/html/struct_database_config__coll__graph.dot b/docs/html/struct_database_config__coll__graph.dot new file mode 100644 index 000000000..f7aca8e67 --- /dev/null +++ b/docs/html/struct_database_config__coll__graph.dot @@ -0,0 +1,11 @@ +digraph "DatabaseConfig" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="DatabaseConfig",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=< +
    postgresql
    > ,fontcolor="grey" ]; + Node2 [id="Node000002",label="database::ConnectionParams",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$structdatabase_1_1_connection_params.html",tooltip=" "]; +} diff --git a/docs/html/struct_database_config__coll__graph.map b/docs/html/struct_database_config__coll__graph.map new file mode 100644 index 000000000..65d3959b5 --- /dev/null +++ b/docs/html/struct_database_config__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/struct_database_config__coll__graph.md5 b/docs/html/struct_database_config__coll__graph.md5 new file mode 100644 index 000000000..b333f82f1 --- /dev/null +++ b/docs/html/struct_database_config__coll__graph.md5 @@ -0,0 +1 @@ +c1d0bf2110eb270bacb7cd569a7ce413 \ No newline at end of file diff --git a/docs/html/struct_database_config__coll__graph.png b/docs/html/struct_database_config__coll__graph.png new file mode 100644 index 000000000..d9ce11ba5 Binary files /dev/null and b/docs/html/struct_database_config__coll__graph.png differ diff --git a/docs/html/struct_group_config-members.html b/docs/html/struct_group_config-members.html new file mode 100644 index 000000000..04917d5a0 --- /dev/null +++ b/docs/html/struct_group_config-members.html @@ -0,0 +1,139 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    GroupConfig Список членов класса
    +
    +
    + +

    Полный список членов класса GroupConfig, включая наследуемые из базового класса

    + + + + + +
    enabledGroupConfig
    input_directoryGroupConfig
    kafka_topicGroupConfig
    nameGroupConfig
    +
    +
    + + + + diff --git a/docs/html/struct_group_config.html b/docs/html/struct_group_config.html new file mode 100644 index 000000000..2d0dc995b --- /dev/null +++ b/docs/html/struct_group_config.html @@ -0,0 +1,221 @@ + + + + + + + +Kafka-1C Connector: Структура GroupConfig + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Структура GroupConfig
    +
    +
    + +

    #include <config.hpp>

    + + + + + + +

    +Открытые атрибуты

    std::string name
    bool enabled
    std::string input_directory
    std::string kafka_topic
    +

    Подробное описание

    +
    +

    См. определение в файле config.hpp строка 70

    +

    Данные класса

    + +

    ◆ enabled

    + +
    +
    + + + + +
    bool GroupConfig::enabled
    +
    + +

    См. определение в файле config.hpp строка 73

    + +
    +
    + +

    ◆ input_directory

    + +
    +
    + + + + +
    std::string GroupConfig::input_directory
    +
    + +

    См. определение в файле config.hpp строка 74

    + +
    +
    + +

    ◆ kafka_topic

    + +
    +
    + + + + +
    std::string GroupConfig::kafka_topic
    +
    + +

    См. определение в файле config.hpp строка 75

    + +
    +
    + +

    ◆ name

    + +
    +
    + + + + +
    std::string GroupConfig::name
    +
    + +

    См. определение в файле config.hpp строка 72

    + +
    +
    +
    Объявления и описания членов структуры находятся в файле: +
    +
    + +
    + + + + diff --git a/docs/html/struct_group_config.js b/docs/html/struct_group_config.js new file mode 100644 index 000000000..1e6116e19 --- /dev/null +++ b/docs/html/struct_group_config.js @@ -0,0 +1,7 @@ +var struct_group_config = +[ + [ "enabled", "struct_group_config.html#a1961ea5cd382a8eb95ba35f8b0d30085", null ], + [ "input_directory", "struct_group_config.html#a4f11116931abc7703ea5d03f6496bce6", null ], + [ "kafka_topic", "struct_group_config.html#ae612e29e9519757dd70db5b75484e666", null ], + [ "name", "struct_group_config.html#ab0a5a3b7ddd836ed4fb3708518ccaff4", null ] +]; \ No newline at end of file diff --git a/docs/html/struct_kafka_config-members.html b/docs/html/struct_kafka_config-members.html new file mode 100644 index 000000000..d0f297dbd --- /dev/null +++ b/docs/html/struct_kafka_config-members.html @@ -0,0 +1,139 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    KafkaConfig Список членов класса
    +
    +
    + +

    Полный список членов класса KafkaConfig, включая наследуемые из базового класса

    + + + + + +
    bootstrap_serversKafkaConfig
    consumerKafkaConfig
    producerKafkaConfig
    topicsKafkaConfig
    +
    +
    + + + + diff --git a/docs/html/struct_kafka_config.html b/docs/html/struct_kafka_config.html new file mode 100644 index 000000000..3cb6787cc --- /dev/null +++ b/docs/html/struct_kafka_config.html @@ -0,0 +1,235 @@ + + + + + + + +Kafka-1C Connector: Структура KafkaConfig + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Структура KafkaConfig
    +
    +
    + +

    #include <config.hpp>

    +
    +Граф связей класса KafkaConfig:
    +
    +
    Collaboration graph
    + + + + + + + + + +
    [см. легенду]
    + + + + + +

    +Классы

    struct  Topics
    struct  Producer
    struct  Consumer
    + + + + + +

    +Открытые атрибуты

    std::string bootstrap_servers
    struct KafkaConfig::Topics topics
    struct KafkaConfig::Producer producer
    struct KafkaConfig::Consumer consumer
    +

    Подробное описание

    +
    +

    См. определение в файле config.hpp строка 13

    +

    Данные класса

    + +

    ◆ bootstrap_servers

    + +
    +
    + + + + +
    std::string KafkaConfig::bootstrap_servers
    +
    + +

    См. определение в файле config.hpp строка 15

    + +
    +
    + +

    ◆ consumer

    + +
    +
    + + + + +
    struct KafkaConfig::Consumer KafkaConfig::consumer
    +
    + +
    +
    + +

    ◆ producer

    + +
    +
    + + + + +
    struct KafkaConfig::Producer KafkaConfig::producer
    +
    + +
    +
    + +

    ◆ topics

    + +
    +
    + + + + +
    struct KafkaConfig::Topics KafkaConfig::topics
    +
    + +
    +
    +
    Объявления и описания членов структуры находятся в файле: +
    +
    + +
    + + + + diff --git a/docs/html/struct_kafka_config.js b/docs/html/struct_kafka_config.js new file mode 100644 index 000000000..9d35e6876 --- /dev/null +++ b/docs/html/struct_kafka_config.js @@ -0,0 +1,10 @@ +var struct_kafka_config = +[ + [ "Topics", "struct_kafka_config_1_1_topics.html", "struct_kafka_config_1_1_topics" ], + [ "Producer", "struct_kafka_config_1_1_producer.html", "struct_kafka_config_1_1_producer" ], + [ "Consumer", "struct_kafka_config_1_1_consumer.html", "struct_kafka_config_1_1_consumer" ], + [ "bootstrap_servers", "struct_kafka_config.html#a2348a03b02fe3fd8603b36d0668a466d", null ], + [ "consumer", "struct_kafka_config.html#a28fc38d804239de7371366e113fe82ea", null ], + [ "producer", "struct_kafka_config.html#a44989757e6df2b612ba641b15444030a", null ], + [ "topics", "struct_kafka_config.html#ab1be7681f0d61eb354db018745e25c1f", null ] +]; \ No newline at end of file diff --git a/docs/html/struct_kafka_config_1_1_consumer-members.html b/docs/html/struct_kafka_config_1_1_consumer-members.html new file mode 100644 index 000000000..577aa8a90 --- /dev/null +++ b/docs/html/struct_kafka_config_1_1_consumer-members.html @@ -0,0 +1,138 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    KafkaConfig::Consumer Список членов класса
    +
    +
    + +

    Полный список членов класса KafkaConfig::Consumer, включая наследуемые из базового класса

    + + + + +
    auto_offset_resetKafkaConfig::Consumer
    enable_auto_commitKafkaConfig::Consumer
    group_idKafkaConfig::Consumer
    +
    +
    + + + + diff --git a/docs/html/struct_kafka_config_1_1_consumer.html b/docs/html/struct_kafka_config_1_1_consumer.html new file mode 100644 index 000000000..e39742c59 --- /dev/null +++ b/docs/html/struct_kafka_config_1_1_consumer.html @@ -0,0 +1,204 @@ + + + + + + + +Kafka-1C Connector: Структура KafkaConfig::Consumer + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Структура KafkaConfig::Consumer
    +
    +
    + +

    #include <config.hpp>

    + + + + + +

    +Открытые атрибуты

    std::string group_id
    std::string auto_offset_reset
    bool enable_auto_commit
    +

    Подробное описание

    +
    +

    См. определение в файле config.hpp строка 29

    +

    Данные класса

    + +

    ◆ auto_offset_reset

    + +
    +
    + + + + +
    std::string KafkaConfig::Consumer::auto_offset_reset
    +
    + +

    См. определение в файле config.hpp строка 32

    + +
    +
    + +

    ◆ enable_auto_commit

    + +
    +
    + + + + +
    bool KafkaConfig::Consumer::enable_auto_commit
    +
    + +

    См. определение в файле config.hpp строка 33

    + +
    +
    + +

    ◆ group_id

    + +
    +
    + + + + +
    std::string KafkaConfig::Consumer::group_id
    +
    + +

    См. определение в файле config.hpp строка 31

    + +
    +
    +
    Объявления и описания членов структуры находятся в файле: +
    +
    + +
    + + + + diff --git a/docs/html/struct_kafka_config_1_1_consumer.js b/docs/html/struct_kafka_config_1_1_consumer.js new file mode 100644 index 000000000..ec7fa2682 --- /dev/null +++ b/docs/html/struct_kafka_config_1_1_consumer.js @@ -0,0 +1,6 @@ +var struct_kafka_config_1_1_consumer = +[ + [ "auto_offset_reset", "struct_kafka_config_1_1_consumer.html#aefe2c1f841e4badd0b345ca5fd309c6f", null ], + [ "enable_auto_commit", "struct_kafka_config_1_1_consumer.html#afd3d5f25ef1e08466f864f70cd4170da", null ], + [ "group_id", "struct_kafka_config_1_1_consumer.html#a038ca3598f8aca14524c11bc9e1c6730", null ] +]; \ No newline at end of file diff --git a/docs/html/struct_kafka_config_1_1_producer-members.html b/docs/html/struct_kafka_config_1_1_producer-members.html new file mode 100644 index 000000000..e9539b62a --- /dev/null +++ b/docs/html/struct_kafka_config_1_1_producer-members.html @@ -0,0 +1,139 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    KafkaConfig::Producer Список членов класса
    +
    +
    + +

    Полный список членов класса KafkaConfig::Producer, включая наследуемые из базового класса

    + + + + + +
    acksKafkaConfig::Producer
    batch_sizeKafkaConfig::Producer
    linger_msKafkaConfig::Producer
    retriesKafkaConfig::Producer
    +
    +
    + + + + diff --git a/docs/html/struct_kafka_config_1_1_producer.html b/docs/html/struct_kafka_config_1_1_producer.html new file mode 100644 index 000000000..e002eb90b --- /dev/null +++ b/docs/html/struct_kafka_config_1_1_producer.html @@ -0,0 +1,221 @@ + + + + + + + +Kafka-1C Connector: Структура KafkaConfig::Producer + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Структура KafkaConfig::Producer
    +
    +
    + +

    #include <config.hpp>

    + + + + + + +

    +Открытые атрибуты

    std::string acks
    int retries
    int batch_size
    int linger_ms
    +

    Подробное описание

    +
    +

    См. определение в файле config.hpp строка 22

    +

    Данные класса

    + +

    ◆ acks

    + +
    +
    + + + + +
    std::string KafkaConfig::Producer::acks
    +
    + +

    См. определение в файле config.hpp строка 24

    + +
    +
    + +

    ◆ batch_size

    + +
    +
    + + + + +
    int KafkaConfig::Producer::batch_size
    +
    + +

    См. определение в файле config.hpp строка 26

    + +
    +
    + +

    ◆ linger_ms

    + +
    +
    + + + + +
    int KafkaConfig::Producer::linger_ms
    +
    + +

    См. определение в файле config.hpp строка 27

    + +
    +
    + +

    ◆ retries

    + +
    +
    + + + + +
    int KafkaConfig::Producer::retries
    +
    + +

    См. определение в файле config.hpp строка 25

    + +
    +
    +
    Объявления и описания членов структуры находятся в файле: +
    +
    + +
    + + + + diff --git a/docs/html/struct_kafka_config_1_1_producer.js b/docs/html/struct_kafka_config_1_1_producer.js new file mode 100644 index 000000000..b13fb7f7e --- /dev/null +++ b/docs/html/struct_kafka_config_1_1_producer.js @@ -0,0 +1,7 @@ +var struct_kafka_config_1_1_producer = +[ + [ "acks", "struct_kafka_config_1_1_producer.html#a2fe3aa9fe31856c6b64ff8b2f3c0b361", null ], + [ "batch_size", "struct_kafka_config_1_1_producer.html#a11c8f76401938e0d921885ac4b721044", null ], + [ "linger_ms", "struct_kafka_config_1_1_producer.html#af52d43fd37e83b1fb83ff88832932025", null ], + [ "retries", "struct_kafka_config_1_1_producer.html#ad949a76f16ffbbd833c093bf6832277c", null ] +]; \ No newline at end of file diff --git a/docs/html/struct_kafka_config_1_1_topics-members.html b/docs/html/struct_kafka_config_1_1_topics-members.html new file mode 100644 index 000000000..01f9d6b52 --- /dev/null +++ b/docs/html/struct_kafka_config_1_1_topics-members.html @@ -0,0 +1,138 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    KafkaConfig::Topics Список членов класса
    +
    +
    + +

    Полный список членов класса KafkaConfig::Topics, включая наследуемые из базового класса

    + + + + +
    errorsKafkaConfig::Topics
    inputKafkaConfig::Topics
    outputKafkaConfig::Topics
    +
    +
    + + + + diff --git a/docs/html/struct_kafka_config_1_1_topics.html b/docs/html/struct_kafka_config_1_1_topics.html new file mode 100644 index 000000000..c3d278490 --- /dev/null +++ b/docs/html/struct_kafka_config_1_1_topics.html @@ -0,0 +1,204 @@ + + + + + + + +Kafka-1C Connector: Структура KafkaConfig::Topics + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Структура KafkaConfig::Topics
    +
    +
    + +

    #include <config.hpp>

    + + + + + +

    +Открытые атрибуты

    std::string input
    std::string output
    std::string errors
    +

    Подробное описание

    +
    +

    См. определение в файле config.hpp строка 16

    +

    Данные класса

    + +

    ◆ errors

    + +
    +
    + + + + +
    std::string KafkaConfig::Topics::errors
    +
    + +

    См. определение в файле config.hpp строка 20

    + +
    +
    + +

    ◆ input

    + +
    +
    + + + + +
    std::string KafkaConfig::Topics::input
    +
    + +

    См. определение в файле config.hpp строка 18

    + +
    +
    + +

    ◆ output

    + +
    +
    + + + + +
    std::string KafkaConfig::Topics::output
    +
    + +

    См. определение в файле config.hpp строка 19

    + +
    +
    +
    Объявления и описания членов структуры находятся в файле: +
    +
    + +
    + + + + diff --git a/docs/html/struct_kafka_config_1_1_topics.js b/docs/html/struct_kafka_config_1_1_topics.js new file mode 100644 index 000000000..ac003aa2c --- /dev/null +++ b/docs/html/struct_kafka_config_1_1_topics.js @@ -0,0 +1,6 @@ +var struct_kafka_config_1_1_topics = +[ + [ "errors", "struct_kafka_config_1_1_topics.html#a58392568ff76c07a0d3b70d420089040", null ], + [ "input", "struct_kafka_config_1_1_topics.html#a3512bb9c634bc7bb91b8adac920696d2", null ], + [ "output", "struct_kafka_config_1_1_topics.html#a1f236a7912500d4677004e28fa94e8b7", null ] +]; \ No newline at end of file diff --git a/docs/html/struct_kafka_config__coll__graph.dot b/docs/html/struct_kafka_config__coll__graph.dot new file mode 100644 index 000000000..b1ee35860 --- /dev/null +++ b/docs/html/struct_kafka_config__coll__graph.dot @@ -0,0 +1,17 @@ +digraph "KafkaConfig" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="KafkaConfig",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [id="edge1_Node000001_Node000002",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=< +
    topics
    > ,fontcolor="grey" ]; + Node2 [id="Node000002",label="KafkaConfig::Topics",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$struct_kafka_config_1_1_topics.html",tooltip=" "]; + Node3 -> Node1 [id="edge2_Node000001_Node000003",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=< +
    producer
    > ,fontcolor="grey" ]; + Node3 [id="Node000003",label="KafkaConfig::Producer",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$struct_kafka_config_1_1_producer.html",tooltip=" "]; + Node4 -> Node1 [id="edge3_Node000001_Node000004",dir="back",color="darkorchid3",style="dashed",tooltip=" ",label=< +
    consumer
    > ,fontcolor="grey" ]; + Node4 [id="Node000004",label="KafkaConfig::Consumer",height=0.2,width=0.4,color="gray40", fillcolor="white", style="filled",URL="$struct_kafka_config_1_1_consumer.html",tooltip=" "]; +} diff --git a/docs/html/struct_kafka_config__coll__graph.map b/docs/html/struct_kafka_config__coll__graph.map new file mode 100644 index 000000000..95bc3fe6c --- /dev/null +++ b/docs/html/struct_kafka_config__coll__graph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/struct_kafka_config__coll__graph.md5 b/docs/html/struct_kafka_config__coll__graph.md5 new file mode 100644 index 000000000..f00c26eef --- /dev/null +++ b/docs/html/struct_kafka_config__coll__graph.md5 @@ -0,0 +1 @@ +da745f65009d5db4a0163789da583ea1 \ No newline at end of file diff --git a/docs/html/struct_kafka_config__coll__graph.png b/docs/html/struct_kafka_config__coll__graph.png new file mode 100644 index 000000000..f1e974c81 Binary files /dev/null and b/docs/html/struct_kafka_config__coll__graph.png differ diff --git a/docs/html/struct_order_data-members.html b/docs/html/struct_order_data-members.html new file mode 100644 index 000000000..318aaf983 --- /dev/null +++ b/docs/html/struct_order_data-members.html @@ -0,0 +1,144 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    OrderData Список членов класса
    +
    +
    + +

    Полный список членов класса OrderData, включая наследуемые из базового класса

    + + + + + + + + + + +
    contractorOrderData
    dateOrderData
    fromJson(const std::string &json_str)OrderDatastatic
    fromJson(const json &j)OrderDatastatic
    goodsOrderData
    numberOrderData
    tinOrderData
    toJson() constOrderData
    trrcOrderData
    +
    +
    + + + + diff --git a/docs/html/struct_order_data.html b/docs/html/struct_order_data.html new file mode 100644 index 000000000..717798fed --- /dev/null +++ b/docs/html/struct_order_data.html @@ -0,0 +1,349 @@ + + + + + + + +Kafka-1C Connector: Структура OrderData + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Структура OrderData
    +
    +
    + +

    #include <json_parser.hpp>

    + + + +

    +Открытые члены

    std::string toJson () const
    + + + +

    +Открытые статические члены

    static OrderData fromJson (const std::string &json_str)
    static OrderData fromJson (const json &j)
    + + + + + + + +

    +Открытые атрибуты

    std::string tin
    std::string trrc
    std::string contractor
    std::string date
    std::string number
    std::vector< OrderItemgoods
    +

    Подробное описание

    +
    +

    См. определение в файле json_parser.hpp строка 24

    +

    Методы

    + +

    ◆ fromJson() [1/2]

    + +
    +
    + + + + + +
    + + + + + + + +
    OrderData OrderData::fromJson (const json & j)
    +
    +static
    +
    + +
    +
    + +

    ◆ fromJson() [2/2]

    + +
    +
    + + + + + +
    + + + + + + + +
    OrderData OrderData::fromJson (const std::string & json_str)
    +
    +static
    +
    +
    +Граф вызова функции:
    +
    +
    + + + + + + + + + + + + +
    + +
    +
    + +

    ◆ toJson()

    + +
    +
    + + + + + + + +
    std::string OrderData::toJson () const
    +
    + +
    +
    +

    Данные класса

    + +

    ◆ contractor

    + +
    +
    + + + + +
    std::string OrderData::contractor
    +
    + +

    См. определение в файле json_parser.hpp строка 27

    + +
    +
    + +

    ◆ date

    + +
    +
    + + + + +
    std::string OrderData::date
    +
    + +

    См. определение в файле json_parser.hpp строка 28

    + +
    +
    + +

    ◆ goods

    + +
    +
    + + + + +
    std::vector<OrderItem> OrderData::goods
    +
    + +

    См. определение в файле json_parser.hpp строка 30

    + +
    +
    + +

    ◆ number

    + +
    +
    + + + + +
    std::string OrderData::number
    +
    + +

    См. определение в файле json_parser.hpp строка 29

    + +
    +
    + +

    ◆ tin

    + +
    +
    + + + + +
    std::string OrderData::tin
    +
    + +

    См. определение в файле json_parser.hpp строка 25

    + +
    +
    + +

    ◆ trrc

    + +
    +
    + + + + +
    std::string OrderData::trrc
    +
    + +

    См. определение в файле json_parser.hpp строка 26

    + +
    +
    +
    Объявления и описания членов структуры находятся в файле: +
    +
    + +
    + + + + diff --git a/docs/html/struct_order_data.js b/docs/html/struct_order_data.js new file mode 100644 index 000000000..63ff2a535 --- /dev/null +++ b/docs/html/struct_order_data.js @@ -0,0 +1,10 @@ +var struct_order_data = +[ + [ "toJson", "struct_order_data.html#adb304d757a97f88a8b0a9e33339ca2f9", null ], + [ "contractor", "struct_order_data.html#aaa1adf7d56f4e3e3593b93dd29345740", null ], + [ "date", "struct_order_data.html#ae0a6f5fff047998c68e3621a5a163177", null ], + [ "goods", "struct_order_data.html#a6b2ffaadbab3d340ac169f36ed9235af", null ], + [ "number", "struct_order_data.html#a4afa71012f565dd0bbf3de66eac82b96", null ], + [ "tin", "struct_order_data.html#adf69c9e05d2636695d68e29b776cf73f", null ], + [ "trrc", "struct_order_data.html#a2bea392e91c64cbc0a6c1cc3292463d6", null ] +]; \ No newline at end of file diff --git a/docs/html/struct_order_data_a3e88570de45cee6e214655aa12ed42f3_icgraph.dot b/docs/html/struct_order_data_a3e88570de45cee6e214655aa12ed42f3_icgraph.dot new file mode 100644 index 000000000..41b31f8d5 --- /dev/null +++ b/docs/html/struct_order_data_a3e88570de45cee6e214655aa12ed42f3_icgraph.dot @@ -0,0 +1,18 @@ +digraph "OrderData::fromJson" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + rankdir="RL"; + Node1 [id="Node000001",label="OrderData::fromJson",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="OrderProcessor::processMessage",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_order_processor.html#a6f8aa8e2aeb597be492065036c2f23f5",tooltip=" "]; + Node2 -> Node3 [id="edge2_Node000002_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="runConsumer",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a9e945a592fa4a0f1706ea24ebb2ab854",tooltip=" "]; + Node3 -> Node4 [id="edge3_Node000003_Node000004",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="main",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="OrderProcessor::reprocess\lPendingMessages",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$class_order_processor.html#af7a710bdbf4bd5c4578db73437477a5f",tooltip=" "]; + Node5 -> Node3 [id="edge5_Node000005_Node000003",dir="back",color="steelblue1",style="solid",tooltip=" "]; +} diff --git a/docs/html/struct_order_data_a3e88570de45cee6e214655aa12ed42f3_icgraph.map b/docs/html/struct_order_data_a3e88570de45cee6e214655aa12ed42f3_icgraph.map new file mode 100644 index 000000000..9c0fe5929 --- /dev/null +++ b/docs/html/struct_order_data_a3e88570de45cee6e214655aa12ed42f3_icgraph.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/html/struct_order_data_a3e88570de45cee6e214655aa12ed42f3_icgraph.md5 b/docs/html/struct_order_data_a3e88570de45cee6e214655aa12ed42f3_icgraph.md5 new file mode 100644 index 000000000..c32c38663 --- /dev/null +++ b/docs/html/struct_order_data_a3e88570de45cee6e214655aa12ed42f3_icgraph.md5 @@ -0,0 +1 @@ +781cd15ff4e7874dad11613d1ea3a6ed \ No newline at end of file diff --git a/docs/html/struct_order_data_a3e88570de45cee6e214655aa12ed42f3_icgraph.png b/docs/html/struct_order_data_a3e88570de45cee6e214655aa12ed42f3_icgraph.png new file mode 100644 index 000000000..89a557088 Binary files /dev/null and b/docs/html/struct_order_data_a3e88570de45cee6e214655aa12ed42f3_icgraph.png differ diff --git a/docs/html/struct_order_item-members.html b/docs/html/struct_order_item-members.html new file mode 100644 index 000000000..af4d4e975 --- /dev/null +++ b/docs/html/struct_order_item-members.html @@ -0,0 +1,139 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    OrderItem Список членов класса
    +
    +
    + +

    Полный список членов класса OrderItem, включая наследуемые из базового класса

    + + + + + +
    priceOrderItem
    quantityOrderItem
    skuOrderItem
    sumOrderItem
    +
    +
    + + + + diff --git a/docs/html/struct_order_item.html b/docs/html/struct_order_item.html new file mode 100644 index 000000000..34ff5c8d8 --- /dev/null +++ b/docs/html/struct_order_item.html @@ -0,0 +1,221 @@ + + + + + + + +Kafka-1C Connector: Структура OrderItem + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Структура OrderItem
    +
    +
    + +

    #include <json_parser.hpp>

    + + + + + + +

    +Открытые атрибуты

    std::string sku
    double quantity
    double price
    double sum
    +

    Подробное описание

    +
    +

    См. определение в файле json_parser.hpp строка 13

    +

    Данные класса

    + +

    ◆ price

    + +
    +
    + + + + +
    double OrderItem::price
    +
    + +

    См. определение в файле json_parser.hpp строка 16

    + +
    +
    + +

    ◆ quantity

    + +
    +
    + + + + +
    double OrderItem::quantity
    +
    + +

    См. определение в файле json_parser.hpp строка 15

    + +
    +
    + +

    ◆ sku

    + +
    +
    + + + + +
    std::string OrderItem::sku
    +
    + +

    См. определение в файле json_parser.hpp строка 14

    + +
    +
    + +

    ◆ sum

    + +
    +
    + + + + +
    double OrderItem::sum
    +
    + +

    См. определение в файле json_parser.hpp строка 17

    + +
    +
    +
    Объявления и описания членов структуры находятся в файле: +
    +
    + +
    + + + + diff --git a/docs/html/struct_order_item.js b/docs/html/struct_order_item.js new file mode 100644 index 000000000..1697a0dcb --- /dev/null +++ b/docs/html/struct_order_item.js @@ -0,0 +1,7 @@ +var struct_order_item = +[ + [ "price", "struct_order_item.html#a223b2394a34be9c984b29c23b6264801", null ], + [ "quantity", "struct_order_item.html#a83b4d1091409217be7f2b35e38229e26", null ], + [ "sku", "struct_order_item.html#aa127c157e2449c02c68948fde169dd55", null ], + [ "sum", "struct_order_item.html#a7379b21ebe1ecdd8f16f086074a735bb", null ] +]; \ No newline at end of file diff --git a/docs/html/struct_processing_config-members.html b/docs/html/struct_processing_config-members.html new file mode 100644 index 000000000..0d3ae2e31 --- /dev/null +++ b/docs/html/struct_processing_config-members.html @@ -0,0 +1,139 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    ProcessingConfig Список членов класса
    +
    +
    + +

    Полный список членов класса ProcessingConfig, включая наследуемые из базового класса

    + + + + + +
    batch_sizeProcessingConfig
    delete_after_sendProcessingConfig
    max_workersProcessingConfig
    retry_interval_secondsProcessingConfig
    +
    +
    + + + + diff --git a/docs/html/struct_processing_config.html b/docs/html/struct_processing_config.html new file mode 100644 index 000000000..6e429b904 --- /dev/null +++ b/docs/html/struct_processing_config.html @@ -0,0 +1,221 @@ + + + + + + + +Kafka-1C Connector: Структура ProcessingConfig + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Структура ProcessingConfig
    +
    +
    + +

    #include <config.hpp>

    + + + + + + +

    +Открытые атрибуты

    int max_workers
    int batch_size
    int retry_interval_seconds
    bool delete_after_send
    +

    Подробное описание

    +
    +

    См. определение в файле config.hpp строка 48

    +

    Данные класса

    + +

    ◆ batch_size

    + +
    +
    + + + + +
    int ProcessingConfig::batch_size
    +
    + +

    См. определение в файле config.hpp строка 51

    + +
    +
    + +

    ◆ delete_after_send

    + +
    +
    + + + + +
    bool ProcessingConfig::delete_after_send
    +
    + +

    См. определение в файле config.hpp строка 53

    + +
    +
    + +

    ◆ max_workers

    + +
    +
    + + + + +
    int ProcessingConfig::max_workers
    +
    + +

    См. определение в файле config.hpp строка 50

    + +
    +
    + +

    ◆ retry_interval_seconds

    + +
    +
    + + + + +
    int ProcessingConfig::retry_interval_seconds
    +
    + +

    См. определение в файле config.hpp строка 52

    + +
    +
    +
    Объявления и описания членов структуры находятся в файле: +
    +
    + +
    + + + + diff --git a/docs/html/struct_processing_config.js b/docs/html/struct_processing_config.js new file mode 100644 index 000000000..faa806e98 --- /dev/null +++ b/docs/html/struct_processing_config.js @@ -0,0 +1,7 @@ +var struct_processing_config = +[ + [ "batch_size", "struct_processing_config.html#adefd52f2a2e86fd9110b6a76110eb382", null ], + [ "delete_after_send", "struct_processing_config.html#a5fbabda8fc7ddf93b0997b3228a147df", null ], + [ "max_workers", "struct_processing_config.html#ad5e444469cadb6aa3f141fed824fc2fb", null ], + [ "retry_interval_seconds", "struct_processing_config.html#a3f7997e36b3bf9e253ad887ae7c1c8d5", null ] +]; \ No newline at end of file diff --git a/docs/html/structdatabase_1_1_client-members.html b/docs/html/structdatabase_1_1_client-members.html new file mode 100644 index 000000000..8a3d3e833 --- /dev/null +++ b/docs/html/structdatabase_1_1_client-members.html @@ -0,0 +1,140 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    database::Client Список членов класса
    +
    +
    + +

    Полный список членов класса database::Client, включая наследуемые из базового класса

    + + + + + + +
    iddatabase::Client
    inndatabase::Client
    kppdatabase::Client
    markeddatabase::Client
    namedatabase::Client
    +
    +
    + + + + diff --git a/docs/html/structdatabase_1_1_client.html b/docs/html/structdatabase_1_1_client.html new file mode 100644 index 000000000..9f984c21a --- /dev/null +++ b/docs/html/structdatabase_1_1_client.html @@ -0,0 +1,238 @@ + + + + + + + +Kafka-1C Connector: Структура database::Client + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Структура database::Client
    +
    +
    + +

    #include <postgresql.hpp>

    + + + + + + + +

    +Открытые атрибуты

    std::string id
    std::string inn
    std::string kpp
    std::string name
    bool marked
    +

    Подробное описание

    +
    +

    См. определение в файле postgresql.hpp строка 34

    +

    Данные класса

    + +

    ◆ id

    + +
    +
    + + + + +
    std::string database::Client::id
    +
    + +

    См. определение в файле postgresql.hpp строка 36

    + +
    +
    + +

    ◆ inn

    + +
    +
    + + + + +
    std::string database::Client::inn
    +
    + +

    См. определение в файле postgresql.hpp строка 37

    + +
    +
    + +

    ◆ kpp

    + +
    +
    + + + + +
    std::string database::Client::kpp
    +
    + +

    См. определение в файле postgresql.hpp строка 38

    + +
    +
    + +

    ◆ marked

    + +
    +
    + + + + +
    bool database::Client::marked
    +
    + +

    См. определение в файле postgresql.hpp строка 40

    + +
    +
    + +

    ◆ name

    + +
    +
    + + + + +
    std::string database::Client::name
    +
    + +

    См. определение в файле postgresql.hpp строка 39

    + +
    +
    +
    Объявления и описания членов структуры находятся в файле: +
    +
    + +
    + + + + diff --git a/docs/html/structdatabase_1_1_client.js b/docs/html/structdatabase_1_1_client.js new file mode 100644 index 000000000..6ccd2a7df --- /dev/null +++ b/docs/html/structdatabase_1_1_client.js @@ -0,0 +1,8 @@ +var structdatabase_1_1_client = +[ + [ "id", "structdatabase_1_1_client.html#a59c09de0aaf09eacd58d9e03cac42d65", null ], + [ "inn", "structdatabase_1_1_client.html#a2832335fbe78cdd62a9ecc4c91c57880", null ], + [ "kpp", "structdatabase_1_1_client.html#af5fd482be6f1c6ac9af6a60d4fbbffe5", null ], + [ "marked", "structdatabase_1_1_client.html#ad0fe81a6ecf278fe23d280e96cc308c7", null ], + [ "name", "structdatabase_1_1_client.html#a9a61216ce80e3281eaef7cdd8657ec95", null ] +]; \ No newline at end of file diff --git a/docs/html/structdatabase_1_1_connection_params-members.html b/docs/html/structdatabase_1_1_connection_params-members.html new file mode 100644 index 000000000..6a5433e65 --- /dev/null +++ b/docs/html/structdatabase_1_1_connection_params-members.html @@ -0,0 +1,141 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    database::ConnectionParams Список членов класса
    +
    +
    + +

    Полный список членов класса database::ConnectionParams, включая наследуемые из базового класса

    + + + + + + + +
    connectionString() constdatabase::ConnectionParams
    databasedatabase::ConnectionParams
    hostdatabase::ConnectionParams
    passworddatabase::ConnectionParams
    portdatabase::ConnectionParams
    usernamedatabase::ConnectionParams
    +
    +
    + + + + diff --git a/docs/html/structdatabase_1_1_connection_params.html b/docs/html/structdatabase_1_1_connection_params.html new file mode 100644 index 000000000..5ab6bceec --- /dev/null +++ b/docs/html/structdatabase_1_1_connection_params.html @@ -0,0 +1,262 @@ + + + + + + + +Kafka-1C Connector: Структура database::ConnectionParams + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Структура database::ConnectionParams
    +
    +
    + +

    #include <postgresql.hpp>

    + + + +

    +Открытые члены

    std::string connectionString () const
    + + + + + + +

    +Открытые атрибуты

    std::string host
    int port
    std::string database
    std::string username
    std::string password
    +

    Подробное описание

    +
    +

    См. определение в файле postgresql.hpp строка 12

    +

    Методы

    + +

    ◆ connectionString()

    + +
    +
    + + + + + + + +
    std::string database::ConnectionParams::connectionString () const
    +
    + +

    См. определение в файле postgresql.hpp строка 20

    + +
    +
    +

    Данные класса

    + +

    ◆ database

    + +
    +
    + + + + +
    std::string database::ConnectionParams::database
    +
    + +

    См. определение в файле postgresql.hpp строка 16

    + +
    +
    + +

    ◆ host

    + +
    +
    + + + + +
    std::string database::ConnectionParams::host
    +
    + +

    См. определение в файле postgresql.hpp строка 14

    + +
    +
    + +

    ◆ password

    + +
    +
    + + + + +
    std::string database::ConnectionParams::password
    +
    + +

    См. определение в файле postgresql.hpp строка 18

    + +
    +
    + +

    ◆ port

    + +
    +
    + + + + +
    int database::ConnectionParams::port
    +
    + +

    См. определение в файле postgresql.hpp строка 15

    + +
    +
    + +

    ◆ username

    + +
    +
    + + + + +
    std::string database::ConnectionParams::username
    +
    + +

    См. определение в файле postgresql.hpp строка 17

    + +
    +
    +
    Объявления и описания членов структуры находятся в файле: +
    +
    + +
    + + + + diff --git a/docs/html/structdatabase_1_1_connection_params.js b/docs/html/structdatabase_1_1_connection_params.js new file mode 100644 index 000000000..b16072dc4 --- /dev/null +++ b/docs/html/structdatabase_1_1_connection_params.js @@ -0,0 +1,9 @@ +var structdatabase_1_1_connection_params = +[ + [ "connectionString", "structdatabase_1_1_connection_params.html#adf642f06affe1750bd495f50fee2241d", null ], + [ "database", "structdatabase_1_1_connection_params.html#a190de2967f826558a7ad5a9fdbc8f5de", null ], + [ "host", "structdatabase_1_1_connection_params.html#aac294a88bf4a434b9f7af573a9eac43d", null ], + [ "password", "structdatabase_1_1_connection_params.html#ac5df7de1f780cee25408e4d5c310b0d1", null ], + [ "port", "structdatabase_1_1_connection_params.html#a47cebdaa3263697a49a810e32126ddcb", null ], + [ "username", "structdatabase_1_1_connection_params.html#a5a1b946ed57e96a6e623e508479070e2", null ] +]; \ No newline at end of file diff --git a/docs/html/structdatabase_1_1_order_item-members.html b/docs/html/structdatabase_1_1_order_item-members.html new file mode 100644 index 000000000..bacbb5197 --- /dev/null +++ b/docs/html/structdatabase_1_1_order_item-members.html @@ -0,0 +1,139 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    database::OrderItem Список членов класса
    +
    +
    + +

    Полный список членов класса database::OrderItem, включая наследуемые из базового класса

    + + + + + +
    pricedatabase::OrderItem
    product_iddatabase::OrderItem
    quantitydatabase::OrderItem
    sumdatabase::OrderItem
    +
    +
    + + + + diff --git a/docs/html/structdatabase_1_1_order_item.html b/docs/html/structdatabase_1_1_order_item.html new file mode 100644 index 000000000..ec6fb997d --- /dev/null +++ b/docs/html/structdatabase_1_1_order_item.html @@ -0,0 +1,221 @@ + + + + + + + +Kafka-1C Connector: Структура database::OrderItem + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Структура database::OrderItem
    +
    +
    + +

    #include <postgresql.hpp>

    + + + + + + +

    +Открытые атрибуты

    std::string product_id
    double quantity
    double price
    double sum
    +

    Подробное описание

    +
    +

    См. определение в файле postgresql.hpp строка 52

    +

    Данные класса

    + +

    ◆ price

    + +
    +
    + + + + +
    double database::OrderItem::price
    +
    + +

    См. определение в файле postgresql.hpp строка 56

    + +
    +
    + +

    ◆ product_id

    + +
    +
    + + + + +
    std::string database::OrderItem::product_id
    +
    + +

    См. определение в файле postgresql.hpp строка 54

    + +
    +
    + +

    ◆ quantity

    + +
    +
    + + + + +
    double database::OrderItem::quantity
    +
    + +

    См. определение в файле postgresql.hpp строка 55

    + +
    +
    + +

    ◆ sum

    + +
    +
    + + + + +
    double database::OrderItem::sum
    +
    + +

    См. определение в файле postgresql.hpp строка 57

    + +
    +
    +
    Объявления и описания членов структуры находятся в файле: +
    +
    + +
    + + + + diff --git a/docs/html/structdatabase_1_1_order_item.js b/docs/html/structdatabase_1_1_order_item.js new file mode 100644 index 000000000..308783666 --- /dev/null +++ b/docs/html/structdatabase_1_1_order_item.js @@ -0,0 +1,7 @@ +var structdatabase_1_1_order_item = +[ + [ "price", "structdatabase_1_1_order_item.html#afe42d8211d06bdba512bb3f49d6c1c6a", null ], + [ "product_id", "structdatabase_1_1_order_item.html#ad66ee06cad1bfdc160fe922b89defac0", null ], + [ "quantity", "structdatabase_1_1_order_item.html#a0ee59553b20ae7d4ee663938e1d46500", null ], + [ "sum", "structdatabase_1_1_order_item.html#a8d8598ac204f2c3dccc257042ab282d0", null ] +]; \ No newline at end of file diff --git a/docs/html/structdatabase_1_1_product-members.html b/docs/html/structdatabase_1_1_product-members.html new file mode 100644 index 000000000..dc0d588ef --- /dev/null +++ b/docs/html/structdatabase_1_1_product-members.html @@ -0,0 +1,140 @@ + + + + + + + +Kafka-1C Connector: Список членов класса + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    database::Product Список членов класса
    +
    +
    + +

    Полный список членов класса database::Product, включая наследуемые из базового класса

    + + + + + + +
    articledatabase::Product
    codedatabase::Product
    iddatabase::Product
    markeddatabase::Product
    namedatabase::Product
    +
    +
    + + + + diff --git a/docs/html/structdatabase_1_1_product.html b/docs/html/structdatabase_1_1_product.html new file mode 100644 index 000000000..95889f30b --- /dev/null +++ b/docs/html/structdatabase_1_1_product.html @@ -0,0 +1,238 @@ + + + + + + + +Kafka-1C Connector: Структура database::Product + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Структура database::Product
    +
    +
    + +

    #include <postgresql.hpp>

    + + + + + + + +

    +Открытые атрибуты

    std::string id
    std::string code
    std::string name
    std::string article
    bool marked
    +

    Подробное описание

    +
    +

    См. определение в файле postgresql.hpp строка 43

    +

    Данные класса

    + +

    ◆ article

    + +
    +
    + + + + +
    std::string database::Product::article
    +
    + +

    См. определение в файле postgresql.hpp строка 48

    + +
    +
    + +

    ◆ code

    + +
    +
    + + + + +
    std::string database::Product::code
    +
    + +

    См. определение в файле postgresql.hpp строка 46

    + +
    +
    + +

    ◆ id

    + +
    +
    + + + + +
    std::string database::Product::id
    +
    + +

    См. определение в файле postgresql.hpp строка 45

    + +
    +
    + +

    ◆ marked

    + +
    +
    + + + + +
    bool database::Product::marked
    +
    + +

    См. определение в файле postgresql.hpp строка 49

    + +
    +
    + +

    ◆ name

    + +
    +
    + + + + +
    std::string database::Product::name
    +
    + +

    См. определение в файле postgresql.hpp строка 47

    + +
    +
    +
    Объявления и описания членов структуры находятся в файле: +
    +
    + +
    + + + + diff --git a/docs/html/structdatabase_1_1_product.js b/docs/html/structdatabase_1_1_product.js new file mode 100644 index 000000000..f1a6cc222 --- /dev/null +++ b/docs/html/structdatabase_1_1_product.js @@ -0,0 +1,8 @@ +var structdatabase_1_1_product = +[ + [ "article", "structdatabase_1_1_product.html#af8dc8d1177ca8b6768561dd109a3d6d3", null ], + [ "code", "structdatabase_1_1_product.html#a55f1bef2aac730c71a64e19daafeb12a", null ], + [ "id", "structdatabase_1_1_product.html#a537c128b62c8ef01b1561d01cb7bb06b", null ], + [ "marked", "structdatabase_1_1_product.html#acf8cf48c48ddc009d50b32934b24b6c8", null ], + [ "name", "structdatabase_1_1_product.html#a996eaac83fc96ed18f8638b3e3b7f627", null ] +]; \ No newline at end of file diff --git a/docs/html/tabs.css b/docs/html/tabs.css new file mode 100644 index 000000000..5b84c153e --- /dev/null +++ b/docs/html/tabs.css @@ -0,0 +1,482 @@ +.sm { + position: relative; + z-index: 9999 +} + +.sm,.sm li,.sm ul { + list-style: none; + margin: 0; + padding: 0; + line-height: normal; + direction: ltr; + text-align: left; + -webkit-tap-highlight-color: transparent +} + +.sm,.sm li { + display: block +} + +.sm-rtl,.sm-rtl li,.sm-rtl ul { + direction: rtl; + text-align: right +} + +.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6 { + margin: 0; + padding: 0 +} + +.sm ul { + display: none +} + +.sm a,.sm li { + position: relative +} + +.sm a,.sm:after { + display: block +} + +.sm a.disabled { + cursor: not-allowed +} + +.sm:after { + content: " "; + height: 0; + font: 0/0 serif; + clear: both; + visibility: hidden; + overflow: hidden +} + +.sm,.sm *,.sm :after,.sm :before { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +.main-menu-btn { + position: relative; + display: inline-block; + width: 36px; + height: 36px; + text-indent: 36px; + margin-left: 8px; + white-space: nowrap; + overflow: hidden; + cursor: pointer; + -webkit-tap-highlight-color: transparent +} + +.main-menu-btn-icon { + top: 50%; + left: 2px +} + +.main-menu-btn-icon,.main-menu-btn-icon:after,.main-menu-btn-icon:before { + position: absolute; + height: 2px; + width: 24px; + background: var(--nav-menu-button-color); + -webkit-transition: all .25s; + transition: all .25s +} + +.main-menu-btn-icon:before { + content: ""; + top: -7px; + left: 0 +} + +.main-menu-btn-icon:after { + content: ""; + top: 7px; + left: 0 +} + +#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon { + height: 0 +} + +#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before { + top: 0; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg) +} + +#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after { + top: 0; + -webkit-transform: rotate(45deg); + transform: rotate(45deg) +} + +#main-menu-state { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + border: 0; + padding: 0; + overflow: hidden; + clip: rect(1px,1px,1px,1px) +} + +#main-menu-state:not(:checked)~#main-menu { + display: none +} + +#main-menu-state:checked~#main-menu { + display: block +} + +@media (min-width:768px) { + .main-menu-btn { + position: absolute; + top: -99999px + } + + #main-menu-state:not(:checked)~#main-menu { + display: block + } +} + +.sm-dox { + background-color: var(--nav-menu-background-color) +} + +.sm-dox a,.sm-dox a:active,.sm-dox a:focus,.sm-dox a:hover { + padding: 0 43px 0 12px; + font-family: var(--font-family-nav); + font-size: 13px; + line-height: 36px; + text-decoration: none; + color: var(--nav-text-normal-color); + outline: 0 +} + +.sm-dox a:hover { + background-color: var(--nav-menu-active-bg); + border-radius: 5px +} + +.sm-dox a.current { + color: #d23600 +} + +.sm-dox a.disabled { + color: #bbb +} + +.sm-dox a span.sub-arrow { + position: absolute; + top: 50%; + margin-top: -14px; + left: auto; + right: 3px; + width: 28px; + height: 28px; + overflow: hidden; + font: 700 12px/28px monospace!important; + text-align: center; + text-shadow: none; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px +} + +.sm-dox a span.sub-arrow:before { + display: block; + content: "+" +} + +.sm-dox a.highlighted span.sub-arrow:before { + display: block; + content: "-" +} + +.sm-dox>li:first-child>:not(ul) a,.sm-dox>li:first-child>a { + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px; + border-radius: 5px 5px 0 0 +} + +.sm-dox>li:last-child>:not(ul) a,.sm-dox>li:last-child>a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul { + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0; + border-radius: 0 0 5px 5px +} + +.sm-dox>li:last-child>:not(ul) a.highlighted,.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted { + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0 +} + +.sm-dox ul { + background: var(--nav-menu-background-color) +} + +.sm-dox ul a,.sm-dox ul a:active,.sm-dox ul a:focus,.sm-dox ul a:hover { + font-size: 12px; + border-left: 8px solid transparent; + line-height: 36px; + text-shadow: none; + background-color: var(--nav-menu-background-color); + background-image: none +} + +.sm-dox ul a:hover { + background-color: var(--nav-menu-active-bg); + border-radius: 5px +} + +.sm-dox ul ul a,.sm-dox ul ul a:active,.sm-dox ul ul a:focus,.sm-dox ul ul a:hover { + border-left: 16px solid transparent +} + +.sm-dox ul ul ul a,.sm-dox ul ul ul a:active,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:hover { + border-left: 24px solid transparent +} + +.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:active,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:hover { + border-left: 32px solid transparent +} + +.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:active,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:hover { + border-left: 40px solid transparent +} + +@media (min-width:768px) { +.sm-dox ul { + position: absolute; + width: 12em; + border: 1px solid #bbb; + padding: 5px 0; + background: var(--nav-menu-background-color); + -moz-border-radius: 5px!important; + -webkit-border-radius: 5px; + border-radius: 5px!important; + -moz-box-shadow: 0 5px 9px rgba(0,0,0,.2); + -webkit-box-shadow: 0 5px 9px rgba(0,0,0,.2); + box-shadow: 0 5px 9px rgba(0,0,0,.2) +} + +.sm-dox li { + float: left; + border-top: 0; + padding: 3px +} + +.sm-dox.sm-rtl li { + float: right +} + +.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li { + float: none +} + +.sm-dox a { + white-space: nowrap +} + +.sm-dox ul a,.sm-dox.sm-vertical a { + white-space: normal +} + +.sm-dox .sm-nowrap>li>:not(ul) a,.sm-dox .sm-nowrap>li>a { + white-space: nowrap +} + +.sm-dox,.sm-dox a span.sub-arrow { + background-color: var(--nav-menu-background-color) +} + +.sm-dox { + padding: 0 10px; + line-height: 36px +} + +.sm-dox a span.sub-arrow { + top: 15px; + right: 10px; + box-sizing: content-box; + padding: 0; + margin: 0; + display: inline-block; + width: 5px; + height: 5px; + border-right: 2px solid var(--nav-arrow-color); + border-bottom: 2px solid var(--nav-arrow-color); + transform: rotate(45deg); + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0 +} + +.sm-dox a,.sm-dox a.highlighted,.sm-dox a:active,.sm-dox a:focus,.sm-dox a:hover { + padding: 0 6px +} + +.sm-dox a:hover { + background-color: var(--nav-menu-active-bg); + border-radius: 5px!important +} + +.sm-dox a:hover span.sub-arrow { + background-color: var(--nav-menu-active-bg); + border-right: 2px solid var(--nav-arrow-selected-color); + border-bottom: 2px solid var(--nav-arrow-selected-color) +} + +.sm-dox a.has-submenu { + padding-right: 24px +} + +.sm-dox>li>ul:after,.sm-dox>li>ul:before { + content: ""; + position: absolute; + top: -18px; + left: 30px; + width: 0; + height: 0; + overflow: hidden; + border-width: 9px; + border-style: dashed dashed solid; + border-color: transparent transparent #bbb +} + +.sm-dox>li>ul:after { + top: -16px; + left: 31px; + border-width: 8px; + border-color: transparent transparent var(--nav-menu-background-color) transparent +} + +.sm-dox ul a span.sub-arrow { + transform: rotate(-45deg); + top: 3px; +} + +.sm-dox ul a,.sm-dox ul a.highlighted,.sm-dox ul a:active,.sm-dox ul a:focus,.sm-dox ul a:hover { + color: var(--nav-menu-foreground-color); + background-image: none; + line-height: normal; + border: 0!important +} + +.sm-dox ul a:hover { + background-color: var(--nav-menu-active-bg); + border-radius: 5px +} + +.sm-dox span.scroll-down,.sm-dox span.scroll-up { + position: absolute; + display: none; + visibility: hidden; + overflow: hidden; + background: var(--nav-menu-background-color); + height: 36px +} + +.sm-dox span.scroll-down:hover,.sm-dox span.scroll-up:hover { + background: #eee +} + +.sm-dox span.scroll-up:hover span.scroll-down-arrow,.sm-dox span.scroll-up:hover span.scroll-up-arrow { + border-color: transparent transparent #d23600 +} + +.sm-dox span.scroll-down:hover span.scroll-down-arrow { + border-color: #d23600 transparent transparent +} + +.sm-dox span.scroll-down-arrow,.sm-dox span.scroll-up-arrow { + position: absolute; + top: 0; + left: 50%; + margin-left: -6px; + width: 0; + height: 0; + overflow: hidden; + border-width: 6px; + border-style: dashed dashed solid; + border-color: transparent transparent var(--nav-menu-foreground-color) transparent +} + +.sm-dox span.scroll-down-arrow { + top: 8px; + border-style: solid dashed dashed; + border-color: var(--nav-menu-foreground-color) transparent transparent transparent +} + +.sm-dox.sm-rtl a.has-submenu { + padding-right: 6px; + padding-left: 24px +} + +.sm-dox.sm-rtl a span.sub-arrow { + right: auto; + left: 6px +} + +.sm-dox.sm-rtl.sm-vertical a.has-submenu,.sm-dox.sm-vertical a,.sm-dox.sm-vertical ul a { + padding: 10px 20px +} + +.sm-dox.sm-rtl ul a span.sub-arrow,.sm-dox.sm-rtl.sm-vertical a span.sub-arrow { + right: auto; + left: 8px; + border-style: dashed solid dashed dashed; + border-color: transparent #555 transparent transparent +} + +.sm-dox.sm-rtl>li>ul:before { + left: auto; + right: 30px +} + +.sm-dox.sm-rtl>li>ul:after { + left: auto; + right: 31px +} + +.sm-dox.sm-rtl ul a.has-submenu { + padding: 10px 20px!important +} + +.sm-dox.sm-vertical { + padding: 10px 0; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px +} + +.sm-dox.sm-vertical a.highlighted,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:hover { + background: #fff +} + +.sm-dox.sm-vertical a span.sub-arrow { + right: 8px; + top: 50%; + margin-top: -5px; + border-width: 5px; + border-style: dashed dashed dashed solid; + border-color: transparent transparent transparent #555 +} + +.sm-dox.sm-vertical>li>ul:after,.sm-dox.sm-vertical>li>ul:before { + display: none +} + +.sm-dox.sm-vertical ul a.highlighted,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:hover { + background: #eee +} + +.sm-dox.sm-vertical ul a.disabled { + background: var(--nav-menu-background-color) +} +} + diff --git a/docs/html/uuid_8hpp.html b/docs/html/uuid_8hpp.html new file mode 100644 index 000000000..00e3f7cf2 --- /dev/null +++ b/docs/html/uuid_8hpp.html @@ -0,0 +1,182 @@ + + + + + + + +Kafka-1C Connector: Файл src/utils/uuid.hpp + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    Файл uuid.hpp
    +
    +
    +
    #include <string>
    +#include <random>
    +#include <sstream>
    +#include <iomanip>
    +
    +Граф включаемых заголовочных файлов для uuid.hpp:
    +
    +
    + + + + + + + + + + + +
    +
    +Граф файлов, в которые включается этот файл:
    +
    +
    + + + + + +
    +
    +

    См. исходные тексты.

    + + + +

    +Пространства имен

    namespace  utils
    + + + +

    +Функции

    std::string utils::generateUUID ()
     Генерирует UUID версии 4 (случайный).
    +
    +
    + +
    + + + + diff --git a/docs/html/uuid_8hpp.js b/docs/html/uuid_8hpp.js new file mode 100644 index 000000000..2e828bbce --- /dev/null +++ b/docs/html/uuid_8hpp.js @@ -0,0 +1,4 @@ +var uuid_8hpp = +[ + [ "utils::generateUUID", "namespaceutils.html#adbc7a6520ceec292a43e3b89c7efba92", null ] +]; \ No newline at end of file diff --git a/docs/html/uuid_8hpp__dep__incl.dot b/docs/html/uuid_8hpp__dep__incl.dot new file mode 100644 index 000000000..69eba9706 --- /dev/null +++ b/docs/html/uuid_8hpp__dep__incl.dot @@ -0,0 +1,10 @@ +digraph "src/utils/uuid.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/utils/uuid.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",dir="back",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="src/processor/order\l_processor.cpp",height=0.2,width=0.4,color="grey40", fillcolor="white", style="filled",URL="$order__processor_8cpp.html",tooltip=" "]; +} diff --git a/docs/html/uuid_8hpp__dep__incl.map b/docs/html/uuid_8hpp__dep__incl.map new file mode 100644 index 000000000..9d5b31697 --- /dev/null +++ b/docs/html/uuid_8hpp__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/uuid_8hpp__dep__incl.md5 b/docs/html/uuid_8hpp__dep__incl.md5 new file mode 100644 index 000000000..eb83e141c --- /dev/null +++ b/docs/html/uuid_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +5a9b3d30a568de18aa86e3ecce387034 \ No newline at end of file diff --git a/docs/html/uuid_8hpp__dep__incl.png b/docs/html/uuid_8hpp__dep__incl.png new file mode 100644 index 000000000..937a0bd9b Binary files /dev/null and b/docs/html/uuid_8hpp__dep__incl.png differ diff --git a/docs/html/uuid_8hpp__incl.dot b/docs/html/uuid_8hpp__incl.dot new file mode 100644 index 000000000..e71a4d7a3 --- /dev/null +++ b/docs/html/uuid_8hpp__incl.dot @@ -0,0 +1,16 @@ +digraph "src/utils/uuid.hpp" +{ + // LATEX_PDF_SIZE + bgcolor="transparent"; + edge [fontname=Helvetica,fontsize=10,labelfontname=Helvetica,labelfontsize=10]; + node [fontname=Helvetica,fontsize=10,shape=box,height=0.2,width=0.4]; + Node1 [id="Node000001",label="src/utils/uuid.hpp",height=0.2,width=0.4,color="gray40", fillcolor="grey60", style="filled", fontcolor="black",tooltip=" "]; + Node1 -> Node2 [id="edge1_Node000001_Node000002",color="steelblue1",style="solid",tooltip=" "]; + Node2 [id="Node000002",label="string",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node3 [id="edge2_Node000001_Node000003",color="steelblue1",style="solid",tooltip=" "]; + Node3 [id="Node000003",label="random",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node4 [id="edge3_Node000001_Node000004",color="steelblue1",style="solid",tooltip=" "]; + Node4 [id="Node000004",label="sstream",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; + Node1 -> Node5 [id="edge4_Node000001_Node000005",color="steelblue1",style="solid",tooltip=" "]; + Node5 [id="Node000005",label="iomanip",height=0.2,width=0.4,color="grey60", fillcolor="#E0E0E0", style="filled",tooltip=" "]; +} diff --git a/docs/html/uuid_8hpp__incl.map b/docs/html/uuid_8hpp__incl.map new file mode 100644 index 000000000..ed49e9b84 --- /dev/null +++ b/docs/html/uuid_8hpp__incl.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/html/uuid_8hpp__incl.md5 b/docs/html/uuid_8hpp__incl.md5 new file mode 100644 index 000000000..0effbc2c4 --- /dev/null +++ b/docs/html/uuid_8hpp__incl.md5 @@ -0,0 +1 @@ +accafdf1ab11304221d840d1dc838e01 \ No newline at end of file diff --git a/docs/html/uuid_8hpp__incl.png b/docs/html/uuid_8hpp__incl.png new file mode 100644 index 000000000..15a0e5afd Binary files /dev/null and b/docs/html/uuid_8hpp__incl.png differ diff --git a/docs/html/uuid_8hpp_source.html b/docs/html/uuid_8hpp_source.html new file mode 100644 index 000000000..c81c83677 --- /dev/null +++ b/docs/html/uuid_8hpp_source.html @@ -0,0 +1,193 @@ + + + + + + + +Kafka-1C Connector: Исходный файл src/utils/uuid.hpp + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Kafka-1C Connector 1.0.0 +
    +
    High-performance Kafka-1C integration microservice
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Загрузка...
    +
    Поиск...
    +
    Не найдено
    +
    +
    +
    +
    + +
    +
    uuid.hpp
    +
    +
    +См. документацию.
    1#pragma once
    +
    2
    +
    3#include <string>
    +
    4#include <random>
    +
    5#include <sstream>
    +
    6#include <iomanip>
    +
    7
    +
    +
    8namespace utils {
    +
    9
    +
    +
    14inline std::string generateUUID() {
    +
    15 std::random_device rd;
    +
    16 std::mt19937_64 gen(rd());
    +
    17 std::uniform_int_distribution<int> dist(0, 15);
    +
    18 std::uniform_int_distribution<int> dist_ver(8, 11); // Для версии 4
    +
    19
    +
    20 std::stringstream ss;
    +
    21 ss << std::hex << std::setfill('0');
    +
    22
    +
    23 // Формат: 8-4-4-4-12
    +
    24 // 8 символов
    +
    25 for (int i = 0; i < 8; ++i) {
    +
    26 ss << dist(gen);
    +
    27 }
    +
    28 ss << '-';
    +
    29
    +
    30 // 4 символа
    +
    31 for (int i = 0; i < 4; ++i) {
    +
    32 ss << dist(gen);
    +
    33 }
    +
    34 ss << '-';
    +
    35
    +
    36 // 4 символа (версия 4)
    +
    37 ss << dist_ver(gen);
    +
    38 for (int i = 0; i < 3; ++i) {
    +
    39 ss << dist(gen);
    +
    40 }
    +
    41 ss << '-';
    +
    42
    +
    43 // 4 символа (вариант)
    +
    44 ss << dist(gen);
    +
    45 for (int i = 0; i < 3; ++i) {
    +
    46 ss << dist(gen);
    +
    47 }
    +
    48 ss << '-';
    +
    49
    +
    50 // 12 символов
    +
    51 for (int i = 0; i < 12; ++i) {
    +
    52 ss << dist(gen);
    +
    53 }
    +
    54
    +
    55 return ss.str();
    +
    56}
    +
    +
    57
    +
    58} // namespace utils
    +
    +
    Определения uuid.hpp:8
    +
    std::string generateUUID()
    Генерирует UUID версии 4 (случайный).
    Определения uuid.hpp:14
    +
    +
    +
    + + + + diff --git a/input/Arhiv/order_007.json b/input/Arhiv/order_007.json new file mode 100644 index 000000000..e68ca8049 --- /dev/null +++ b/input/Arhiv/order_007.json @@ -0,0 +1,10 @@ +{ + "TIN": "7888234572", + "TRRC": "", + "contractor": "ИП Михайлов И.И.", + "date": "2026-08-09T09:30:00", + "number": "ORD-007", + "goods": [ + {"SKU": "PROD-002", "Quantity": 8, "Price": 1500.00, "Sum": 12000.00} + ] +} \ No newline at end of file diff --git a/input/Arhiv/order_7.json b/input/Arhiv/order_7.json new file mode 100644 index 000000000..eba1d65ca --- /dev/null +++ b/input/Arhiv/order_7.json @@ -0,0 +1,15 @@ +{ + "TIN": "7709876543", + "TRRC": "770202002", + "contractor": "ООО Партнер", + "date": "2026-08-03T11:00:00", + "number": "ORD-520", + "goods": [ + { + "SKU": "PROD-008", + "Quantity": 1978, + "Price": 1000.00, + "Sum": 1978000.00 + } + ] +} \ No newline at end of file diff --git a/input/Arhiv/order_78.json b/input/Arhiv/order_78.json new file mode 100644 index 000000000..f1cf52272 --- /dev/null +++ b/input/Arhiv/order_78.json @@ -0,0 +1,15 @@ +{ + "TIN": "7878787878", + "TRRC": "780202002", + "contractor": "ООО Партнер На кирилице", + "date": "2026-08-03T11:30:00", + "number": "ORD-529", + "goods": [ + { + "SKU": "PROD-008", + "Quantity": 1978, + "Price": 1000.00, + "Sum": 1978000.00 + } + ] +} \ No newline at end of file diff --git a/input/Arhiv/order_8.json b/input/Arhiv/order_8.json new file mode 100644 index 000000000..d64d3c6a6 --- /dev/null +++ b/input/Arhiv/order_8.json @@ -0,0 +1,15 @@ +{ + "TIN": "7809876543", + "TRRC": "780202002", + "contractor": "LLC Partner SPB", + "date": "2026-08-03T11:00:00", + "number": "ORD-530", + "goods": [ + { + "SKU": "PROD-008", + "Quantity": 780, + "Price": 100.00, + "Sum": 78000.00 + } + ] +} \ No newline at end of file diff --git a/input/Arhiv/order_87.json b/input/Arhiv/order_87.json new file mode 100644 index 000000000..8d73ae14a --- /dev/null +++ b/input/Arhiv/order_87.json @@ -0,0 +1,15 @@ +{ + "TIN": "7878787878", + "TRRC": "780202002", + "contractor": "! Партнер На кирилице", + "date": "2026-08-03T11:52:00", + "number": "ORD-574", + "goods": [ + { + "SKU": "PROD-003", + "Quantity": 7800, + "Price": 1000.00, + "Sum": 7800000.00 + } + ] +} \ No newline at end of file diff --git a/input/order_602.json b/input/order_602.json new file mode 100644 index 000000000..9dd7d9be4 --- /dev/null +++ b/input/order_602.json @@ -0,0 +1,10 @@ +{ + "TIN": "7701234567", + "TRRC": "770101001", + "contractor": "ООО Тестовая Компания", + "date": "2026-08-10T12:04:00", + "number": "ORD-602", + "goods": [ + {"SKU": "PROD-001", "Quantity": 5, "Price": 1000.00, "Sum": 5000.00} + ] +} \ No newline at end of file diff --git a/input/order_603.json b/input/order_603.json new file mode 100644 index 000000000..6d90b6c09 --- /dev/null +++ b/input/order_603.json @@ -0,0 +1,10 @@ +{ + "TIN": "7709876543", + "TRRC": "770202002", + "contractor": "ООО Партнер", + "date": "2026-08-10T12:40:00", + "number": "ORD-603", + "goods": [ + {"SKU": "PROD-002", "Quantity": 10, "Price": 1500.00, "Sum": 15000.00} + ] +} \ No newline at end of file diff --git a/input/order_604.json b/input/order_604.json new file mode 100644 index 000000000..5541f7e8b --- /dev/null +++ b/input/order_604.json @@ -0,0 +1,10 @@ +{ + "TIN": "7809876543", + "TRRC": "780202002", + "contractor": "LLC Partner SPB", + "date": "2026-08-10T12:22:00", + "number": "ORD-604", + "goods": [ + {"SKU": "PROD-003", "Quantity": 7, "Price": 2000.00, "Sum": 14000.00} + ] +} \ No newline at end of file diff --git a/input/order_605.json b/input/order_605.json new file mode 100644 index 000000000..e50d572e4 --- /dev/null +++ b/input/order_605.json @@ -0,0 +1,10 @@ +{ + "TIN": "1978197878", + "TRRC": "780202002", + "contractor": "! Партнер Тест1", + "date": "2026-08-10T12:59:00", + "number": "ORD-605", + "goods": [ + {"SKU": "PROD-004", "Quantity": 3, "Price": 2500.00, "Sum": 7500.00} + ] +} \ No newline at end of file diff --git a/input/order_608.json b/input/order_608.json new file mode 100644 index 000000000..5963d54d8 --- /dev/null +++ b/input/order_608.json @@ -0,0 +1,10 @@ +{ + "TIN": "7701234569", + "TRRC": "", + "contractor": "ИП Петров Б.Б.", + "date": "2026-08-10T12:59:00", + "number": "ORD-608", + "goods": [ + {"SKU": "PROD-007", "Quantity": 4, "Price": 2200.00, "Sum": 8800.00} + ] +} \ No newline at end of file diff --git a/input/order_609.json b/input/order_609.json new file mode 100644 index 000000000..8f2ffc1db --- /dev/null +++ b/input/order_609.json @@ -0,0 +1,10 @@ +{ + "TIN": "7701234570", + "TRRC": "", + "contractor": "ИП Сидоров В.В.", + "date": "2026-08-10T12:12:00", + "number": "ORD-609", + "goods": [ + {"SKU": "PROD-008", "Quantity": 6, "Price": 1200.00, "Sum": 7200.00} + ] +} \ No newline at end of file diff --git a/input/order_610.json b/input/order_610.json new file mode 100644 index 000000000..5cfed5904 --- /dev/null +++ b/input/order_610.json @@ -0,0 +1,10 @@ +{ + "TIN": "7809876543", + "TRRC": "780202002", + "contractor": "LLC Partner SPB", + "date": "2026-08-10T12:22:00", + "number": "ORD-610", + "goods": [ + {"SKU": "PROD-016", "Quantity": 4, "Price": 2100.00, "Sum": 8400.00} + ] +} \ No newline at end of file diff --git a/input/order_611.json b/input/order_611.json new file mode 100644 index 000000000..cb59b1dd8 --- /dev/null +++ b/input/order_611.json @@ -0,0 +1,10 @@ +{ + "TIN": "7701234572", + "TRRC": "", + "contractor": "ИП Кузнецов И.И.", + "date": "2026-08-10T12:48:00", + "number": "ORD-611", + "goods": [ + {"SKU": "PROD-010", "Quantity": 11, "Price": 1100.00, "Sum": 12100.00} + ] +} \ No newline at end of file diff --git a/input/order_620.json b/input/order_620.json new file mode 100644 index 000000000..ff5088f03 --- /dev/null +++ b/input/order_620.json @@ -0,0 +1,14 @@ +{ + "TIN": "7701234569", + "TRRC": "", + "contractor": "ИП Петров Б.Б.", + "date": "2026-08-10T12:52:00", + "number": "ORD-620", + "goods": [ + {"SKU": "PROD-001", "Quantity": 1, "Price": 1000.00, "Sum": 1000.00}, + {"SKU": "PROD-002", "Quantity": 2, "Price": 1500.00, "Sum": 3000.00}, + {"SKU": "PROD-003", "Quantity": 3, "Price": 2000.00, "Sum": 6000.00}, + {"SKU": "PROD-004", "Quantity": 4, "Price": 2500.00, "Sum": 10000.00}, + {"SKU": "PROD-005", "Quantity": 5, "Price": 3000.00, "Sum": 15000.00} + ] +} \ No newline at end of file diff --git a/input/order_7.json b/input/order_7.json new file mode 100644 index 000000000..eba1d65ca --- /dev/null +++ b/input/order_7.json @@ -0,0 +1,15 @@ +{ + "TIN": "7709876543", + "TRRC": "770202002", + "contractor": "ООО Партнер", + "date": "2026-08-03T11:00:00", + "number": "ORD-520", + "goods": [ + { + "SKU": "PROD-008", + "Quantity": 1978, + "Price": 1000.00, + "Sum": 1978000.00 + } + ] +} \ No newline at end of file diff --git a/input/order_700.json b/input/order_700.json new file mode 100644 index 000000000..e5f1f6d4e --- /dev/null +++ b/input/order_700.json @@ -0,0 +1,21 @@ +{ + "TIN": "7709234567", + "TRRC": "770901001", + "contractor": "ООО Альфа-Трейд", + "date": "2026-08-10T10:00:00", + "number": "ORD-700", + "goods": [ + { + "SKU": "PROD-003", + "Quantity": 15, + "Price": 2000.00, + "Sum": 30000.00 + }, + { + "SKU": "PROD-007", + "Quantity": 8, + "Price": 2200.00, + "Sum": 17600.00 + } + ] +} \ No newline at end of file diff --git a/input/order_701.json b/input/order_701.json new file mode 100644 index 000000000..160e0c435 --- /dev/null +++ b/input/order_701.json @@ -0,0 +1,27 @@ +{ + "TIN": "7707234567", + "TRRC": "770701001", + "contractor": "ЗАО Бета-Групп", + "date": "2026-08-10T12:00:00", + "number": "ORD-701", + "goods": [ + { + "SKU": "PROD-008", + "Quantity": 20, + "Price": 1200.00, + "Sum": 24000.00 + }, + { + "SKU": "PROD-010", + "Quantity": 12, + "Price": 1100.00, + "Sum": 13200.00 + }, + { + "SKU": "PROD-012", + "Quantity": 6, + "Price": 800.00, + "Sum": 4800.00 + } + ] +} \ No newline at end of file diff --git a/input/order_78.json b/input/order_78.json new file mode 100644 index 000000000..f1cf52272 --- /dev/null +++ b/input/order_78.json @@ -0,0 +1,15 @@ +{ + "TIN": "7878787878", + "TRRC": "780202002", + "contractor": "ООО Партнер На кирилице", + "date": "2026-08-03T11:30:00", + "number": "ORD-529", + "goods": [ + { + "SKU": "PROD-008", + "Quantity": 1978, + "Price": 1000.00, + "Sum": 1978000.00 + } + ] +} \ No newline at end of file diff --git a/input/order_8.json b/input/order_8.json new file mode 100644 index 000000000..d64d3c6a6 --- /dev/null +++ b/input/order_8.json @@ -0,0 +1,15 @@ +{ + "TIN": "7809876543", + "TRRC": "780202002", + "contractor": "LLC Partner SPB", + "date": "2026-08-03T11:00:00", + "number": "ORD-530", + "goods": [ + { + "SKU": "PROD-008", + "Quantity": 780, + "Price": 100.00, + "Sum": 78000.00 + } + ] +} \ No newline at end of file diff --git a/input/order_87.json b/input/order_87.json new file mode 100644 index 000000000..8d73ae14a --- /dev/null +++ b/input/order_87.json @@ -0,0 +1,15 @@ +{ + "TIN": "7878787878", + "TRRC": "780202002", + "contractor": "! Партнер На кирилице", + "date": "2026-08-03T11:52:00", + "number": "ORD-574", + "goods": [ + { + "SKU": "PROD-003", + "Quantity": 7800, + "Price": 1000.00, + "Sum": 7800000.00 + } + ] +} \ No newline at end of file diff --git a/lib.cpp b/lib.cpp deleted file mode 100644 index 88396ea0a..000000000 --- a/lib.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "lib.h" - -#include "version.h" - -int version() { - return PROJECT_VERSION_PATCH; -} diff --git a/lib.h b/lib.h deleted file mode 100644 index f802c701e..000000000 --- a/lib.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -int version(); - diff --git a/main.cpp b/main.cpp deleted file mode 100644 index 18861d612..000000000 --- a/main.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "lib.h" - -#include - -int main(int, char **) { - std::cout << "Version: " << version() << std::endl; - std::cout << "Hello, world!" << std::endl; - return 0; -} diff --git a/src/cache/sqlite_cache.cpp b/src/cache/sqlite_cache.cpp new file mode 100644 index 000000000..995e8d5c0 --- /dev/null +++ b/src/cache/sqlite_cache.cpp @@ -0,0 +1,294 @@ +#include "sqlite_cache.hpp" +#include + +// ============================================================ +// Конструктор +// ============================================================ +MessageCache::MessageCache(const std::string &db_path) + : db_path_(db_path), db_(nullptr) {} + +// ============================================================ +// Деструктор +// ============================================================ +MessageCache::~MessageCache() +{ + if (db_) + { + sqlite3_close(db_); // Закрываем соединение с БД + } +} + +// ============================================================ +// Инициализация +// 1. Открываем БД (создается автоматически) +// 2. Включаем WAL режим для производительности +// 3. Создаем таблицу messages +// ============================================================ +bool MessageCache::init() +{ + std::lock_guard lock(mutex_); + + if (sqlite3_open(db_path_.c_str(), &db_) != SQLITE_OK) + { + std::cerr << "[Cache] Failed to open: " << sqlite3_errmsg(db_) << std::endl; + return false; + } + + execute("PRAGMA journal_mode=WAL;"); + execute("PRAGMA synchronous=NORMAL;"); + + // ДОБАВЛЯЕМ ПОЛЕ source + const char *sql = R"( + CREATE TABLE IF NOT EXISTS messages ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + filename TEXT NOT NULL, + tin TEXT, + trrc TEXT, + topic TEXT NOT NULL, + message TEXT NOT NULL, + status TEXT DEFAULT 'pending', + source TEXT NOT NULL, -- ← УНИКАЛЬНЫЙ ИДЕНТИФИКАТОР + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + sent_at TIMESTAMP, + error TEXT + ); + CREATE INDEX IF NOT EXISTS idx_status ON messages(status); + CREATE INDEX IF NOT EXISTS idx_created ON messages(created_at); + CREATE INDEX IF NOT EXISTS idx_source ON messages(source); + )"; + + if (!execute(sql)) + { + return false; + } + + std::cout << "[Cache] Initialized: " << db_path_ << std::endl; + return true; +} + +// ============================================================ +// Сохранение сообщения в кэш +// ============================================================ +bool MessageCache::save(const std::string &filename, const std::string &topic, + const std::string &message, const std::string &tin, + const std::string &trrc, const std::string &source) +{ + std::lock_guard lock(mutex_); + + std::string sql = R"( + INSERT INTO messages (filename, tin, trrc, topic, message, status, source) + VALUES (?, ?, ?, ?, ?, 'pending', ?) + )"; + + sqlite3_stmt *stmt; + if (sqlite3_prepare_v2(db_, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) + { + std::cerr << "[Cache] Prepare failed: " << sqlite3_errmsg(db_) << std::endl; + return false; + } + + sqlite3_bind_text(stmt, 1, filename.c_str(), -1, SQLITE_TRANSIENT); // 6. Привязка параметров к INSERT + sqlite3_bind_text(stmt, 2, tin.c_str(), -1, SQLITE_TRANSIENT); + sqlite3_bind_text(stmt, 3, trrc.c_str(), -1, SQLITE_TRANSIENT); + sqlite3_bind_text(stmt, 4, topic.c_str(), -1, SQLITE_TRANSIENT); + sqlite3_bind_text(stmt, 5, message.c_str(), -1, SQLITE_TRANSIENT); + + // ★ source - уникальный идентификатор ★ + std::string full_source = source; + if (!source_prefix_.empty() && !source.empty()) + { + full_source = source_prefix_ + "|" + source; + } + sqlite3_bind_text(stmt, 6, full_source.c_str(), -1, SQLITE_TRANSIENT); + + int rc = sqlite3_step(stmt); // 7. Выполнение INSERT + sqlite3_finalize(stmt); + + if (rc != SQLITE_DONE) + { + std::cerr << "[Cache] Insert failed: " << sqlite3_errmsg(db_) << std::endl; + return false; + } + + return true; +} + +// ============================================================ +// Отметка сообщения как отправленного +// ============================================================ +bool MessageCache::markSent(int64_t id) +{ + std::lock_guard lock(mutex_); + + // 27. Выполнение UPDATE изменение статуса + std::string sql = R"( + UPDATE messages + SET status = 'sent', sent_at = CURRENT_TIMESTAMP + WHERE id = ? + )"; // Формирование SQL + + sqlite3_stmt *stmt; + if (sqlite3_prepare_v2(db_, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) // Выполнение запроса + { + return false; + } + + sqlite3_bind_int64(stmt, 1, id); + int rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + + return rc == SQLITE_DONE; +} + +bool MessageCache::markError(int64_t id, const std::string &error) +{ + std::lock_guard lock(mutex_); + + std::string sql = R"( + UPDATE messages + SET status = 'error', error = ? + WHERE id = ? + )"; + + sqlite3_stmt *stmt; + if (sqlite3_prepare_v2(db_, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) + { + return false; + } + + sqlite3_bind_text(stmt, 1, error.c_str(), -1, SQLITE_TRANSIENT); + sqlite3_bind_int64(stmt, 2, id); + int rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + + return rc == SQLITE_DONE; +} + +// ============================================================ +// Получение ожидающих отправки сообщений +// ============================================================ +std::vector> +MessageCache::getPendingMessages(int limit) +{ + std::lock_guard lock(mutex_); + + std::vector> result; + + // ИСПОЛЬЗУЕМ source_prefix ДЛЯ ФИЛЬТРАЦИИ + std::string sql = R"( + SELECT id, topic, message, filename + FROM messages + WHERE status = 'pending' + AND source LIKE ? || '%' + AND datetime(created_at) <= datetime('now', '-' || ? || ' seconds') + ORDER BY created_at + LIMIT ? + )"; + + sqlite3_stmt *stmt; + if (sqlite3_prepare_v2(db_, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) + { + std::cerr << "[Cache] Select failed: " << sqlite3_errmsg(db_) << std::endl; + return result; + } + + sqlite3_bind_text(stmt, 1, source_prefix_.c_str(), -1, SQLITE_TRANSIENT); + sqlite3_bind_int(stmt, 2, reprocess_delay_seconds_); + sqlite3_bind_int(stmt, 3, limit); + + while (sqlite3_step(stmt) == SQLITE_ROW) + { + int64_t id = sqlite3_column_int64(stmt, 0); + std::string topic = reinterpret_cast(sqlite3_column_text(stmt, 1)); + std::string message = reinterpret_cast(sqlite3_column_text(stmt, 2)); + std::string filename = reinterpret_cast(sqlite3_column_text(stmt, 3)); + result.emplace_back(id, topic, message, filename); + } + + sqlite3_finalize(stmt); + return result; +} + +bool MessageCache::removeSent() +{ + std::lock_guard lock(mutex_); + return execute("DELETE FROM messages WHERE status = 'sent'"); +} + +void MessageCache::cleanup(int days) +{ + std::lock_guard lock(mutex_); + std::string sql = "DELETE FROM messages WHERE created_at < datetime('now', '-' || ? || ' days')"; + + sqlite3_stmt *stmt; + if (sqlite3_prepare_v2(db_, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) + { + return; + } + + sqlite3_bind_int(stmt, 1, days); + sqlite3_step(stmt); + sqlite3_finalize(stmt); +} + +// ============================================================ +// Статистика: сколько ожидающих отправки +// ============================================================ +size_t MessageCache::getPendingCount() +{ + std::lock_guard lock(mutex_); + + sqlite3_stmt *stmt; + if (sqlite3_prepare_v2(db_, "SELECT COUNT(*) FROM messages WHERE status = 'pending'", + -1, &stmt, nullptr) != SQLITE_OK) + { + return 0; + } + + sqlite3_step(stmt); + size_t count = sqlite3_column_int64(stmt, 0); + sqlite3_finalize(stmt); + return count; +} + +// ============================================================ +// Статистика: всего записей +// ============================================================ +size_t MessageCache::getTotalCount() +{ + std::lock_guard lock(mutex_); + + sqlite3_stmt *stmt; + if (sqlite3_prepare_v2(db_, "SELECT COUNT(*) FROM messages", -1, &stmt, nullptr) != SQLITE_OK) + { + return 0; + } + + sqlite3_step(stmt); + size_t count = sqlite3_column_int64(stmt, 0); + sqlite3_finalize(stmt); + return count; +} + +// ============================================================ +// Вспомогательная функция: выполнить SQL запрос +// ============================================================ +bool MessageCache::execute(const std::string &sql) +{ + char *errmsg = nullptr; + int rc = sqlite3_exec(db_, sql.c_str(), nullptr, nullptr, &errmsg); + if (rc != SQLITE_OK) + { + std::cerr << "[Cache] SQL error: " << errmsg << std::endl; + sqlite3_free(errmsg); + return false; + } + return true; +} + +bool MessageCache::prepareAndExecute(const std::string &sql, + std::function binder) +{ + // Этот метод пока не используется, но оставлен для будущего расширения + return true; +} \ No newline at end of file diff --git a/src/cache/sqlite_cache.hpp b/src/cache/sqlite_cache.hpp new file mode 100644 index 000000000..b85961a5a --- /dev/null +++ b/src/cache/sqlite_cache.hpp @@ -0,0 +1,64 @@ +#pragma once + +#include +#include +#include +#include +#include +#include // <-- ДОБАВЛЯЕМ ЭТУ СТРОКУ + +// ============================================================ +// Класс: MessageCache +// Хранит сообщения в SQLite для надежности +// ============================================================ +class MessageCache +{ +public: + MessageCache(const std::string &db_path); + ~MessageCache(); + + // Инициализация БД (создание таблиц) + bool init(); + + // Сохранить сообщение перед отправкой + bool save(const std::string &filename, const std::string &topic, + const std::string &message, const std::string &tin = "", + const std::string &trrc = "", const std::string &source = ""); + + void setSourcePrefix(const std::string &prefix) { source_prefix_ = prefix; } + void setReprocessDelay(int seconds) { reprocess_delay_seconds_ = seconds; } + + // Отметить сообщение как отправленное + bool markSent(int64_t id); + + // Отметить сообщение как ошибочное + bool markError(int64_t id, const std::string &error); + + // Получить ожидающие отправки сообщения + std::vector> + getPendingMessages(int limit = 100); + + // Удалить отправленные сообщения + bool removeSent(); + + // Очистка старых записей (старше N дней) + void cleanup(int days = 7); + + // Статистика + size_t getPendingCount(); // Сколько ожидает отправки + size_t getTotalCount(); // Всего записей в БД + +private: + std::string db_path_; // Путь к файлу БД + sqlite3 *db_; // Указатель на БД + std::mutex mutex_; // Мьютекс для потокобезопасности + std::string source_prefix_; + int reprocess_delay_seconds_ = 0; + + // Выполнить SQL запрос (без результата) + bool execute(const std::string &sql); + + // Подготовить и выполнить запрос с параметрами + bool prepareAndExecute(const std::string &sql, + std::function binder); +}; \ No newline at end of file diff --git a/src/config/config.cpp b/src/config/config.cpp new file mode 100644 index 000000000..cc107cf69 --- /dev/null +++ b/src/config/config.cpp @@ -0,0 +1,65 @@ +#include "config.hpp" +#include +#include + +AppConfig AppConfig::load(const std::string &filename) +{ + std::ifstream file(filename); + if (!file.is_open()) + { + throw std::runtime_error("Cannot open config file: " + filename); + } + + json j; + file >> j; + + AppConfig config; + + // Kafka + config.kafka.bootstrap_servers = j["kafka"]["bootstrap_servers"]; + config.kafka.topics.input = j["kafka"]["topics"]["input"]; + config.kafka.topics.output = j["kafka"]["topics"]["output"]; + config.kafka.topics.errors = j["kafka"]["topics"]["errors"]; + config.kafka.producer.acks = j["kafka"]["producer"]["acks"]; + config.kafka.producer.retries = j["kafka"]["producer"]["retries"]; + config.kafka.producer.batch_size = j["kafka"]["producer"]["batch_size"]; + config.kafka.producer.linger_ms = j["kafka"]["producer"]["linger_ms"]; + config.kafka.consumer.group_id = j["kafka"]["consumer"]["group_id"]; + config.kafka.consumer.auto_offset_reset = j["kafka"]["consumer"]["auto_offset_reset"]; + config.kafka.consumer.enable_auto_commit = j["kafka"]["consumer"]["enable_auto_commit"]; + + // Database — загружаем в ConnectionParams + config.database.postgresql.host = j["database"]["postgresql"]["host"]; + config.database.postgresql.port = j["database"]["postgresql"]["port"]; + config.database.postgresql.database = j["database"]["postgresql"]["database"]; + config.database.postgresql.username = j["database"]["postgresql"]["username"]; + config.database.postgresql.password = j["database"]["postgresql"]["password"]; + + // Processing + config.processing.max_workers = j["processing"]["max_workers"]; + config.processing.batch_size = j["processing"]["batch_size"]; + config.processing.retry_interval_seconds = j["processing"]["retry_interval_seconds"]; + config.processing.delete_after_send = j["processing"]["delete_after_send"]; + + // Cache + config.cache.path = j["cache"]["path"]; + config.cache.retention_days = j["cache"].value("retention_days", 7); + config.cache.reprocess_delay_seconds = j["cache"].value("reprocess_delay_seconds", 7); + config.cache.source_prefix = j["cache"].value("source_prefix", "localhost:9092|orders.input"); + + // Mode + config.mode = j.value("mode", "both"); + + // Groups + for (const auto &group : j["groups"]) + { + GroupConfig g; + g.name = group["name"]; + g.enabled = group["enabled"]; + g.input_directory = group["input_directory"]; + g.kafka_topic = group["kafka_topic"]; + config.groups.push_back(g); + } + + return config; +} \ No newline at end of file diff --git a/src/config/config.hpp b/src/config/config.hpp new file mode 100644 index 000000000..154915b71 --- /dev/null +++ b/src/config/config.hpp @@ -0,0 +1,91 @@ +#pragma once + +#include +#include +#include +#include "../database/postgresql.hpp" // <-- ДОБАВЛЯЕМ + +using json = nlohmann::json; + +// ============================================================ +// KafkaConfig +// ============================================================ +struct KafkaConfig +{ + std::string bootstrap_servers; + struct Topics + { + std::string input; + std::string output; + std::string errors; + } topics; + struct Producer + { + std::string acks; + int retries; + int batch_size; + int linger_ms; + } producer; + struct Consumer + { + std::string group_id; + std::string auto_offset_reset; + bool enable_auto_commit; + } consumer; +}; + +// ============================================================ +// DatabaseConfig — используем ConnectionParams из database +// ============================================================ +struct DatabaseConfig +{ + database::ConnectionParams postgresql; +}; + +// ============================================================ +// ProcessingConfig +// ============================================================ +struct ProcessingConfig +{ + int max_workers; + int batch_size; + int retry_interval_seconds; + bool delete_after_send; +}; + +// ============================================================ +// CacheConfig +// ============================================================ +struct CacheConfig +{ + std::string path; + int retention_days = 7; + int reprocess_delay_seconds = 7; + std::string source_prefix; // УНИКАЛЬНЫЙ ПРЕФИКС РАЗДЕЛЕНИЯ ПОТОКОВ В КЭШЕ SQLLITE +}; + +// ============================================================ +// GroupConfig +// ============================================================ +struct GroupConfig +{ + std::string name; + bool enabled; + std::string input_directory; + std::string kafka_topic; +}; + +// ============================================================ +// AppConfig +// ============================================================ +struct AppConfig +{ + KafkaConfig kafka; + DatabaseConfig database; + ProcessingConfig processing; + CacheConfig cache; + std::vector groups; + std::string mode; // "producer", "consumer", "both" + + static AppConfig load(const std::string &filename); +}; \ No newline at end of file diff --git a/src/database/postgresql.cpp b/src/database/postgresql.cpp new file mode 100644 index 000000000..10e682f79 --- /dev/null +++ b/src/database/postgresql.cpp @@ -0,0 +1,593 @@ +#include "postgresql.hpp" +#include "../utils/logger.hpp" +#include +#include +#include +#include +#include +#include + +namespace database +{ + + // ============================================================ + // Конструкторы / Деструктор + // ============================================================ + + PostgreSQL::PostgreSQL() + : conn_(nullptr), connected_(false) {} + + PostgreSQL::PostgreSQL(const ConnectionParams ¶ms) + : params_(params), conn_(nullptr), connected_(false) {} + + PostgreSQL::~PostgreSQL() + { + disconnect(); + } + + // ============================================================ + // Подключение к БД + // ============================================================ + + bool PostgreSQL::connect() + { + try + { + if (params_.host.empty()) + { + conn_ = std::make_unique(""); + } + else + { + conn_ = std::make_unique(params_.connectionString()); + } + + if (!conn_->is_open()) + { + Logger::error("Failed to connect to PostgreSQL"); + return false; + } + + // УСТАНАВЛИВАЕМ КОДИРОВКУ + { + pqxx::work txn(*conn_); + + // Проверяем кодировку + pqxx::result res = txn.exec("SHOW client_encoding;"); + std::string encoding = res[0][0].as(); + Logger::info("PostgreSQL client_encoding: " + encoding); + + txn.exec("SET client_encoding = 'UTF8';"); + txn.exec("SET standard_conforming_strings = on;"); + txn.commit(); + } + + connected_ = true; + Logger::info("Connected to PostgreSQL"); + return true; + } + catch (const std::exception &e) + { + Logger::error("PostgreSQL connection error: " + std::string(e.what())); + return false; + } + } + + bool PostgreSQL::isConnected() const + { + return connected_ && conn_ && conn_->is_open(); + } + + void PostgreSQL::disconnect() + { + // if (conn_ && conn_->is_open()) + //{ + // conn_->close(); + // } + conn_.reset(); + connected_ = false; + } + + // ============================================================ + // Выполнение SQL запросов + // ============================================================ + + bool PostgreSQL::execute(const std::string &sql) + { + if (!isConnected()) + { + Logger::error("Not connected to PostgreSQL"); + return false; + } + + try + { + pqxx::work txn(*conn_); + txn.exec(sql); + txn.commit(); + return true; + } + catch (const std::exception &e) + { + Logger::error("SQL error: " + std::string(e.what())); + Logger::error("SQL: " + sql); + return false; + } + } + + bool PostgreSQL::executeParams(const std::string &sql, const std::vector ¶ms) + { + if (!isConnected()) + { + Logger::error("Not connected to PostgreSQL"); + return false; + } + + try + { + pqxx::work txn(*conn_); + + std::string query = sql; + for (size_t i = 0; i < params.size(); ++i) + { + std::string placeholder = "$" + std::to_string(i + 1); + size_t pos = query.find(placeholder); + if (pos != std::string::npos) + { + query.replace(pos, placeholder.length(), "'" + escape(params[i]) + "'"); + } + } + + txn.exec(query); + txn.commit(); + return true; + } + catch (const std::exception &e) + { + Logger::error("SQL error: " + std::string(e.what())); + Logger::error("SQL: " + sql); + return false; + } + } + + pqxx::result PostgreSQL::query(const std::string &sql) + { + if (!isConnected()) + { + Logger::error("Not connected to PostgreSQL"); + return pqxx::result(); + } + + try + { + pqxx::work txn(*conn_); + pqxx::result result = txn.exec(sql); + txn.commit(); + return result; + } + catch (const std::exception &e) + { + Logger::error("SQL error: " + std::string(e.what())); + Logger::error("SQL: " + sql); + return pqxx::result(); + } + } + + // ============================================================ + // Вспомогательные функции + // ============================================================ + + std::string PostgreSQL::escape(const std::string &str) + { + Logger::debug("escape input: " + str); + + std::string result = str; + size_t pos = 0; + while ((pos = result.find("'", pos)) != std::string::npos) + { + result.replace(pos, 1, "''"); + pos += 2; + } + return result; + } + + std::string PostgreSQL::generateUUID() + { + std::random_device rd; + std::mt19937_64 gen(rd()); + std::uniform_int_distribution dist(0, 15); + + std::stringstream ss; + ss << std::hex << std::setfill('0'); + for (int i = 0; i < 36; ++i) + { + if (i == 8 || i == 13 || i == 18 || i == 23) + { + ss << '-'; + } + else + { + ss << dist(gen); + } + } + return ss.str(); + } + + // ============================================================ + // UUID → HEX (с обратным слешем) + // ============================================================ + + std::string PostgreSQL::convertToHex(const std::string &uuid) + { + if (uuid.length() != 36) + { + return uuid; + } + + // Удаляем дефисы + std::string clean = uuid; + clean.erase(std::remove(clean.begin(), clean.end(), '-'), clean.end()); + + // Добавляем \x в начало (экранируем слэш для C++) + return "\\x" + clean; + } + + // ============================================================ + // ★ HEX → UUID (с дефисами, перевернутый) ★ + // ============================================================ + + std::string PostgreSQL::convertTo1CUUID(const std::string &hex) + { + // Если это HEX с \x - убираем префикс + std::string clean = hex; + if (clean.find("\\x") == 0) + { + clean = clean.substr(2); + } + if (clean.find("0x") == 0) + { + clean = clean.substr(2); + } + + if (clean.length() != 32) + { + return hex; + } + + // Разбиваем на группы: a362345a60c3974211f18e88975e67cc + // a362345a | 60c3 | 9742 | 11f1 | 8e88975e67cc + std::string part1 = clean.substr(0, 8); + std::string part2 = clean.substr(8, 4); + std::string part3 = clean.substr(12, 4); + std::string part4 = clean.substr(16, 4); + std::string part5 = clean.substr(20, 12); + + // Переворачиваем первые 3 группы + std::string reversed = + part1.substr(6, 2) + part1.substr(4, 2) + part1.substr(2, 2) + part1.substr(0, 2) + "-" + + part2.substr(2, 2) + part2.substr(0, 2) + "-" + + part3.substr(2, 2) + part3.substr(0, 2) + "-" + + part4 + "-" + + part5; + + return reversed; + } + + std::string PostgreSQL::formatDate(const std::string &date) + { + if (date.find('T') != std::string::npos) + { + std::string result = date; + std::replace(result.begin(), result.end(), 'T', ' '); + if (result.find('.') == std::string::npos) + { + result += ".000"; + } + return result; + } + + auto now = std::chrono::system_clock::now(); + std::time_t now_time = std::chrono::system_clock::to_time_t(now); + std::tm tm; +#ifdef _WIN32 + localtime_s(&tm, &now_time); +#else + localtime_r(&now_time, &tm); +#endif + + std::stringstream ss; + ss << std::put_time(&tm, "%Y-%m-%d %H:%M:%S.000"); + return ss.str(); + } + + // ============================================================ + // Поиск контрагента + // ============================================================ + + std::optional PostgreSQL::findClient(const std::string &inn, const std::string &kpp) + { + try + { + std::string sql; + + if (kpp.empty()) + { + sql = R"( + SELECT _IDRRef, _Description, _Fld50, _Fld51, _Marked + FROM _Reference47 + WHERE _Fld50 = ')" + + escape(inn) + + R"(' + AND (_Fld51 = '' OR _Fld51 IS NULL) + AND _Marked = FALSE + )"; + } + else + { + sql = R"( + SELECT _IDRRef, _Description, _Fld50, _Fld51, _Marked + FROM _Reference47 + WHERE _Fld50 = ')" + + escape(inn) + + R"(' + AND _Fld51 = ')" + + escape(kpp) + + R"(' + AND _Marked = FALSE + )"; + } + + Logger::debug("findClient SQL: " + sql); + + pqxx::result result = query(sql); // 19. SELECT из _Reference47 (таблица контрагентов) + if (result.empty()) + { + Logger::warning("Client not found: INN=" + inn + ", KPP=" + kpp); + return std::nullopt; + } + + Client client; + for (const auto &row : result) + { + client.id = row[0].as(); // УЖЕ В HEX ФОРМАТЕ (\x...) + client.name = row[1].as(); + client.inn = row[2].as(); + client.kpp = row[3].as(); + client.marked = row[4].as(); + break; + } + + Logger::info("Client found: " + client.inn + " (" + client.name + ")"); + return client; + } + catch (const std::exception &e) + { + Logger::error("findClient error: " + std::string(e.what())); + return std::nullopt; + } + } + + // ============================================================ + // Создание контрагента + // ============================================================ + + std::string PostgreSQL::createClient(const std::string &inn, const std::string &kpp, const std::string &name) + { + try + { + + // ОБРЕЗАЕМ ИМЯ ДО 25 СИМВОЛОВ ТАК КАК ДЛИНА НАИМЕНОВАНИЯ 25 СИМВОЛОВ + std::string short_name = name; + if (short_name.length() > 25) + { + short_name = short_name.substr(0, 25); + Logger::warning("Name truncated to 25 chars: " + name + " -> " + short_name); + } + + std::string id = generateUUID(); + std::string id_hex = convertToHex(id); // HEX с \x + + // ДОПОЛНЯЕМ _Code ДО 9 СИМВОЛОВ + std::string code = inn.substr(0, 8); + while (code.length() < 9) + { + code = "0" + code; + } + + Logger::debug("Creating client with name: " + name); + + // НУЛЕВОЙ UUID ДЛЯ _PredefinedID + std::string empty_uuid = "00000000-0000-0000-0000-000000000000"; + std::string empty_hex = convertToHex(empty_uuid); // ★ HEX с \x ★ + + // 20. INSERT в _Reference47 (создание контрагента) + std::string sql = R"( + INSERT INTO _Reference47 (_IDRRef, _Code, _Description, _Fld50, _Fld51, _Marked, _PredefinedID) + VALUES (')" + id_hex + + R"(', ')" + code + + R"(', ')" + escape(name) + + R"(', ')" + escape(inn) + + R"(', ')" + escape(kpp) + + R"(', FALSE, ')" + empty_hex + R"(') + )"; + + Logger::debug("createClient SQL: " + sql); + + if (!execute(sql)) + { + Logger::error("Failed to create client: " + inn); + return ""; + } + + Logger::info("Created client: " + inn + " (" + name + "), ID: " + id); + return id_hex; // ВОЗВРАЩАЕМ HEX + } + catch (const std::exception &e) + { + Logger::error("createClient error: " + std::string(e.what())); + return ""; + } + } + + // ============================================================ + // Поиск товара по артикулу + // ============================================================ + + std::optional PostgreSQL::findProductByArticle(const std::string &article) + { + try + { + std::string sql = R"( + SELECT _IDRRef, _Code, _Description, _Fld52, _Marked + FROM _Reference48 + WHERE _Fld52 = ')" + + escape(article) + + R"(' + AND _Marked = FALSE + )"; + + Logger::debug("findProductByArticle SQL: " + sql); + + pqxx::result result = query(sql); // 22. SELECT из _Reference48 (Поиск номенклатуры) + if (result.empty()) + { + Logger::warning("Product not found: article=" + article); + return std::nullopt; + } + + Product product; + for (const auto &row : result) + { + product.id = row[0].as(); // УЖЕ В HEX ФОРМАТЕ (\x...) + product.code = row[1].as(); + product.name = row[2].as(); + product.article = row[3].as(); + product.marked = row[4].as(); + break; + } + + Logger::info("Product found: " + product.article + " (" + product.name + ")"); + return product; + } + catch (const std::exception &e) + { + Logger::error("findProductByArticle error: " + std::string(e.what())); + return std::nullopt; + } + } + + // ============================================================ + // Создание заказа + // ============================================================ + + std::string PostgreSQL::createOrder( + const std::string &client_id, + const std::string &date, + const std::string &number, + const std::vector &items) + { + try + { + if (items.empty()) + { + Logger::error("Cannot create order with empty items"); + return ""; + } + + if (!isConnected()) + { + Logger::error("Not connected to PostgreSQL"); + return ""; + } + + std::string order_id = generateUUID(); + std::string order_id_hex = convertToHex(order_id); // ★ HEX с \x ★ + std::string order_date = formatDate(date); + std::string order_number = number.empty() ? "AUTO-" + std::to_string(std::time(nullptr)) : number; + + // ТРАНЗАКЦИЯ + pqxx::work txn(*conn_); + + // 1. Создаем документ (шапку заказа) + // 24. INSERT в _Document49 (начало создания документа заказа) + std::string sql_order = R"( + INSERT INTO _Document49 (_IDRRef, _Date_Time, _Number, _Posted, _Marked, _Fld53RRef) + VALUES (')" + order_id_hex + + R"(', ')" + order_date + + R"(', ')" + escape(order_number) + + R"(', TRUE, FALSE, ')" + escape(client_id) + R"(') + )"; + + Logger::debug("createOrder - header SQL: " + sql_order); + txn.exec(sql_order); + Logger::info("Created order header: " + order_number); + + // 2. Создаем строки товаров + int lineNo = 1; + for (const auto &item : items) + { + // НЕ КОНВЕРТИРУЕМ - product_id УЖЕ В HEX ФОРМАТЕ + std::string product_id_hex = item.product_id; + + // 25. INSERT в _Document49_VT54 (добавляем товары в Заказ покупателя отдельная таблица) + std::string sql_item = R"( + INSERT INTO _Document49_VT54 (_Document49_IDRRef, _Fld56RRef, _Fld57, _Fld58, _Fld59, _KeyField, _LineNo55) + VALUES (')" + order_id_hex + + R"(', ')" + escape(product_id_hex) + + R"(', )" + std::to_string(item.quantity) + + R"(, )" + std::to_string(item.price) + + R"(, )" + std::to_string(item.sum) + + R"(, ')" + order_id_hex + + R"(', )" + std::to_string(lineNo) + R"() + )"; + + Logger::debug("createOrder - item SQL: " + sql_item); + txn.exec(sql_item); + lineNo++; + } + + // ФИКСИРУЕМ ТРАНЗАКЦИЮ + txn.commit(); + + Logger::info("Order " + order_number + " created with " + std::to_string(items.size()) + " items"); + return order_id_hex; // ВОЗВРАЩАЕМ HEX + } + catch (const std::exception &e) + { + Logger::error("createOrder error: " + std::string(e.what())); + return ""; + } + } + + // ============================================================ + // Запись в регистр сведений + // ============================================================ + + void PostgreSQL::logKafkaMessage( // 17. INSERT в _InfoRg60 + long long linux_time, + const std::string &tin, + const std::string &trrc, + const std::string &json_data) + { + try + { + std::string sql = R"( + INSERT INTO _InfoRg60 (_Fld61, _Fld62, _Fld63, _Fld64) + VALUES ()" + std::to_string(linux_time) + + R"(, ')" + escape(tin) + + R"(', ')" + escape(trrc) + + R"(', ')" + escape(json_data) + R"(') + )"; + + Logger::debug("logKafkaMessage SQL: " + sql); + + execute(sql); + Logger::debug("Logged Kafka message for TIN: " + tin); + } + catch (const std::exception &e) + { + Logger::error("logKafkaMessage error: " + std::string(e.what())); + } + } + +} // namespace database \ No newline at end of file diff --git a/src/database/postgresql.hpp b/src/database/postgresql.hpp new file mode 100644 index 000000000..5a5cc5788 --- /dev/null +++ b/src/database/postgresql.hpp @@ -0,0 +1,125 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace database +{ + + struct ConnectionParams + { + std::string host; + int port; + std::string database; + std::string username; + std::string password; + + std::string connectionString() const + { + return "host=" + host + + " port=" + std::to_string(port) + + " dbname=" + database + + " user=" + username + + " password=" + password; + } + }; + + // ============================================================ + // Структуры для работы с 1С таблицами + // ============================================================ + + struct Client + { + std::string id; // _IDRRef (HEX с \x) + std::string inn; // _Fld50 + std::string kpp; // _Fld51 + std::string name; // _Description + bool marked; // _Marked + }; + + struct Product + { + std::string id; // _IDRRef (HEX с \x) + std::string code; // _Code + std::string name; // _Description + std::string article; // _Fld52 + bool marked; // _Marked + }; + + struct OrderItem + { + std::string product_id; // _Fld56RRef (HEX с \x) + double quantity; // _Fld57 + double price; // _Fld58 + double sum; // _Fld59 + }; + + // ============================================================ + // Класс для работы с PostgreSQL через libpqxx + // ============================================================ + + class PostgreSQL + { + public: + PostgreSQL(); + PostgreSQL(const ConnectionParams ¶ms); + ~PostgreSQL(); + + bool connect(); + bool isConnected() const; + void disconnect(); + + // Выполнение SQL запроса (без результата) + bool execute(const std::string &sql); + + // Выполнение запроса с параметрами + bool executeParams(const std::string &sql, const std::vector ¶ms); + + // Выполнение запроса с результатом + pqxx::result query(const std::string &sql); + + // ============================================================ + // Работа с контрагентами + // ============================================================ + std::optional findClient(const std::string &inn, const std::string &kpp = ""); + std::string createClient(const std::string &inn, const std::string &kpp, const std::string &name); + + // ============================================================ + // Работа с номенклатурой + // ============================================================ + std::optional findProductByArticle(const std::string &article); + + // ============================================================ + // Работа с заказами + // ============================================================ + std::string createOrder( + const std::string &client_id, + const std::string &date, + const std::string &number, + const std::vector &items); + + // ============================================================ + // Запись в регистр сведений + // ============================================================ + void logKafkaMessage( + long long linux_time, + const std::string &tin, + const std::string &trrc, + const std::string &json_data); + + private: + ConnectionParams params_; + std::unique_ptr conn_; + bool connected_; + + std::string escape(const std::string &str); + std::string generateUUID(); + std::string convertToHex(const std::string &uuid); // UUID → HEX с \x + std::string convertTo1CUUID(const std::string &hex); // HEX → UUID с дефисами + std::string formatDate(const std::string &date); + }; + +} // namespace database \ No newline at end of file diff --git a/src/kafka/consumer.cpp b/src/kafka/consumer.cpp new file mode 100644 index 000000000..6173c0909 --- /dev/null +++ b/src/kafka/consumer.cpp @@ -0,0 +1,130 @@ +#include "consumer.hpp" +#include "../utils/logger.hpp" +#include + +KafkaConsumer::KafkaConsumer(const std::string &brokers, + const std::string &group_id, + const std::string &topic) + : brokers_(brokers), group_id_(group_id), topic_(topic), + consumer_(nullptr), running_(false) {} + +KafkaConsumer::~KafkaConsumer() +{ + stop(); +} + +bool KafkaConsumer::init() +{ + RdKafka::Conf *conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL); + + conf->set("bootstrap.servers", brokers_, errstr_); + conf->set("group.id", group_id_, errstr_); + conf->set("enable.auto.commit", "true", errstr_); // ← ВКЛЮЧАЕМ АВТО-КОММИТ + conf->set("auto.commit.interval.ms", "1000", errstr_); // ← КАЖДУЮ СЕКУНДУ + conf->set("auto.offset.reset", "earliest", errstr_); + conf->set("session.timeout.ms", "60000", errstr_); + conf->set("max.poll.interval.ms", "300000", errstr_); + conf->set("heartbeat.interval.ms", "3000", errstr_); + conf->set("connection.timeout.ms", "30000", errstr_); + conf->set("socket.timeout.ms", "30000", errstr_); + conf->set("client.software.name", "kafka-1c-connector", errstr_); // Почему-то стало обязательными этот и ниже параметер + conf->set("client.software.version", "1.0.0", errstr_); + + consumer_.reset(RdKafka::KafkaConsumer::create(conf, errstr_)); + delete conf; + + if (!consumer_) + { + Logger::error("Failed to create consumer: " + errstr_); + return false; + } + + // Подписываемся на топик + std::vector topics = {topic_}; + RdKafka::ErrorCode err = consumer_->subscribe(topics); + if (err != RdKafka::ERR_NO_ERROR) + { + Logger::error("Failed to subscribe: " + RdKafka::err2str(err)); + return false; + } + + Logger::info("Kafka consumer initialized. Brokers: " + brokers_ + ", Topic: " + topic_); + return true; +} + +void KafkaConsumer::start() +{ + if (running_.load()) + return; + + running_.store(true); + consumer_thread_ = std::make_unique(&KafkaConsumer::consumeLoop, this); + Logger::info("Kafka consumer started"); +} + +void KafkaConsumer::stop() +{ + if (!running_.load()) + return; + + running_.store(false); + if (consumer_thread_ && consumer_thread_->joinable()) + { + consumer_thread_->join(); + } + consumer_thread_.reset(); + + if (consumer_) + { + consumer_->close(); + } + + Logger::info("Kafka consumer stopped"); +} + +void KafkaConsumer::setMessageCallback(MessageCallback cb) +{ + callback_ = std::move(cb); +} + +void KafkaConsumer::consumeLoop() +{ + Logger::info("Consumer loop started for topic: " + topic_); + + while (running_.load()) + { + RdKafka::Message *msg = consumer_->consume(1000); // 1 секунда таймаут // 11. Чтение из Kafka + + if (!msg) + continue; + + if (msg->err() == RdKafka::ERR_NO_ERROR) + { + // Получаем сообщение + std::string key = msg->key() ? *msg->key() : ""; + std::string value(static_cast(msg->payload()), msg->len()); + int64_t timestamp = msg->timestamp().timestamp; + + Logger::debug("Received message: " + key); + + if (callback_) + { + callback_(key, value, timestamp); // 12. Вызов колбэка + } + // АСИНХРОННЫЙ КОММИТ (не блокирует) + consumer_->commitAsync(msg); + } + else if (msg->err() == RdKafka::ERR__PARTITION_EOF) + { + // Конец партиции — нормально + } + else + { + Logger::error("Consumer error: " + msg->errstr()); + } + + delete msg; + } + + Logger::info("Consumer loop stopped"); +} \ No newline at end of file diff --git a/src/kafka/consumer.hpp b/src/kafka/consumer.hpp new file mode 100644 index 000000000..47a941ca6 --- /dev/null +++ b/src/kafka/consumer.hpp @@ -0,0 +1,38 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +class KafkaConsumer +{ +public: + using MessageCallback = std::function; + + KafkaConsumer(const std::string &brokers, const std::string &group_id, const std::string &topic); + ~KafkaConsumer(); + + bool init(); + void start(); + void stop(); + void setMessageCallback(MessageCallback cb); + + bool isRunning() const { return running_.load(); } + +private: + void consumeLoop(); + + std::string brokers_; + std::string group_id_; + std::string topic_; + std::unique_ptr consumer_; + MessageCallback callback_; + std::atomic running_; + std::unique_ptr consumer_thread_; + std::string errstr_; +}; \ No newline at end of file diff --git a/src/kafka/producer.cpp b/src/kafka/producer.cpp new file mode 100644 index 000000000..c2edeb2b8 --- /dev/null +++ b/src/kafka/producer.cpp @@ -0,0 +1,144 @@ +#include "producer.hpp" +#include + +// ============================================================ +// DeliveryReportCb - реализация +// ============================================================ + +KafkaProducer::DeliveryReportCb::DeliveryReportCb(KafkaProducer *producer) + : producer_(producer) {} + +void KafkaProducer::DeliveryReportCb::dr_cb(RdKafka::Message &msg) // 10.Callback доставки +{ + if (msg.err()) + { + // Ошибка доставки + producer_->failed_count_.fetch_add(1); + if (producer_->callback_) + { + producer_->callback_(msg.key() ? *msg.key() : "", msg.err(), msg.offset()); + } + } + else + { + // Успешная доставка + producer_->sent_count_.fetch_add(1); + if (producer_->callback_) + { + producer_->callback_(msg.key() ? *msg.key() : "", 0, msg.offset()); + } + } +} + +// ============================================================ +// KafkaProducer - реализация +// ============================================================ + +// Конструктор +KafkaProducer::KafkaProducer(const std::string &brokers, const std::string &topic) + : brokers_(brokers), topic_(topic), producer_(nullptr), delivery_cb_(nullptr) {} + +// Деструктор +KafkaProducer::~KafkaProducer() +{ + if (producer_) + { + producer_->flush(5000); // Ждем отправки всех сообщений + producer_.reset(); // Удаляем producer + } +} + +// ============================================================ +// Инициализация producer +// ============================================================ +bool KafkaProducer::init(const std::string &acks, int retries) +{ + + // 1. Создаем конфигурацию + RdKafka::Conf *conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL); + + // 2. Устанавливаем параметры + conf->set("bootstrap.servers", brokers_, errstr_); // Адрес Kafka + conf->set("acks", acks, errstr_); // Уровень подтверждения + conf->set("message.send.max.retries", std::to_string(retries), errstr_); + conf->set("request.timeout.ms", "5000", errstr_); // Таймаут + + // 3. Устанавливаем callback для доставки + delivery_cb_ = std::make_unique(this); + conf->set("dr_cb", delivery_cb_.get(), errstr_); + + // 4. Создаем producer + producer_.reset(RdKafka::Producer::create(conf, errstr_)); + delete conf; + + if (!producer_) + { + std::cerr << "Failed to create producer: " << errstr_ << std::endl; + return false; + } + + std::cout << "[Kafka] Producer initialized. Brokers: " << brokers_ + << ", Topic: " << topic_ << std::endl; + return true; +} + +// ============================================================ +// Отправка сообщения без ключа +// ============================================================ +bool KafkaProducer::send(const std::string &message) +{ + return send("", message); +} + +// ============================================================ +// Отправка сообщения с ключом +// ============================================================ +bool KafkaProducer::send(const std::string &key, const std::string &message) +{ + if (!producer_) + { + std::cerr << "[Kafka] Producer not initialized" << std::endl; + return false; + } + + // Вызываем функцию produce библиотеки librdkafka + RdKafka::ErrorCode err = producer_->produce( // 9. Вызов librdkafka produce + topic_, // Топик + RdKafka::Topic::PARTITION_UA, // Авто-выбор партиции + RdKafka::Producer::RK_MSG_COPY, // Копировать сообщение + const_cast(message.c_str()), // Указатель на данные + message.size(), // Размер данных + key.empty() ? nullptr : key.c_str(), // Ключ (может быть пустым) + key.empty() ? 0 : key.size(), // Размер ключа + 0, // Timestamp (0 = автоматически) + nullptr // Заголовки + ); + + if (err != RdKafka::ERR_NO_ERROR) + { + std::cerr << "[Kafka] Failed to produce: " << RdKafka::err2str(err) << std::endl; + return false; + } + // poll(0) - немедленная отправка (не ждем накопления) + producer_->poll(0); + return true; +} + +// ============================================================ +// Принудительная отправка всех накопленных сообщений +// ============================================================ +void KafkaProducer::flush(int timeout_ms) +{ + if (producer_) + { + producer_->flush(timeout_ms); + } +} + +// ============================================================ +// Установка пользовательского callback +// ============================================================ +void KafkaProducer::setDeliveryCallback(DeliveryCallback cb) +{ + callback_ = std::move(cb); +} \ No newline at end of file diff --git a/src/kafka/producer.hpp b/src/kafka/producer.hpp new file mode 100644 index 000000000..3507b4ba4 --- /dev/null +++ b/src/kafka/producer.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include +#include +#include + +class KafkaProducer { +public: + using DeliveryCallback = std::function; + + KafkaProducer(const std::string& brokers, const std::string& topic); + ~KafkaProducer(); + + bool init(const std::string& acks = "all", int retries = 3); + bool send(const std::string& message); + bool send(const std::string& key, const std::string& message); + void setDeliveryCallback(DeliveryCallback cb); + void flush(int timeout_ms = 5000); + + // Статистика + size_t getSentCount() const { return sent_count_.load(); } + size_t getFailedCount() const { return failed_count_.load(); } + +private: + class DeliveryReportCb : public RdKafka::DeliveryReportCb { + public: + DeliveryReportCb(KafkaProducer* producer); + void dr_cb(RdKafka::Message& msg) override; + private: + KafkaProducer* producer_; + }; + + std::string brokers_; + std::string topic_; + std::unique_ptr producer_; + std::unique_ptr delivery_cb_; + DeliveryCallback callback_; + std::string errstr_; + + std::atomic sent_count_{0}; + std::atomic failed_count_{0}; +}; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 000000000..c712b5266 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,389 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "config/config.hpp" +#include "kafka/producer.hpp" +#include "kafka/consumer.hpp" +#include "parser/json_parser.hpp" +#include "cache/sqlite_cache.hpp" +#include "database/postgresql.hpp" +#include "processor/order_processor.hpp" +#include "utils/logger.hpp" + +namespace fs = std::filesystem; + +// ============================================================ +// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ +// ============================================================ + +std::atomic running{true}; +std::atomic producer_count{0}; +std::atomic consumer_count{0}; +std::atomic error_count{0}; + +// ============================================================ +// ОБРАБОТЧИК СИГНАЛОВ (Ctrl+C) +// ============================================================ + +void signalHandler(int signal) +{ + Logger::info("Received signal " + std::to_string(signal) + ", shutting down..."); + running = false; +} + +// ============================================================ +// ВСПОМОГАТЕЛЬНАЯ ФУНКЦИЯ — ПОЛУЧЕНИЕ СПИСКА ФАЙЛОВ +// ============================================================ + +std::vector getJsonFiles(const std::string &directory) +{ + std::vector files; + try + { + for (const auto &entry : fs::directory_iterator(directory)) + { + if (entry.path().extension() == ".json") + { + files.push_back(entry.path().string()); + } + } + } + catch (const std::exception &e) + { + Logger::error("Directory read error: " + std::string(e.what())); + } + return files; +} + +// ============================================================ +// ФУНКЦИЯ PRODUCER (отправка файлов в Kafka) +// ============================================================ + +void processFiles(const std::string &directory, + KafkaProducer &producer, + MessageCache &cache, + const std::string &topic, + std::atomic &next_index, + const std::vector &files) +{ + + size_t idx; + while ((idx = next_index.fetch_add(1)) < files.size()) // 1. Lock-free атомарное разделение + { + const std::string &filepath = files[idx]; + + try + { + Logger::debug("[Producer] Processing: " + filepath); + + auto order = JsonParser::parseOrder(filepath); // 2. Начало чтения файла + if (!JsonParser::validate(order)) + { + Logger::error("[Producer] Invalid order: " + filepath); + error_count.fetch_add(1); + continue; + } + + std::string json_message = order.toJson(); + std::string key = order.tin + "-" + order.number; + std::string source_type = "producer"; + + if (!cache.save(filepath, topic, json_message, order.tin, order.trrc, source_type)) // 5. Сохранение в SQLite (Producer) + { + Logger::error("[Producer] Failed to cache: " + filepath); + error_count.fetch_add(1); + continue; + } + + if (producer.send(key, json_message)) // 8.Отправка в Kafka + { + producer_count.fetch_add(1); + Logger::info("[Producer] Sent: " + key + " (" + std::to_string(producer_count.load()) + ")"); + + try + { + fs::remove(filepath); + Logger::debug("[Producer] Deleted: " + filepath); + } + catch (const std::exception &e) + { + Logger::warning("[Producer] Failed to delete: " + filepath + " - " + e.what()); + } + } + else + { + Logger::error("[Producer] Failed to send: " + key); + error_count.fetch_add(1); + } + } + catch (const std::exception &e) + { + Logger::error("[Producer] Error processing " + filepath + ": " + e.what()); + error_count.fetch_add(1); + } + } +} + +// ============================================================ +// ФУНКЦИЯ PRODUCER — ЗАПУСК В ОТДЕЛЬНОМ ПОТОКЕ +// ============================================================ + +void runProducer(AppConfig &config, KafkaProducer &producer, MessageCache &cache) +{ + Logger::info("[Producer] Thread started"); + + const int MAX_WORKERS = config.processing.max_workers; + std::vector workers; + + while (running) + { + for (const auto &group : config.groups) + { + if (!group.enabled) + continue; + + auto files = getJsonFiles(group.input_directory); + if (files.empty()) + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + continue; + } + + Logger::info("[Producer] Found " + std::to_string(files.size()) + " files in " + group.input_directory); + + std::atomic next_index{0}; + + for (int i = 0; i < MAX_WORKERS && running; ++i) + { + workers.emplace_back([&]() + { processFiles( + group.input_directory, + producer, + cache, + group.kafka_topic, + std::ref(next_index), + std::cref(files)); }); + } + + for (auto &worker : workers) + { + if (worker.joinable()) + { + worker.join(); + } + } + workers.clear(); + } + + if (running) + { + std::this_thread::sleep_for(std::chrono::seconds(1)); + } + } + + Logger::info("[Producer] Thread stopped"); +} + +// ============================================================ +// ФУНКЦИЯ CONSUMER — ЗАПУСК В ОТДЕЛЬНОМ ПОТОКЕ +// ============================================================ + +void runConsumer(AppConfig &config, database::PostgreSQL &db, MessageCache &cache, KafkaProducer &error_producer) +{ + Logger::info("[Consumer] Thread started"); + + try + { + KafkaConsumer consumer( // Создание consumer + config.kafka.bootstrap_servers, + config.kafka.consumer.group_id, + config.kafka.topics.input); + + if (!consumer.init()) + { // Инициализация + Logger::error("[Consumer] Failed to initialize"); + return; + } + + OrderProcessor processor(db, cache, error_producer); // Создание processor + + Logger::info("[Consumer] Checking for pending messages in cache..."); + processor.reprocessPendingMessages(); // Восстановление + + // Устанавливаем callback для обработки сообщений + consumer.setMessageCallback([&processor](const std::string &key, + const std::string &value, + int64_t timestamp) + { + if (processor.processMessage(key, value, timestamp)) { + consumer_count.fetch_add(1); + } else { + error_count.fetch_add(1); + } }); + + // Запускаем consumer (блокирующий вызов в отдельном потоке) + consumer.start(); // Запуск consumer + + // Ждем завершения (while running) + while (running) + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + + // Останавливаем consumer (он автоматически закоммитит offset) + consumer.stop(); + } + catch (const std::exception &e) + { + Logger::error("[Consumer] Error: " + std::string(e.what())); + } + + Logger::info("[Consumer] Thread stopped"); +} + +// ============================================================ +// ГЛАВНАЯ ФУНКЦИЯ +// ============================================================ + +int main(int argc, char *argv[]) +{ + // 1. Устанавливаем обработчик сигналов + signal(SIGINT, signalHandler); + signal(SIGTERM, signalHandler); + + try + { + Logger::info("=== Kafka-1C Connector (Producer + Consumer) ==="); + Logger::info("Version: 1.0.0"); + + // 2. Загружаем конфигурацию + AppConfig config = AppConfig::load("./config/settings.json"); + Logger::info("Config loaded successfully"); + + // 3. Инициализируем SQLite кэш + MessageCache cache(config.cache.path); + if (!cache.init()) + { + Logger::error("Failed to initialize cache"); + return 1; + } + + // УСТАНАВЛИВАЕМ НАСТРОЙКИ + cache.setSourcePrefix(config.cache.source_prefix); + cache.setReprocessDelay(config.cache.reprocess_delay_seconds); + + Logger::info("Cache initialized: " + config.cache.path); + + // 4. Инициализируем PostgreSQL + database::PostgreSQL db(config.database.postgresql); + if (!db.connect()) + { + Logger::error("Failed to connect to PostgreSQL"); + return 1; + } + Logger::info("PostgreSQL connected: " + config.database.postgresql.database); + + // 5. Инициализируем Kafka Producer (основной) + KafkaProducer producer( + config.kafka.bootstrap_servers, + config.kafka.topics.input); + + if (!producer.init(config.kafka.producer.acks, config.kafka.producer.retries)) + { + Logger::error("Failed to initialize Kafka producer"); + return 1; + } + + // 6. Инициализируем Kafka Producer для ошибок + KafkaProducer error_producer( + config.kafka.bootstrap_servers, + config.kafka.topics.errors); + + if (!error_producer.init(config.kafka.producer.acks, config.kafka.producer.retries)) + { + Logger::error("Failed to initialize Kafka error producer"); + return 1; + } + + // 7. Устанавливаем callback для подтверждения доставки + producer.setDeliveryCallback([](const std::string &key, int error, int64_t offset) + { + if (error == 0) { + Logger::debug("[Producer] Delivered: " + key + " (offset: " + std::to_string(offset) + ")"); + } else { + Logger::warning("[Producer] Delivery failed: " + key + " (error: " + std::to_string(error) + ")"); + } }); + + // 8. Определяем режим работы + std::string mode = config.mode; + if (argc > 1) + { + mode = argv[1]; + } + + Logger::info("Mode: " + mode); + + // 9. Запускаем потоки в зависимости от режима + std::thread producer_thread; + std::thread consumer_thread; + + if (mode == "producer" || mode == "both") + { + Logger::info("Starting Producer thread..."); + producer_thread = std::thread(runProducer, std::ref(config), std::ref(producer), std::ref(cache)); + } + + if (mode == "consumer" || mode == "both") + { + Logger::info("Starting Consumer thread..."); + std::this_thread::sleep_for(std::chrono::seconds(2)); + consumer_thread = std::thread(runConsumer, std::ref(config), std::ref(db), std::ref(cache), std::ref(error_producer)); + } + + // 10. Ждем завершения (Ctrl+C) + while (running) + { + std::this_thread::sleep_for(std::chrono::seconds(1)); + } + + // 11. Остановка потоков + Logger::info("Stopping threads..."); + + if (producer_thread.joinable()) + { + producer_thread.join(); + } + + if (consumer_thread.joinable()) + { + consumer_thread.join(); + } + + // 12. Завершение + producer.flush(); + error_producer.flush(); + cache.cleanup(7); + + Logger::info("=== Summary ==="); + Logger::info("Producer sent: " + std::to_string(producer_count.load())); + Logger::info("Consumer processed: " + std::to_string(consumer_count.load())); + Logger::info("Errors: " + std::to_string(error_count.load())); + Logger::info("Pending in cache: " + std::to_string(cache.getPendingCount())); + Logger::info("Total in cache: " + std::to_string(cache.getTotalCount())); + Logger::info("Shutdown complete"); + } + catch (const std::exception &e) + { + Logger::error("Fatal error: " + std::string(e.what())); + return 1; + } + + return 0; +} \ No newline at end of file diff --git a/src/parser/json_parser.cpp b/src/parser/json_parser.cpp new file mode 100644 index 000000000..14af8c630 --- /dev/null +++ b/src/parser/json_parser.cpp @@ -0,0 +1,188 @@ +#include "json_parser.hpp" +#include +#include +#include +#include "../utils/logger.hpp" + +#ifdef _WIN32 +#include +#endif + +namespace fs = std::filesystem; + +// ============================================================ +// ★ КОНВЕРТАЦИЯ WINDOWS-1251 → UTF-8 ★ +// ============================================================ + +std::string win1251ToUtf8(const std::string &win1251_str) +{ +#ifdef _WIN32 + if (win1251_str.empty()) + return win1251_str; + + int wide_len = MultiByteToWideChar(1251, 0, win1251_str.c_str(), -1, nullptr, 0); + if (wide_len == 0) + return win1251_str; + + std::wstring wide_str(wide_len, L'\0'); + MultiByteToWideChar(1251, 0, win1251_str.c_str(), -1, &wide_str[0], wide_len); + wide_str.pop_back(); + + int utf8_len = WideCharToMultiByte(CP_UTF8, 0, wide_str.c_str(), -1, nullptr, 0, nullptr, nullptr); + if (utf8_len == 0) + return win1251_str; + + std::string utf8_str(utf8_len, '\0'); + WideCharToMultiByte(CP_UTF8, 0, wide_str.c_str(), -1, &utf8_str[0], utf8_len, nullptr, nullptr); + utf8_str.pop_back(); + + return utf8_str; +#else + return win1251_str; +#endif +} + +// ============================================================ +// OrderData::toJson +// ============================================================ + +std::string OrderData::toJson() const +{ + json j; + j["TIN"] = tin; + j["TRRC"] = trrc; + j["contractor"] = contractor; + j["date"] = date; + j["number"] = number; + + json goods_array = json::array(); + for (const auto &item : goods) + { + goods_array.push_back({{"SKU", item.sku}, + {"Quantity", item.quantity}, + {"Price", item.price}, + {"Sum", item.sum}}); + } + j["goods"] = goods_array; + + return j.dump(2); +} + +// ============================================================ +// OrderData::fromJson (из объекта) +// ============================================================ + +OrderData OrderData::fromJson(const json &j) +{ + OrderData data; + + data.tin = j.value("TIN", ""); + data.trrc = j.value("TRRC", ""); + data.contractor = j.value("contractor", ""); + data.date = j.value("date", ""); + data.number = j.value("number", ""); + + if (j.contains("goods") && j["goods"].is_array()) + { + for (const auto &item : j["goods"]) + { + OrderItem order_item; + order_item.sku = item.value("SKU", ""); + order_item.quantity = item.value("Quantity", 0.0); + order_item.price = item.value("Price", 0.0); + order_item.sum = item.value("Sum", 0.0); + data.goods.push_back(order_item); + } + } + + return data; +} + +// ============================================================ +// OrderData::fromJson (из строки) +// ============================================================ + +OrderData OrderData::fromJson(const std::string &json_str) +{ + try + { + json j = json::parse(json_str); // 4. Парсинг в nlohmann::json + return fromJson(j); + } + catch (const std::exception &e) + { + std::cerr << "[JSON] Parse error: " << e.what() << std::endl; + return OrderData(); + } +} + +// ============================================================ +// JsonParser::parseOrder - ТОЛЬКО ОДНО ОПРЕДЕЛЕНИЕ +// ============================================================ + +OrderData JsonParser::parseOrder(const std::string &filename) // 3. Вход в парсинг JSON +{ + std::ifstream file(filename); + if (!file.is_open()) + { + std::cerr << "[JSON] Cannot open: " << filename << std::endl; + return OrderData(); + } + + std::string content((std::istreambuf_iterator(file)), + std::istreambuf_iterator()); + + // ПРОСТО ПАРСИМ КАК ЕСТЬ - БЕЗ КОНВЕРТАЦИИ + // PostgreSQL client_encoding = UTF8, а файлы в UTF-8 + return OrderData::fromJson(content); +} + +// ============================================================ +// JsonParser::parseDirectory +// ============================================================ + +std::vector JsonParser::parseDirectory(const std::string &directory) +{ + std::vector orders; + + try + { + for (const auto &entry : fs::directory_iterator(directory)) + { + if (entry.path().extension() == ".json") + { + OrderData order = parseOrder(entry.path().string()); + if (validate(order)) + { + orders.push_back(order); + std::cout << "[JSON] Loaded: " << entry.path().filename() << std::endl; + } + } + } + } + catch (const std::exception &e) + { + std::cerr << "[JSON] Directory error: " << e.what() << std::endl; + } + + return orders; +} + +// ============================================================ +// JsonParser::validate +// ============================================================ + +bool JsonParser::validate(const OrderData &order) +{ + if (order.tin.empty()) + { + std::cerr << "[JSON] Validation failed: Missing TIN or TRRC" << std::endl; + return false; + } + if (order.goods.empty()) + { + std::cerr << "[JSON] Validation failed: No goods" << std::endl; + return false; + } + return true; +} \ No newline at end of file diff --git a/src/parser/json_parser.hpp b/src/parser/json_parser.hpp new file mode 100644 index 000000000..f3bf076dc --- /dev/null +++ b/src/parser/json_parser.hpp @@ -0,0 +1,54 @@ +#pragma once + +#include +#include +#include + +// ============================================================ +// Структура: OrderItem +// Один товар в заказе +// ============================================================ +using json = nlohmann::json; + +struct OrderItem { + std::string sku; // Артикул товара + double quantity; // Количество + double price; // Цена за единицу + double sum; // Сумма (quantity * price) +}; + +// ============================================================ +// Структура: OrderData +// Полный заказ (контрагент + товары) +// ============================================================ +struct OrderData { + std::string tin; // ИНН контрагента + std::string trrc; // КПП контрагента + std::string contractor; // Наименование контрагента + std::string date; // Дата документа + std::string number; // Номер документа + std::vector goods; // Массив товаров + + // Преобразование в JSON строку + std::string toJson() const; + // Создание из JSON строки + static OrderData fromJson(const std::string& json_str); + // Создание из JSON объекта + static OrderData fromJson(const json& j); +}; + +// ============================================================ +// Класс: JsonParser +// Парсинг JSON файлов +// ============================================================ +class JsonParser { +public: + // Парсинг одного файла + static OrderData parseOrder(const std::string& filename); + // Парсинг из строки + static OrderData parseOrderFromString(const std::string& json_str); + // Парсинг всех файлов в папке + static std::vector parseDirectory(const std::string& directory); + // Валидация заказа (проверка обязательных полей) + static bool validate(const OrderData& order); +}; \ No newline at end of file diff --git a/src/processor/order_processor.cpp b/src/processor/order_processor.cpp new file mode 100644 index 000000000..ad1d814c2 --- /dev/null +++ b/src/processor/order_processor.cpp @@ -0,0 +1,343 @@ +#include "order_processor.hpp" +#include "../utils/logger.hpp" +#include "../utils/uuid.hpp" +#include +#include +#include +#include + +// ============================================================ +// Конструктор +// ============================================================ +OrderProcessor::OrderProcessor(database::PostgreSQL &db, + MessageCache &cache, + KafkaProducer &error_producer) + : db_(db), cache_(cache), error_producer_(error_producer) {} + +// ============================================================ +// Получение Linux времени (миллисекунды с 1970) +// ============================================================ +long long OrderProcessor::getLinuxTime() +{ + auto now = std::chrono::system_clock::now(); + auto duration = now.time_since_epoch(); + return std::chrono::duration_cast(duration).count(); +} + +// ============================================================ +// Отправка ошибки в топик orders.errors +// ============================================================ +void OrderProcessor::sendError(const std::string &error_type, // 28. Отправка ошибки в Kafka + const std::string &description, + const std::string &original_message) +{ + try + { + std::string uuid = utils::generateUUID(); // Генерация UUID + std::string key = error_type + " " + uuid; + + nlohmann::json error_json; // Формирование JSON + error_json["error_type"] = error_type; + error_json["uuid"] = uuid; + error_json["timestamp"] = getLinuxTime(); + error_json["description"] = description; + if (!original_message.empty()) + { + error_json["original_message"] = original_message; + } + + std::string error_str = error_json.dump(); + + if (error_producer_.send(key, error_str)) // Отправка в Kafka // 29. Отправка в orders.errors + { + Logger::debug("Error sent to Kafka: " + key); + } + else + { + Logger::error("Failed to send error to Kafka: " + key); + } + } + catch (const std::exception &e) + { + Logger::error("sendError failed: " + std::string(e.what())); + } +} + +bool OrderProcessor::isOrderAlreadyProcessed(const std::string &key) +{ + // Проверяем в SQLite, есть ли уже обработанное сообщение с таким ключом + auto pending = cache_.getPendingMessages(1000); + for (const auto &[id, topic, message, filename] : pending) + { + // Проверяем, содержит ли сообщение этот ключ + if (message.find(key) != std::string::npos) + { + // Нашли сообщение с таким ключом - значит уже обрабатывали + Logger::warning("Order already in cache: " + key); + return true; + } + } + + // Также можно проверить в PostgreSQL (по номеру заказа и ИНН) + // Но это отдельный запрос, который может замедлить работу + + return false; +} + +// ============================================================ +// Обработка одного сообщения из Kafka +// ============================================================ +bool OrderProcessor::processMessage(const std::string &key, // 13. Вход в обработку + const std::string &value, + int64_t timestamp) +{ + Logger::debug("Processing message: " + key); + + try + { + // 1. Проверяем не обработан ли уже заказ + if (isOrderAlreadyProcessed(key)) + { + Logger::warning("Order already processed, skipping: " + key); + return true; // Возвращаем true, чтобы не считать ошибкой + } + + // 2. Проверяем, что это JSON + if (value.empty() || (value[0] != '{' && value[0] != '[')) + { + std::string error_msg = "Message is not valid JSON: " + value.substr(0, 100); + Logger::warning(error_msg); + sendError("Kafka read error", error_msg, value); + return false; + } + + // 3. Парсим JSON + OrderData order = OrderData::fromJson(value); // 14. Парсинг JSON + if (!JsonParser::validate(order)) + { + std::string error_msg = "Invalid order structure: missing TIN, TRRC or goods"; + Logger::error(error_msg); + sendError("Kafka read error", error_msg, value); + return false; + } + + // 4. Сохраняем в SQLite кэш (на случай сбоя БД) + std::string cache_key = "order_" + order.tin + "_" + order.number; + std::string source_type = "consumer"; + if (!cache_.save(cache_key, "processing", value, order.tin, order.trrc, source_type)) // 15. Сохранение в SQLite (Consumer) + { + Logger::warning("Failed to save to cache, continuing..."); + } + + // 5. Логируем в регистр сведений + logToRegister(order, value); // 16. Запись в регистр сведений + + // 6. Обрабатываем контрагента + auto client_id = processClient(order); // 18. Поиск контрагента + if (!client_id) + { + std::string error_msg = "Client not found and could not be created: TIN=" + order.tin; + Logger::error(error_msg); + sendError("PostgreSQL write error", error_msg, value); + return false; + } + + // 7. Обрабатываем товары + auto items = processProducts(order); // 21. Поиск товаров + if (items.empty()) + { + std::string error_msg = "No valid products found in order"; + Logger::error(error_msg); + sendError("PostgreSQL write error", error_msg, value); + return false; + } + + // 8. Создаем заказ + if (!createOrder(order, *client_id, items)) // 23. Создание заказа + { + std::string error_msg = "Failed to create order in PostgreSQL"; + Logger::error(error_msg); + sendError("PostgreSQL write error", error_msg, value); + return false; + } + + Logger::info("Order processed successfully: " + order.number); + return true; + } + catch (const std::exception &e) + { + std::string error_msg = "Exception: " + std::string(e.what()); + Logger::error("processMessage error: " + error_msg); + sendError("Kafka read error", error_msg, value); + return false; + } +} + +// ============================================================ +// Повторная обработка сообщений из кэша +// ============================================================ +void OrderProcessor::reprocessPendingMessages() +{ + auto pending = cache_.getPendingMessages(1000); // Получение pending + if (pending.empty()) + { + Logger::info("No pending messages to reprocess"); + return; + } + + Logger::info("Found " + std::to_string(pending.size()) + " pending messages to reprocess"); + + for (const auto &[id, topic, message, filename] : pending) // Цикл по pending + { + Logger::info("Reprocessing: " + filename); + + try + { + OrderData order = OrderData::fromJson(message); // Парсинг + if (!JsonParser::validate(order)) + { + Logger::error("Invalid cached order: " + filename); + cache_.markError(id, "Invalid JSON in cache"); + sendError("PostgreSQL write error", "Invalid cached order: " + filename, message); + continue; + } + + logToRegister(order, message); + + auto client_id = processClient(order); + if (!client_id) + { + Logger::error("Failed to reprocess client: " + order.tin); + cache_.markError(id, "Client not found"); + sendError("PostgreSQL write error", "Client not found: TIN=" + order.tin, message); + continue; + } + + auto items = processProducts(order); + if (items.empty()) + { + Logger::error("No valid products in cached order: " + filename); + cache_.markError(id, "No products found"); + sendError("PostgreSQL write error", "No products found in order", message); + continue; + } + + if (!createOrder(order, *client_id, items)) + { + Logger::error("Failed to reprocess order: " + filename); + cache_.markError(id, "Order creation failed"); + sendError("PostgreSQL write error", "Order creation failed", message); + continue; + } + + cache_.markSent(id); // Обновление статуса // 26. UPDATE SQLite (status='sent') - изменяем статус на обработано + Logger::info("Reprocessed successfully: " + filename); + } + catch (const std::exception &e) + { + Logger::error("Reprocess error: " + std::string(e.what())); + cache_.markError(id, e.what()); + sendError("PostgreSQL write error", "Reprocess error: " + std::string(e.what()), message); + } + } +} + +// ============================================================ +// Обработка контрагента (поиск или создание) +// ============================================================ +std::optional OrderProcessor::processClient(const OrderData &order) +{ + Logger::info("processClient: TIN=" + order.tin + ", TRRC=" + order.trrc); + + auto client = db_.findClient(order.tin, order.trrc); + + if (client) + { + Logger::info("Client found: " + client->id); + return client->id; + } + + // ★ НЕ НАЙДЕН - СОЗДАЕМ ★ + Logger::info("Client NOT found, creating new client..."); + std::string name = order.contractor.empty() ? "Контрагент " + order.tin : order.contractor; + std::string client_id = db_.createClient(order.tin, order.trrc, name); + + if (client_id.empty()) + { + Logger::error("Failed to create client: " + order.tin); + return std::nullopt; + } + + Logger::info("Client created: " + client_id); + return client_id; +} + +// ============================================================ +// Обработка товаров (поиск по артикулам) +// ============================================================ +std::vector OrderProcessor::processProducts(const OrderData &order) +{ + std::vector items; + + for (const auto &item : order.goods) // Цикл по товарам + { + auto product = db_.findProductByArticle(item.sku); + + if (!product) // Товар не найден + { + Logger::warning("Product not found: " + item.sku); + continue; + } + + database::OrderItem db_item; + db_item.product_id = product->id; + db_item.quantity = item.quantity; + db_item.price = item.price; + db_item.sum = item.sum; + + items.push_back(db_item); // Добавление товара + Logger::debug("Product added: " + item.sku + " (x" + std::to_string(item.quantity) + ")"); + } + + return items; +} + +// ============================================================ +// Создание заказа +// ============================================================ +bool OrderProcessor::createOrder(const OrderData &order, + const std::string &client_id, + const std::vector &items) +{ + if (items.empty()) // Проверка товаров + { + Logger::error("Cannot create order with empty items"); + return false; + } + + std::string order_number = order.number; + if (order_number.empty()) + { + auto now = std::chrono::system_clock::now(); + auto time_t = std::chrono::system_clock::to_time_t(now); + order_number = "AUTO-" + std::to_string(time_t); // Генерация номера + } + + std::string order_id = db_.createOrder( // Создание в БД + client_id, + order.date, + order_number, + items); + + return !order_id.empty(); +} + +// ============================================================ +// Логирование в регистр сведений +// ============================================================ +void OrderProcessor::logToRegister(const OrderData &order, const std::string &json_str) +{ + long long linux_time = getLinuxTime(); + db_.logKafkaMessage(linux_time, order.tin, order.trrc, json_str); + Logger::debug("Logged to register: " + order.tin); +} \ No newline at end of file diff --git a/src/processor/order_processor.hpp b/src/processor/order_processor.hpp new file mode 100644 index 000000000..862ebb6f0 --- /dev/null +++ b/src/processor/order_processor.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include "../database/postgresql.hpp" +#include "../parser/json_parser.hpp" +#include "../cache/sqlite_cache.hpp" +#include "../kafka/producer.hpp" +#include +#include +#include + +class OrderProcessor +{ +public: + OrderProcessor(database::PostgreSQL &db, MessageCache &cache, KafkaProducer &error_producer); + + // Обработка одного сообщения из Kafka + bool processMessage(const std::string &key, const std::string &value, int64_t timestamp); + + // Повторная обработка сообщений из кэша + void reprocessPendingMessages(); + +private: + database::PostgreSQL &db_; + MessageCache &cache_; + KafkaProducer &error_producer_; + + // Отправка ошибки в топик orders.errors + void sendError(const std::string &error_type, const std::string &description, const std::string &original_message = ""); + + long long getLinuxTime(); + std::optional processClient(const OrderData &order); + std::vector processProducts(const OrderData &order); + bool createOrder(const OrderData &order, const std::string &client_id, + const std::vector &items); + void logToRegister(const OrderData &order, const std::string &json_str); + bool isOrderAlreadyProcessed(const std::string &key); +}; \ No newline at end of file diff --git a/src/utils/logger.cpp b/src/utils/logger.cpp new file mode 100644 index 000000000..5e779b2ce --- /dev/null +++ b/src/utils/logger.cpp @@ -0,0 +1,4 @@ +#include "logger.hpp" + +// Реализация статических членов вынесена в hpp (inline) +// Этот файл нужен для сборки \ No newline at end of file diff --git a/src/utils/logger.hpp b/src/utils/logger.hpp new file mode 100644 index 000000000..aab01d53c --- /dev/null +++ b/src/utils/logger.hpp @@ -0,0 +1,84 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +// ============================================================ +// Класс: Logger +// Логирование с временными метками +// ============================================================ +class Logger { +public: + enum class Level { + INFO, + WARNING, + ERROR, + DEBUG + }; + + static void setLevel(Level level) { current_level_ = level; } + + static void info(const std::string& message) { + log(Level::INFO, message); + } + + static void warning(const std::string& message) { + log(Level::WARNING, message); + } + + static void error(const std::string& message) { + log(Level::ERROR, message); + } + + static void debug(const std::string& message) { + log(Level::DEBUG, message); + } + +private: + static Level current_level_; + static std::mutex mutex_; + + static void log(Level level, const std::string& message) { + if (level < current_level_) return; // Если уровень ниже текущего - пропускаем + + std::lock_guard lock(mutex_); // Защита от перемешивания логов + + std::string prefix; + switch (level) { + case Level::INFO: prefix = "[INFO] "; break; + case Level::WARNING: prefix = "[WARN] "; break; + case Level::ERROR: prefix = "[ERROR] "; break; + case Level::DEBUG: prefix = "[DEBUG] "; break; + } + + std::cout << prefix << getTimestamp() << " " << message << std::endl; + } + + static std::string getTimestamp() { + auto now = std::chrono::system_clock::now(); + auto time_t = std::chrono::system_clock::to_time_t(now); + auto ms = std::chrono::duration_cast( + now.time_since_epoch() + ) % 1000; + + std::tm tm; +#ifdef _WIN32 + localtime_s(&tm, &time_t); +#else + localtime_r(&time_t, &tm); +#endif + + std::ostringstream oss; + oss << std::put_time(&tm, "%Y-%m-%d %H:%M:%S") + << "." << std::setfill('0') << std::setw(3) << ms.count(); + return oss.str(); + } +}; + +// Инициализация статических членов +inline Logger::Level Logger::current_level_ = Logger::Level::INFO; +inline std::mutex Logger::mutex_; \ No newline at end of file diff --git a/src/utils/uuid.hpp b/src/utils/uuid.hpp new file mode 100644 index 000000000..596c78a1f --- /dev/null +++ b/src/utils/uuid.hpp @@ -0,0 +1,58 @@ +#pragma once + +#include +#include +#include +#include + +namespace utils { + +/** + * @brief Генерирует UUID версии 4 (случайный) + * @return UUID в формате: 550e8400-e29b-41d4-a716-446655440000 + */ +inline std::string generateUUID() { + std::random_device rd; + std::mt19937_64 gen(rd()); + std::uniform_int_distribution dist(0, 15); + std::uniform_int_distribution dist_ver(8, 11); // Для версии 4 + + std::stringstream ss; + ss << std::hex << std::setfill('0'); + + // Формат: 8-4-4-4-12 + // 8 символов + for (int i = 0; i < 8; ++i) { + ss << dist(gen); + } + ss << '-'; + + // 4 символа + for (int i = 0; i < 4; ++i) { + ss << dist(gen); + } + ss << '-'; + + // 4 символа (версия 4) + ss << dist_ver(gen); + for (int i = 0; i < 3; ++i) { + ss << dist(gen); + } + ss << '-'; + + // 4 символа (вариант) + ss << dist(gen); + for (int i = 0; i < 3; ++i) { + ss << dist(gen); + } + ss << '-'; + + // 12 символов + for (int i = 0; i < 12; ++i) { + ss << dist(gen); + } + + return ss.str(); +} + +} // namespace utils \ No newline at end of file diff --git a/test_version.cpp b/test_version.cpp deleted file mode 100644 index 2e95b86c5..000000000 --- a/test_version.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#define BOOST_TEST_MODULE test_version - -#include "lib.h" - -#include - -BOOST_AUTO_TEST_SUITE(test_version) - -BOOST_AUTO_TEST_CASE(test_valid_version) { - BOOST_CHECK(version() > 0); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/version.h.in b/version.h.in deleted file mode 100644 index f118b3938..000000000 --- a/version.h.in +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#cmakedefine PROJECT_VERSION_PATCH @PROJECT_VERSION_PATCH@ - diff --git a/workflows/docs.yml b/workflows/docs.yml new file mode 100644 index 000000000..bb3017cd3 --- /dev/null +++ b/workflows/docs.yml @@ -0,0 +1,25 @@ + - name: Install Doxygen and Graphviz + run: | + sudo apt-get update + sudo apt-get install -y doxygen graphviz + + - name: Check dot version + # Эта команда покажет в логах, работает ли Graphviz вообще + run: dot -V + + - name: Generate Documentation + run: doxygen Doxyfile + + - name: Check for generated images + # Это покажет, появились ли PNG файлы до деплоя + run: ls docs/html/*.png || echo "PNG FILES NOT FOUND" + + - name: Add .nojekyll + run: touch ./docs/html/.nojekyll + + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./docs/html + publish_branch: gh-pages \ No newline at end of file diff --git "a/\320\222\320\276\320\267\320\274\320\276\320\266\320\275\321\213\320\265 \320\262\320\276\320\277\321\200\320\276\321\201\321\213.txt" "b/\320\222\320\276\320\267\320\274\320\276\320\266\320\275\321\213\320\265 \320\262\320\276\320\277\321\200\320\276\321\201\321\213.txt" new file mode 100644 index 000000000..3fb1cbdf5 --- /dev/null +++ "b/\320\222\320\276\320\267\320\274\320\276\320\266\320\275\321\213\320\265 \320\262\320\276\320\277\321\200\320\276\321\201\321\213.txt" @@ -0,0 +1,744 @@ +📚 ПОДРОБНЫЕ ОТВЕТЫ НА ВОПРОСЫ ДЛЯ ЗАЩИТЫ +1️⃣ КАК УСТРОЕН LOCK-FREE PRODUCER? +📖 Краткий ответ (для устного выступления) +Lock-free Producer — это многопоточный механизм отправки файлов в Kafka, который использует атомарные +операции для распределения работы между потоками без использования блокировок (mutex). +Это обеспечивает максимальную производительность и предотвращает взаимоблокировки. + +🔧 Техническая реализация +// main.cpp - runProducer() +void runProducer(AppConfig& config, KafkaProducer& producer, MessageCache& cache) { + const int MAX_WORKERS = config.processing.max_workers; // 4 потока + std::vector workers; + + while (running) { + for (const auto& group : config.groups) { + auto files = getJsonFiles(group.input_directory); // Получаем список файлов + + // ★ КЛЮЧЕВОЙ МОМЕНТ ★ + // Атомарный счетчик - общий для всех потоков + std::atomic next_index{0}; + + // Запускаем N потоков + for (int i = 0; i < MAX_WORKERS && running; ++i) { + workers.emplace_back([&]() { + processFiles( + group.input_directory, + producer, + cache, + group.kafka_topic, + std::ref(next_index), // ← Передаем атомарный счетчик по ссылке + std::cref(files) + ); + }); + } + + // Ждем завершения всех потоков + for (auto& worker : workers) { + if (worker.joinable()) { + worker.join(); + } + } + workers.clear(); + } + } +} + +🔍 Как работает атомарный индекс +// main.cpp - processFiles() +void processFiles(..., std::atomic& next_index, const std::vector& files) { + size_t idx; + + // ★ ГЛАВНАЯ МАГИЯ ★ + // fetch_add() - атомарная операция: + // 1. Читает текущее значение + // 2. Увеличивает на 1 + // 3. Возвращает предыдущее значение + // ВСЕ ЭТО ВЫПОЛНЯЕТСЯ КАК ОДНА НЕДЕЛИМАЯ ОПЕРАЦИЯ! + while ((idx = next_index.fetch_add(1)) < files.size()) { + const std::string& filepath = files[idx]; + + // Обработка файла... + auto order = JsonParser::parseOrder(filepath); + // ... отправка в Kafka ... + } +} + +📊 Визуализация работы +Файлы: [A.json, B.json, C.json, D.json, E.json, F.json, G.json, H.json] + ↓ + atomic next_index = 0 + ↓ + ┌─────────────────────────────────────────────┐ + │ Поток 1 Поток 2 Поток 3 Поток 4 │ + │ fetch_add fetch_add fetch_add fetch_add │ + │ ↓ ↓ ↓ ↓ │ + │ 0 1 2 3 │ + │ ↓ ↓ ↓ ↓ │ + │ A.json B.json C.json D.json │ + │ ↓ ↓ ↓ ↓ │ + │ fetch_add fetch_add fetch_add fetch_add │ + │ ↓ ↓ ↓ ↓ │ + │ 4 5 6 7 │ + │ ↓ ↓ ↓ ↓ │ + │ E.json F.json G.json H.json │ + └─────────────────────────────────────────────┘ + + ✅ Преимущества Lock-free подхода +Традиционный подход (mutex) Lock-free подход (atomic) +❌ Блокировка потоков ✅ Потоки не блокируются +❌ Риск взаимоблокировок ✅ Нет взаимоблокировок +❌ Накладные расходы на mutex ✅ Минимальные накладные расходы +❌ Контекстные переключения ✅ Нет переключений +❌ Сложность отладки ✅ Проще отлаживать +✅ Гарантированная безопасность ✅ Гарантированная безопасность + +2️⃣ ЗАЧЕМ НУЖЕН SQLITE КЭШ? +📖 Краткий ответ +SQLite кэш — это резервное хранилище всех сообщений, которое гарантирует, что ни одно сообщение не будет потеряно при сбоях. Сообщение сохраняется в кэш ПЕРЕД отправкой в Kafka или записью в PostgreSQL. + +🎯 Основные функции +1. Гарантия доставки (Producer) +// Последовательность Producer: +1. Сохранить в SQLite (статус: pending) ← ЕСЛИ СБОЙ ЗДЕСЬ - ФАЙЛ НЕ УДАЛЕН +2. Отправить в Kafka ← ЕСЛИ СБОЙ ЗДЕСЬ - МОЖНО ВОССТАНОВИТЬ +3. Обновить статус (sent) ← ЕСЛИ СБОЙ ЗДЕСЬ - ОТПРАВЛЕНО, НО НЕ ПОМЕЧЕНО +4. Удалить файл + +2. Восстановление после сбоя (Consumer) +// При запуске Consumer: +void OrderProcessor::reprocessPendingMessages() { + // 1. Читаем все pending сообщения из SQLite + auto pending = cache_.getPendingMessages(1000); + + // 2. Повторно обрабатываем каждое + for (const auto& [id, topic, message, filename] : pending) { + // 3. Парсим и обрабатываем как обычно + OrderData order = OrderData::fromJson(message); + // ... обработка ... + + // 4. Если успешно - помечаем как sent + cache_.markSent(id); + } +} + +3. Отслеживание статуса +// Статусы сообщений в SQLite: +// 1. 'pending' - ожидает обработки +// 2. 'sent' - успешно обработано +// 3. 'error' - произошла ошибка + +// Таблица messages +CREATE TABLE messages ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + filename TEXT NOT NULL, + tin TEXT, + trrc TEXT, + topic TEXT NOT NULL, + message TEXT NOT NULL, + status TEXT DEFAULT 'pending', // ← КЛЮЧЕВОЕ ПОЛЕ + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + sent_at TIMESTAMP, + error TEXT +); + +📊 Сценарии использования +Сценарий 1: Producer (отправка в Kafka) +1. Прочитан файл order.json +2. Сохранен в SQLite (status = 'pending') ← КЭШИРОВАНИЕ +3. Отправлен в Kafka → УСПЕШНО +4. Обновлен статус (status = 'sent') +5. Удален файл + +Сценарий 2: Сбой при отправке в Kafka +1. Прочитан файл order.json +2. Сохранен в SQLite (status = 'pending') ← СОХРАНЕН! +3. Отправка в Kafka → ОШИБКА (Kafka недоступна) +4. Программа завершается + ... +5. Перезапуск программы +6. Обнаруживает pending сообщения +7. Повторно отправляет в Kafka ✅ + +Сценарий 3: Consumer (обработка заказа) +1. Получено сообщение из Kafka +2. Сохранен в SQLite (status = 'pending') ← КЭШИРОВАНИЕ +3. Поиск клиента в PostgreSQL → УСПЕШНО +4. Поиск товаров в PostgreSQL → УСПЕШНО +5. Создание заказа в PostgreSQL → УСПЕШНО +6. Обновлен статус (status = 'sent') + +✅ Преимущества SQLite кэша +Без кэша С кэшем +❌ Потеря сообщений при сбое ✅ Сообщения не теряются +❌ Нет восстановления ✅ Автоматическое восстановление +❌ Нельзя отследить статус ✅ Полный контроль статуса +❌ Нет аудита ✅ Есть история всех операций + + +3️⃣ ЧТО ДЕЛАЕТ РЕГИСТР СВЕДЕНИЙ? +📖 Краткий ответ +Регистр сведений (_InfoRg60) — это таблица аудита в 1С, которая хранит историю всех полученных сообщений. Каждая запись содержит: временную метку, ИНН, КПП и полный JSON заказа. +🎯 Назначение +-- Структура регистра сведений +CREATE TABLE _InfoRg60 ( + _Fld61 BIGINT, -- Linux timestamp (миллисекунды с 1970) + _Fld62 VARCHAR(12), -- ИНН контрагента + _Fld63 VARCHAR(9), -- КПП контрагента + _Fld64 TEXT -- Полный JSON заказа +); + +📝 Как используется в коде +// order_processor.cpp - logToRegister() +void OrderProcessor::logToRegister(const OrderData& order, const std::string& json_str) { + // 1. Получаем текущее время в миллисекундах + long long linux_time = getLinuxTime(); // 1712345678901 + + // 2. Записываем в регистр + db_.logKafkaMessage(linux_time, order.tin, order.trrc, json_str); +} + +// postgresql.cpp - logKafkaMessage() +void PostgreSQL::logKafkaMessage( + long long linux_time, + const std::string& tin, + const std::string& trrc, + const std::string& json_data +) { + std::string sql = R"( + INSERT INTO _InfoRg60 (_Fld61, _Fld62, _Fld63, _Fld64) + VALUES (" + std::to_string(linux_time) + R"(, '" + escape(tin) + R"(', '" + escape(trrc) + R"(', '" + escape(json_data) + R"(') + )"; + execute(sql); +} + +📊 Что хранится в регистре +-- Пример записи +INSERT INTO _InfoRg60 VALUES ( + 1712345678901, -- Время получения + '7701234567', -- ИНН + '770101001', -- КПП + '{"TIN":"7701234567","TRRC":"770101001","contractor":"ООО Тест","goods":[...]}' +); + +🎯 Зачем это нужно? +1. Аудит +Кто отправил заказ (ИНН/КПП) + +Когда был получен (timestamp) + +Какие данные были отправлены (JSON) + +2. Отслеживание проблем +Можно проверить, что заказ был получен + +Можно восстановить данные, если что-то пошло не так + +3. Интеграция с 1С +1С может использовать этот регистр для проверки входящих данных + +Синхронизация между системами + +4. Отчетность +Можно строить отчеты по полученным заказам + +Статистика по контрагентам + +📋 Сравнение с другими таблицами +Таблица Назначение Когда записывается +_InfoRg60 Регистр сведений (аудит) Сразу после получения из Kafka +_Reference47 Контрагенты После обработки контрагента +_Reference48 Номенклатура После обработки товаров +_Document49 Заказы После создания заказа + +✅ Преимущества +БЕЗ РЕГИСТРА СВЕДЕНИЙ: +❌ Нет истории сообщений +❌ Нельзя отследить, что пришло +❌ Сложно отлаживать +❌ Нет аудита + +С РЕГИСТРОМ СВЕДЕНИЙ: +✅ Полная история всех сообщений +✅ Можно отследить проблемы +✅ Легкая отладка +✅ Аудит для 1С +✅ Восстановление данных + +4️⃣ КАК ВОССТАНАВЛИВАЮТСЯ СООБЩЕНИЯ ПОСЛЕ СБОЯ? +📖 Краткий ответ +При запуске Consumer автоматически проверяет SQLite кэш на наличие сообщений со статусом pending и повторно обрабатывает их. Это гарантирует, что ни одно сообщение не будет потеряно даже при сбоях. + +🔄 Полный цикл восстановления +// main.cpp - при запуске Consumer +void runConsumer(...) { + // 1. Создаем процессор + OrderProcessor processor(db, cache, error_producer); + + // 2. ★ ВОССТАНОВЛЕНИЕ ★ + Logger::info("[Consumer] Checking for pending messages in cache..."); + processor.reprocessPendingMessages(); // ← КЛЮЧЕВОЙ МЕТОД + + // 3. Запускаем основной цикл + consumer.start(); +} + +📝 Детальная реализация восстановления +// order_processor.cpp - reprocessPendingMessages() +void OrderProcessor::reprocessPendingMessages() { + // 1. Получаем все pending сообщения из SQLite + auto pending = cache_.getPendingMessages(1000); + + if (pending.empty()) { + Logger::info("No pending messages to reprocess"); + return; + } + + Logger::info("Found " + std::to_string(pending.size()) + + " pending messages to reprocess"); + + // 2. Обрабатываем каждое сообщение + for (const auto& [id, topic, message, filename] : pending) { + Logger::info("Reprocessing: " + filename); + + try { + // 3. Парсим JSON + OrderData order = OrderData::fromJson(message); + if (!JsonParser::validate(order)) { + Logger::error("Invalid cached order: " + filename); + cache_.markError(id, "Invalid JSON in cache"); + sendError("PostgreSQL write error", "Invalid cached order", message); + continue; + } + + // 4. Логируем в регистр сведений + logToRegister(order, message); + + // 5. Обрабатываем контрагента + auto client_id = processClient(order); + if (!client_id) { + Logger::error("Failed to reprocess client: " + order.tin); + cache_.markError(id, "Client not found"); + sendError("PostgreSQL write error", "Client not found", message); + continue; + } + + // 6. Обрабатываем товары + auto items = processProducts(order); + if (items.empty()) { + Logger::error("No valid products in cached order: " + filename); + cache_.markError(id, "No products found"); + sendError("PostgreSQL write error", "No products found", message); + continue; + } + + // 7. Создаем заказ + if (!createOrder(order, *client_id, items)) { + Logger::error("Failed to reprocess order: " + filename); + cache_.markError(id, "Order creation failed"); + sendError("PostgreSQL write error", "Order creation failed", message); + continue; + } + + // 8. ★ ПОМЕЧАЕМ КАК ОБРАБОТАННОЕ ★ + cache_.markSent(id); + Logger::info("Reprocessed successfully: " + filename); + + } catch (const std::exception& e) { + Logger::error("Reprocess error: " + std::string(e.what())); + cache_.markError(id, e.what()); + sendError("PostgreSQL write error", "Reprocess error", message); + } + } +} + +📊 Сценарии восстановления +Сценарий 1: Сбой до отправки в Kafka (Producer) + +1. Файл прочитан и сохранен в SQLite (status = 'pending') +2. ❌ Сбой: Kafka недоступна +3. Программа завершена +4. 🔄 Перезапуск Producer +5. ✅ Обнаружены pending сообщения +6. ✅ Повторная отправка в Kafka +7. ✅ Статус обновлен на 'sent' +8. ✅ Файл удален + +Сценарий 2: Сбой после отправки, до обновления статуса +1. Файл прочитан и сохранен в SQLite (status = 'pending') +2. ✅ Отправлен в Kafka (успешно) +3. ❌ Сбой: программа упала до обновления статуса +4. Программа завершена +5. 🔄 Перезапуск Producer +6. ✅ Обнаружены pending сообщения +7. ⚠️ Сообщение уже есть в Kafka (дубликат) +8. ✅ Повторная отправка (idempotent) +9. ✅ Статус обновлен на 'sent' + +Сценарий 3: Сбой при обработке Consumer +1. ✅ Получено сообщение из Kafka +2. ✅ Сохранено в SQLite (status = 'pending') +3. ✅ Записано в регистр сведений +4. ❌ Сбой: PostgreSQL недоступен +5. Программа завершена +6. 🔄 Перезапуск Consumer +7. ✅ Обнаружены pending сообщения +8. ✅ Повторная обработка +9. ✅ Статус обновлен на 'sent' + +🛡️ Гарантии надежности +// Атомарность операций +1. Сохранение в SQLite → Атомарно (INSERT) +2. Отправка в Kafka → Атомарно (produce) +3. Обновление статуса → Атомарно (UPDATE) + +// Если что-то пошло не так между 1 и 2: +// - Сообщение в SQLite со статусом 'pending' +// - При перезапуске будет повторно отправлено + +// Если что-то пошло не так между 2 и 3: +// - Сообщение в SQLite со статусом 'pending' +// - При перезапуске будет отправлено повторно (дубликат) +// - Kafka гарантирует idempotent-обработку + +5️⃣ ПОЧЕМУ ACKS=ALL? +📖 Краткий ответ +acks=all — это настройка Kafka Producer, которая требует подтверждения от всех реплик (in-sync replicas) перед тем, как считать сообщение доставленным. Это обеспечивает максимальную надежность и гарантирует, что сообщение не будет потеряно даже при сбое брокера. + +📊 Уровни подтверждения (acks) +acks Описание Надежность Производительность +0 Без подтверждения ❌ Очень низкая ✅ Максимальная +1 Подтверждение от лидера 🔶 Средняя 🔶 Высокая +all Подтверждение от всех реплик ✅ Максимальная ❌ Низкая + +🔧 Реализация в коде +// config/settings.json +{ + "kafka": { + "producer": { + "acks": "all", // ← ТРЕБУЕТ ПОДТВЕРЖДЕНИЯ ОТ ВСЕХ РЕПЛИК + "retries": 3, + "batch_size": 100, + "linger_ms": 5 + } + } +} + +// producer.cpp - init() +bool KafkaProducer::init(const std::string& acks, int retries) { + RdKafka::Conf* conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL); + + // Устанавливаем acks + conf->set("acks", acks, errstr_); // ← "all" + + // Дополнительные настройки для надежности + conf->set("message.send.max.retries", std::to_string(retries), errstr_); + conf->set("request.timeout.ms", "5000", errstr_); + + // Создаем producer + producer_.reset(RdKafka::Producer::create(conf, errstr_)); + // ... +} + +📋 Как работает acks=all + Producer Kafka Cluster + │ │ + │ 1. Отправка сообщения │ + ├──────────────────────────►│ + │ │ + │ ┌──────┴──────┐ + │ │ Leader │ ← Получает сообщение + │ │ Replica │ + │ └──────┬──────┘ + │ │ + │ ┌──────┴──────┐ + │ │ Follower │ ← Реплицирует + │ │ Replica 1 │ + │ └──────┬──────┘ + │ │ + │ ┌──────┴──────┐ + │ │ Follower │ ← Реплицирует + │ │ Replica 2 │ + │ └──────┬──────┘ + │ │ + │ 2. Подтверждение от всех │ + │◄──────────────────────────┤ + │ │ + │ 3. Message delivered! │ + +🎯 Почему выбрали acks=all? +1. Финансовые данные +// Заказы содержат финансовую информацию +// Потеря заказа = потеря денег +// acks=all гарантирует, что заказ не потеряется + +2. Интеграция с 1С +// 1С отправляет критически важные данные +// Нужна 100% гарантия доставки +// acks=all обеспечивает эту гарантию + +3. Бизнес-требования +// Заказы должны быть доставлены в любом случае +// Даже при сбое одного брокера +// acks=all гарантирует доставку при сбое + +📊 Сравнение сценариев +Сценарий: Сбой лидера после получения сообщения +acks=0 acks=1 acks=all +❌ Сообщение потеряно ❌ Сообщение потеряно ✅ Сообщение сохранено +Producer не знает Producer не знает Producer получил подтверждение +Нет восстановления Нет восстановления Есть восстановление + +Сценарий: Сбой фолловера во время репликации +acks=0 acks=1 acks=all +✅ Сообщение доставлено ✅ Сообщение доставлено ❌ Сообщение НЕ доставлено +❌ Нет гарантии ❌ Нет гарантии ✅ Безопасность +Риск потери Риск потери Нет риска + +// Настройка баланса между надежностью и производительностью +{ + "kafka": { + "producer": { + "acks": "all", // ← Надежность + "retries": 3, // ← Попытки при сбое + "batch_size": 100, // ← Производительность + "linger_ms": 5 // ← Производительность + } + } +} + +⚖️ Компромисс +// Почему так: +// 1. acks=all → Гарантия доставки (бизнес-требование) +// 2. retries=3 → Автоматическое восстановление +// 3. batch_size=100 → Оптимизация сети +// 4. linger_ms=5 → Оптимизация задержек + +6️⃣ КАК ОБРАБАТЫВАЮТСЯ ОШИБКИ? +📖 Краткий ответ +Все ошибки в Consumer обрабатываются через единый механизм sendError(), который отправляет структурированное сообщение в топик orders.errors. +Это позволяет централизованно отслеживать все проблемы и анализировать их. + +🔧 Единый механизм обработки ошибок +// order_processor.cpp - sendError() +void OrderProcessor::sendError( + const std::string& error_type, // Тип ошибки + const std::string& description, // Описание + const std::string& original_message // Оригинальное сообщение +) { + try { + // 1. Генерируем UUID для идентификации ошибки + std::string uuid = utils::generateUUID(); + std::string key = error_type + " " + uuid; + + // 2. Формируем структурированный JSON + nlohmann::json error_json; + error_json["error_type"] = error_type; + error_json["uuid"] = uuid; + error_json["timestamp"] = getLinuxTime(); + error_json["description"] = description; + if (!original_message.empty()) { + error_json["original_message"] = original_message; + } + + std::string error_str = error_json.dump(); + + // 3. Отправляем в топик errors + if (error_producer_.send(key, error_str)) { + Logger::debug("Error sent to Kafka: " + key); + } else { + Logger::error("Failed to send error to Kafka: " + key); + } + + } catch (const std::exception& e) { + Logger::error("sendError failed: " + std::string(e.what())); + } +} + +📝 Типы ошибок + +// 1. Ошибки чтения из Kafka +sendError("Kafka read error", "Message is not valid JSON", value); + +// 2. Ошибки валидации +sendError("Kafka read error", "Invalid order structure: missing TIN", value); + +// 3. Ошибки PostgreSQL +sendError("PostgreSQL write error", "Client not found and could not be created", value); + +// 4. Ошибки товаров +sendError("PostgreSQL write error", "No valid products found in order", value); + +// 5. Ошибки создания заказа +sendError("PostgreSQL write error", "Failed to create order in PostgreSQL", value); + +📊 Где происходят проверки +// order_processor.cpp - processMessage() +bool OrderProcessor::processMessage(const std::string& key, + const std::string& value, + int64_t timestamp) { + try { + // ✅ Проверка 1: Валидность JSON + if (value.empty() || (value[0] != '{' && value[0] != '[')) { + sendError("Kafka read error", "Message is not valid JSON", value); + return false; // ← ОШИБКА 1 + } + + // ✅ Проверка 2: Структура заказа + OrderData order = OrderData::fromJson(value); + if (!JsonParser::validate(order)) { + sendError("Kafka read error", "Invalid order structure", value); + return false; // ← ОШИБКА 2 + } + + // ✅ Проверка 3: Контрагент + auto client_id = processClient(order); + if (!client_id) { + sendError("PostgreSQL write error", "Client not found", value); + return false; // ← ОШИБКА 3 + } + + // ✅ Проверка 4: Товары + auto items = processProducts(order); + if (items.empty()) { + sendError("PostgreSQL write error", "No valid products found", value); + return false; // ← ОШИБКА 4 + } + + // ✅ Проверка 5: Создание заказа + if (!createOrder(order, *client_id, items)) { + sendError("PostgreSQL write error", "Failed to create order", value); + return false; // ← ОШИБКА 5 + } + + return true; // ✅ УСПЕХ + + } catch (const std::exception& e) { + // ✅ Проверка 6: Исключения + sendError("Kafka read error", "Exception: " + std::string(e.what()), value); + return false; // ← ОШИБКА 6 + } +} + +📋 Формат ошибки в Kafka +{ + "error_type": "PostgreSQL write error", + "uuid": "550e8400-e29b-41d4-a716-446655440000", + "timestamp": 1712345678901, + "description": "Client not found and could not be created: TIN=7709876543", + "original_message": "{\"TIN\":\"7709876543\",\"TRRC\":\"770202002\",\"contractor\":\"ООО Партнер\",\"date\":\"2026-08-02T11:00:00\",\"number\":\"ORD-007\",\"goods\":[{\"SKU\":\"PROD-007\",\"Quantity\":520,\"Price\":100.00,\"Sum\":52000.00}]}" +} + +🎯 Мониторинг ошибок +# 1. Просмотр всех ошибок +kafka-console-consumer --topic orders.errors --bootstrap-server localhost:9092 --from-beginning + +# 2. Просмотр ошибок по типу +kafka-console-consumer --topic orders.errors --bootstrap-server localhost:9092 --property print.key=true + +# 3. Анализ ошибок в SQLite +sqlite3 cache/messages.db +SELECT * FROM messages WHERE status = 'error'; + +# 4. Статистика ошибок в логах +[INFO] === Summary === +[INFO] Errors: 3 ← СЧЕТЧИК ОШИБОК + +🛡️ Обработка ошибок на всех уровнях + +// 1. Уровень Kafka (consumer.cpp) +if (msg->err() == RdKafka::ERR_NO_ERROR) { + // Успешно +} else { + // Ошибка чтения из Kafka + Logger::error("Consumer error: " + msg->errstr()); +} + +// 2. Уровень Processor (order_processor.cpp) +try { + // Обработка заказа +} catch (const std::exception& e) { + sendError("Kafka read error", e.what(), value); + return false; +} + +// 3. Уровень PostgreSQL (postgresql.cpp) +try { + txn.exec(sql); + txn.commit(); +} catch (const std::exception& e) { + Logger::error("SQL error: " + std::string(e.what())); + return false; +} + +// 4. Уровень SQLite (sqlite_cache.cpp) +if (sqlite3_step(stmt) != SQLITE_DONE) { + std::cerr << "[Cache] Insert failed: " << sqlite3_errmsg(db_) << std::endl; + return false; +} + +✅ Преимущества системы обработки ошибок + +Аспект Преимущество +Централизация Все ошибки через sendError() +Структурированность Единый JSON формат +Отслеживаемость UUID для каждой ошибки +Аналитика Легко анализировать в Kafka +Логирование Детальные логи с уровнями +Восстановление SQLite кэш для повторной обработки +Мониторинг Счетчики ошибок в summary + +🎓 КЛЮЧЕВЫЕ ТЕЗИСЫ ДЛЯ ЗАЩИТЫ +1️⃣ Lock-free Producer +Использует атомарные операции (std::atomic) + +Нет блокировок (mutex) + +Максимальная производительность + +Безопасное распределение файлов между потоками + +2️⃣ SQLite кэш +Резервное хранилище для всех сообщений + +Гарантия доставки при сбоях + +Автоматическое восстановление + +Три статуса: pending, sent, error + +3️⃣ Регистр сведений +Таблица аудита в 1С + +Хранит историю всех сообщений + +Время, ИНН, КПП, JSON + +Для отчетности и отладки + +4️⃣ Восстановление после сбоя +Автоматическая проверка при запуске + +Повторная обработка pending сообщений + +Ни одно сообщение не теряется + +Idempotent обработка + +5️⃣ acks=all +Максимальная надежность + +Подтверждение от всех реплик + +Гарантия доставки + +Компромисс с производительностью + +6️⃣ Обработка ошибок +Единый механизм sendError() + +Структурированный JSON + +Топик orders.errors + +Отслеживание всех проблем \ No newline at end of file diff --git "a/\320\227\320\260\320\277\321\200\320\276\321\201\321\213Postrige.txt" "b/\320\227\320\260\320\277\321\200\320\276\321\201\321\213Postrige.txt" new file mode 100644 index 000000000..d5cb1b4f3 --- /dev/null +++ "b/\320\227\320\260\320\277\321\200\320\276\321\201\321\213Postrige.txt" @@ -0,0 +1,54 @@ +SELECT + _IDRRef as "Ссылка", + _Code as "Код", + _Description as "Наименование", + _Fld50 as "ИНН", + _Fld51 as "КПП", + _Marked as "ПометкаУдаления" +FROM _Reference47; + +SELECT + _IDRRef as "Ссылка", + _Code as "Код", + _Description as "Наименование", + _Fld52 as "Артикул", + _Marked as "ПометкаУдаления" +FROM _Reference48; + +SELECT + _IDRRef as "Ссылка", + _Date_Time as "Дата", + _Number as "Номер", + _Posted as "Проведен", + _Marked as "ПометкаУдаления", + _Fld53RRef as "Контрагент" +FROM _Document49; + +SELECT + _Document49_IDRRef as "Заказ", + _Fld56RRef as "Товар", + _Fld57 as "Количество", + _Fld58 as "Цена", + _Fld59 as "Сумма", + _LineNo55 as "НомерСтроки" +FROM _Document49_VT54; + +SELECT + _Fld61 as "Время", + _Fld62 as "ИНН", + _Fld63 as "КПП", + _Fld64 as "JSON" +FROM _InfoRg60; + +SELECT + d._Number as "Номер", + d._Date_Time as "Дата", + c._Description as "Контрагент", + p._Description as "Товар", + vt._Fld57 as "Кол-во", + vt._Fld58 as "Цена", + vt._Fld59 as "Сумма" +FROM _Document49 d +JOIN _Reference47 c ON d._Fld53RRef = c._IDRRef +JOIN _Document49_VT54 vt ON d._IDRRef = vt._Document49_IDRRef +JOIN _Reference48 p ON vt._Fld56RRef = p._IDRRef; \ No newline at end of file diff --git "a/\320\232\320\273\321\216\321\207\320\265\320\262\321\213\320\265\320\242\320\276\321\207\320\272\320\270\320\236\321\201\321\202\320\260\320\275\320\276\320\262\320\260.docx" "b/\320\232\320\273\321\216\321\207\320\265\320\262\321\213\320\265\320\242\320\276\321\207\320\272\320\270\320\236\321\201\321\202\320\260\320\275\320\276\320\262\320\260.docx" new file mode 100644 index 000000000..926ae52d4 Binary files /dev/null and "b/\320\232\320\273\321\216\321\207\320\265\320\262\321\213\320\265\320\242\320\276\321\207\320\272\320\270\320\236\321\201\321\202\320\260\320\275\320\276\320\262\320\260.docx" differ diff --git "a/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265 Consumer.docx" "b/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265 Consumer.docx" new file mode 100644 index 000000000..0e2f29b36 Binary files /dev/null and "b/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265 Consumer.docx" differ diff --git "a/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265.docx" "b/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265.docx" new file mode 100644 index 000000000..48f6e9f89 Binary files /dev/null and "b/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265.docx" differ diff --git "a/\320\237\320\260\320\274\321\217\321\202\320\272\320\260.txt" "b/\320\237\320\260\320\274\321\217\321\202\320\272\320\260.txt" new file mode 100644 index 000000000..b6f5e1a5f --- /dev/null +++ "b/\320\237\320\260\320\274\321\217\321\202\320\272\320\260.txt" @@ -0,0 +1,286 @@ +📋 ПАМЯТКА ДЛЯ ЗАЩИТЫ +🎯 КЛЮЧЕВЫЕ МОМЕНТЫ ДЛЯ ЗАЩИТЫ +1. АРХИТЕКТУРА ПРОЕКТА +┌──────────────────────────────────────────────────────────────┐ +│ ПРОЕКТНАЯ АРХИТЕКТУРА │ +├──────────────────────────────────────────────────────────────┤ +│ │ +│ 🏗 Трехуровневая архитектура: │ +│ │ +│ 1. Уровень ВЗАИМОДЕЙСТВИЯ (Kafka) │ +│ - producer.hpp/cpp - отправка в Kafka │ +│ - consumer.hpp/cpp - получение из Kafka │ +│ │ +│ 2. Уровень БИЗНЕС-ЛОГИКИ (Processor) │ +│ - order_processor.hpp/cpp │ +│ - Обработка заказов: клиент → товары → заказ │ +│ │ +│ 3. Уровень ДАННЫХ (Storage) │ +│ - postgresql.hpp/cpp - основное хранилище │ +│ - sqlite_cache.hpp/cpp - резервное кэширование │ +│ │ +│ 🔧 Вспомогательные модули: │ +│ - config.hpp/cpp - конфигурация │ +│ - json_parser.hpp/cpp - парсинг JSON │ +│ - logger.hpp/cpp - логирование │ +│ - uuid.hpp - генерация UUID │ +│ │ +└──────────────────────────────────────────────────────────────┘ + +2. ПОТОКИ ВЫПОЛНЕНИЯ +// main.cpp - два параллельных потока + +Поток 1 (Producer) Поток 2 (Consumer) +──────────────────────────────────────────────── +runProducer() runConsumer() + │ │ + ▼ ▼ +Читает файлы из input/ Инициализирует KafkaConsumer + │ │ + ▼ ▼ +Парсит JSON Восстанавливает из кэша + │ │ + ▼ ▼ +Сохраняет в SQLite Запускает consumeLoop() + │ │ + ▼ ▼ +Отправляет в Kafka processMessage() для каждого + │ │ + ▼ ▼ +Удаляет файл Авто-коммит offset + + +3. ПОСЛЕДОВАТЕЛЬНОСТЬ ОБРАБОТКИ ЗАКАЗА +// 1. Входная точка +OrderProcessor::processMessage(key, value, timestamp) + │ + ├── 1.1 Проверка JSON + │ └── if (!JsonParser::validate(order)) → sendError() + │ + ├── 1.2 Сохранение в SQLite кэш + │ └── cache_.save(cache_key, "processing", value, tin, trrc) + │ + ├── 1.3 Логирование в регистр сведений + │ └── db_.logKafkaMessage(linux_time, tin, trrc, json_str) + │ + ├── 1.4 Обработка контрагента + │ ├── db_.findClient(tin, trrc) + │ │ └── SELECT FROM _Reference47 WHERE _Fld50 = '...' AND _Fld51 = '...' + │ └── if not found → db_.createClient(tin, trrc, name) + │ └── INSERT INTO _Reference47 (...) + │ + ├── 1.5 Обработка товаров (цикл) + │ └── for each item in order.goods: + │ └── db_.findProductByArticle(item.sku) + │ └── SELECT FROM _Reference48 WHERE _Fld52 = '...' + │ └── if not found → пропускаем + │ └── if found → добавляем в вектор items + │ + ├── 1.6 Создание заказа + │ └── db_.createOrder(client_id, date, number, items) + │ ├── generateUUID() → order_id + │ ├── INSERT INTO _Document49 (_IDRRef, _Date_Time, _Number, _Posted, _Marked, _Fld53RRef) + │ │ VALUES (order_id, date, number, 1, 0, client_id) + │ └── for each item in items: + │ └── INSERT INTO _Document49_VT54 (_Document49_IDRRef, _Fld56RRef, _Fld57, _Fld58, _Fld59) + │ VALUES (order_id, product_id, quantity, price, sum) + │ + └── 1.7 Успех + └── return true + +4. ТАБЛИЦЫ БАЗЫ ДАННЫХ +Таблица Назначение Ключевые поля +_Reference47 Контрагенты _IDRRef, _Fld50 (ИНН), _Fld51 (КПП) +_Reference48 Номенклатура _IDRRef, _Fld52 (Артикул) +_Document49 Заказы (шапка) _IDRRef, _Fld53RRef (клиент) +_Document49_VT54 Товары в заказе _Document49_IDRRef, _Fld56RRef (товар) +_InfoRg60 Регистр сведений _Fld61 (timestamp), _Fld62 (ИНН), _Fld63 (КПП) + +5. ОБРАБОТКА ОШИБОК +// Все ошибки отправляются в топик orders.errors +void OrderProcessor::sendError(error_type, description, original_message) + │ + ├── Генерирует UUID ошибки + ├── Формирует JSON: + │ { + │ "error_type": "Kafka read error", + │ "uuid": "...", + │ "timestamp": 1712345678901, + │ "description": "...", + │ "original_message": "..." + │ } + └── error_producer_.send(key, error_json.dump()) + +// Типы ошибок: +// 1. "Kafka read error" - проблемы с парсингом JSON +// 2. "PostgreSQL write error" - проблемы с записью в БД + +6. SQLITE КЭШ +// Структура таблицы messages +CREATE TABLE messages ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + filename TEXT NOT NULL, + tin TEXT, + trrc TEXT, + topic TEXT NOT NULL, + message TEXT NOT NULL, + status TEXT DEFAULT 'pending', // 'pending', 'sent', 'error' + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + sent_at TIMESTAMP, + error TEXT +); + +// Зачем нужен? +// 1. Сохранение сообщений перед отправкой в Kafka (Producer) +// 2. Восстановление после сбоя (Consumer) +// 3. Отслеживание статуса обработки + + +7. ТОЧКИ ОСТАНОВА ДЛЯ ОТЛАДКИ +Файл Строка Что проверяем +consumer.cpp 73 Получение сообщения из Kafka +order_processor.cpp 58 Проверка JSON +order_processor.cpp 65 Парсинг JSON → структура OrderData +postgresql.cpp 122 SQL запрос поиска клиента +postgresql.cpp 131 Результат поиска клиента +postgresql.cpp 165 SQL запрос поиска товара +postgresql.cpp 171 Результат поиска товара +postgresql.cpp 200 INSERT в _Document49 (шапка) +postgresql.cpp 211 INSERT в _Document49_VT54 (строки) +postgresql.cpp 185 INSERT в _InfoRg60 (регистр) +order_processor.cpp 53 Отправка ошибки в Kafka + + +8. ВОПРОСЫ, КОТОРЫЕ МОГУТ ЗАДАТЬ НА ЗАЩИТЕ +1. Почему используется SQLite + PostgreSQL? +SQLite: кэш для надежности (сохранение сообщений до обработки) + +PostgreSQL: основное хранилище (1С база) + +2. Как обрабатываются ошибки? +Все ошибки логируются и отправляются в топик orders.errors + +Структура ошибки содержит тип, описание, оригинальное сообщение + +3. Как происходит восстановление после сбоя? +При запуске Consumer вызывает reprocessPendingMessages() + +Читает из SQLite все сообщения со статусом pending + +Повторно обрабатывает их + +4. Как гарантируется доставка? +acks=all — подтверждение от всех реплик + +SQLite кэш перед отправкой + +Автоматический коммит offset после обработки + +5. Почему выбран C++20? +Высокая производительность + +Lock-free многопоточность + +Современные возможности (std::atomic, std::optional) + +6. Как устроен многопоточный Producer? + +// Lock-free цикл с атомарным индексом +std::atomic next_index{0}; +while ((idx = next_index.fetch_add(1)) < files.size()) { + // Обработка файла без блокировок +} + +9. КОМАНДЫ ДЛЯ ЗАПУСКА +# Сборка +cd build +cmake .. -DCMAKE_TOOLCHAIN_FILE="C:/vcpkg/scripts/buildsystems/vcpkg.cmake" +cmake --build . --config Release + +# Запуск +cd Release +./kafka_order_sender.exe # Producer + Consumer +./kafka_order_sender.exe producer # Только Producer +./kafka_order_sender.exe consumer # Только Consumer + +# Просмотр сообщений в Kafka +kafka-console-consumer --topic orders.input --bootstrap-server localhost:9092 --from-beginning + +# Просмотр ошибок +kafka-console-consumer --topic orders.errors --bootstrap-server localhost:9092 --from-beginning + +# Проверка SQLite +sqlite3 cache/messages.db +SELECT * FROM messages; + +10. ОСНОВНЫЕ ЗАВИСИМОСТИ +# CMakeLists.txt +target_link_libraries(kafka_order_sender + PRIVATE + rdkafka++ # Kafka + sqlite3 # SQLite + pqxx # PostgreSQL +) + +# vcpkg +librdkafka:x64-windows +nlohmann-json:x64-windows +sqlite3:x64-windows +libpqxx:x64-windows + +11. JSON-ФОРМАТ ЗАКАЗА +{ + "TIN": "7701234567", // ИНН контрагента (обязательное) + "TRRC": "770101001", // КПП контрагента (обязательное) + "contractor": "ООО Тест", // Наименование (опционально) + "date": "2026-08-02T10:00:00", // Дата (опционально) + "number": "ORD-001", // Номер (опционально) + "goods": [ // Массив товаров (обязательное) + { + "SKU": "PROD-001", // Артикул (обязательное) + "Quantity": 10, // Количество (обязательное) + "Price": 1500.50, // Цена (обязательное) + "Sum": 15005.00 // Сумма (обязательное) + } + ] +} + +12. СТАТИСТИКА ВЫПОЛНЕНИЯ +// По завершению main() выводит: +[INFO] === Summary === +[INFO] Producer sent: 15 // Отправлено сообщений +[INFO] Consumer processed: 12 // Обработано заказов +[INFO] Errors: 3 // Ошибок +[INFO] Pending in cache: 0 // Ожидают отправки +[INFO] Total in cache: 15 // Всего в кэше + +🎯 ПЛАН ПОДГОТОВКИ К ЗАЩИТЕ +Действие 1: Пройти код с отладчиком +1. Установить брейкпоинты по списку выше +2. Запустить программу в режиме consumer +3. Отправить тестовый JSON в Kafka +4. Пройти шаг за шагом все этапы +5. Записать SQL запросы, которые выполняются + +Действие 2: Подготовить ответы на вопросы +Как устроен Lock-free Producer? + +Зачем нужен SQLite кэш? + +Что делает регистр сведений? + +Как восстанавливаются сообщения после сбоя? + +Почему acks=all? + +Как обрабатываются ошибки? + +Действие 3: Подготовить демонстрацию +1. Запустить программу в режиме both +2. Положить файл в input/ +3. Показать лог отправки в Kafka +4. Показать лог обработки Consumer +5. Показать данные в PostgreSQL +6. Показать данные в SQLite +7. Показать ошибку (если есть) + diff --git "a/\320\241\320\245\320\225\320\234\320\220.txt" "b/\320\241\320\245\320\225\320\234\320\220.txt" new file mode 100644 index 000000000..505cd6575 --- /dev/null +++ "b/\320\241\320\245\320\225\320\234\320\220.txt" @@ -0,0 +1,111 @@ +ПОЛНАЯ ЦЕПОЧКА ВЫЗОВОВ +1. PRODUCER (JSON → KAFKA) +main.cpp + └── main() + └── std::thread(runProducer) // Запуск потока Producer + └── runProducer() + └── getJsonFiles() // .\src\main.cpp + └── fs::directory_iterator // Чтение папки input/ + └── for (workers) // Запуск N потоков + └── processFiles() // .\src\main.cpp + ├── JsonParser::parseOrder() + │ └── OrderData::fromJson() // .\src\parser\json_parser.cpp + │ └── nlohmann::json::parse() + ├── JsonParser::validate() // .\src\parser\json_parser.cpp + ├── order.toJson() // .\src\parser\json_parser.cpp + ├── cache.save() // .\src\cache\sqlite_cache.cpp + │ └── INSERT INTO messages (status='pending', source='producer') + ├── producer.send() // .\src\kafka\producer.cpp + │ └── producer_->produce() // librdkafka + │ └── producer_->poll(0) + └── fs::remove() // Удаление файла + + +2. CONSUMER (KAFKA → SQL) +main.cpp + └── main() + └── std::thread(runConsumer) // Запуск потока Consumer + └── runConsumer() // .\src\main.cpp + ├── KafkaConsumer() // .\src\kafka\consumer.cpp + │ └── consumer.init() + │ └── RdKafka::KafkaConsumer::create() + │ └── consumer_->subscribe() + ├── OrderProcessor() // .\src\processor\order_processor.cpp + ├── processor.reprocessPendingMessages() + │ └── cache_.getPendingMessages() // .\src\cache\sqlite_cache.cpp + │ └── SELECT ... WHERE status='pending' AND source LIKE '...|producer%' + │ └── for each message: + │ ├── OrderData::fromJson() + │ ├── processClient() + │ │ ├── db_.findClient() // .\src\database\postgresql.cpp + │ │ │ └── query(SELECT FROM _Reference47) + │ │ └── db_.createClient() // если не найден + │ │ └── execute(INSERT INTO _Reference47) + │ ├── processProducts() + │ │ └── for each goods: + │ │ └── db_.findProductByArticle() + │ │ └── query(SELECT FROM _Reference48) + │ ├── createOrder() + │ │ └── db_.createOrder() + │ │ ├── generateUUID() + │ │ ├── convertToHex() + │ │ ├── execute(INSERT INTO _Document49) + │ │ └── for each item: + │ │ └── execute(INSERT INTO _Document49_VT54) + │ └── cache_.markSent() // UPDATE messages SET status='sent' + └── consumer.start() + └── consumeLoop() // .\src\kafka\consumer.cpp + └── consumer_->consume() + └── callback_() // → OrderProcessor::processMessage() + └── processMessage() + ├── OrderData::fromJson() + ├── cache_.save() // .\src\cache\sqlite_cache.cpp + │ └── INSERT (source='consumer') + ├── logToRegister() + │ └── db_.logKafkaMessage() + │ └── INSERT INTO _InfoRg60 + ├── processClient() + │ ├── db_.findClient() + │ └── db_.createClient() + ├── processProducts() + │ └── db_.findProductByArticle() + ├── createOrder() + │ └── db_.createOrder() + └── cache_.markSent() + +3. ОБРАБОТКА ОШИБОК + +order_processor.cpp + └── OrderProcessor::sendError() + ├── utils::generateUUID() + ├── nlohmann::json (формирование) + └── error_producer_.send() // .\src\kafka\producer.cpp + └── producer_->produce(topic: orders.errors) + + + + СВОДНАЯ ТАБЛИЦА +Этап Функция Файл Что делает +1 runProducer() main.cpp Запускает поток Producer +2 processFiles() main.cpp Обрабатывает файлы в цикле +3 JsonParser::parseOrder() json_parser.cpp Парсит JSON файл +4 cache.save() sqlite_cache.cpp Сохраняет в SQLite (pending) +5 producer.send() producer.cpp Отправляет в Kafka +6 runConsumer() main.cpp Запускает поток Consumer +7 reprocessPendingMessages() order_processor.cpp Восстанавливает из кэша +8 consumeLoop() consumer.cpp Читает из Kafka +9 processMessage() order_processor.cpp Обрабатывает сообщение +10 processClient() order_processor.cpp Находит/создает контрагента +11 processProducts() order_processor.cpp Находит товары +12 createOrder() order_processor.cpp Создает заказ в PostgreSQL +13 cache.markSent() sqlite_cache.cpp Помечает как обработанное + + +КЛЮЧЕВЫЕ МОМЕНТЫ + +1. Producer: файл → SQLite (pending) → Kafka +2. Consumer: Kafka → SQLite (pending) → SQL → markSent() +3. Recovery: SQLite (pending, source='producer', старше N сек) → SQL → markSent() +4. Source: producer | consumer (разделение потоков) +5. Ошибки: sendError() → Kafka (orders.errors) + \ No newline at end of file