The Challenge
In order to speed up the most recent modernisation efforts, our partner needed support with a specific project, which would include migrating a component of their systems to their new platform that is modern and future-ready. We worked with them in a close collaboration to maximise the efforts without disrupting operations.
The Approach
We partnered with our client to modernise their Data Factory — a complex system of C++ and C# executables alongside various batch jobs. This transformation enhanced data ingestion, optimised output for downstream systems, and ensured long-term efficiency, scalability, and maintainability.
In order to support their migration efforts, we concentrated on three key areas: transitioning from Access databases to SQLite, eliminating Windows-specific dependencies, and enabling the Data Factory to operate within a Linux container environment.
Transition from Microsoft Access to SQlite
As part of our work to future-proof their Data Factory, we replaced Microsoft Access databases while preserving the existing data structure and integrity. SQLite was the ideal choice as it offered a lightweight, efficient solution that mirrored Access behaviour and minimised disruption.
To ensure a seamless migration, we developed a bespoke conversion tool to transform Access databases into SQLite format. The tool included an export-to-Excel function with side-by-side comparisons, ensuring data accuracy.
Additionally, we introduced a centralised data access layer, separate implementations for C++ and C#, which streamlined the codebase, reduced complexity, and improved scalability and maintainability.With many projects built on .NET Framework 4.7.2, we undertook a strategic upgrade to .NET 8 to enable long-term support with a multi-platform framework that would ensure alignment with the broader migration objectives.
Removing Windows dependencies for cross-platform flexibility
While maintaining a comprehensive inventory of Data Factory projects, we systematically upgraded each one, methodically compiling on Linux and resolving errors by removing or replacing Windows-specific dependencies. This process improved code maintainability, eliminated legacy constraints, and enhanced overall system flexibility.
Running Data Factory on Linux container for portability
With all projects successfully compiled on Linux, we transitioned the Data Factory to a fully operational Linux environment. This phase involved resolving platform-specific discrepancies, which ensured reliable performance across platforms.
To streamline deployment and orchestration, we wrote a Dockerfile, enabling effortless replication of the Data Factory build and runtime environment on any machine. Finally, we executed a full suite of tests using diverse datasets provided by our client, rigorously validating data integrity and correctness. The migration streamlined operations, improved maintainability, and prepared the system for scalable, future-ready performance.
General improvements
While addressing the key migration areas, we also took the opportunity to improve the codebase by:
- Migrating C++ applications to C# where appropriate;
- Removing unused code to enhance maintainability;
- Adding logging for better visibility and debugging;
- Eliminating unnecessary third-party tools to reduce dependencies;
- Improving documentation for easier onboarding and future development;
- Upgrading C# projects to supported versions for long-term compatibility.
The Deliverables
As a result of our engagement, we successfully delivered technical solutions which included:
- Replacing Microsoft Access databases with a more portable SQLite-based solution.
- Refactoring the codebase to remove Windows API dependencies, ensuring seamless operation on Linux and within containerised environments.
- Introducing an abstraction layer for database interactions, centralising queries to simplify future upgrades and enhance maintainability.
- Offering comprehensive documentation to support ongoing operations and future development efforts.
Closing the Engagement
By modernising and enhancing the system’s capabilities, we transformed the codebase into a more portable, efficient, and future-ready foundation. No longer tied to a specific environment, our client can deploy their pipeline anywhere, reducing operational overhead and unlocking new opportunities with ease.
With a cross-platform .NET upgrade, the code is more secure and benefits from the latest advancements. Transitioning to Linux containers helped optimise performance and resource utilisation, making the system leaner and more scalable. We stripped away unnecessary complexities, eliminating cumbersome dependencies that slowed development, testing, and production. This set the stage for easier collaboration and adoption.
Deployment is now simpler and more reliable, reducing vulnerability exposure and aligning with industry best practices. The result? A future-proof foundation that supports innovation, accelerates progress and keeps the system resilient in a rapidly evolving landscape.