{"id":14557441,"url":"https://github.com/syncliteio/SyncLite","last_synced_at":"2025-09-04T02:31:50.098Z","repository":{"id":254690095,"uuid":"845846725","full_name":"syncliteio/SyncLite","owner":"syncliteio","description":"SyncLite : Build Anything Sync Anywhere","archived":false,"fork":false,"pushed_at":"2024-09-18T01:03:46.000Z","size":450,"stargazers_count":132,"open_issues_count":6,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-09-18T13:30:14.005Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/syncliteio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-22T03:27:45.000Z","updated_at":"2024-09-18T09:12:09.000Z","dependencies_parsed_at":"2024-10-23T08:53:57.816Z","dependency_job_id":"e05a2ae2-739e-4e55-bf13-458092993c11","html_url":"https://github.com/syncliteio/SyncLite","commit_stats":null,"previous_names":["syncliteio/synclite"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/syncliteio%2FSyncLite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/syncliteio%2FSyncLite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/syncliteio%2FSyncLite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/syncliteio%2FSyncLite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/syncliteio","download_url":"https://codeload.github.com/syncliteio/SyncLite/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":231929873,"owners_count":18447579,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-09-06T20:01:14.898Z","updated_at":"2024-12-31T00:30:35.164Z","avatar_url":"https://github.com/syncliteio.png","language":"Java","funding_links":[],"categories":["Java","Shell","大数据","others"],"sub_categories":[],"readme":"\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.synclite.io\"\u003e\n  \u003cimg src=\"docs/images/SyncLite_logo.png\" alt=\"SyncLite - Build Anything Sync Anywhere\"\u003e\n  \u003c/a\u003e\n  \u003cp align=\"center\"\u003e\n    \u003ca href=\"https://www.synclite.io\"\u003eLearn more\u003c/a\u003e\n    ·\n    \u003ca href=\"https://join.slack.com/t/syncliteworkspace/shared_invite/zt-2pz945vva-uuKapsubC9Mu~uYDRKo6Jw\"\u003eChat on Slack\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/p\u003e\n\n# SyncLite - Build Anything Sync Anywhere\n\n\u003ca href=https://www.synclite.io\u003eSyncLite\u003c/a\u003e is an open-source, low-code, comprehensive relational data consolidation platform enabling developers to rapidly build data intensive applications for edge, desktop and mobile environments. SyncLite enables real-time, transactional data replication and consolidation from various sources including edge/desktop applications using popular embedded databases (SQLite, DuckDB, Apache Derby, H2, HyperSQL), data streaming applications, IoT message brokers, traditional database systems(ETL) and more into a diverse array of databases, data warehouses, and data lakes, enabling AI and ML use-cases at edge and cloud.\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.synclite.io\"\u003e\n  \u003cimg src=\"docs/images/SyncLite_Overview.png\" width=\"80%\" height=\"80%\" alt=\"SyncLite - Build Anything Sync Anywhere\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\nSyncLite enables following scenarios for industry leading databases, data warehouse and data lakes.\n\n## Build Sync-Ready Applications: \nSyncLite provides a novel CDC replication framework for embedded databases, helping developers quickly build data-intensive applications, including Gen AI Search and RAG applications, for edge, desktop, and mobile environments. It integrates seamlessly with popular embedded databases like SQLite, DuckDB, Apache Derby, H2, and HyperSQL (HSQLDB), enabling Change Data Capture (CDC), transactional, real-time data replication, and consolidation into industry-leading databases, data warehouses, and data lakes. \n\n```SyncLite Logger```, an embeddable Java library (JDBC driver), that can be consumed by Java and Python applications for efficient data syncing by capturing all SQL transactions in log files and shipping these log files to configured staging storages.\n\n```SyncLite DB```, a standalone sync-enabled database, accepting SQL requests in JSON format over HTTP, making it compatible with any programming language (Java, Python, C++, C#, Go, Rust, Ruby, Node.js etc.) and ideal for flexible, real-time data integration and consolidation, right from edge/desktop applications into final data destinations.\n```\n\n{Edge/Desktop Apps} + {SyncLite Logger + Embedded Databases} ---\u003e {Staging Storage} ---\u003e {SyncLite Consolidator} ---\u003e {Destination DB/DW/DataLakes}\n```\n\n```\n{Edge/Desktop Apps} ---\u003e {SyncLite DB + Embedded Databases} ---\u003e {Staging Storage} ---\u003e {SyncLite Consolidator} ---\u003e {Destination DB/DW/DataLakes}\n```\n\nLearn more: \n\nhttps://www.synclite.io/synclite/sync-ready-apps\n\nhttps://www.synclite.io/solutions/gen-ai-search-rag\n\n\n## Build Streaming Applications For Last Mile Delivery: \nSyncLite facilitates development of large-scale data streaming applications through SyncLite Logger, which offers both a Kafka Producer API and SQL API. This allows for the ingestion of massive amounts of data and provides the capability to query the ingested data using the SQL API within applications. Together, SyncLite Logger and SyncLite Consolidator enable seamless last-mile data integration from thousands of streaming application instances into a diverse array of final data destinations.\n\n```\n{Data Streaming Apps} + {SyncLite Logger} ---\u003e {Staging Storage} ---\u003e {SyncLite Consolidator} ---\u003e {Destination DB/DW/DataLakes}\n```\n\n```\n{Data Streaming Apps} ---\u003e {SyncLite DB} ---\u003e {Staging Storage} ---\u003e {SyncLite Consolidator} ---\u003e {Destination DB/DW/DataLakes}\n```\n\nLearn more: https://www.synclite.io/synclite/last-mile-streaming\n\n\n## Deploy Database ETL/Replication/Migration Pipelines:\nSet up many-to-many, scalable database replication/migration/incremental ETL pipelines from a diverse range of source databases and raw data files into a diverse range of destinations.\n\n```\n{Source Databases} ---\u003e {SyncLite DBReader} ---\u003e {Staging Storage} ---\u003e {SyncLite Consolidator} ---\u003e {Destination DB/DW/DataLakes}\n```\n\nLearn More: https://www.synclite.io/solutions/smart-database-etl\n\n## Setup Rapid IoT Data Connectors:\nConnect numerous MQTT brokers (IoT gateways) to one or more destination databases.\n\n```\n{IoT Message Brokers} ---\u003e {SyncLite QReader} ---\u003e {Staging Storage} ---\u003e {SyncLite Consolidator} ---\u003e {Destination DB/DW/DataLakes}\n```\n\nLearn More: https://www.synclite.io/solutions/iot-data-connector\n\n# SyncLite Components\n\n```SyncLite Logger``` is a JDBC driver, enables developers to rapidly build \n\t\n-sync-enabled, robust, responsive, high-performance, low-latency, transactional, data intensive applications for edge/mobile/desktop platforms using their favorite embedded databases (SQLite, DuckDB, Apache Derby, H2, HyperSQL)\n  \t\n-large scale data streaming solutions for last mile data integrations into a wide range of industry leading databases, while offering ability to perform real-time analytics using the native embedded databases over streaming data, at the producer end of the pipelines.\n\n```SyncLite DB``` is a sync-enabled, single-node database server that wraps popular embedded databases like SQLite, DuckDB, Apache Derby, H2, and HyperSQL. Unlike the embeddable SyncLite Logger library for Java and Python applications, SyncLite DB acts as a standalone server, allowing your edge or desktop applications—regardless of the programming language—to connect and send SQL requests (wrapped in JSON format) over HTTP. \n\n```SyncLite Client``` is a command line tool to operate SyncLite devices, to execute SQL queries and workloads.\n\n```SyncLite DBReader``` enables data teams and data engineers to configure and orchestrate many-to-many, highly scalable, incremental/log-based database ETL/replication/migration jobs across a diverse array of databases, data warehouses and data lakes.\n\n```SyncLite QReader``` enables developers to integrate IoT data published to message queue brokers, into a diverse array of databases, data warehouses and data lakes, enabling real-time analytics and AI use cases at all three levels: edge, fog and cloud.\n\n```SyncLite Consolidator``` is the centralized application to all the reader/producer tools mentioned above, which receives and consolidates the incoming data and log files in real-time into one or more databases, data warehouses and data lakes of user’s choice. SyncLite Consolidator also offers additional features: table/column/value filtering and mapping, data type mapping, database trigger installation, fine-tunable writes, support for multiple destinations and more.\n\n```SyncLite JobMonitor``` enables managing, scheduling and monitoring all SyncLite jobs created on a given host.\n\n```SyncLite Validator``` is an E2E integration testing tool for SyncLite.\n\n# Build SyncLite\n\n1. If you are using a pre-built release then ignore this section. \n2. Install/Download Apache Maven(3.8.6 or above): https://maven.apache.org/download.cgi\n3. If you opt to not use the deploy scripts generated in the release which download the prerequisite software : Apache Tomcat and OpenJDK, then manually install them\n\t\n \ta. OpenJDK 11 : https://jdk.java.net/java-se-ri/11\n\t\n \tb. Apache Tomcat 9.0.95 : https://tomcat.apache.org/download-90.cgi\n\n5. Run following: \n\t```\n\tgit clone --recurse-submodules git@github.com:syncliteio/SyncLite.git SyncLite\n\t\n\tcd SyncLite\n\t\n\tmvn -Drevision=oss clean install\n\t\n\t```\n6. Release is created under SyncLite/target\n\n## Release Structure:\n\nThe build process creates following release structure under SyncLite\\target: \n```\nsynclite-platform-\u003cversion\u003e\n|\n|\n--------lib\n|       |\n|       |\n|        --------logger\n|       |        |\n|       |        |\n|       |        --------java\n|       |        |        |\n|       |        |        |    \n|       |        |        --------synclite-logger-\u003cversion\u003e.jar   ==\u003e SyncLite Logger JDBC driver, to be added as a depependency in your edge apps\n|       |        |\n|       |        |\n|       |        --------synclite_logger.conf  ==\u003e A sample configuration file for SyncLite logger.\n|       |\n|       |\n|       --------consolidator\n|       |        |\n|       |        |\n|       |        --------synclite-consolidator-\u003cversion\u003e.war   ==\u003e SyncLite Consolidator application, to be deployed on an application server such as Tomcat on a centralized host\n|\n|\n|\n|\n--------sample-apps\n|        |\n|        |\n|        --------jsp-servlet\n|        |        |\n|        |        |\n|        |        --------web\n|        |        |\n|        |        |\n|        |        --------src          ==\u003e Source code of a sample Jsp Servlet app that demonstrates usage of synclite-logger\n|        |        |\n|        |        |\n|        |        --------target        \n|        |        |\n|        |        |\n|        |        --------synclite-sample-app-\u003cversion\u003e.war\n|        |        \n|        |\n|        --------java\n|        |        |\n|        |        |\n|        |        --------*.java    =\u003e Java source files demonstrating SyncLite logger usage.\n|        |        |\n|        |        |\n|        |        --------README\n|        |\n|        |\n|        |\n|        |\n|        --------python\n|                |\n|                |\n|                --------*.py    =\u003e Python source files demonstrating SyncLite logger usage.\n|                |\n|                |\n|                --------README\n|\n|\n|\n|\n--------bin\n|        |\n|        |\n|        --------deploy.bat/deploy.sh    ==\u003e Deployment script for deploying SyncLite consolidator and sample application from the lib directory\n|        |                    \n|        |                        \n|        --------start.bat/start.sh    ==\u003e Launch script to start tomcat and the deployed SyncLite applications.\n|        |             \n|        |           \n|        --------docker-deploy.sh/docker-start.sh   ==\u003e Deployment and launch scripts for running SyncLite Consolidator inside a docker container. \n|        |             \n|        |           \n|        --------stage\n|        |        |         \n|        |        |         \n|        |        --------sftp    ==\u003e Contains docker-deploy.sh,docker-start.sh, docker-stop.sh scripts to launch SFTP server as SyncLite stage\n|        |        |         \n|        |        |                                   \n|        |        --------minio   ==\u003e Contains docker-deploy.sh, docker-start.sh, docker-stop.sh scripts to launch MinIO server as SyncLite stage\n|        |       \n|        |       \n|        |       \n|        --------dst\n|                |\n|                |                \n|                --------postgresql  ==\u003e Contains docker-deploy.sh,docker-start.sh scripts to launch PostgrSQL server as SyncLite destination DB\n|                |         \n|                |                                  \n|                --------mysql   ==\u003e Contains docker-deploy.sh, docker-start.shscripts to launch MySQL server as SyncLite destination DB\n| \n|\n|\n--------tools\n        |\n        |\n        --------synclite-client   ==\u003e Client tool to execute SQL operations on SyncLite databases/devices.\n\t|\n\t|\n        --------synclite-db    ==\u003e A standalone database server offering sync-enabled embedded databases for edge/desktop applications. \n\t|\n\t|\n        --------synclite-dbreader    ==\u003e Smart database ETL/Replication/Migration tool\n\t|\n\t|\n\t--------synclite-qreader     ==\u003e Rapid IoT data connector tool\n\t|\n\t|\n\t--------synclite-job-monitor   ==\u003e Job Monitor tool to manage, monitor and schedule SyncLite jobs.\n\t|\n\t|\n        --------synclite-validator    ==\u003e An E2E integration testing tool for SyncLite\n \n\n```\n\n### Quick Start - Native/Docker based\n\nNOTE: Below instructions enable a quick start and trial of SyncLite platform. \nFor production usage, it is recommended to go through installation process to install OpenJDK11 and Tomcat9 (as a service) \non your Windows/Ubuntu host.\n\n1. Enter bin directory.\n\n2. (One time) Run ```deploy.bat```(WINDOWS) / ```deploy.sh``` (UBUNTU) to deploy the SyncLite consolidator and a SyncLite sample application.\n   \n   OR Run ```docker-deploy.sh``` (UBUNTU) to deploy a docker container for SyncLite platform.\n\n   OR Manually deploy below war files on your tomcat server:\n   - ```SyncLite\\target\\synclite-platform-dev\\lib\\consolidator\\synclite-consolidator-oss.war```,\n   - ```SyncLite\\target\\synclite-platform-dev\\sample-apps\\jsp-servlet\\web\\target\\synclite-sample-app-oss.war```\n   - ```SyncLite\\target\\synclite-platform-dev\\tools\\synclite-dbreader\\synclite-dbreader-oss.war```\n   - ```SyncLite\\target\\synclite-platform-dev\\tools\\synclite-dbreader\\synclite-qreader-oss.war```\n   - ```SyncLite\\target\\synclite-platform-dev\\tools\\synclite-dbreader\\synclite-jobmonitor-oss.war```\n     \n   \n3. Run ```start.bat```(WINDOWS) / ```start.sh```(UBUNTU) to start tomcat and the deployed SyncLite applications. (Please note the username/password for tomcat manager web console is synclite/synclite)\n\n   OR Run ```docker-start.sh``` to run the docker container (Please check options passed to docker run command e.g. the home directory of the current user is mapped to ```/root``` inside docker to persist all the\n   SyncLite storage in the native host).\n\n   OR manually start applications from your tomcat manager console.\n\n4. Open tomcat manager console http://localhost:8080/manager (Use synclite/synclite as the default user/password when prompted as set by the deploy script). The manager web console will show all the SyncLite applications deployed. \n\n5. Open http://localhost:8080/synclite-consolidator to launch SyncLite Consolidator application\n\n6. Open http://localhost:8080/synclite-sample-app to launch SyncLite sample web application \n\n7. Configure and start SyncLite consolidator job in the SyncLite Consolidator application. You can follow through the \"Configure Job\" wizard reviewing all the default configuration values. Create databases/devices of any type from the deployed sample web application and execute SQL workloads on several devices at once specifying the device index range. Observe data consolidator in the SyncLite Cosolidator dashboard. You can check device specific data consolidation progress on individual device pages (from \"List Devices\" page), query destination database on the \"Analyze Data\" page. \n\n8. This release also comes with a CLI client for SyncLite under tools/synclite-client. You can run synclite-client.bat(WINDOWS)/synclite-client.sh (UBUNTU) to start the client tool and execute SQL operations which are not only executed/persisted on the native database but also consolidated by the SyncLite consolidator into destination DB.\n   - Usage 1 : ```synclite-client.bat/synclite-client.sh ==\u003e Will start with DB = \u003cUSER.HOME\u003e/synclite/job1/db/test.db, DEVICE_TYPE = SQLITE, CONFIG = \u003cUSER.HOME\u003e/synclite/db/synclite_logger.conf```\n   - Usage 2 : ```synclite-client.bat/synclite-client.sh \u003cpath/to/db/file\u003e --device-type \u003cSQLITE|DUCKDB|DERBY|H2|HYPERSQL|STREAMING|SQLITE_APPENDER|DUCKDB_APPENDER|DERBY_APPENDER|H2_APPENDER|HYPERSQL_APPENDER\u003e --synclite-logger-config \u003cpath/to/synclite/logger/config\u003e --server \u003cSyncLite DB Address\u003e```\n   - Note: If --sever switch is specified then the client connects to SyncLite DB to  execute SQL statements, else it usages embedded ```SyncLite Logger``` library to directly operate on the devices.\n     \n9. This release also comes with SyncLite DB server under tools/synclite-db. You can run synclite-db.bat(WINDOWS)/synclite-db.sh(UBUNTU) to start SyncLite DB server and connect to it using synclite-client to execute SQL operations which are not only executed/persisted on the specified embedded database but also consolidated by the SyncLite Consolidator onto the destination databases.\n   - Usage 1 : ```synclite-db.bat/synclite-db.sh``` ==\u003e Will start SyncLite DB with default configurations\n   - Usage 2 : ```synclite-db.bat/synclite-db.sh --config \u003cpath/to/synclite-db/config\u003e```\n          \n10. Use ```stop.bat``` (Windows) / ```stop.sh```(LINUX) to stop SyncLite consolidator job (if running) and tomcat.\n   OR RUN docker-stop.sh to stop the docker container.\n\n11. Refer ```sample_apps/java``` and ```samples_apps/python``` and use any of them as a starting point to build your own application.\n\n12. You can install/use a database of your choice and  perform data consolidation to it (instead of the default SQLite destination): PostgreSQL, MySQL, MongoDB, SQLite, DuckDB.\n\n13. This release also packages docker scripts to setup PostgreSQL and MySQL to serve as SyncLite destinations.\n    - ```bin/dst/postgresql``` contains ```docker-deploy.sh```, ```docker-start.sh``` and ```docker-stop.sh```\n    - ```bin/dst/mysql``` contains ```docker-deploy.sh```, ```docker-start.sh``` and ```docker.stop.sh```\n\n14. You can deploy your applications on remote hosts/devices and share the local-stage-directory of your respective SyncLite applications with SyncLite Consolidator host via one of the following file staging storages: \n    - SFTP\n    - Amazon S3\n    - MinIO Object Storage Server\n    - Apache Kafka\n    - Microsoft OneDrive\n    - Google Drive\n    - NFS Sharing\n    - Local Network Sharing\n      \nPlease check documentation for setting up these staging storages for SyncLite : https://www.synclite.io/resources/documentation\n \n15. This release also packages docker scripts to setup SFTP and MinIO servers to serve as SyncLite stage.\n    - ```bin/stage/sftp```  contains ```docker-deploy.sh```, ```docker-start.sh``` and ```docker-stop.sh```\n    - ```bin/stage/minio``` contains ```docker-deploy.sh```, ```docker-start.sh``` and ```docker-stop.sh```\n      NOTE: These scripts contain default configurations. You must change usernames, passwords and setup any additional security mechanisms on top of these basic setups. \n\n16. The SyncLite docker scripts ```bin/docker-deploy.sh```, ```bin/docker-start.sh```, ```bin/docker-stop.sh``` contain two variables at the top to choose a stage and destination:\n    - STAGE : Set it to SFTP or MINIO.\n    - DST : Set it to POSTGRESQL or MYSQL.\n\n      Once you set the STAGE and DST to appropriate values e.g. SFTP and POSTGRESQL, the ```docker-deploy.sh``` and ```docker-start.sh``` scripts will bring up docker containers for SyncLite consolidator, SFTP\n      server and PostgreSQL server and you will be all set to configure and start a SyncLite consoldiator job be able to consolidate data into PostgreSQL server received from remote SyncLite applications\n      configured to connect to the SFTP stage. \n\n17. After a successful trial, if you need to perform another trial, stop the docker containers, and delete contents under ```/home/synclite``` to start a fresh trial of a different scenario etc.\n\n18. Open http://localhost:8080/synclite-dbreader (and open http://localhost:8080/synclite-consolidator) to setup database ETL/Replication/Migration pipelines.\n\n19. Open http://localhost:8080/synclite-qreader (and open http://localhost:8080/synclite-consolidator) to setup rapid IoT pipelines.\n\n20. Open http://localhost:8080/synclite-job-monitor to manage, monitor and schedule various SyncLite jobs.\n    \nRefer documentation at https://www.synclite.io/resources/documentation for more details.\n\nNOTE : For production usage, it is recommended to install OpenJDK11 and Tomcat as a service (or any other application server of your choice) and deploy SyncLite consolidator web archive release, Please refer our documentation at www.synclite.io for detailed installation steps for Windows and Ubuntu.\n\n\n# Using SyncLite Logger\n\nAdd ```synclite-logger-\u003cversion\u003e.jar``` file created as part of the above build as a dependency in your application.\n\n## Configuration File\n\nRefer ```src/main/resources/synclite_logger.conf``` file for all available configuration options for SyncLite Logger. Refer \"SyncLite Logger Configuration\" section in the documentation at https://www.synclite.io/resources/documentation for more details about all configuration options. \n\n## Application Code Samples (SQL API)\n\nRefer below code samples to build applications using SyncLite Logger. \n\n### Transactional Devices : \n\nTransactional devices (SQLite, DuckDB, Apache Derby, H2, HyperSQL) support all database operations and perform transactional logging of all the DDL and DML operations performed by the application. These enable  developers to build use cases such as building data-intensive sync-ready applications for edge, edge + cloud GenAI search and RAG applications, native SQL (hot) hot data stores, SQL application caches, edge enablement of cloud databases and more.\n\n#### Java\n```\npackage testApp;\n\nimport java.nio.file.Path;\nimport java.sql.Connection;\nimport java.sql.DriverManager;\nimport java.sql.PreparedStatement;\nimport java.sql.SQLException;\nimport java.sql.Statement;\nimport io.synclite.logger.*;\n\n\npublic class TestTransactionalDevice {\n\t\n\tpublic static Path syncLiteDBPath;\n\tpublic static void appStartup() throws SQLException, ClassNotFoundException {\n\t\tsyncLiteDBPath = Path.of(System.getProperty(\"user.home\"), \"synclite\", \"db\");\n\t\tClass.forName(\"io.synclite.logger.SQLite\");\n\t\t//\n\t\t//////////////////////////////////////////////////////\n\t\t//For other types of transactional devices : \n\t\t//DuckDB : Class.forName(\"io.synclite.logger.DuckDB\");\n\t\t//Apache Derby : Class.forName(\"io.synclite.logger.Derby\");\n\t\t//H2 : Class.forName(\"io.synclite.logger.H2\");\n\t\t//HyperSQL : Class.forName(\"io.synclite.logger.HyperSQL\");\n\t\t//////////////////////////////////////////////////////\n\t\t//\n\n\t\tPath dbPath = syncLiteDBPath.resolve(\"test_tran.db\");\n\t\tSQLite.initialize(dbPath, syncLiteDBPath.resolve(\"synclite_logger.conf\"));\n\t\t//\n\t\t//////////////////////////////////////////////////////\n\t\t//For other types of transactional devices : \n\t\t//DuckDB : DuckDB.initialize(dbPath, syncLiteDBPath.resolve(\"synclite_logger.conf\"));\n\t\t//Apache Derby : Derby.initialize(dbPath, syncLiteDBPath.resolve(\"synclite_logger.conf\"));\n\t\t//H2 : H2.initialize(dbPath, syncLiteDBPath.resolve(\"synclite_logger.conf\"));\n\t\t//HyperSQL : HyperSQL.initialize(dbPath, syncLiteDBPath.resolve(\"synclite_logger.conf\"));\n\t\t//////////////////////////////////////////////////////\n\t\t//\n\t}\t\n\t\n\tpublic void myAppBusinessLogic() throws SQLException {\n\t\t//\n\t\t//Some application business logic\n\t\t//\n\t\t//Perform some database operations\t\t\n\t\ttry (Connection conn = DriverManager.getConnection(\"jdbc:synclite_sqlite:\" + syncLiteDBPath.resolve(\"test_sqlite.db\"))) {\n\t\t\t//\n\t\t        //////////////////////////////////////////////////////////////////\n\t\t\t//For other types of transactional devices use following connection strings :\n\t\t\t//For DuckDB : jdbc:synclite_duckdb:\u003cdb_path\u003e\n\t\t\t//For Apache Derby : jdbc:synclite_derby:\u003cdb_path\u003e\n\t\t\t//For H2 : jdbc:synclite_h2:\u003cdb_path\u003e\n\t\t\t//For HyperSQL : jdbc:synclite_hsqldb:\u003cdb_path\u003e\n\t\t\t///////////////////////////////////////////////////////////////////\n\t\t\t//\n\t\t\ttry (Statement stmt = conn.createStatement()) { \n\t\t\t\t//Example of executing a DDL : CREATE TABLE. \n\t\t\t\t//You can execute other DDL operations : DROP TABLE, ALTER TABLE, RENAME TABLE.\n\t\t\t\tstmt.execute(\"CREATE TABLE IF NOT EXISTS feedback(rating INT, comment TEXT)\");\n\t\t\t\t\n\t\t\t\t//Example of performing INSERT\n\t\t\t\tstmt.execute(\"INSERT INTO feedback VALUES(3, 'Good product')\");\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t//Example of setting Auto commit OFF to implement transactional semantics\n\t\t\tconn.setAutoCommit(false);\n\t\t\ttry (Statement stmt = conn.createStatement()) { \n\t\t\t\t//Example of performing basic DML operations INSERT/UPDATE/DELETE\n\t\t\t\tstmt.execute(\"UPDATE feedback SET comment = 'Better product' WHERE rating = 3\");\n\t\t\t\tstmt.execute(\"INSERT INTO feedback VALUES (1, 'Poor product')\");\n\t\t\t\tstmt.execute(\"DELETE FROM feedback WHERE rating = 1\");\n\t\t\t}\n\t\t\tconn.commit();\n\t\t\tconn.setAutoCommit(true);\n\t\t\t\n\t\t\t//Example of Prepared Statement functionality for bulk insert.\t\t\t\n\t\t\ttry(PreparedStatement pstmt = conn.prepareStatement(\"INSERT INTO feedback VALUES(?, ?)\")) {\n\t\t\t\tpstmt.setInt(1, 4);\n\t\t\t\tpstmt.setString(2, \"Excellent Product\");\n\t\t\t\tpstmt.addBatch();\n\t\t\t\t\n\t\t\t\tpstmt.setInt(1, 5);\n\t\t\t\tpstmt.setString(2, \"Outstanding Product\");\n\t\t\t\tpstmt.addBatch();\n\t\t\t\t\n\t\t\t\tpstmt.executeBatch();\t\t\t\n\t\t\t}\n\t\t}\n\t\t//Close SyncLite database/device cleanly.\n\t\tSQLite.closeDevice(Path.of(\"test_sqlite.db\"));\n\t\t//\n\t\t///////////////////////////////////////////////////////\n\t\t//For other types of transactional devices :\n\t\t//DuckDB : DuckDB.closeDevice\n\t\t//Apache Derby : Derby.closeDevice\n\t\t//H2 : H2.closeDevice\n\t\t//HyperSQL : HyperSQL.closeDevice\n\t\t//////////////////////////////////////////////////////\n\t\t//\n\t\t//You can also close all open databases in a single SQL : CLOSE ALL DATABASES\n\t}\t\n\t\n\tpublic static void main(String[] args) throws ClassNotFoundException, SQLException {\n\t\tappStartup();\n\t\tTestTransactionalDevice testApp = new TestTransactionalDevice();\n\t\ttestApp.myAppBusinessLogic();\n\t}\n}\n\n```\n#### Python   \n\n```\nimport jaydebeapi\n\nprops = {\n  \"config\": \"synclite_logger.conf\",\n  \"device-name\" : \"tran1\"\n}\nconn = jaydebeapi.connect(\"io.synclite.logger.SQLite\",\n                           \"jdbc:synclite_duckdb:c:\\\\synclite\\\\python\\\\data\\\\test_sqlite.db\",\n                           props,\n                           \"synclite-logger-\u003cversion\u003e.jar\",)\n#//\n#////////////////////////////////////////////////////////////////\n#For other types of transactional devices use following are the class names and connection strings :\n#For DuckDB - Class : io.synclite.logger.DuckDB, Connection String : jdbc:synclite_duckdb:\u003cdb_path\u003e\n#For Apache Derby - Class : io.synclite.logger.Derby, Connection String : jdbc:synclite_derby:\u003cdb_path\u003e\n#For H2 - Class : io.synclite.logger.H2, Connection String : jdbc:synclite_h2:\u003cdb_path\u003e\n#For HyperSQL - Class : io.synclite.logger.HyperSQL, Connection String : jdbc:synclite_hsqldb:\u003cdb_path\u003e\n#/////////////////////////////////////////////////////////////////\n#//\n\ncurs = conn.cursor()\n\n#Example of executing a DDL : CEATE TABLE.\n#You can execute other DDL operations : DROP TABLE, ALTER TABLE, RENAME TABLE.\ncurs.execute('CREATE TABLE IF NOT EXISTS feedback(rating INT, comment TEXT)')\n\n#Example of performing basic DML operations INSERT/UPDATE/DELETE\ncurs.execute(\"insert into feedback values (3, 'Good product')\")\n\n#Example of setting Auto commit OFF to implement transactional semantics\nconn.jconn.setAutoCommit(False)\ncurs.execute(\"update feedback set comment = 'Better product' where rating = 3\")\ncurs.execute(\"insert into feedback values (1, 'Poor product')\")\ncurs.execute(\"delete from feedback where rating = 1\")\nconn.commit()\nconn.jconn.setAutoCommit(True)\n\n\n#Example of Prepared Statement functionality for bulk insert.\nargs = [[4, 'Excellent product'],[5, 'Outstanding product']]\ncurs.executemany(\"insert into feedback values (?, ?)\", args)\n\n#Close SyncLite database/device cleanly.\ncurs.execute(\"close database c:\\\\synclite\\\\python\\\\data\\\\test_sqlite.db\");\n\n#You can also close all open databases in a single SQL : CLOSE ALL DATABASES\n```\n\n### Appender Devices :\n\nAppender devices (SQLiteAppender, DuckDBAppender, DerbyAppender, H2Appender, HyperSQLAppender) support all DDL operations and Prepared Statement based INSERT operations, are highly optimized for high speed concurrent batched data ingestion, performing logging of ingested data. Unlike transactional devices, appender devices only allow INSERT DML operations (UPDATE and DELETE are not allowed). Appender devices enable developers to build high volume streaming applications enabled with last mile data integration from thousands of edge points into centralized database destinations as well as in-app analytics by enabling fast read access to ingested data from the underlying local embedded databases storing the ingested/streamed data.\n\n#### Java\n\n```\npackage testApp;\n\nimport java.nio.file.Path;\nimport java.sql.Connection;\nimport java.sql.DriverManager;\nimport java.sql.PreparedStatement;\nimport java.sql.SQLException;\nimport java.sql.Statement;\nimport io.synclite.logger.*;\n\npublic class TestAppenderDevice {\n\tpublic static Path syncLiteDBPath;\n\n\tpublic static void appStartup() throws SQLException, ClassNotFoundException {\n\t\tsyncLiteDBPath = Path.of(System.getProperty(\"user.home\"), \"synclite\", \"db\");\n\t\tClass.forName(\"io.synclite.logger.SQLiteAppender\");\n\t\t//\n\t\t//////////////////////////////////////////////////////\n\t\t//For other types of appender devices : \n\t\t//DuckDB : Class.forName(\"io.synclite.logger.DuckDBAppender\");\n\t\t//Apache Derby : Class.forName(\"io.synclite.logger.DerbyAppender\");\n\t\t//H2 : Class.forName(\"io.synclite.logger.H2Appender\");\n\t\t//HyperSQL : Class.forName(\"io.synclite.logger.HyperSQLAppender\");\n\t\t//////////////////////////////////////////////////////\n\t\t//\n\t\tPath dbPath = syncLiteDBPath.resolve(\"test_appender.db\");\n\t\tSQLiteAppender.initialize(dbPath, syncLiteDBPath.resolve(\"synclite_logger.conf\"));\n\t}\n\n\tpublic void myAppBusinessLogic() throws SQLException {\n\t\t//\n\t\t// Some application business logic\n\t\t//\n\t\t// Perform some database operations\n\t\ttry (Connection conn = DriverManager.getConnection(\"jdbc:synclite_sqlite_appender:\" + syncLiteDBPath.resolve(\"test_appender.db\"))) {\n\t\t\t//\n\t\t        //////////////////////////////////////////////////////////////////\n\t\t\t//For other types of appender devices use following connection strings :\n\t\t\t//For DuckDBAppender : jdbc:synclite_duckdb_appender:\u003cdb_path\u003e\n\t\t\t//For DerbyAppender : jdbc:synclite_derby_appender:\u003cdb_path\u003e\n\t\t\t//For H2Appender : jdbc:synclite_h2_appender:\u003cdb_path\u003e\n\t\t\t//For HyperSQLAppender : jdbc:synclite_hsqldb_appender:\u003cdb_path\u003e\n\t\t\t///////////////////////////////////////////////////////////////////\n\t\t\t//\n\t\t\ttry (Statement stmt = conn.createStatement()) {\n\t\t\t\t// Example of executing a DDL : CREATE TABLE.\n\t\t\t\t// You can execute other DDL operations : DROP TABLE, ALTER TABLE, RENAME TABLE.\n\t\t\t\tstmt.execute(\"CREATE TABLE IF NOT EXISTS feedback(rating INT, comment TEXT)\");\n\t\t\t}\n\n\t\t\t//\n\t\t\t// Example of Prepared Statement functionality for bulk insert.\n\t\t\t// Note that Appender Devices allows all DDL operations, INSERT INTO DML operations (UPDATES and DELETES are not allowed) and SELECT queries.\n\t\t\t//\n\t\t\ttry (PreparedStatement pstmt = conn.prepareStatement(\"INSERT INTO feedback VALUES(?, ?)\")) {\n\t\t\t\tpstmt.setInt(1, 4);\n\t\t\t\tpstmt.setString(2, \"Excellent Product\");\n\t\t\t\tpstmt.addBatch();\n\n\t\t\t\tpstmt.setInt(1, 5);\n\t\t\t\tpstmt.setString(2, \"Outstanding Product\");\n\t\t\t\tpstmt.addBatch();\n\n\t\t\t\tpstmt.executeBatch();\n\t\t\t}\n\t\t}\n\t\t// Close SyncLite database/device cleanly.\n\t\tSQLiteAppender.closeDevice(Path.of(\"test_appender.db\"));\n\t\t//\n\t\t///////////////////////////////////////////////////////\n\t\t//For other types of appender devices :\n\t\t//DuckDBAppender : DuckDBAppender.closeDevice\n\t\t//DerbyAppender : DerbyAppender.closeDevice\n\t\t//H2Appender : H2Appender.closeDevice\n\t\t//HyperSQLAppender : HyperSQLAppender.closeDevice\n\t\t//////////////////////////////////////////////////////\n\t\t//\n\t\t// You can also close all open databases/devices in a single SQL : CLOSE ALL\n\t\t// DATABASES\n\t}\n\n\tpublic static void main(String[] args) throws ClassNotFoundException, SQLException {\n\t\tappStartup();\n\t\tTestAppenderDevice testApp = new TestAppenderDevice();\n\t\ttestApp.myAppBusinessLogic();\n\t}\n\n}\n```\n\n#### Python\n\n```\nimport jaydebeapi\nprops = {\n  \"config\": \"synclite_logger.conf\",\n  \"device-name\" : \"appender1\"\n}\nconn = jaydebeapi.connect(\"io.synclite.logger.SQLiteAppender\",\n                           \"jdbc:synclite_sqlite_appender:c:\\\\synclite\\\\python\\\\data\\\\test_appender.db\",\n                           props,\n                           \"synclite-logger-\u003cversion\u003e.jar\",)\n#//\n#////////////////////////////////////////////////////////////////\n#For other types of appender devices use following are the class names and connection strings :\n#For DuckDBAppender - Class : io.synclite.logger.DuckDBAppender, Connection String : jdbc:synclite_duckdb_appender:\u003cdb_path\u003e\n#For DerbyAppender - Class : io.synclite.logger.DerbyAppender, Connection String : jdbc:synclite_derby_appender:\u003cdb_path\u003e\n#For H2Appender - Class : io.synclite.logger.H2Appender, Connection String : jdbc:synclite_h2_appender:\u003cdb_path\u003e\n#For HyperSQLAppender - Class : io.synclite.logger.HyperSQLAppender, Connection String : jdbc:synclite_hsqldb_appender:\u003cdb_path\u003e\n#/////////////////////////////////////////////////////////////////\n#//\n\ncurs = conn.cursor()\n\n#Example of executing a DDL : CREATE TABLE.\n#You can execute other DDL operations : DROP TABLE, ALTER TABLE, RENAME TABLE.\ncurs.execute('CREATE TABLE IF NOT EXISTS feedback(rating INT, comment TEXT)')\n\n#Example of Prepared Statement functionality for bulk insert.\nargs = [[4, 'Excellent product'],[5, 'Outstanding product']]\ncurs.executemany(\"insert into feedback values (?, ?)\", args)\n\n#Close SyncLite database/device cleanly.\ncurs.execute(\"close database c:\\\\synclite\\\\python\\\\data\\\\test_appender.db\");\n\n#You can also close all open databases in a single SQL : CLOSE ALL DATABASES\n```\n\n### Streaming Device : \nStreaming device allows all DDL operations (as supported by SQLite) and Prepared Statement based INSERT operations (UPDATE and DELETE are not allowed) to allow high speed concurrent batched data ingestion, performing logging and streaming of the ingested data. Streaming device enable developers to build high volume data streaming applications enabled with last mile data integration from thousands of edge applications into one or more centralized databases/data warehouses/data lakes.\n\n#### Java\n\n```\npackage testApp;\n\nimport java.nio.file.Path;\nimport java.sql.Connection;\nimport java.sql.DriverManager;\nimport java.sql.PreparedStatement;\nimport java.sql.SQLException;\nimport java.sql.Statement;\nimport io.synclite.logger.*;\n\npublic class TestStreamingDevice {\n\tpublic static Path syncLiteDBPath;\n\n\tpublic static void appStartup() throws SQLException, ClassNotFoundException {\n\t\tsyncLiteDBPath = Path.of(System.getProperty(\"user.home\"), \"synclite\", \"db\");\n\t\tClass.forName(\"io.synclite.logger.Streaming\");\n\t\tPath dbPath = syncLiteDBPath.resolve(\"t_str.db\");\n\t\tStreaming.initialize(dbPath, syncLiteDBPath.resolve(\"synclite_logger.conf\"));\n\t}\n\n\tpublic void myAppBusinessLogic() throws SQLException {\n\t\t//\n\t\t// Some application business logic\n\t\t//\n\t\t// Perform some database operations\n\t\ttry (Connection conn = DriverManager\n\t\t\t\t.getConnection(\"jdbc:synclite_streaming:\" + syncLiteDBPath.resolve(\"t_str.db\"))) {\n\t\t\ttry (Statement stmt = conn.createStatement()) {\n\t\t\t\t// Example of executing a DDL : CREATE TABLE.\n\t\t\t\t// You can execute other DDL operations : DROP TABLE, ALTER TABLE, RENAME TABLE.\n\t\t\t\tstmt.execute(\"CREATE TABLE IF NOT EXISTS feedback(rating INT, comment TEXT)\");\n\t\t\t}\n\n\t\t\t// Example of Prepared Statement functionality for bulk insert.\n\t\t\ttry (PreparedStatement pstmt = conn.prepareStatement(\"INSERT INTO feedback VALUES(?, ?)\")) {\n\t\t\t\tpstmt.setInt(1, 4);\n\t\t\t\tpstmt.setString(2, \"Excellent Product\");\n\t\t\t\tpstmt.addBatch();\n\n\t\t\t\tpstmt.setInt(1, 5);\n\t\t\t\tpstmt.setString(2, \"Outstanding Product\");\n\t\t\t\tpstmt.addBatch();\n\n\t\t\t\tpstmt.executeBatch();\n\t\t\t}\n\t\t}\n\t\t// Close SyncLite database/device cleanly.\n\t\tStreaming.closeDevice(Path.of(\"t_str.db\"));\n\t\t// You can also close all open databases/devices in a single SQL : CLOSE ALL\n\t\t// DATABASES\n\t}\n\n\tpublic static void main(String[] args) throws ClassNotFoundException, SQLException {\n\t\tappStartup();\n\t\tTestStreamingDevice testApp = new TestStreamingDevice();\n\t\ttestApp.myAppBusinessLogic();\n\t}\n}\n```\n#### Python\n\n```\nimport jaydebeapi\nprops = {\n  \"config\": \"synclite_logger.conf\",\n  \"device-name\" : \"streaming1\"\n}\nconn = jaydebeapi.connect(\"io.synclite.logger.Streaming\",\n                           \"jdbc:synclite_streaming:c:\\\\synclite\\\\python\\\\data\\\\t_str.db\",\n                           props,\n                           \"synclite-logger-\u003cversion\u003e.jar\",)\n\ncurs = conn.cursor()\n\n#Example of executing a DDL : CEATE TABLE.\n#You can execute other DDL operations : DROP TABLE, ALTER TABLE, RENAME TABLE.\ncurs.execute('CREATE TABLE IF NOT EXISTS feedback(rating INT, comment TEXT)')\n\n#Example of Prepared Statement functionality for bulk insert.\nargs = [[4, 'Excellent product'],[5, 'Outstanding product']]\ncurs.executemany(\"insert into feedback values (?, ?)\", args)\n\n#Close SyncLite database/device cleanly.\ncurs.execute(\"close database c:\\\\synclite\\\\python\\\\data\\\\t_str.db\");\n\n#You can also close all open databases in a single SQL : CLOSE ALL DATABASES\n```\n\n## Application Code Samples (Kafka API)\n\n```\npackage testApp;\n\nimport io.synclite.logger.*;\n\npublic class TestKafkaProducer {\n\n\tpublic static void main(String[] args) throws Exception {\n\n\t\tProperties props = new Properties();\n\t    \n\t\t//\n\t\t//Set properties to use a staging storage of your choice e.g. S3, MinIO, SFTP etc. \n\t\t//where SyncLite logger will ship log files continuously for consumption by SyncLite consolidator\n\t\t//\n\t\t\n        \tProducer\u003cString, String\u003e producer = new io.synclite.logger.KafkaProducer(props);\n\n\t\tProducerRecord\u003cString, String\u003e record = new ProducerRecord\u003c\u003e(\"test\", \"key\", \"value\");\n        \n\t\t//\n\t\t//You can use same or different KafkaProducer objects to ingest data concurrently over multiple theads.\n\t\t//\n        \tproducer.send(record);\n\t\t\n\t\tproduer.close();\n\n\t}\n```\n\n# Launching and using SyncLite DB\n\n```SyncLite DB``` is a sync-enabled, single-node database server that wraps popular embedded databases like SQLite, DuckDB, Apache Derby, H2, and HyperSQL. Unlike the embeddable ```SyncLite Logger``` library for Java and Python applications, ```SyncLite DB``` acts as a standalone server, allowing your edge or desktop applications—regardless of the programming language—to connect and send/post SQL requests (wrapped in JSON format) via a REST API. This makes it an ideal solution for seamless, real-time data synchronization in diverse environments.\n\n1. Go to the directory ```synclite-platform-\u003cversion\u003e\\tools\\synclite-db```\n2. Check the configurations in synclite-db.conf and adjust them as per your needs.\n3. Run ```synclite-db.bat --config synclite-db.conf``` ( OR ```synclite-db.sh --config synclite-db.conf``` on linux). This starts the SyncLite DB server listening at the specified address.\n4. An application in your favoirite programming language can establish a connection with the SyncLite DB server at the specified address and send requests in JSON format as below\n\n\t- Connect and initialize a device\n\n   \tRequest\n\t```\n \t{\n \t\t\"db-type\" : \"SQLITE\"\n \t\t\"db-path\" : \"C:\\synclite\\users\\bob\\synclite\\job1\\test.db\"\n \t\t\"synclite-logger-config\" : \"C:\\synclite\\users\\bob\\synclite\\job1\\synclite_logger.conf\"\n \t\t\"sql\" : \"initialize\"\n \t}\n  \t```\n\n \tResponse from Server \n \t```\n  \t{\n  \t\t\"result\"  : true\t\n \t\t\"message\" : \"Database initialized successfully\"\n \t}\n  \t```\n  \n\t- Send a sql command to create a table\n\n   \tRequest\n\t```\n \t{\n \t\t\"db-path\" : \"C:\\synclite\\users\\bob\\synclite\\job1\\test.db\"\n \t\t\"sql\" : \"CREATE TABLE IF NOT EXISTS(a INT, b INT)\"\n \t}\n \t```\n\n \tResponse from Server \n \t```\n  \t{\n  \t\t\"result\" : \"true\"\n \t\t\"message\" : \"Update executed successfully, rows affected: 0\"\n   \t}\n  \t```\n  \n\t- Send a request to perform a batched insert in the created table\n\n   \tRequest\n\t```\n \t{\n \t\t\"db-path\" : \"C:\\synclite\\users\\bob\\synclite\\job1\\test.db\"\n \t\t\"sql\" : \"INSERT INTO t1(a,b) VALUES(?, ?)\"\n \t\t\"arguments\" : [[1, \"one\"], [2, \"two\"]]\n   \t}\n \t```\n\n \tResponse from Server \n \t```\n  \t{\n  \t\t\"result\" : \"true\"\n \t\t\"message\" : \"Batch executed successfully, rows affected: 2\"\n   \t}\n  \t```\n\n\t- Send a request to begin a transaction on database\n\n \tRequest\n\t ```\n \t{\n \t\t\"db-path\" : \"C:\\synclite\\users\\bob\\synclite\\job1\\test.db\"\n \t\t\"sql\" : \"begin\"\n   \t}\n \t```\n\n \tResponse from Server \n \t```\n  \t{\n  \t\t\"result\" : \"true\"\n \t\t\"message\" : \"Transaction started successfully\"\n  \t\t\"txn-handle\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\"\n   \t}\n  \t```\n\t\n\t- Send a request to execute a sql inside started transaction\n\n   \tRequest\n\t```\n \t{\n \t\t\"db-path\" : \"C:\\synclite\\users\\bob\\synclite\\job1\\test.db\"\n \t\t\"sql\" : \"INSERT INTO t1(a,b) VALUES(?, ?)\"\n\t\t\"txn-handle\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\"\n \t\t\"arguments\" : [[3, \"three\"], [4, \"four\"]]\n   \t}\n \t```\n\n \tResponse from Server \n \t```\n  \t{\n  \t\t\"result\" : \"true\"\n \t\t\"message\" : \"Batch executed successfully, rows affected: 2\"\n   \t}\n  \t```\n\n\t- Send a request to commit a transaction\n\n\tRequest\t\n\t```\n \t{\n \t\t\"db-path\" : \"C:\\synclite\\users\\bob\\synclite\\job1\\test.db\"\n  \t\t\"txn-handle\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\"\n \t\t\"sql\" : \"commit\"\n \t}\n \t```\n\n \tResponse from Server \n \t```\n  \t{\n  \t\t\"result\" : \"true\"\n \t\t\"message\" : \"Transaction committed successfully\"\n   \t}\n  \t```\n\n\t- Send a request to close database   \t\n \tRequest\n\n\t ```\n \t{\n \t\t\"db-path\" : \"C:\\synclite\\users\\bob\\synclite\\job1\\test.db\"\n \t\t\"sql\" : \"close\"\n   \t}\n \t```\n\t\n \tResponse from Server \n \t```\n  \t{\n  \t\t\"result\" : \"true\"\n\t\t\"message\" : \"Database closed successfully\"\n   \t}\n  \t```\n \n5. SyncLite DB (internally leveraging SyncLite Logger), creates a device stage directory at configured stage path with sql logs created for each device. These device stage directories are continuously synchronized with SyncLite consolidator for consolidating them into final destination databases.\n   \n6. Several such hosts, each running SyncLite DB, each of them creating several SyncLite databases/devices (i.e. embedded databases), can synchornize these embedded databases in real-time with a centralized SyncLite consolidator that aggregates the incoming data and changes, in real-time, into configured destination databases.\n\n     \n# Running Integration Tests\n\n```SyncLite Validator``` is a GUI based tool with a war file deployed on app server, it can be launched at http://localhost:8080/synclite-validator. A test job can be configured and run to execute all the end to end integration tests which validate data consolidation functionality for various SyncLite device types.  \n    \n\t\n# Pre-Built Releases:\n\n## SyncLite Logger\n\n1. SyncLite Logger is is published as maven dependency :\n   ```\n\t\u003c!-- https://mvnrepository.com/artifact/io.synclite/synclite-logger --\u003e\n\t\u003cdependency\u003e\n\t    \u003cgroupId\u003eio.synclite\u003c/groupId\u003e\n\t    \u003cartifactId\u003esynclite-logger\u003c/artifactId\u003e\n\t    \u003cversion\u003e#LatestVersion#\u003c/version\u003e\n\t\u003c/dependency\u003e\n   ```\n2. OR You can directly download the latest published synclite-logger-\u003cversion\u003e.jar from : https://github.com/syncliteio/SyncLiteLoggerJava/blob/main/src/main/resources/ and add it as a dependency in your applications.\n   \n## SyncLite Consolidator\n\n1. A docker image of SyncLite Consolidator is available on docker hub : https://hub.docker.com/r/syncliteio/synclite-consolidator\n\n2. OR a release zip file can be downloaded from this GitHub Repo : https://github.com/syncliteio/SyncLite/releases\n\n# Supported Systems\n\n## Source Systems\n1. Edge Applications(Java/Python) +  SyncLite Logger (wrapping embedded databases :SQLite, DuckDB, Apache Derby, H2, HyperSQL)\n2. Edge Applications (any programming language) + SyncLite DB (wrapping embedded databases :SQLite, DuckDB, Apache Derby, H2, HyperSQL)\n3. Databases : PostgreSQL, MySQL, MongoDB, SQLite\n4. Message Brokers : Eclipse Mosquitto MQTT broker\n5. Data Files : CSV ( stored on FS/S3/MinIO)\n\n## Staging Storages\n1. Local FS\n2. SFTP\n3. S3\n4. MinIO\n5. Kafka\n6. Microsoft OneDrive\n7. Google Drive\n   \n## Destination Systems\n1. PostgreSQL\n2. MySQL\n3. MongoDB\n4. Microsoft SQL Server\n5. Apache Iceberg\n8. ClickHouse\n9. FerretDB\n6. SQLite\n7. DuckDB\n\n# Patent\nSyncLite is backed by patented technlogy, more info : https://www.synclite.io/resources/patent  \n\n# Support\nJoin \u003ca href=https://join.slack.com/t/syncliteworkspace/shared_invite/zt-2pz945vva-uuKapsubC9Mu~uYDRKo6Jw\u003eSlack Channel\u003c/a\u003e for support and discussions.\n\nContact: support@synclite.io\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsyncliteio%2FSyncLite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsyncliteio%2FSyncLite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsyncliteio%2FSyncLite/lists"}