Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | 1x 8x 8x 8x 8x 8x 8x 8x | import { ICore, IModel, ICollection } from '../core';
export interface ICreateForDriverOptions {
core: ICore;
db: any;
logError?: (err: Error) => never;
}
export interface ICoreIntegratedDriver extends ICore {
/* ------------------------------------------------------------------------*/
/* Query methods ----------------------------------------------------------*/
/* ------------------------------------------------------------------------*/
/* Note these query methods ensure their count against the number of
* generated top level business objects which are created - not the number
* of relational rows returned from the database driver! Thus, for example,
* `one` understands that there may be multiple result rows (which a
* database driver's `one` query method would throw at) but which correctly
* nest into one Model.)
*/
// Execute a query returning a single model, or throws.
one: <T extends IModel>(
query: string,
values?: object,
errorHandler?: (err: Error) => never
) => T;
// Execute a query returning either single model or undefined, or throws.
oneOrNone: <T extends IModel>(
query: string,
values?: object,
errorHandler?: (err: Error) => never
) => T | void;
// Execute a query returning a Collection with at least one model, or throws.
many: <T extends ICollection<IModel>>(
query: string,
values?: object,
errorHandler?: (err: Error) => never
) => T;
// Execute a query returning a Collection.
any: <T extends ICollection<IModel>>(
query: string,
values?: object,
errorHandler?: (err: Error) => never
) => T | void;
// Execute a query returning null.
none: (
query: string,
values?: object,
errorHandler?: (err: Error) => never
) => void;
}
export const createForPGP = ({
core,
db,
logError
}: ICreateForDriverOptions): ICoreIntegratedDriver => {
const defaultErrorHandler = (err: Error) => {
if (!(err.name === 'QueryResultError')) {
if (logError) {
logError(err);
}
}
throw err;
};
/* ------------------------------------------------------------------------*/
/* Query functions --------------------------------------------------------*/
/* ------------------------------------------------------------------------*/
const one = <T extends IModel>(
query: string,
values?: object,
errorHandler = defaultErrorHandler
): T => {
return db
.many(query, values)
.then((rows: any) => core.createOneFromDatabase(rows))
.catch(errorHandler);
};
const oneOrNone = <T extends IModel>(
query: string,
values?: object,
errorHandler = defaultErrorHandler
): T | void => {
return db
.any(query, values)
.then((rows: any) => core.createOneOrNoneFromDatabase(rows))
.catch(errorHandler);
};
const many = <T extends ICollection<IModel>>(
query: string,
values?: object,
errorHandler = defaultErrorHandler
): T => {
return db
.any(query, values)
.then((rows: any) => core.createManyFromDatabase(rows))
.catch(errorHandler);
};
const any = <T extends ICollection<IModel>>(
query: string,
values?: object,
errorHandler = defaultErrorHandler
): T | void => {
return db
.result(query, values)
.then((result: any) =>
core.createAnyFromDatabase(
result.rows,
result.fields[0].name.split('#')[0]
)
)
.catch(errorHandler);
};
const none = (
query: string,
values?: object,
errorHandler = defaultErrorHandler
): void => {
return db
.none(query, values)
.then(() => null)
.catch(errorHandler);
};
return Object.assign({}, core, {
// Query Functions
one,
oneOrNone,
many,
any,
none,
// provide direct access to db
db
});
};
|