01 · TRANSLATOR

Standard SQL in.
Native SOQL out.

Varelma is a pure-Java JDBC driver that parses the SQL you already write, plans the joins Salesforce can’t express, and emits native SOQL over the REST API — inside your own environment, with zero data copied and zero runtime dependencies.

Driver class com.varelma.salesforce.jdbc.SalesforceDriver

Zero runtime dependencies 818 automated tests Java 17+ Salesforce REST API v62.0 Single self-contained JAR

02 · THE PROBLEM

Three ways teams pay to talk to Salesforce today.

Every option asks you to give something up — your SQL, a copy of your data, or a line item that grows with your headcount. Varelma removes all three.

├─ SOQL ≠ SQL

SOQL is not SQL

No arbitrary joins, no UNION, no CASE. Every existing report, ORM, and BI query has to be rewritten by hand against a dialect only Salesforce speaks.

├─ ETL COPIES

ETL copies your data

Warehouse pipelines duplicate regulated records into a second system on a schedule, adding latency, storage, and a fresh surface to secure and audit.

└─ DRIVERS METER

Existing drivers meter you

Per-developer, per-server, per-core, per-connection — production licensing is quote-only, and the meter never stops running as you grow.

03 · HOW IT WORKS

One pipeline, from SQL text to REST call.

The driver is a compiler front-end for Salesforce. Tokens become an AST, the AST becomes SOQL, and anything Salesforce can’t evaluate is finished in your own JVM — never by copying the table out.

STAGE 1 SqlTokenizer Raw SQL text → tokens. Recognises the /* soql */ escape prefix.
STAGE 2 SqlParser Tokens → abstract syntax tree. Detects joins, subqueries, DML and DDL.
STAGE 3 SoqlTranslator AST → native SOQL. Expands SELECT * via the Describe API.
STAGE 4 Salesforce REST API v62.0 Over HTTP/2 with gzip. Automatic re-auth on 401. Describe + metadata cached.
JoinTranslator Engaged when the AST holds a join. Resolves child.ForeignKey = parent.Id to the relationship name via Describe, rewrites a.NameAccount.Name, and queries from the child. Re-enters SoqlTranslator.
QueryExecutor · client-side When a construct can’t be pushed down, the base rows are fetched once and the remaining operators — UNION, CASE, DISTINCT — run in your JVM. Nested JSON is flattened automatically.

04 · CAPABILITIES

What runs in Salesforce, and what runs in your JVM.

The honest split. Anything on the left is compiled to SOQL and executed by Salesforce. Anything on the right is fetched once and finished locally — correct results either way.

Pushed down to SOQL
  • WHERE · BETWEEN · IN · LIKE · IS NULL · NOT
  • GROUP BY · HAVING · ORDER BY
  • LIMIT · OFFSET
  • Aggregates: COUNT / SUM / AVG / MIN / MAX
  • SELECT * — expanded via the Describe API
  • Semi-joins: simple IN (SELECT …)
  • 2-table INNER / LEFT JOIN where ON is child.FK = parent.Id
Executed client-side
  • RIGHT / FULL / CROSS and multi-table joins
  • UNION / UNION ALL / INTERSECT / EXCEPT
  • CASE · CAST · DISTINCT
  • || string concatenation
  • Complex subqueries
  • EXISTS
ESCAPE HATCH

Already fluent in SOQL? Prefix a statement with /* soql */ and the SQL parser steps aside — the raw SOQL is sent straight to the REST API, untouched. Full control when you want it, translation when you don’t.

Composite writes

Up to 25 DML operations batched into a single HTTP round-trip via the Composite API.

Bulk API 2.0

Opt-in with useBulkApi=true; routes automatically once a change exceeds bulkThreshold (default 200).

DDL & procedures

CREATE / ALTER / DROP TABLE via the Tooling API. CALL proc(…) maps to Apex REST. (No RENAME COLUMN — a Salesforce limit.)

Upsert & merge

MERGE INTO … KEY (…) and UPSERT … ON keyField map to the Salesforce upsert endpoint.

05 · WIRING

How you actually plug it in.

One JAR on the classpath, one driver class, one URL. It registers through java.sql.DriverManager and drops into any JDBC tool or pooled data source.

Connection jdbc
Driver classcom.varelma.salesforce.jdbc.SalesforceDriver
JDBC URLjdbc:salesforce:https://acme.my.salesforce.com
Also acceptsjdbc:salesforce: · jdbc:salesforce
authFlowpassword · jwt · client_credentials
DataSourceSalesforceDataSource implements javax.sql.DataSource
isValid()GET /limits · validates pooled connections

Add it in DBeaver

  1. New driver — Database → Driver Manager → New.
  2. Add the delivered JAR, then set the class to com.varelma.salesforce.jdbc.SalesforceDriver.
  3. Set the URL template to jdbc:salesforce:{host}.
  4. Create a connection, pick your authFlow, and browse the virtual INFORMATION_SCHEMA. DataGrip, DbVisualizer and SQuirreL SQL follow the same three steps.
HikariCP Pool.java
HikariConfig cfg = new HikariConfig(); cfg.setDriverClassName("com.varelma.salesforce.jdbc.SalesforceDriver"); cfg.setJdbcUrl("jdbc:salesforce:https://acme.my.salesforce.com"); cfg.addDataSourceProperty("authFlow", "jwt"); cfg.addDataSourceProperty("clientId", "3MVG9…"); cfg.addDataSourceProperty("username", "svc@acme.com"); cfg.addDataSourceProperty("privateKey", "/etc/varelma/app.pem"); // streaming keeps ~2000 rows in memory; setFetchSize(200..2000) cfg.addDataSourceProperty("streaming", "true"); HikariDataSource ds = new HikariDataSource(cfg);

06 · SECURITY & TRUST

Your environment. Your credentials. No vendor in the path.

The driver is a library on your classpath. Traffic goes straight from your process to Salesforce — there is no Varelma service between you and your data.

Data path

Runs where you run

A single JAR in your JVM. No proxy, no hosted gateway, nothing of ours in the request path.

Auth

Three OAuth flows

Password, JWT Bearer, and client credentials — selected by the authFlow property. Automatic re-auth on 401.

At rest

AES-256-GCM vault

Any file ending .enc is decrypted with a key derived as SHA-256(VAULT_KEY). Plain JSON otherwise.

In transit

HTTP/2 with gzip

Every request goes out as HTTP/2 with gzip, straight from your process to your Salesforce host.

Supply chain

Nothing to scan

Zero runtime dependencies. Only java.sql, java.net.http and java.security from the JDK — no transitive dependency surface to scan.

Provenance

Signed, direct delivery

The JAR is delivered to you directly and signed — not pulled from a public registry — and runs entirely inside your environment with nothing phoning home.

We hold no compliance certification today and make no such claim. Security documentation is exchanged directly during procurement.
Legal entity Varelma PTY LTD · Australia
Continuity Perpetual licence, runs with no vendor in the path
License Perpetual — you hold the asset
Support Direct with Varelma

07 · TOOLS IT DROPS INTO

If it speaks JDBC, it speaks Varelma.

No connector to install, no adapter to maintain. Register the driver and Salesforce shows up as just another database.

DBeaver IntelliJ DataGrip DbVisualizer SQuirreL SQL Any JVM application

08 · COMPARISON

The difference is the model, not the discount.

We compare how each option is licensed — not prices. The row that matters is whether the meter ever stops.

Licensing-model comparison of Varelma against CData, Progress DataDirect, Salesforce Connect, and free open-source drivers.
  Varelma CData Progress DataDirect Salesforce Connect Free OSS drivers
Licensing model Flat, per company Subscription — per developer & per server Quote-only — per CPU core Per connection Open-source, often unmaintained
Runtime dependencies Zero Not disclosed Not disclosed Not disclosed Real dependency trees
Read & write Read + write — DML, DDL, upsert Not disclosed Not disclosed Not disclosed Largely read-only
Ownership / term Perpetual — you hold the asset Term subscription Not disclosed Per connection Self-supported
Metering None Per seat / per server Per core Per connection None

Competitor terms as publicly described — models, not prices. Confirm current terms with each vendor.

09 · LICENSING

One SKU. One licence. You own it.

No per-seat, no per-core, no per-connection, no metering. One licence for the whole company, forever.

Varelma Salesforce JDBC Driver · single SKU
  • Unlimited users, cores, and servers — no metering
  • Perpetual license — you hold the asset
  • Delivered directly to you, signed — not pulled from a public registry
  • Single self-contained JAR, zero runtime dependencies
  • Update & support terms agreed before you commit
Contact us
Why one licence Your Salesforce bill already scales with your business. Your driver shouldn’t. Buy it once, deploy it everywhere.
What you hold A signed JAR that is yours. It runs inside your environment with no licence server to phone home to — if Varelma went away tomorrow, it keeps running.
Delivery Delivered signed, directly to you once terms are agreed — never through a public registry.

10 · FAQ

The questions procurement actually asks.

How is the driver delivered?

The JAR is delivered to you directly and signed — it is not pulled from a public registry. Once it arrives it is your artifact: it runs entirely inside your environment, with no Varelma service in the data path and no licence server to phone home to.

What license do I actually get?

One flat, perpetual, per-company license. Unlimited users, cores, and servers — no per-seat or per-core metering. The license itself never expires.

What if Varelma disappears?

Your license is perpetual, and the driver runs entirely inside your environment — there is no Varelma service in the data path and no licence server to phone home to. There is nothing for us to switch off. The JAR you hold keeps working regardless of what happens to us.

How do you handle our credentials?

They never leave your environment — the driver runs in your JVM and talks directly to Salesforce. Choose password, JWT Bearer, or client-credentials OAuth. Secrets can be encrypted at rest with an AES-256-GCM vault whose key is derived from your VAULT_KEY environment variable. Security documentation is exchanged directly with us, not through this page.

What is deliberately missing?

We are honest about the edges. jdbcCompliant() returns false. There are no window functions, no CTEs (WITH), no correlated subqueries, and no derived tables in FROM. DDL is non-transactional. Threading follows the JDBC contract that pooled, multi-threaded deployments require: Connection is fully thread-safe — pool evictors may call isValid(), close(), or abort() concurrently with application threads — while Statement and ResultSet are single-thread-use with cross-thread close() and cancel(), and DatabaseMetaData is safe for concurrent metadata access. This is version 0.1.0 and not yet on Maven Central.

How long from form to JAR?

You send the short form below. We contact you on your preferred channel — email or phone — to agree terms and collect the legal entity, billing/PO, and security documentation. Then you receive the driver, signed, together with your licence. No credit-card checkout — terms are agreed directly.

11 · CONTACT US

Start with a few fields. We take it from there.

This form does one thing: tells us who to contact and how you’d prefer we reach you. Everything sensitive is collected directly, not here.

PUBLIC DETAILS
How would you prefer we reach you first?

Rather not use a form? Email jon@varelma.com directly.

200 OK · request received

Thanks — we’ll be in touch.

A Varelma engineer will be in touch on your preferred channel — email or phone — to agree terms and take it from there. Nothing sensitive was captured on this page.