@asla/yoursql 0.8.10 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  import type { SqlStatementDataset } from "../sql_gen/mod.ts";
2
2
  import { DbQuery } from "./DbQuery.ts";
3
3
  import type { MultipleQueryResult, QueryRowsResult, DbQueryBase } from "./DbQueryBase.ts";
4
- import type { StringLike, TransactionMode } from "./interfaces.ts";
4
+ import type { SqlLike, TransactionMode } from "./interfaces.ts";
5
5
  /**
6
6
 
7
7
  /**
@@ -13,8 +13,8 @@ export declare class DbPoolConnection extends DbQuery {
13
13
  constructor(conn: DbQueryBase, onRelease: (conn: DbQueryBase) => void);
14
14
  begin(mode?: TransactionMode): Promise<void>;
15
15
  query<T = any>(sql: SqlStatementDataset<T>): Promise<QueryRowsResult<T>>;
16
- query<T = any>(sql: StringLike): Promise<QueryRowsResult<T>>;
17
- multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: StringLike): Promise<T>;
16
+ query<T = any>(sql: SqlLike): Promise<QueryRowsResult<T>>;
17
+ multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: SqlLike | SqlLike[]): Promise<T>;
18
18
  rollback(): Promise<void>;
19
19
  commit(): Promise<void>;
20
20
  get released(): boolean;
@@ -2,7 +2,7 @@ import type { SqlStatementDataset } from "../sql_gen/mod.ts";
2
2
  import { DbQuery } from "./DbQuery.ts";
3
3
  import type { MultipleQueryResult, QueryRowsResult } from "./DbQueryBase.ts";
4
4
  import type { DbPoolConnection } from "./DbPoolConnection.ts";
5
- import type { DbTransaction, StringLike, TransactionMode } from "./interfaces.ts";
5
+ import type { DbTransaction, SqlLike, TransactionMode } from "./interfaces.ts";
6
6
  /** @public */
7
7
  export type DbPoolTransactionOption = {
8
8
  errorRollback?: boolean;
@@ -21,9 +21,9 @@ export declare class DbPoolTransaction extends DbQuery implements DbTransaction
21
21
  savePoint(savePoint: string): Promise<void>;
22
22
  rollbackTo(savePoint: string): Promise<void>;
23
23
  query<T extends object = any>(sql: SqlStatementDataset<T>): Promise<QueryRowsResult<T>>;
24
- query<T extends object = any>(sql: StringLike): Promise<QueryRowsResult<T>>;
24
+ query<T extends object = any>(sql: SqlLike): Promise<QueryRowsResult<T>>;
25
25
  multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: SqlStatementDataset<T>): Promise<T>;
26
- multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: StringLike): Promise<T>;
26
+ multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: SqlLike | SqlLike[]): Promise<T>;
27
27
  get released(): boolean;
28
28
  [Symbol.asyncDispose](): Promise<void>;
29
29
  }
@@ -18,19 +18,20 @@ class DbPoolTransaction extends DbQuery {
18
18
  this.#errorRollback = option.errorRollback;
19
19
  }
20
20
  }
21
- this.#query = (sql) => {
21
+ this.#query = ((sql, multiple) => {
22
22
  return new Promise((resolve, reject) => {
23
23
  this.#pending = connect()
24
24
  .then((conn) => {
25
25
  this.#conn = conn;
26
- const promise = conn.multipleQuery("BEGIN" + (this.mode ? " TRANSACTION ISOLATION LEVEL " + this.mode : "") + ";\n" + sql);
26
+ const begin = "BEGIN" + (this.mode ? " TRANSACTION ISOLATION LEVEL " + this.mode : "");
27
+ const promise = conn.multipleQuery([begin, sql]);
27
28
  this.#pending = promise;
28
29
  this.#query = this.#queryAfter;
29
30
  return promise;
30
31
  })
31
32
  .then((res) => {
32
33
  this.#pending = undefined;
33
- resolve(res[1]);
34
+ resolve(multiple ? res.slice(1) : res[1]);
34
35
  }, (e) => {
35
36
  // 语法错误、查询错误、网络错误
36
37
  this.#pending = undefined;
@@ -50,7 +51,7 @@ class DbPoolTransaction extends DbQuery {
50
51
  onFinally();
51
52
  });
52
53
  });
53
- };
54
+ });
54
55
  }
55
56
  #pending;
56
57
  #conn;
@@ -78,13 +79,14 @@ class DbPoolTransaction extends DbQuery {
78
79
  rollbackTo(savePoint) {
79
80
  return this.query("ROLLBACK TO " + savePoint).then(() => { });
80
81
  }
81
- /** 拿到连接后执行这个 */
82
- #queryAfter(sql) {
82
+ #queryAfter(sql, multiple) {
83
83
  const conn = this.#conn;
84
- return conn.query(sql).then((res) => {
84
+ const onFinish = (res) => {
85
+ this.#query = this.#queryAfter;
85
86
  this.#pending = undefined;
86
87
  return res;
87
- }, (e) => {
88
+ };
89
+ const onError = (e) => {
88
90
  this.#pending = undefined;
89
91
  if (this.#errorRollback) {
90
92
  const onOk = () => {
@@ -97,7 +99,11 @@ class DbPoolTransaction extends DbQuery {
97
99
  this.#release(conn, e);
98
100
  throw e;
99
101
  }
100
- });
102
+ };
103
+ if (multiple)
104
+ return conn.multipleQuery(sql).then(onFinish, onError);
105
+ else
106
+ return conn.query(sql).then(onFinish, onError);
101
107
  }
102
108
  #query;
103
109
  query(sql) {
@@ -108,7 +114,7 @@ class DbPoolTransaction extends DbQuery {
108
114
  multipleQuery(sql) {
109
115
  if (this.#pending)
110
116
  return Promise.reject(new ParallelQueryError());
111
- return this.#query(sql);
117
+ return this.#query(sql, true);
112
118
  }
113
119
  #error;
114
120
  #release(conn, error = new ConnectionNotAvailableError("Connection already release")) {
@@ -1,22 +1,22 @@
1
1
  import type { SqlStatementDataset } from "../sql_gen/mod.ts";
2
- import { StringLike } from "./interfaces.ts";
2
+ import { SqlLike } from "./interfaces.ts";
3
3
  import { MultipleQueryResult, DbQueryBase, QueryRowsResult } from "./DbQueryBase.ts";
4
4
  /**
5
5
  * SQL 查询相关操作
6
6
  * @public
7
7
  */
8
8
  export declare abstract class DbQuery implements DbQueryBase {
9
- abstract query<T = any>(sql: StringLike): Promise<QueryRowsResult<T>>;
10
- abstract multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: StringLike): Promise<T>;
9
+ abstract query<T = any>(sql: SqlLike): Promise<QueryRowsResult<T>>;
10
+ abstract multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: SqlLike | SqlLike[]): Promise<T>;
11
11
  /** 单语句查询受影响的行 */
12
- queryCount(sql: string | StringLike): Promise<number>;
12
+ queryCount(sql: SqlLike): Promise<number>;
13
13
  /** 单语句查询,不应查询多语句,否则返回错误值 */
14
14
  queryRows<T = any>(sql: SqlStatementDataset<T>): Promise<T[]>;
15
15
  /** 单语句查询,不应查询多语句,否则返回错误值 */
16
- queryRows<T = any>(sql: StringLike): Promise<T[]>;
16
+ queryRows<T = any>(sql: SqlLike): Promise<T[]>;
17
17
  /** 单语句查询,只返回第一行。如果查询没有返回行,则抛出异常。 */
18
18
  queryFirstRow<T = any>(sql: SqlStatementDataset<T>): Promise<T>;
19
- queryFirstRow<T = any>(sql: StringLike): Promise<T>;
19
+ queryFirstRow<T = any>(sql: SqlLike): Promise<T>;
20
20
  /**
21
21
  * 查询行
22
22
  * 不应查询单条语句,否则返回错误值
@@ -26,7 +26,7 @@ export declare abstract class DbQuery implements DbQueryBase {
26
26
  * 查询行
27
27
  * 不应查询单语句,否则返回错误值
28
28
  */
29
- multipleQueryRows<T extends any[] = any[]>(sql: StringLike): Promise<T[]>;
29
+ multipleQueryRows<T extends any[] = any[]>(sql: SqlLike): Promise<T[]>;
30
30
  /**
31
31
  * 指定某一列为key,返回 key 到 row 的映射
32
32
  * 单语句查询,不应查询多语句,否则返回错误值
@@ -36,6 +36,6 @@ export declare abstract class DbQuery implements DbQueryBase {
36
36
  * 指定某一列为key,返回 key 到 row 的映射
37
37
  * 单语句查询,不应查询多语句,否则返回错误值
38
38
  */
39
- queryMap<T extends Record<string, any> = Record<string, any>, K extends keyof T = string>(sql: StringLike, key: K): Promise<Map<T[K], T>>;
39
+ queryMap<T extends Record<string, any> = Record<string, any>, K extends keyof T = string>(sql: SqlLike, key: K): Promise<Map<T[K], T>>;
40
40
  }
41
41
  //# sourceMappingURL=DbQuery.d.ts.map
@@ -5,27 +5,27 @@
5
5
  class DbQuery {
6
6
  /** 单语句查询受影响的行 */
7
7
  queryCount(sql) {
8
- return this.query(sql.toString()).then((res) => {
8
+ return this.query(sql).then((res) => {
9
9
  if (res.rowCount === null)
10
10
  return 0;
11
11
  return res.rowCount;
12
12
  });
13
13
  }
14
14
  queryRows(sql) {
15
- return this.query(sql.toString()).then((res) => res.rows);
15
+ return this.query(sql).then((res) => res.rows);
16
16
  }
17
17
  queryFirstRow(sql) {
18
- return this.query(sql.toString()).then(({ rows, rowCount }) => {
18
+ return this.query(sql).then(({ rows, rowCount }) => {
19
19
  if (rows.length === 0)
20
20
  throw new Error("Query did not return any rows");
21
21
  return rows[0];
22
22
  });
23
23
  }
24
24
  multipleQueryRows(sql) {
25
- return this.multipleQuery(sql.toString()).then((res) => res.map((item) => item.rows ?? []));
25
+ return this.multipleQuery(sql).then((res) => res.map((item) => item.rows ?? []));
26
26
  }
27
27
  async queryMap(sql, key) {
28
- const { rows } = await this.query(sql.toString());
28
+ const { rows } = await this.query(sql);
29
29
  let map = new Map();
30
30
  for (let i = 0; i < rows.length; i++) {
31
31
  map.set(rows[i][key], rows[i]);
@@ -1,5 +1,5 @@
1
1
  import type { SqlStatementDataset } from "../sql_gen/mod.ts";
2
- import { StringLike } from "./interfaces.ts";
2
+ import { SqlLike } from "./interfaces.ts";
3
3
  /** @public */
4
4
  export interface SingleQueryResult {
5
5
  rowCount: number;
@@ -19,8 +19,10 @@ export interface DbQueryBase {
19
19
  /** 单语句查询,不应查询多语句,否则返回错误值 */
20
20
  query<T = any>(sql: SqlStatementDataset<T>): Promise<QueryRowsResult<T>>;
21
21
  /** 单语句查询,不应查询多语句,否则返回错误值 */
22
- query<T = any>(sql: StringLike): Promise<QueryRowsResult<T>>;
22
+ query<T = any>(sql: SqlLike): Promise<QueryRowsResult<T>>;
23
23
  /** 多语句查询 */
24
- multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: StringLike): Promise<T>;
24
+ multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: SqlLike | SqlLike[]): Promise<T>;
25
25
  }
26
+ /** @public */
27
+ export declare function sqlLikeToString(sqlLike: SqlLike): string;
26
28
  //# sourceMappingURL=DbQueryBase.d.ts.map
@@ -0,0 +1,11 @@
1
+ /** @public */
2
+ function sqlLikeToString(sqlLike) {
3
+ if (typeof sqlLike === "string") {
4
+ return sqlLike;
5
+ }
6
+ else {
7
+ return sqlLike.genSql();
8
+ }
9
+ }
10
+
11
+ export { sqlLikeToString };
@@ -59,10 +59,10 @@ export interface DbQueryPool extends DbQuery {
59
59
  totalCount: number;
60
60
  begin(mode?: TransactionMode): DbTransaction;
61
61
  cursor<T extends {}>(sql: SqlStatementDataset<T>): Promise<DbCursor<T>>;
62
- cursor<T>(sql: StringLike, option?: DbCursorOption): Promise<DbCursor<T>>;
62
+ cursor<T>(sql: SqlLike, option?: DbCursorOption): Promise<DbCursor<T>>;
63
63
  }
64
64
  /** @public */
65
- export type StringLike = {
66
- toString(): string;
65
+ export type SqlLike = {
66
+ genSql(): string;
67
67
  } | string;
68
68
  //# sourceMappingURL=interfaces.d.ts.map
@@ -1,4 +1,5 @@
1
1
  export { ConnectionNotAvailableError, ParallelQueryError } from './errors.js';
2
+ export { sqlLikeToString } from './DbQueryBase.js';
2
3
  export { DbQuery } from './DbQuery.js';
3
4
  export { DbCursor } from './DbCursor.js';
4
5
  export { DbPoolConnection } from './DbPoolConnection.js';
@@ -1,7 +1,9 @@
1
1
  /** @public */
2
2
  export declare abstract class SqlStatement {
3
3
  /** 获取 SQL 语句 */
4
- abstract toString(): string;
4
+ toString(): string;
5
+ /** 获取 SQL 语句 */
6
+ abstract genSql(): string;
5
7
  }
6
8
  /**
7
9
  * 可选择项。可以是 table、查询结果等,它能被 select 语句选择
@@ -34,7 +36,7 @@ export declare abstract class SqlStatementDataset<T> extends SqlStatement implem
34
36
  export declare class SqlTextStatementDataset<T> extends SqlStatementDataset<T> {
35
37
  readonly sql: string;
36
38
  constructor(sql: string);
37
- toString(): string;
39
+ genSql(): string;
38
40
  }
39
41
  /**
40
42
  * 推断查询结果的类型
@@ -1,5 +1,9 @@
1
1
  /** @public */
2
2
  class SqlStatement {
3
+ /** 获取 SQL 语句 */
4
+ toString() {
5
+ return this.genSql();
6
+ }
3
7
  }
4
8
  /** @public */
5
9
  class SqlStatementDataset extends SqlStatement {
@@ -9,7 +13,7 @@ class SqlStatementDataset extends SqlStatement {
9
13
  * 如果是 选择语句,则是 (xxx)
10
14
  */
11
15
  toSelect() {
12
- return "(" + this.toString() + ")";
16
+ return "(" + this.genSql() + ")";
13
17
  }
14
18
  }
15
19
  /** @public */
@@ -19,7 +23,7 @@ class SqlTextStatementDataset extends SqlStatementDataset {
19
23
  super();
20
24
  this.sql = sql;
21
25
  }
22
- toString() {
26
+ genSql() {
23
27
  return this.sql;
24
28
  }
25
29
  }
@@ -8,7 +8,7 @@ export declare class SqlChainModify<T extends TableType = {}> extends SqlStateme
8
8
  returning<R extends {}>(returns: Constructable<SelectParam | "*">): SqlStatementDataset<R>;
9
9
  onConflict(onConflict: Constructable<readonly string[] | string>): ChainAfterConflictDo<T>;
10
10
  where(where: Constructable<ConditionParam | void>): ChainModifyReturning<T>;
11
- toString(): string;
11
+ genSql(): string;
12
12
  }
13
13
  export declare class SqlInsertConflictBranch<T extends TableType = {}> implements ChainAfterConflictDo<T> {
14
14
  readonly sql: string;
@@ -18,7 +18,7 @@ class SqlChainModify extends SqlStatement {
18
18
  else {
19
19
  columnsStr = selectColumns(returns);
20
20
  }
21
- let sql = this.toString() + "\nRETURNING " + columnsStr;
21
+ let sql = this.genSql() + "\nRETURNING " + columnsStr;
22
22
  return new SqlTextStatementDataset(sql);
23
23
  }
24
24
  onConflict(onConflict) {
@@ -26,14 +26,14 @@ class SqlChainModify extends SqlStatement {
26
26
  onConflict = onConflict();
27
27
  if (typeof onConflict !== "string")
28
28
  onConflict = onConflict.join(",");
29
- let sql = this.toString() + `\nON CONFLICT (${onConflict})`;
29
+ let sql = this.genSql() + `\nON CONFLICT (${onConflict})`;
30
30
  return new SqlInsertConflictBranch(sql);
31
31
  }
32
32
  where(where$1) {
33
33
  const sql = where(where$1);
34
- return new SqlChainModify(this.toString() + sql);
34
+ return new SqlChainModify(this.genSql() + sql);
35
35
  }
36
- toString() {
36
+ genSql() {
37
37
  return this.sql;
38
38
  }
39
39
  }
@@ -8,10 +8,10 @@ var _a;
8
8
  */
9
9
  class SqlSelectChain extends SqlTextStatementDataset {
10
10
  where(param) {
11
- return new SqlSelectChain(this.toString() + where(param));
11
+ return new SqlSelectChain(this.genSql() + where(param));
12
12
  }
13
13
  groupBy(columns) {
14
- let sql = this.toString();
14
+ let sql = this.genSql();
15
15
  if (typeof columns === "string")
16
16
  sql += " GROUP BY " + columns;
17
17
  else
@@ -19,13 +19,13 @@ class SqlSelectChain extends SqlTextStatementDataset {
19
19
  return new SqlSelectChain(sql);
20
20
  }
21
21
  having(param) {
22
- return new SqlSelectChain(this.toString() + having(param));
22
+ return new SqlSelectChain(this.genSql() + having(param));
23
23
  }
24
24
  orderBy(param) {
25
- return new SqlSelectChain(this.toString() + orderBy(param));
25
+ return new SqlSelectChain(this.genSql() + orderBy(param));
26
26
  }
27
27
  limit(limit, offset) {
28
- let sql = this.toString();
28
+ let sql = this.genSql();
29
29
  let type;
30
30
  if (limit) {
31
31
  type = typeof limit;
@@ -276,7 +276,7 @@ class YourValuesAs extends SqlStatementDataset {
276
276
  toSelect() {
277
277
  return this.#sql;
278
278
  }
279
- toString() {
279
+ genSql() {
280
280
  return this.#sql;
281
281
  }
282
282
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asla/yoursql",
3
- "version": "0.8.10",
3
+ "version": "0.9.1",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "types": "./dist/mod.d.ts",