UNPKG

phantasy-mysql

Version:
65 lines (57 loc) 2.35 kB
// @flow import type { $MYSQL, DbConnection, DbPool, ConnectionOpts, PoolOpts, QueryResult } from './effect'; import type { BuiltQuery } from './builder'; import type { QueryObj } from './sql/types'; import { EffTask, Task } from 'phantasy'; import { Query } from './builder'; import { toSql } from './builder'; export type { $MYSQL, ConnectionOpts, PoolOpts, DbConnection, DbPool, ResultRow, ResultInfo, QueryResult } from './effect'; export { Delete, Insert, Replace, Select, toSql, Update } from './builder'; export { MYSQL } from './mysql'; export { schema } from './schema'; /** * `requireMysql :: () -> EffTask { MYSQL: $MYSQL } $MYSQL Error` * * @private */ function requireMysql(): EffTask<{ MYSQL: $MYSQL }, $MYSQL, Error> { return EffTask.Requires(deps => Task.of(deps.MYSQL)); } /** * `createPool :: PoolOpts -> EffTask { MYSQL: $MYSQL } DbPool Error` */ export function createPool(opts: PoolOpts): EffTask<{ MYSQL: $MYSQL }, DbPool, Error> { return requireMysql() .andThen(mysql => EffTask.fromTask(mysql.createPool(opts))); } /** * `getConnection :: DbPool -> EffTask { MYSQL: $MYSQL } DbConnection, Error` */ export function getConnection(pool: DbPool): EffTask<{ MYSQL: $MYSQL }, DbConnection, Error> { return requireMysql() .andThen(mysql => EffTask.fromTask(mysql.getConnection(pool))); } /** * `createConnection :: ConnectionOpts -> EffTask { MYSQL: $MYSQL } DbConnection Error` */ export function createConnection(opts: ConnectionOpts): EffTask<{ MYSQL: $MYSQL }, DbConnection, Error> { return requireMysql() .andThen(mysql => EffTask.fromTask(mysql.createConnection(opts))); } /** * `query :: BuiltQuery | QueryObj -> DbConnection -> EffTask { MYSQL: $MYSQL } QueryResult Error` */ export function query<Result: QueryResult>(query: BuiltQuery | QueryObj, connection: DbConnection): EffTask<{ MYSQL: $MYSQL }, Result, Error> { return requireMysql() .andThen(mysql => { const { sql, args } = (query instanceof Query) ? toSql(query) : query; return EffTask.fromTask(mysql.query(sql, args, connection)); }); } /** * `poolQuery :: BuiltQuery | QueryObj -> DbPool -> EffTask { MYSQL: $MYSQL } QueryResult Error` */ export function poolQuery(q: BuiltQuery | QueryObj, pool: DbPool): EffTask<{ MYSQL: $MYSQL }, QueryResult, Error> { return getConnection(pool) .andThen(conn => query(q, conn)); }