Skip to Content
ClientsgRPC ClientsGo SDK

Go SDK PREVIEW

The official Go SDK provides a small, idiomatic layer over Kubling’s public gRPC contract. It handles channel creation, login and token propagation, and adds typed row accessors plus helpers for statements and transactions.

This guide targets sdk-go/v0.1.1, requires Go 1.25 or newer and uses the provider-backed VDB from the Quickstart setup.

Pin an SDK version in applications and upgrade deliberately. Both the client transport and the current SDK are Preview APIs.

Install the SDK

Create a Go module

mkdir kubling-grpc-client cd kubling-grpc-client go mod init example.com/kubling-grpc-client

Add the released SDK

go get github.com/kubling-community/kubling-grpc/[email protected]

Create the client

Save the following program as main.go:

package main import ( "fmt" "log" "github.com/kubling-community/kubling-grpc/sdk-go/client" "github.com/kubling-community/kubling-grpc/sdk-go/result" ) func main() { if err := run(); err != nil { log.Fatal(err) } } func run() error { cli, err := client.NewClient(client.Options{ Address: "localhost:50061", Username: "quickstart", Password: "quickstart", VDBName: "ProviderQuickstartVDB", }) if err != nil { return err } defer cli.Close() defer cli.Logout() queryResult, err := result.Query(cli, ` SELECT id, name, status, active FROM provider.PROJECT ORDER BY id `) if err != nil { return err } rows := queryResult.Rows() defer rows.Close() for rows.Next() { id, err := rows.String("id") if err != nil { return err } name, err := rows.String("name") if err != nil { return err } status, err := rows.Char("status") if err != nil { return err } active, err := rows.Bool("active") if err != nil { return err } fmt.Printf("%s | %s | %s | %t\n", id, name, status, active) } return nil }

Logout closes the logical Engine session. Close closes only the network channel. Because deferred calls run in reverse order, the example logs out before closing the channel.

Run it

go run .

Expected output:

project-1 | Provider SDK | A | true project-2 | Engine Integration | P | true

Execute a statement

Use exec.Exec for INSERT, UPDATE or DELETE statements:

import "github.com/kubling-community/kubling-grpc/sdk-go/exec" execResult, err := exec.Exec(cli, ` UPDATE provider.TASK SET completed = true WHERE id = 'task-2' `) if err != nil { return err } fmt.Printf("affected rows: %d\n", execResult.AffectedRows())

The Quickstart returns affected rows: 1. Recreating the provider container restores its initial in-memory state.

Manage a transaction

Transactions belong to the logical Kubling session represented by the token:

import "github.com/kubling-community/kubling-grpc/sdk-go/tx" transaction, err := tx.Begin(cli) if err != nil { return err } committed := false defer func() { if !committed { _ = transaction.Rollback() } }() _, err = transaction.Exec(` UPDATE provider.TASK SET completed = true WHERE id = 'task-2' `) if err != nil { return err } if err := transaction.Commit(); err != nil { return err } committed = true

Whether the physical change uses a native transaction, MVCC or compensation depends on the VDB and source capabilities. The SDK transaction controls the Engine session; it does not change those semantics.

Typed values

Rows exposes typed accessors matching Kubling logical values, including String, Bool, Byte, Short, Integer, Long, BigInteger, Float, Double, Decimal, Date, Time, Timestamp, Bytes and JSON.

Use Value(column) when the column can be NULL or when code must inspect its runtime representation. A typed accessor reports an error for NULL, an unknown column or an incompatible value type.

Sessions and concurrent clients

client.NewClient opens a channel and logs in. To intentionally reuse an existing logical session on another channel, pass cli.Token() to client.NewClientWithToken. Clients sharing a token also share transaction state and must agree on who may commit, roll back or log out.

Prefer one independently authenticated session per application workflow unless cross-channel coordination is explicitly required.

Current SDK boundaries

The gRPC wire contract streams query batches, but result.Query currently collects all batches before returning a Result. For incremental processing, use the generated QueryService client as shown in the protocol reference.

The high-level helpers also do not currently expose positional parameters, custom batch size or the returnGeneratedKeys request flag. Those features are available through the generated protobuf client.

The current connection helper tries TLS without verifying the server certificate and falls back to plaintext if that probe fails. Do not treat this automatic detection as production server-identity verification. Use a generated gRPC client configured with trusted credentials when certificate verification is required.

See the protocol reference for direct RPC access and Communication security for the Engine listener.

Last updated on