1import type * as spanner from "@distilled.cloud/gcp/spanner_v1";
2import type * as Effect from "effect/Effect";
3import * as Binding from "../../Binding.ts";
4import type { RuntimeContext } from "../../RuntimeContext.ts";
5import type { Database } from "./Database.ts";
6
7export interface ExecuteSqlRequest extends spanner.ExecuteSqlRequest {}
8
9export type ExecuteSqlError =
10 | spanner.CreateProjectsInstancesDatabasesSessionsError
11 | spanner.ExecuteSqlProjectsInstancesDatabasesSessionsError;
12
13/**
14 * Runtime binding for Spanner `sessions.executeSql`.
15 *
16 * Bind this operation to a {@link Database} in a Function/Action init
17 * phase. Provide {@link ExecuteSqlHttp}. Statements run on one
18 * multiplexed session per database, created on first use and reused for
19 * the life of the runtime instance.
20 *
21 * ### Executing SQL
22 * **Example:** Run a query
23 * ```typescript
24 * const executeSql = yield* GCP.Spanner.ExecuteSql(database);
25 * const result = yield* executeSql({ sql: "SELECT 1 AS n" });
26 * ```
27 *
28 * @binding
29 * @category Spanner
30 */
31export interface ExecuteSql extends Binding.Service<
32 ExecuteSql,
33 "GCP.Spanner.ExecuteSql",
34 (
35 database: Database,
36 ) => Effect.Effect<
37 (
38 request: ExecuteSqlRequest,
39 ) => Effect.Effect<spanner.ResultSet, ExecuteSqlError, RuntimeContext>
40 >
41> {}
42
43export const ExecuteSql = Binding.Service<ExecuteSql>("GCP.Spanner.ExecuteSql");