diff --git a/packages/drizzle-duckdb-wasm/README.md b/packages/drizzle-duckdb-wasm/README.md index 9ffd5ba34..9199b314e 100644 --- a/packages/drizzle-duckdb-wasm/README.md +++ b/packages/drizzle-duckdb-wasm/README.md @@ -41,42 +41,42 @@ export const users = pgTable('users', () => ({ drizzle-kit generate ``` -```vue +```html ``` @@ -133,3 +133,7 @@ async function main() { await client.close() } ``` + +## Footnotes + +Check out [the package](https://github.com/moeru-ai/airi/tree/main/packages/duckdb-wasm/README.md) we made for easier call to `@duckdb/duckdb-wasm` as well! diff --git a/packages/drizzle-duckdb-wasm/src/session.ts b/packages/drizzle-duckdb-wasm/src/session.ts index 3cb70cdff..8fa4e36f1 100644 --- a/packages/drizzle-duckdb-wasm/src/session.ts +++ b/packages/drizzle-duckdb-wasm/src/session.ts @@ -1,9 +1,8 @@ import type { DuckDBWasmClient } from '@proj-airi/duckdb-wasm' -import type { Schema, StructRow } from 'apache-arrow' import type { Assume, Logger, Query, RelationalSchemaConfig, TablesRelationalConfig } from 'drizzle-orm' import type { PgDialect, PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig, SelectedFieldsOrdered } from 'drizzle-orm/pg-core' -import { beginTransaction, mapColumnData, withSavepoint } from '@proj-airi/duckdb-wasm' +import { beginTransaction, withSavepoint } from '@proj-airi/duckdb-wasm' import { entityKind, fillPlaceholders, NoopLogger } from 'drizzle-orm' import { PgPreparedQuery, PgSession, PgTransaction } from 'drizzle-orm/pg-core' @@ -11,36 +10,6 @@ export type Row = Record export type RowList = T -function toJSRepresentedRows StructRow[], schema: Schema }>(results: T) { - const rows = (results.toArray() as StructRow[] || []).map(item => item.toJSON()) || [] - - const jsRepresentedRows = rows.map((row) => { - results.schema.fields.forEach((field) => { - return row[field.name] = mapColumnData(row[field.name], field) - }) - - return row - }) - - return jsRepresentedRows -} - -async function callQuery(client: Promise, query: string, params: unknown[]) { - const c = await client - - if (!params || params.length === 0) { - const results = await c.conn.query(query) - return toJSRepresentedRows(results) - } - - const stmt = await c.conn.prepare(query) - const results = await stmt.query(...params) - const rows = toJSRepresentedRows(results) - - stmt.close() - return rows -} - export class DuckDBWASMPreparedQuery extends PgPreparedQuery { static override readonly [entityKind]: string = 'DuckDBWasmPreparedQuery' @@ -60,17 +29,21 @@ export class DuckDBWASMPreparedQuery extends PgPr this.logger.logQuery(this.queryString, params) const { fields, queryString: query, client, customResultMapper } = this + const c = await client + if (!fields && !customResultMapper) { - return callQuery(client, query, params) + return c.query(query, params) } - return callQuery(client, query, params) + return c.query(query, params) } async all(placeholderValues: Record | undefined = {}): Promise { const params = fillPlaceholders(this.params, placeholderValues) this.logger.logQuery(this.queryString, params) - return callQuery(this.client, this.queryString, params) + + const c = await this.client + return c.query(this.queryString, params) } } @@ -116,7 +89,8 @@ export class DuckDBWasmSession< async query(query: string, params: unknown[]): Promise> { this.logger.logQuery(query, params) - return callQuery(this.client, query, params) + const c = await this.client + return c.query(query, params) } async queryObjects( @@ -124,7 +98,8 @@ export class DuckDBWasmSession< params: unknown[], ): Promise> { this.logger.logQuery(query, params) - return callQuery(this.client, query, params) as Promise> + const c = await this.client + return c.query(query, params) as Promise> } override transaction( diff --git a/packages/duckdb-wasm/README.md b/packages/duckdb-wasm/README.md index 6e3699aff..cdc7e7ac4 100644 --- a/packages/duckdb-wasm/README.md +++ b/packages/duckdb-wasm/README.md @@ -17,25 +17,25 @@ npm i @proj-airi/duckdb-wasm -D ### Browser -```vue +```html ``` @@ -62,3 +62,7 @@ async function main() { await close() } ``` + +## Footnotes + +Check out the [Drizzle ORM driver](https://github.com/moeru-ai/airi/blob/main/packages/drizzle-duckdb-wasm/README.md) we made for `@duckdb/duckdb-wasm` as welL! diff --git a/packages/duckdb-wasm/src/common.ts b/packages/duckdb-wasm/src/common.ts index 3fea205aa..1605ecb8b 100644 --- a/packages/duckdb-wasm/src/common.ts +++ b/packages/duckdb-wasm/src/common.ts @@ -36,6 +36,4 @@ export async function getEnvironment() { catch { return 'unknown' } - - return 'unknown' } diff --git a/packages/duckdb-wasm/src/duckdb.ts b/packages/duckdb-wasm/src/duckdb.ts index 165cfce6d..8a14617c3 100644 --- a/packages/duckdb-wasm/src/duckdb.ts +++ b/packages/duckdb-wasm/src/duckdb.ts @@ -4,6 +4,7 @@ import { AsyncDuckDB, ConsoleLogger, selectBundle, VoidLogger } from '@duckdb/du import { defu } from 'defu' import { getEnvironment } from './common' +import { mapStructRowData } from './format' export type ConnectOptions = ConnectRequiredOptions & ConnectOptionalOptions @@ -21,6 +22,7 @@ export interface DuckDBWasmClient { db: AsyncDuckDB conn: AsyncDuckDBConnection close: () => Promise + query: (string, params?: unknown[]) => Promise[]> } export async function connect(options: ConnectOptions): Promise { @@ -79,6 +81,19 @@ export async function connect(options: ConnectOptions): Promise { + if (!params || params.length === 0) { + const results = await conn.query(query) + return mapStructRowData(results) + } + + const stmt = await conn.prepare(query) + const results = await stmt.query(...params) + const rows = mapStructRowData(results) + + stmt.close() + return rows + }, close: async () => { await conn.close() await db.terminate() diff --git a/packages/duckdb-wasm/src/format.ts b/packages/duckdb-wasm/src/format.ts index dd4ae2157..4a572882b 100644 --- a/packages/duckdb-wasm/src/format.ts +++ b/packages/duckdb-wasm/src/format.ts @@ -1,5 +1,5 @@ import type { TZDate } from '@date-fns/tz' -import type { Field, StructRow } from 'apache-arrow' +import type { Field, Schema, StructRow } from 'apache-arrow' import type { DataType } from './types' import { TZDateMini } from '@date-fns/tz' @@ -605,3 +605,17 @@ export function mapColumnData(x: DataType, field?: Field): T { return String(x) as T } + +export function mapStructRowData StructRow[], schema: Schema }>(results: T) { + const rows = (results.toArray() as StructRow[] || []).map(item => item.toJSON()) || [] + + const jsRepresentedRows = rows.map((row) => { + results.schema.fields.forEach((field) => { + return row[field.name] = mapColumnData(row[field.name], field) + }) + + return row + }) + + return jsRepresentedRows +}