From df09030e7fc45cffd717d174d81adc6c656d90b7 Mon Sep 17 00:00:00 2001 From: Zac Spitzer Date: Thu, 18 Sep 2025 13:56:31 +0200 Subject: [PATCH] LDEV-5820 initial version CockroachDB JDBC ext https://luceeserver.atlassian.net/browse/LDEV-5820 --- .github/workflows/main.yml | 205 +++++++++++++++++++++ .gitignore | 12 ++ .vscode/settings.json | 7 + CockroachDB.cfc | 86 +++++++++ README.md | 22 +++ build.xml | 286 +++++++++++++++++++++++++++++ logo.png | Bin 0 -> 16287 bytes maven-settings.xml | 27 +++ pom.xml | 362 +++++++++++++++++++++++++++++++++++++ tests/cockroachdb.cfc | 88 +++++++++ 10 files changed, 1095 insertions(+) create mode 100644 .github/workflows/main.yml create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 CockroachDB.cfc create mode 100644 README.md create mode 100644 build.xml create mode 100644 logo.png create mode 100644 maven-settings.xml create mode 100644 pom.xml create mode 100644 tests/cockroachdb.cfc diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..47bcbe0 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,205 @@ +name: Java CI Combined + +on: + push: + pull_request: + workflow_dispatch: + workflow_call: + inputs: + LUCEE_TEST_JAVA_VERSION: + required: true + type: string + default: '21' + LUCEE_VERSION_QUERY: + required: true + type: string + default: '["6.2/snapshot/light","7/snapshot/light"]' + +jobs: + setup: + runs-on: ubuntu-latest + outputs: + version: ${{ steps.extract-version.outputs.VERSION }} + lucee-versions: ${{ steps.convert-lucee-versions.outputs.LUCEE_VERSIONS }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: Cache Maven packages + uses: actions/cache@v4 + with: + path: ~/.m2 + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- + + - name: Extract version number + id: extract-version + run: | + VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) + echo "VERSION=$VERSION" >> $GITHUB_OUTPUT + + - name: Convert Lucee versions + id: convert-lucee-versions + env: + REPO_VERSIONS: ${{ vars.LUCEE_TEST_VERSIONS_PLUS }} + INPUT_VERSIONS: ${{ inputs.LUCEE_VERSION_QUERY }} + run: | + # Use input versions if provided, otherwise use repo versions + SIMPLE_VERSIONS="${INPUT_VERSIONS:-$REPO_VERSIONS}" + # Convert simple format to complex format + echo "$SIMPLE_VERSIONS" | jq -c 'map({version: ("light-" + split("/")[0] + ".0.0-SNAPSHOT"), query: .})' > lucee_versions.json + LUCEE_VERSIONS=$(cat lucee_versions.json) + echo "LUCEE_VERSIONS=$LUCEE_VERSIONS" >> $GITHUB_OUTPUT + + - name: Cache Lucee files + uses: actions/cache@v4 + with: + path: ~/work/_actions/lucee/script-runner/main/lucee-download-cache + key: lucee-downloads + + - name: Import GPG key + run: | + echo "$GPG_PRIVATE_KEY" | base64 --decode | gpg --batch --import + env: + GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + + build: + runs-on: ubuntu-latest + needs: setup + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: ${{ inputs.LUCEE_TEST_JAVA_VERSION || '21' }} + distribution: 'temurin' + + - name: Cache Maven packages + uses: actions/cache@v4 + with: + path: ~/.m2 + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- + + - name: Build and Install with Maven + run: | + echo "------- Maven Install -------"; + mvn -B -e -f pom.xml clean install + + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: cockroachdb-lex + path: target/*.lex + + test: + runs-on: ubuntu-latest + needs: [setup, build] + strategy: + fail-fast: false + matrix: + lucee: ${{ fromJSON(needs.setup.outputs.lucee-versions) }} + steps: + - uses: actions/checkout@v4 + + - name: Start CockroachDB + run: | + docker run -d --name cockroachdb \ + -p 26257:26257 -p 8080:8080 \ + cockroachdb/cockroach:v23.1.11 start-single-node --insecure + + - name: Wait for CockroachDB and setup database + run: | + # Download cockroach CLI + curl -L https://binaries.cockroachdb.com/cockroach-v23.1.11.linux-amd64.tgz | tar -xz + sudo cp cockroach-v23.1.11.linux-amd64/cockroach /usr/local/bin/ + + # Wait for CockroachDB to be ready + for i in {1..10}; do + cockroach sql --insecure --host=localhost:26257 --execute="SELECT 1;" && break || sleep 5; + done + + # Create database + cockroach sql --insecure --host=localhost:26257 --execute="CREATE DATABASE IF NOT EXISTS testdb;" + + - name: Download built artifact + uses: actions/download-artifact@v4 + with: + name: cockroachdb-lex + path: target/ + + - name: Checkout Lucee + uses: actions/checkout@v4 + with: + repository: lucee/lucee + path: lucee + + - name: Run Lucee Test Suite + uses: lucee/script-runner@main + with: + webroot: ${{ github.workspace }}/lucee/test + execute: /bootstrap-tests.cfm + luceeVersionQuery: ${{ matrix.lucee.query }} + extensionDir: ${{ github.workspace }}/target + env: + testLabels: cockroachdb + testServices: none # we don't need any services for this test, avoid errors due to bundle download + LUCEE_ENABLE_BUNDLE_DOWNLOAD: false # we want to test the extension we just built + COCKROACHDB_HOST: localhost + COCKROACHDB_USERNAME: root + COCKROACHDB_PORT: 26257 + COCKROACHDB_DATABASE: testdb + LUCEE_LOGGING_FORCE_APPENDER: console + LUCEE_LOGGING_FORCE_LEVEL: info + testAdditional: ${{ github.workspace }}/tests + + deploy: + runs-on: ubuntu-latest + needs: [test] + if: always() && needs.test.result == 'success' && github.ref == 'refs/heads/main' + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: Cache Maven packages + uses: actions/cache@v4 + with: + path: ~/.m2 + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- + + - name: Import GPG key + run: | + echo "$GPG_PRIVATE_KEY" | base64 --decode | gpg --batch --import + env: + GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + + - name: Build and Deploy with Maven + env: + MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} + MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + run: | + if [[ "${{ needs.setup.outputs.version }}" == *-SNAPSHOT ]]; then + echo "------- Maven Deploy snapshot on ${{ github.event_name }} -------"; + mvn -B -e -f pom.xml clean deploy --settings maven-settings.xml + else + echo "------- Maven Deploy release on ${{ github.event_name }} -------"; + mvn -B -e -f pom.xml clean deploy -DperformRelease=true --settings maven-settings.xml + fi \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..28e1415 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +/dist +/notUsedYet +**/Test.java +**/.DS_Store +**/.svn/ +/*.project +va specific +*.class +target +target/* +*.lock +*.DS_Store diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c1fb686 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "workbench.colorCustomizations": { + "activityBar.background": "#023608", + "titleBar.activeBackground": "#034B0B", + "titleBar.activeForeground": "#ECFEEE" + } +} \ No newline at end of file diff --git a/CockroachDB.cfc b/CockroachDB.cfc new file mode 100644 index 0000000..20cc058 --- /dev/null +++ b/CockroachDB.cfc @@ -0,0 +1,86 @@ +component extends="types.Driver" output="no" implements="types.IDatasource" { + + fields = array( + field("SSL Mode", "sslmode", "disable,require,verify-ca,verify-full", "disable", "SSL mode to use for the connection.", "radio"), + field("Application Name", "application_name", "", false, "Optional application name for the connection."), + field("Timezone", "timezone", "", false, "Set the session timezone for the connection."), + field("Retry Transient Errors", "retryTransientErrors", "true,false", "false", "Automatically retry serialization failures during transactions.", "radio"), + field("Implicit SELECT FOR UPDATE", "implicitSelectForUpdate", "true,false", "false", "Automatically append FOR UPDATE to qualified SELECT statements to reduce contention.", "radio"), + field("Rewrite Batched Inserts", "reWriteBatchedInserts", "true,false", "false", "Enable array-based rewrites for bulk INSERT operations.", "radio"), + field("Rewrite Batched Updates", "reWriteBatchedUpdates", "true,false", "false", "Enable array-based rewrites for bulk UPDATE operations.", "radio"), + field("Rewrite Batched Upserts", "reWriteBatchedUpserts", "true,false", "false", "Enable array-based rewrites for bulk UPSERT operations.", "radio"), + field("Retry Max Attempts", "retryMaxAttempts", "", "15", "Maximum number of retry attempts for transient errors (default: 15)."), + field("Retry Max Backoff Time", "retryMaxBackoffTime", "", "30s", "Maximum backoff time between retries (default: 30s).") + ); + + this.type.port = this.TYPE_FREE; + this.value.host = "localhost"; + this.value.port = 26257; + this.className = "{class-name}"; + this.bundleName = "{bundle-name}"; + this.dsn = "{connString}"; + + /** + * Custom parameter syntax for CockroachDB JDBC URLs + */ + public struct function customParameterSyntax() { + return {leadingdelimiter:'?', delimiter:'&', separator:'='}; + } + + /** + * Validate field combinations before saving + */ + public void function onBeforeUpdate() { + // Validate retry settings + if (len(form.custom_retryMaxAttempts ?: "")) { + var attempts = val(form.custom_retryMaxAttempts); + if (attempts < 1 || attempts > 100) { + throw message="Retry Max Attempts must be between 1 and 100"; + } + } + + // Validate backoff time format + if (len(form.custom_retryMaxBackoffTime ?: "")) { + var backoffTime = form.custom_retryMaxBackoffTime; + if (!reFindNoCase("^\d+[smh]?$", backoffTime)) { + throw message="Retry Max Backoff Time must be in format like '30s', '5m', or '1h'"; + } + } + } + + /** + * returns display name of the driver + */ + public string function getName() { + return "{label}"; + } + + /** + * returns the id of the driver + */ + public string function getId() { + return "{id}"; + } + + /** + * returns the description of the driver + */ + public string function getDescription() { + return "{description}"; + } + + /** + * returns array of fields + */ + public array function getFields() { + return fields; + } + + public boolean function literalTimestampWithTSOffset() { + return false; + } + + public boolean function alwaysSetTimeout() { + return true; + } +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..84d5836 --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# Lucee CockroachDB JDBC Extension + +![CockroachDB Logo](logo.png) + +[![Java CI](https://github.com/lucee/extension-jdbc-cockroachdb/actions/workflows/main.yml/badge.svg)](https://github.com/lucee/extension-jdbc-cockroachdb/actions/workflows/main.yml) + +Issues: https://luceeserver.atlassian.net/issues/?jql=labels%20%3D%20cockroachdb + +## Coackroach DB + +https://www.cockroachlabs.com/product/overview/ + +## JDBC client + +While you can just use the Postgres JDBC client, this JDBC client adds some extra Cockroachdb specific support (it does bundle the postgres jdbc client and extends it) + +https://github.com/cloudneutral/cockroachdb-jdbc + +## Requirements + +**Java 17 or higher** is required for this extension due to the CockroachDB JDBC driver 2.0.1+ dependency. +**Lucee 6.2.2.91 or newer** diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..4c28a92 --- /dev/null +++ b/build.xml @@ -0,0 +1,286 @@ + + + + Building Datasource Extension + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Manifest-Version: 1.0 +Built-Date: ${NOW} +version: "${symbolicVersion}" +id: "${id}" +name: "${label}" +description: "${desc}" +category: "Datasource" +lucee-core-version: "6.2.2.91" +start-bundles: false +jdbc: "[{'label':'${label}','id':'${jdbcid}','connectionString':'${_connstr}','class':'${className}','bundleName':'${symbolicName}','bundleVersion':'${symbolicVersion}'}]" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..70c97443ef8b00157b54cd56369b7e9e0ff42f94 GIT binary patch literal 16287 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 ZK!a`$p7mL*X8_bkQC1CBCu0`=e*l3+*nj{4 literal 0 HcmV?d00001 diff --git a/maven-settings.xml b/maven-settings.xml new file mode 100644 index 0000000..3647539 --- /dev/null +++ b/maven-settings.xml @@ -0,0 +1,27 @@ + + + + + + + ossrh + ${env.MAVEN_USERNAME} + ${env.MAVEN_PASSWORD} + + + + + + ossrh + + true + + + gpg2 + ${env.GPG_PASSPHRASE} + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..66af6fa --- /dev/null +++ b/pom.xml @@ -0,0 +1,362 @@ + + 4.0.0 + org.lucee + cockroachdb-jdbc-extension + ${cockroachdb.jdbc.version} + pom + CockroachDB JDBC + + + UTF-8 + 17 + 17 + C1A2B3C4-D5E6-47F8-9A0BC1D2E3F4A5B6 + 6.2.2.91 + server + 2.0.1 + jdbc:cockroachdb://{host}:{port}/{database} + cockroachdb + + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + https://oss.sonatype.org/content/repositories/snapshots/ + + + + org.openjdk.nashorn + nashorn-core + 15.4 + provided + + + io.github.kai-niemi.cockroachdb.jdbc + cockroachdb-jdbc + ${cockroachdb.jdbc.version} + + + org.postgresql + postgresql + 42.7.7 + + + + https://github.com/lucee/extension-jdbc-cockroachdb + scm:git:git://github.com/lucee/extension-jdbc-cockroachdb.git + scm:git:git@github.com:lucee/extension-jdbc-cockroachdb.git + ${project.version} + + + + + The GNU Lesser General Public License, Version 2.1 + http://www.gnu.org/licenses/lgpl-2.1.txt + repo + + + + + + zspitzer + Zac Spitzer + zac@lucee.org + Lucee Association Switzerland + http://lucee.org + + Project-Administrator + Developer + + +1 + + + + JDBC Type 4 Driver for CockroachDB. + https://github.com/lucee/extension-jdbc-cockroachdb + + + + release-sign-artifacts + + + performRelease + true + + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 3.0.1 + + + sign-artifacts + verify + + sign + + + + ${project.build.directory}/${project.artifactId}-${project.version}.lex + + + + + + + org.apache.maven.plugins + maven-release-plugin + 3.0.0 + + true + false + release + deploy + + + + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.2.0 + + + copy-cockroachdb-jar + generate-resources + + copy-dependencies + + + io.github.kai-niemi.cockroachdb.jdbc,org.postgresql + cockroachdb-jdbc,postgresql + ${project.build.directory}/dependency + false + true + + + + + + + + + org.apache.maven.plugins + maven-antrun-plugin + 3.0.0 + + + org.openjdk.nashorn + nashorn-core + 15.4 + + + + + package + + run + + + + + + + + + + + + + + + + + + + + Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-SymbolicName: cockroachdb-jdbc +Bundle-Name: CockroachDB JDBC Driver OSGi Bundle +Bundle-Version: ${cockroachdb.jdbc.version} +Bundle-Description: OSGi bundle for CockroachDB JDBC driver +Bundle-Vendor: Lucee Association Switzerland +Bundle-RequiredExecutionEnvironment: JavaSE-17 +Export-Package: io.cockroachdb.jdbc;version="${cockroachdb.jdbc.version}", + io.github.kai_niemi.cockroachdb.jdbc;version="${cockroachdb.jdbc.version}", + org.postgresql;version="42.7.7", + org.postgresql.copy;version="42.7.7", + org.postgresql.core;version="42.7.7", + org.postgresql.ds;version="42.7.7", + org.postgresql.ds.common;version="42.7.7", + org.postgresql.fastpath;version="42.7.7", + org.postgresql.geometric;version="42.7.7", + org.postgresql.jdbc;version="42.7.7", + org.postgresql.largeobject;version="42.7.7", + org.postgresql.ssl;version="42.7.7", + org.postgresql.util;version="42.7.7", + org.postgresql.xa;version="42.7.7" +Import-Package: javax.sql, + javax.naming;resolution:=optional, + javax.net.ssl;resolution:=optional, + javax.transaction.xa;resolution:=optional, + org.slf4j;resolution:=optional;version="[1.6,3)", + javax.xml.parsers;resolution:=optional, + javax.xml.transform;resolution:=optional, + javax.xml.transform.stream;resolution:=optional + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.2.0 + + + attach-artifacts + package + + attach-artifact + + + + + + ${project.build.directory}/${project.artifactId}-${project.version}.lex + lex + + + + + + + + + + org.apache.maven.plugins + maven-clean-plugin + 3.1.0 + + + cleanup + post-package + + clean + + + + + ${project.build.directory}/antrun + + **/* + + + + ${project.build.directory}/archive-tmp + + **/* + + + + + + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 3.0.0-M1 + + + default-deploy + deploy + + deploy-file + + + ${project.build.directory}/${project.artifactId}-${project.version}.lex + ${project.groupId} + ${project.artifactId} + ${project.version} + ossrh + ${deploy.url} + lex + + + + + + + + org.sonatype.central + central-publishing-maven-plugin + 0.8.0 + true + + ossrh + true + + + + + \ No newline at end of file diff --git a/tests/cockroachdb.cfc b/tests/cockroachdb.cfc new file mode 100644 index 0000000..664728a --- /dev/null +++ b/tests/cockroachdb.cfc @@ -0,0 +1,88 @@ +component extends="org.lucee.cfml.test.LuceeTestCase" labels="cockroachdb" { + + function beforeAll (){ + variables.bundleName = "cockroachdb-jdbc"; + if ( _isConfEmpty() ) { + systemOutput( "CockroachDB environment variables not set, skipping tests", true ); + return; + } + variables.conf = _getCockroachEnvVars(); + variables.ds = { + class: "io.cockroachdb.jdbc.CockroachDriver" + // , bundleName: bundleName + // , bundleVersion: bundleVersion + , connectionString: "jdbc:cockroachdb://#variables.conf.host#:#variables.conf.port#/#variables.conf.database#?sslmode=disable" + , username: variables.conf.username + // In insecure mode, omit password to avoid authentication issues + }; + } + + function run(){ + describe( title="CockroachDB basic connection test", body=function(){ + + it("expect config to not be empty", function(){ + expect( _getCockroachEnvVars() ).notToBeEmpty("cockroachdb environment variables not set"); + }); + + it(title="verify cockroachdb with dbinfo", skip=_isConfEmpty(), body=function(){ + dbinfo datasource="#ds#" name="local.result" type="version"; + systemOutput( "", true ); + systemOutput( ds, true ); + systemOutput( local.result.toJson(), true ); + expect( local.result ).notToBeEmpty(); + }); + + }); + + describe( title="CockroachDB basic CRUD tests", body=function(){ + it(title="can create a table", skip=_isConfEmpty(), body=function(){ + // Clean up any existing test data first + QueryExecute( "DROP TABLE IF EXISTS test_table", {}, {datasource=ds} ); + var sql = "CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(255))"; + var result = QueryExecute( sql, {}, {datasource=ds} ); + expect( result ).toBeQuery(); + }); + it(title="can insert a row", skip=_isConfEmpty(), body=function(){ + var sql = "INSERT INTO test_table (id, name) VALUES (?, ?)"; + var params = [1, "Alice"]; + var result = QueryExecute( sql, params, {datasource=ds} ); + expect( result ).toBeQuery(); + }); + it(title="can select a row", skip=_isConfEmpty(), body=function(){ + var sql = "SELECT * FROM test_table WHERE id = ?"; + var params = [{value=1, cfsqltype="CF_SQL_INTEGER"}]; + var result = QueryExecute( sql, params, {datasource=ds} ); + expect( result.recordCount ).toBe( 1 ); + expect( result.name ).toBe( "Alice" ); + }); + it(title="can update a row", skip=_isConfEmpty(), body=function(){ + var sql = "UPDATE test_table SET name = ? WHERE id = ?"; + var params = ["Bob", {value=1, cfsqltype="CF_SQL_INTEGER"}]; + var result = QueryExecute( sql, params, {datasource=ds} ); + expect( result ).toBeQuery(); + // Verify update + var verify = QueryExecute( "SELECT * FROM test_table WHERE id = ?", [{value=1, cfsqltype="CF_SQL_INTEGER"}], {datasource=ds} ); + expect( verify.name ).toBe( "Bob" ); + }); + it(title="can delete a row", skip=_isConfEmpty(), body=function(){ + var sql = "DELETE FROM test_table WHERE id = ?"; + var params = [{value=1, cfsqltype="CF_SQL_INTEGER"}]; + var result = QueryExecute( sql, params, {datasource=ds} ); + expect( result ).toBeQuery(); + // Verify delete + var verify = QueryExecute( "SELECT * FROM test_table WHERE id = ?", [{value=1, cfsqltype="CF_SQL_INTEGER"}], {datasource=ds} ); + expect( verify.recordCount ).toBe( 0 ); + }); + + }) + } + + private boolean function _isConfEmpty() { + return isEmpty(_getCockroachEnvVars()); + } + + private struct function _getCockroachEnvVars() { + return server._getSystemPropOrEnvVars("HOST,USERNAME,PORT,DATABASE", "COCKROACHDB_"); + } + +}