{"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":"../.."}
|