Skip to content

Database connectivity bridge - REST API for executing SQL queries against multiple databases via XML configuration. Built with Spring Boot and Groovy.

Notifications You must be signed in to change notification settings

TorbenMerrald/sqlbridge_v2

Repository files navigation

SQLBridge v2

A Spring Boot REST API service that provides configurable database connectivity through XML-based configuration. Execute SQL queries against multiple databases without code changes.

Technology Stack: Spring Boot 3.3.5 | Groovy | Java 17 | HikariCP


Overview

SQLBridge v2 acts as a database connectivity bridge, providing HTTP endpoints for executing SQL queries against multiple heterogeneous databases. Configuration is entirely XML-driven, allowing new queries and data sources to be added without code deployment.

Key Benefits:

  • Configuration-driven SQL execution (no code changes for new queries)
  • Support for multiple databases simultaneously
  • Multiple response formats (XML, JSON, tab-separated)
  • Connection pooling with HikariCP
  • Secure credential management via environment variables

Features

  • Multi-Database Support: SQL Server (with Windows integrated auth), Oracle, IBM DB2/iSeries, HSQLDB, CSV
  • REST API Endpoints: Three endpoints with different response formats
  • XML Configuration: Define SQL actions, scripts, and database mappings
  • Groovy Scripting: Dynamic SQL generation with parameter substitution
  • Connection Pooling: HikariCP for efficient database connections
  • Environment Variables: Secure credential management

Quick Start

Prerequisites

  • Java 17+
  • Gradle 8.x (or use included wrapper)

Setup

  1. Clone the repository

    git clone <repository-url>
    cd sqlbridge_v2
  2. Configure environment variables

    cp .env.example .env
    # Edit .env with your database credentials
  3. Run the application

    ./gradlew bootRun
  4. Test the API

    curl "http://localhost:8080/sqlbridge/dataconnect/jsonAction?key=DEFAULTtest&searchfor=example"

Configuration

Environment Variables

Copy .env.example to .env and configure your database credentials:

# Database 0
DB0_JDBC_URL=jdbc:sqlserver://your-server:1433;encrypt=false
DB0_USERNAME=your_username
DB0_PASSWORD=your_password

# Database 1
DB1_JDBC_URL=jdbc:sqlserver://your-server:1433;encrypt=false
DB1_USERNAME=your_username
DB1_PASSWORD=your_password

# Database 2
DB2_JDBC_URL=jdbc:sqlserver://your-server:1433;encrypt=false
DB2_USERNAME=your_username
DB2_PASSWORD=your_password

Up to 6 databases (db0-db5) can be configured.

DataSource Configuration

Database connections are configured in conf/sqlbridge-datasource.properties:

spring.datasource.db0.jdbcUrl=${DB0_JDBC_URL}
spring.datasource.db0.username=${DB0_USERNAME}
spring.datasource.db0.password=${DB0_PASSWORD}
spring.datasource.db0.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

# HikariCP settings
spring.datasource.db0.hikari.minimum-idle=5
spring.datasource.db0.hikari.maximum-pool-size=10
spring.datasource.db0.hikari.idle-timeout=6000
spring.datasource.db0.hikari.max-lifetime=18000

SQL Action Configuration

SQL queries are defined in conf/sqlbridge-config.xml:

<Configurations>
  <Actions>
    <Action>
      <Name>select</Name>
      <KeyScript>config + key</KeyScript>

      <Configuration>
        <Key>DEFAULTcustomers</Key>
        <SQLLookupScript><![CDATA[
          "SELECT id, name, email FROM customers WHERE name LIKE '%${searchfor}%'"
        ]]></SQLLookupScript>
        <JndiName>db0</JndiName>
      </Configuration>

      <Configuration>
        <Key>DEFAULTorders</Key>
        <SQLLookupScript><![CDATA[
          "SELECT order_id, total FROM orders WHERE customer_id = '${customerid}'"
        ]]></SQLLookupScript>
        <JndiName>db1</JndiName>
      </Configuration>
    </Action>
  </Actions>
</Configurations>

Configuration Elements:

  • Name: Action type (select, json, xml)
  • KeyScript: Groovy script that determines which configuration to use
  • Key: Unique identifier matching the KeyScript result
  • SQLLookupScript: SQL query with ${parameter} placeholders
  • JndiName: Database identifier (db0-db5)

API Reference

Base URL: http://localhost:8080/sqlbridge/dataconnect

GET /selectAction

Returns query results in tab-separated format.

curl "http://localhost:8080/sqlbridge/dataconnect/selectAction?key=DEFAULTcustomers&searchfor=john"

Response:

RESULTSET|john@example.com	John Doe	|jane@example.com	Jane Smith	|

GET /jsonAction

Returns query results as JSON with execution metadata.

curl "http://localhost:8080/sqlbridge/dataconnect/jsonAction?key=DEFAULTcustomers&searchfor=john"

Response:

{
  "success": true,
  "message": "",
  "executionTimeMs": 45,
  "data": [
    {"email": "john@example.com", "name": "John Doe"},
    {"email": "jane@example.com", "name": "Jane Smith"}
  ]
}

POST /xmlPostAction

Accepts XML request body and returns structured XML response.

curl -X POST "http://localhost:8080/sqlbridge/dataconnect/xmlPostAction" \
  -H "Content-Type: application/xml" \
  -d '<request><key>DEFAULTcustomers</key><searchfor>john</searchfor></request>'

Response:

<?xml version="1.0" encoding="ISO-8859-1"?>
<response>
  <requeststatus>true</requeststatus>
  <errordescription></errordescription>
  <fields>
    <row><email type="string"><![CDATA[john@example.com]]></email><name type="string"><![CDATA[John Doe]]></name></row>
  </fields>
</response>

Common Parameters

Parameter Description
key Configuration key (matches <Key> in XML config)
config Configuration prefix (default: "DEFAULT")
searchfor Search term for LIKE clauses
Custom parameters Any parameter referenced in SQLLookupScript

Build & Development

Build Commands

Command Description
./gradlew bootRun Run development server on port 8080
./gradlew bootJar Build JAR artifact (build/libs/sqlbridge.jar)
./gradlew test Run all tests
./gradlew clean build Clean and rebuild project

Project Structure

sqlbridge_v2/
├── src/main/groovy/dk/bpas/sqlbridge/
│   ├── SqlbridgeV2Application.groovy    # Main entry point
│   ├── rest/
│   │   └── DataLinkRestController.groovy # REST endpoints
│   ├── config/
│   │   ├── ConfigXml.groovy              # XML config loader
│   │   └── ShellFunctions.groovy         # SQL helper functions
│   └── database/
│       ├── MultiDataSourceConfig.groovy  # DataSource beans
│       └── DatabaseService.groovy        # DataSource accessor
├── conf/
│   ├── sqlbridge-config.xml              # SQL action configuration
│   └── sqlbridge-datasource.properties   # Database configuration
├── .env.example                          # Environment template
└── build.gradle                          # Build configuration

Testing

# Run all tests
./gradlew test

# Run specific test class
./gradlew test --tests ConfigXmlTest

# Run with verbose output
./gradlew test --info

Deployment

JAR Deployment

# Build the JAR
./gradlew clean bootJar

# Run with environment variables
java -DDB0_JDBC_URL=jdbc:sqlserver://server:1433 \
     -DDB0_USERNAME=user \
     -DDB0_PASSWORD=pass \
     -jar build/libs/sqlbridge.jar

Logging

Logs are written to logs/sqlbridge-info.log with daily rotation (7-day retention).

Configure in application.properties:

logging.file.name=logs/sqlbridge-info.log
logging.logback.rollingpolicy.max-history=7

Health Check

curl http://localhost:8080/actuator/health

Architecture

Request Flow

HTTP Request
    │
    ▼
DataLinkRestController
    │
    ├─► Evaluate KeyScript (Groovy)
    │       │
    │       ▼
    ├─► Lookup Configuration by Key
    │       │
    │       ▼
    ├─► Resolve DataSource (db0-db5)
    │       │
    │       ▼
    ├─► Evaluate SQL Script with parameters
    │       │
    │       ▼
    ├─► Execute Query (Groovy SQL + HikariCP)
    │       │
    │       ▼
    └─► Format Response (XML/JSON/Tab-separated)
            │
            ▼
      HTTP Response

Supported Database Drivers

Database Driver
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver
SQL Server (jTDS) net.sourceforge.jtds.jdbc.Driver
Oracle oracle.jdbc.OracleDriver
IBM DB2/iSeries com.ibm.as400.access.AS400JDBCDriver
HSQLDB org.hsqldb.jdbc.JDBCDriver
CSV org.relique.jdbc.csv.CsvDriver

License

This is proprietary software developed by BPA Solutions A/S. All rights reserved.


Support

For internal support, contact the development team.

About

Database connectivity bridge - REST API for executing SQL queries against multiple databases via XML configuration. Built with Spring Boot and Groovy.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors