phantasy-mysql
Version:
65 lines (57 loc) • 2.35 kB
Flow
// @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));
}