333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
1
{"version":3,"sources":["../../src/driver/expo/ExpoQueryRunner.ts"],"names":[],"mappings":"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","file":"ExpoQueryRunner.js","sourcesContent":["import {QueryRunnerAlreadyReleasedError} from \"../../error/QueryRunnerAlreadyReleasedError\";\nimport {QueryFailedError} from \"../../error/QueryFailedError\";\nimport {AbstractSqliteQueryRunner} from \"../sqlite-abstract/AbstractSqliteQueryRunner\";\nimport {TransactionAlreadyStartedError} from \"../../error/TransactionAlreadyStartedError\";\nimport {TransactionNotStartedError} from \"../../error/TransactionNotStartedError\";\nimport {ExpoDriver} from \"./ExpoDriver\";\nimport {Broadcaster} from \"../../subscriber/Broadcaster\";\n\n// Needed to satisfy the Typescript compiler\ninterface IResultSet {\n    insertId: number | undefined;\n    rowsAffected: number;\n    rows: {\n        length: number;\n        item: (idx: number) => any;\n        _array: any[];\n    };\n}\ninterface ITransaction {\n    executeSql: (\n        sql: string,\n        args: any[] | undefined,\n        ok: (tsx: ITransaction, resultSet: IResultSet) => void,\n        fail: (tsx: ITransaction, err: any) => void\n    ) => void;\n}\n\n/**\n * Runs queries on a single sqlite database connection.\n */\nexport class ExpoQueryRunner extends AbstractSqliteQueryRunner {\n    \n    /**\n     * Database driver used by connection.\n     */\n    driver: ExpoDriver;\n\n    /**\n     * Database transaction object\n     */\n    private transaction?: ITransaction;\n    \n    // -------------------------------------------------------------------------\n    // Constructor\n    // -------------------------------------------------------------------------\n\n    constructor(driver: ExpoDriver) {\n        super();\n        this.driver = driver;\n        this.connection = driver.connection;\n        this.broadcaster = new Broadcaster(this);\n    }\n\n    /**\n     * Starts transaction. Within Expo, all database operations happen in a\n     * transaction context, so issuing a `BEGIN TRANSACTION` command is\n     * redundant and will result in the following error:\n     * \n     * `Error: Error code 1: cannot start a transaction within a transaction`\n     * \n     * Instead, we keep track of a `Transaction` object in `this.transaction`\n     * and continue using the same object until we wish to commit the\n     * transaction.\n     */\n    async startTransaction(): Promise<void> {\n        if (this.isTransactionActive && typeof this.transaction !== \"undefined\")\n            throw new TransactionAlreadyStartedError();\n\n        this.isTransactionActive = true;\n    }\n\n    /**\n     * Commits transaction.\n     * Error will be thrown if transaction was not started.\n     * Since Expo will automatically commit the transaction once all the\n     * callbacks of the transaction object have been completed, \"committing\" a\n     * transaction in this driver's context means that we delete the transaction\n     * object and set the stage for the next transaction.\n     */\n    async commitTransaction(): Promise<void> {\n        if (!this.isTransactionActive && typeof this.transaction === \"undefined\")\n            throw new TransactionNotStartedError();\n\n        this.isTransactionActive = false;\n        this.transaction = undefined;\n    }\n\n    /**\n     * Rollbacks transaction.\n     * Error will be thrown if transaction was not started.\n     * This method's functionality is identical to `commitTransaction()` because\n     * the transaction lifecycle is handled within the Expo transaction object.\n     * Issuing separate statements for `COMMIT` or `ROLLBACK` aren't necessary.\n     */\n    async rollbackTransaction(): Promise<void> {\n        if (!this.isTransactionActive && typeof this.transaction === \"undefined\")\n            throw new TransactionNotStartedError();\n\n        this.isTransactionActive = false;\n        this.transaction = undefined;\n    }\n\n    /**\n     * Executes a given SQL query.\n     */\n    query(query: string, parameters?: any[]): Promise<any> {\n        if (this.isReleased)\n            throw new QueryRunnerAlreadyReleasedError();\n\n        return new Promise<any>(async (ok, fail) => {\n            const databaseConnection = await this.connect();\n            this.driver.connection.logger.logQuery(query, parameters, this);\n            const queryStartTime = +new Date();\n            // All Expo SQL queries are executed in a transaction context\n            databaseConnection.transaction((transaction: ITransaction) => {\n                if (typeof this.transaction === \"undefined\") {\n                    this.startTransaction();\n                    this.transaction = transaction;\n                }\n                this.transaction.executeSql(query, parameters, (t: ITransaction, result: IResultSet) => {\n                    // log slow queries if maxQueryExecution time is set\n                    const maxQueryExecutionTime = this.driver.connection.options.maxQueryExecutionTime;\n                    const queryEndTime = +new Date();\n                    const queryExecutionTime = queryEndTime - queryStartTime;\n                    if (maxQueryExecutionTime && queryExecutionTime > maxQueryExecutionTime) {\n                        this.driver.connection.logger.logQuerySlow(queryExecutionTime, query, parameters, this);\n                    }\n    \n                    // return id of inserted row, if query was insert statement.\n                    if (query.substr(0, 11) === \"INSERT INTO\") {\n                        ok(result.insertId);\n                    }\n                    else {\n                        let resultSet = [];\n                        for (let i = 0; i < result.rows.length; i++) {\n                            resultSet.push(result.rows.item(i));\n                        }\n                        ok(resultSet);\n                    }\n                }, (t: ITransaction, err: any) => {\n                    this.driver.connection.logger.logQueryError(err, query, parameters, this);\n                    fail(new QueryFailedError(query, parameters, err));\n                });\n            }, (err: any) => {\n                this.rollbackTransaction();\n            }, () => {\n                this.isTransactionActive = false;\n                this.transaction = undefined;\n            });\n        });\n    }\n}\n"],"sourceRoot":"../.."}