//created by thschleicher import * as SQLite from "expo-sqlite"; import uuid from "react-native-uuid"; import { Query } from "expo-sqlite"; const db = SQLite.openDatabase("interactive_systeme.db"); export const initDatabase = async () => { try { await db.transactionAsync(async (tx: SQLite.SQLTransactionAsync) => { await tx.executeSqlAsync( "CREATE TABLE IF NOT EXISTS category (guid VARCHAR(36) PRIMARY KEY, name TEXT, color TEXT, type TEXT);" ); await tx.executeSqlAsync( "CREATE TABLE IF NOT EXISTS expense (guid VARCHAR(36) PRIMARY KEY, name TEXT, category_guid VARCHAR(36), datetime DATETIME, amount DOUBLE, FOREIGN KEY (category_guid) REFERENCES category(guid));" ); console.log("Successfully initialized Tables!"); }); } catch (error) { console.log("Error initializing the Tables!"); throw (error); } }; export const addCategory = async (name: string, color: string, type: string) => { //needs user input validation for type and color (should be validated by this function) const UUID = uuid.v4(); try { await db.transactionAsync(async (tx) => { await tx.executeSqlAsync("INSERT INTO category (guid, name, color, type) VALUES (?, ?, ?, ?);", [UUID.toString(), name, color, type] ); }); console.log("Category added successfully!"); } catch (error) { console.log("Error adding category: ", error); throw error; } } export const addExpense = async (name: string, category_guid: string,datetime: string, amount: number) => { //needs user input validation for type and color (should be validated by this function) const expenseUUID = uuid.v4(); try { await db.transactionAsync(async (tx) => { await tx.executeSqlAsync("INSERT INTO expense (guid, name, category_guid, datetime, amount) VALUES (?, ?, ?, ?, ?);", [expenseUUID.toString(), name, category_guid, datetime, amount] ); }); console.log("Expense added successfully!"); } catch (error) { console.log("Error adding expense: ", error); throw error; } }; export const deleteCategory = async (guid: string) => { try { await db.transactionAsync(async (tx: SQLite.SQLTransactionAsync) => { await tx.executeSqlAsync("DELETE FROM category WHERE guid = ?;", [guid]); }); } catch(error) { console.log("Error deleting category: ", error); throw error; } } export const deleteExpense = async (guid: string) => { try { await db.transactionAsync(async (tx: SQLite.SQLTransactionAsync) => { await tx.executeSqlAsync("DELETE FROM expense WHERE guid = ?;", [guid]); }); } catch(error) { console.log("Error deleting expense: ", error); throw error; } } export const executeQuery = async (query: string) => { const sqliteQuary: Query[] = [{sql: query, args: []}]; const result = await runQuery(sqliteQuary); if("rows" in result[0]) { return result[0]["rows"]; } console.error("Query could not be executed!"); }; export const deleteExpenses = async () => { try { await db.transactionAsync(async (tx: SQLite.SQLTransactionAsync) => { await tx.executeSqlAsync("DELETE FROM expense;"); }); } catch(error) { console.log("Error deleting expense: ", error); throw error; } } export const deleteDatabase = () => { closeDatabase().then(() => { try { db.deleteAsync() } catch (error) { console.log("Error deleting the Database: ", error); throw error; } }); console.log("Database Deleted!") } const runQuery = async (query: Query[]) => { try { return await db.execAsync(query, true); } catch (error) { console.log("Error running Quary: ", error); throw(error); } }; const closeDatabase = async () => { try { db.closeAsync(); } catch (error) { console.log("Error, cant close database: ", error); throw error; } }