/* Libraries */ import * as SQLite from 'expo-sqlite' import type { WebSQLDatabase } from 'expo-sqlite' /* Types */ type Databases = { [key: string]: WebSQLDatabase } /* Constants */ const databases: Databases = {} /** * @author HPro Informática * * @version 1.0.1 * @param databaseName */ export function openDatabase(databaseName: string = 'hpro'): SQLite.WebSQLDatabase { let database = databases[databaseName] if (!database) { database = SQLite.openDatabase(`${databaseName}.db`) databases[databaseName] = database } return database } /** * @author HPro Informática * * @version 1.0.2 * @description * Essa função deve ser utilizada para se obter facilmente resultado de queries. * NÃO utilizar dentro do contexto da chamada transactionAsync(). * @param SqlExpression * @param args * @param databaseName */ export async function executeSqlAsync(SqlExpression: string, args: (number | string)[] = [], databaseName: string = 'hpro') { if (!SqlExpression) { throw new Error('É obrigatório informar uma expressão SQL.') } const database = openDatabase(databaseName) return new Promise((resolve, reject) => { database.transaction((transaction) => transaction.executeSql( SqlExpression, args, (transaction, resultSet) => { transaction return resolve(resultSet) }, (transaction, error) => { transaction reject(error) return false } ) ) }) } /** * @author HPro Informática * * @version 1.0.2 * @description * As chamadas SQL dentro da transactionAsync() devem ser executadas usando * a API do SQLite. Ou seja, utilizar a referência 'transaction' que é passada como * argumento para 'callback' para realizar as chamadas transaction.executeSql(). * * NÃO deve ser utilizada a função executeSqlAsync() desse wrapper uma vez que ela * não executará dentro da transação corrente. * * Foi decidido por não construir uma chamada que aceitaria a execução da * executeSqlAsync() pela verbosidade excessiva e por forçar a utilização * do Promise.all([]) para a execução dd executeSqlAsync() dentro do contexto da * transactionAsync(). * @param callback * @param databaseName */ export async function transactionAsync(callback: (transaction: SQLite.SQLTransaction) => void, databaseName: string = 'hpro'): Promise { const database = openDatabase(databaseName) return new Promise((resolve, reject) => { database.transaction((transaction) => callback(transaction), (error: SQLite.SQLError) => reject(error), () => resolve() ) }) }