diff --git a/.github/workflows/golangci-lint.yaml b/.github/workflows/golangci-lint.yaml index d685429..cbebad3 100644 --- a/.github/workflows/golangci-lint.yaml +++ b/.github/workflows/golangci-lint.yaml @@ -34,7 +34,7 @@ jobs: go-version: ${{ matrix.go }} - name: Perform linting - uses: golangci/golangci-lint-action@v8 + uses: golangci/golangci-lint-action@v9 with: args: --config=${{ github.workspace }}/.github/linters/.golangci.yaml only-new-issues: false diff --git a/bearer.ignore b/bearer.ignore index fcdaea6..ec39e68 100644 --- a/bearer.ignore +++ b/bearer.ignore @@ -1,7 +1,7 @@ { "d77cfa512728249f637fbf096fae3c7a_0": { "author": "docktermj", - "false_positive": false, - "ignored_at": "2025-05-20T16:58:57Z" + "false_positive": true, + "ignored_at": "2025-11-10T22:19:10Z" } } \ No newline at end of file diff --git a/connector/connector.go b/connector/connector.go index cd17ebb..9034722 100644 --- a/connector/connector.go +++ b/connector/connector.go @@ -117,11 +117,13 @@ func createPostgresqlConnector(ctx context.Context, parsedURL *url.URL) (driver. configurationMap["search_path"] = searchPath[0] } - configuration := "" + var configurationBuilder strings.Builder for key, value := range configurationMap { - configuration += fmt.Sprintf("%s=%s ", key, value) + configurationBuilder.WriteString(fmt.Sprintf("%s=%s ", key, value)) } + configuration := configurationBuilder.String() + result, err := connectorpostgresql.NewConnector(ctx, configuration) return result, wraperror.Errorf(err, wraperror.NoMessage) @@ -221,11 +223,13 @@ func createMssqlConnector(ctx context.Context, parsedURL *url.URL) (driver.Conne } } - configuration := "" + var configurationBuilder strings.Builder for key, value := range configurationMap { - configuration += fmt.Sprintf("%s=%s;", key, value) + configurationBuilder.WriteString(fmt.Sprintf("%s=%s;", key, value)) } + configuration := configurationBuilder.String() + result, err := connectormssql.NewConnector(ctx, configuration) return result, wraperror.Errorf(err, wraperror.NoMessage) @@ -259,11 +263,13 @@ func createOciConnector(ctx context.Context, parsedURL *url.URL) (driver.Connect configurationMap[key] = value[0] } - configuration := "" + var configurationBuilder strings.Builder for key, value := range configurationMap { - configuration += fmt.Sprintf("%s=%s ", key, value) + configurationBuilder.WriteString(fmt.Sprintf("%s=%s ", key, value)) } + configuration := configurationBuilder.String() + result, err := connectororacle.NewConnector(ctx, configuration) return result, wraperror.Errorf(err, wraperror.NoMessage) diff --git a/connectormssql/connectormssql_examples_test.go b/connectormssql/connectormssql_examples_test.go index 3990a6e..e0fb595 100644 --- a/connectormssql/connectormssql_examples_test.go +++ b/connectormssql/connectormssql_examples_test.go @@ -19,7 +19,10 @@ func ExampleNewConnector() { databaseConnector, err := connectormssql.NewConnector(ctx, configuration) failOnError(err) - _ = databaseConnector // Faux use of databaseConnector + connection, err := databaseConnector.Connect(ctx) + failOnError(err) + + _ = connection // Faux use of database connection. // Output: } diff --git a/connectormysql/connectormysql_examples_test.go b/connectormysql/connectormysql_examples_test.go index 1cc924c..306ce2f 100644 --- a/connectormysql/connectormysql_examples_test.go +++ b/connectormysql/connectormysql_examples_test.go @@ -29,7 +29,10 @@ func ExampleNewConnector() { databaseConnector, err := connectormysql.NewConnector(ctx, configuration) failOnError(err) - _ = databaseConnector // Faux use of databaseConnector + connection, err := databaseConnector.Connect(ctx) + failOnError(err) + + _ = connection // Faux use of database connection. // Output: } diff --git a/connectororacle/connectororacle_examples_test.go b/connectororacle/connectororacle_examples_test.go index dc5e86a..2c74516 100644 --- a/connectororacle/connectororacle_examples_test.go +++ b/connectororacle/connectororacle_examples_test.go @@ -19,7 +19,10 @@ func ExampleNewConnector() { databaseConnector, err := connectororacle.NewConnector(ctx, configuration) failOnError(err) - _ = databaseConnector // Faux use of databaseConnector + connection, err := databaseConnector.Connect(ctx) + failOnError(err) + + _ = connection // Faux use of database connection. // Output: } diff --git a/connectorpostgresql/connectorpostgresql_examples_test.go b/connectorpostgresql/connectorpostgresql_examples_test.go index 97fef38..ea89f45 100644 --- a/connectorpostgresql/connectorpostgresql_examples_test.go +++ b/connectorpostgresql/connectorpostgresql_examples_test.go @@ -19,7 +19,10 @@ func ExampleNewConnector() { databaseConnector, err := connectorpostgresql.NewConnector(ctx, configuration) failOnError(err) - _ = databaseConnector // Faux use of databaseConnector + connection, err := databaseConnector.Connect(ctx) + failOnError(err) + + _ = connection // Faux use of database connection. // Output: } diff --git a/connectorsqlite/connectorsqlite_examples_test.go b/connectorsqlite/connectorsqlite_examples_test.go index c93542b..d71fb98 100644 --- a/connectorsqlite/connectorsqlite_examples_test.go +++ b/connectorsqlite/connectorsqlite_examples_test.go @@ -18,7 +18,10 @@ func ExampleNewConnector() { databaseConnector, err := connectorsqlite.NewConnector(ctx, configuration) failOnError(err) - _ = databaseConnector // Faux use of databaseConnector + connection, err := databaseConnector.Connect(ctx) + failOnError(err) + + _ = connection // Faux use of database connection. // Output: } @@ -29,7 +32,10 @@ func ExampleNewConnector_inmemory() { databaseConnector, err := connectorsqlite.NewConnector(ctx, configuration) failOnError(err) - _ = databaseConnector // Faux use of databaseConnector + connection, err := databaseConnector.Connect(ctx) + failOnError(err) + + _ = connection // Faux use of database connection. // Output: } diff --git a/docker-compose.test.yaml b/docker-compose.test.yaml index 6a05685..727a4f5 100644 --- a/docker-compose.test.yaml +++ b/docker-compose.test.yaml @@ -1,7 +1,4 @@ -version: "3" - services: - # makefile makes a metadata file for pgadmin. makefile: @@ -9,71 +6,70 @@ services: command: - sh - -c - - mkdir /output/postgres_postgres.com; echo $${FILE_CONTENTS} >> /output/postgres_postgres.com/servers.json + - mkdir /output/postgres_postgres.com || true; echo $${FILE_CONTENTS} > /output/postgres_postgres.com/servers.json; environment: FILE_CONTENTS: >- { - "Servers": { - "1": { - "Name": "senzing", - "Group": "Servers", - "Host": "senzing-postgres", - "Port": 5432, - "MaintenanceDB": "postgres", - "Username": "postgres", - "SSLMode": "prefer", - "SSLCert": "/.postgresql/postgresql.crt", - "SSLKey": "/.postgresql/postgresql.key", - "SSLCompression": 0, - "Timeout": 10, - "UseSSHTunnel": 0, - "TunnelPort": "22", - "TunnelAuthentication": 0 + "Servers": { + "1": { + "Name": "senzing", + "Group": "Servers", + "Host": "senzing-postgres", + "Port": 5432, + "MaintenanceDB": "postgres", + "Username": "postgres", + "UseSSHTunnel": 0, + "TunnelPort": "22", + "TunnelAuthentication": 0, + "KerberosAuthentication": false, + "ConnectionParameters": { + "sslmode": "prefer", + "connect_timeout": 10, + "sslcert": "/.postgresql/postgresql.crt", + "sslkey": "/.postgresql/postgresql.key" + } + } } - } } image: busybox:${SENZING_DOCKER_IMAGE_VERSION_BUSYBOX:-latest} networks: - senzing read_only: true - user: ${SENZING_UID:-1001}:${SENZING_GID:-1001} + user: ${SENZING_UID:-0}:${SENZING_GID:-0} volumes: - - /tmp:/output + - pgadmin-volume:/output postgres: container_name: senzing-postgres environment: - # See https://github.com/bitnami/bitnami-docker-postgresql#configuration - POSTGRESQL_DATABASE: G2 - POSTGRESQL_PASSWORD: senzing - POSTGRESQL_POSTGRES_PASSWORD: postgres - POSTGRESQL_USERNAME: senzing + # See https://hub.docker.com/_/postgres "Environment Variables" + PGDATA: /var/lib/postgresql/data/pgdata + POSTGRES_DB: ${POSTGRES_DB:-G2} + POSTGRES_PASSWORD: ${POSTGRESQL_POSTGRES_PASSWORD:-postgres} healthcheck: - test: - [ - "CMD-SHELL", - "pg_isready -U ${POSTGRES_USERNAME:-postgres}" - ] + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USERNAME:-postgres}"] interval: 10s timeout: 5s retries: 5 - image: bitnami/postgresql:${SENZING_DOCKER_IMAGE_VERSION_BITNAMI_POSTGRESQL:-latest} + image: postgres:${SENZING_DOCKER_IMAGE_VERSION_POSTGRES:-latest} networks: - senzing ports: - 5432:5432 restart: always + user: ${SENZING_UID:-0}:${SENZING_GID:-0} + volumes: + - postgres-volume:/var/lib/postgresql/data/pgdata mysql: container_name: senzing-mysql environment: # See https://hub.docker.com/_/mysql/ "Environment Variables" MYSQL_DATABASE: G2 - MYSQL_NATIVE_PASSWORD: "ON" MYSQL_PASSWORD: mysql MYSQL_ROOT_PASSWORD: root MYSQL_USER: mysql - image: bitnami/mysql:${SENZING_DOCKER_IMAGE_VERSION_BITNAMI_MYSQL:-latest} + image: mysql:${SENZING_DOCKER_IMAGE_VERSION_MYSQL:-latest} networks: - senzing ports: @@ -87,7 +83,7 @@ services: ACCEPT_EULA: Y MSSQL_PID: Developer MSSQL_SA_PASSWORD: Passw0rd - image: mcr.microsoft.com/mssql/server:${SENZING_DOCKER_IMAGE_VERSION_MSSQL_SERVER:-latest} + image: mcr.microsoft.com/mssql/server:${SENZING_DOCKER_IMAGE_VERSION_MSSQL_SERVER:-2025-latest} networks: - senzing ports: @@ -109,7 +105,7 @@ services: container_name: senzing-mssql-create-database depends_on: - mssql - image: mcr.microsoft.com/mssql/server:${SENZING_DOCKER_IMAGE_VERSION_MSSQL_SERVER:-latest} + image: mcr.microsoft.com/mssql/server:${SENZING_DOCKER_IMAGE_VERSION_MSSQL_SERVER:-2025-latest} networks: - senzing restart: on-failure @@ -151,9 +147,9 @@ services: - 9171:80 - 9172:443 restart: always - user: "${SENZING_UID:-1001}:0" + user: ${SENZING_UID:-0}:${SENZING_GID:-0} volumes: - - /tmp:/var/lib/pgadmin/storage + - pgadmin-volume:/var/lib/pgadmin/storage phpmyadmin: container_name: senzing-phpmyadmin @@ -161,7 +157,7 @@ services: - mysql environment: DATABASE_HOST: mysql - image: bitnami/phpmyadmin:${SENZING_DOCKER_IMAGE_VERSION_BITNAMI_PHPMYADMIN:-latest} + image: phpmyadmin:${SENZING_DOCKER_IMAGE_VERSION_PHPMYADMIN:-latest} networks: - senzing ports: @@ -179,7 +175,10 @@ services: - 9177:8080 restart: always - networks: senzing: name: ${SENZING_DOCKER_NETWORK:-senzing-network} + +volumes: + pgadmin-volume: + postgres-volume: diff --git a/go.mod b/go.mod index bda8c75..002b814 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( filippo.io/edwards25519 v1.1.0 // indirect github.com/VictoriaMetrics/easyproto v0.1.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logfmt/logfmt v0.6.1 // indirect github.com/godror/knownpb v0.3.0 // indirect github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect github.com/golang-sql/sqlexp v0.1.0 // indirect @@ -29,14 +29,14 @@ require ( github.com/kr/pretty v0.3.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect - golang.org/x/crypto v0.41.0 // indirect - golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b // indirect - golang.org/x/net v0.43.0 // indirect - golang.org/x/sys v0.35.0 // indirect - golang.org/x/text v0.28.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1 // indirect - google.golang.org/grpc v1.75.0 // indirect - google.golang.org/protobuf v1.36.8 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.30.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251110190251-83f479183930 // indirect + google.golang.org/grpc v1.76.0 // indirect + google.golang.org/protobuf v1.36.10 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index caa72c0..7a56486 100644 --- a/go.sum +++ b/go.sum @@ -19,8 +19,8 @@ github.com/VictoriaMetrics/easyproto v0.1.4/go.mod h1:QlGlzaJnDfFd8Lk6Ci/fuLxfTo github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logfmt/logfmt v0.6.1 h1:4hvbpePJKnIzH1B+8OR/JPbTx37NktoI9LE2QZBBkvE= +github.com/go-logfmt/logfmt v0.6.1/go.mod h1:EV2pOAQoZaT1ZXZbqDl5hrymndi4SY9ED9/z6CO0XAk= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= @@ -92,28 +92,28 @@ go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFh go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= -golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= -golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= -golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0= -golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= -golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY= +golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1 h1:pmJpJEvT846VzausCQ5d7KreSROcDqmO388w5YbnltA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1/go.mod h1:GmFNa4BdJZ2a8G+wCe9Bg3wwThLrJun751XstdJt5Og= -google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= -google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= -google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= -google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251110190251-83f479183930 h1:tK4fkUnnRhig9TsTp4otV1FxwBFYgbKUq1RY0V6KZ4U= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251110190251-83f479183930/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A= +google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=