>) -> Self {
- Self { schema_cache }
- }
-
- // Die zentrale Ausführungsfunktion
- pub fn execute(&self, sql: &str, conn: &Connection) -> Result<(), String> {
- // 1. Parsen des SQL-Strings in einen AST
- let dialect = SQLiteDialect {};
- let mut ast =
- Parser::parse_sql(&dialect, sql).map_err(|e| format!("SQL-Parse-Fehler: {}", e))?;
-
- // Sicherstellen, dass wir nur eine Anweisung haben
- if ast.len() != 1 {
- return Err("Nur einzelne SQL-Anweisungen werden unterstützt.".to_string());
- }
- let statement = &mut ast;
-
- // 2. Umschreiben des AST (Logik folgt in Abschnitt 2)
- self.transform_statement(statement)?;
-
- // 3. Ausführen der (möglicherweise modifizierten) Anweisung
- let final_sql = statement.to_string();
- conn.execute(&final_sql)
- .map_err(|e| format!("DB-Ausführungsfehler: {}", e))?;
-
- Ok(())
- }
-
- // Platzhalter für die Transformationslogik
- fn transform_statement(&self, statement: &mut Statement) -> Result<(), String> {
- // HIER KOMMT DIE MAGIE HIN
- // TODO: Implementierung der `CREATE TABLE`, `DELETE` und `SELECT` Transformationen
- Ok(())
- }
-}
diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs
index 86e3160..5afd18c 100644
--- a/src-tauri/src/lib.rs
+++ b/src-tauri/src/lib.rs
@@ -1,4 +1,5 @@
//mod browser;
+mod android_storage;
mod database;
mod extension;
mod models;
@@ -44,13 +45,15 @@ pub fn run() {
})
.manage(DbConnection(Arc::new(Mutex::new(None))))
.manage(ExtensionState::default())
- .plugin(tauri_plugin_notification::init())
.plugin(tauri_plugin_dialog::init())
.plugin(tauri_plugin_fs::init())
.plugin(tauri_plugin_http::init())
+ .plugin(tauri_plugin_notification::init())
.plugin(tauri_plugin_opener::init())
.plugin(tauri_plugin_os::init())
+ .plugin(tauri_plugin_persisted_scope::init())
.plugin(tauri_plugin_store::Builder::new().build())
+ .plugin(tauri_plugin_android_fs::init())
//.plugin(tauri_plugin_sql::Builder::new().build())
.invoke_handler(tauri::generate_handler![
database::create_encrypted_database,
@@ -63,6 +66,9 @@ pub fn run() {
extension::copy_directory,
extension::database::extension_sql_execute,
extension::database::extension_sql_select,
+ android_storage::request_storage_permission,
+ android_storage::has_storage_permission,
+ android_storage::get_external_storage_paths,
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json
index aa12a41..e67f0c3 100644
--- a/src-tauri/tauri.conf.json
+++ b/src-tauri/tauri.conf.json
@@ -55,7 +55,7 @@
"icons/icon.icns",
"icons/icon.ico"
],
- "resources": ["database/vault.db", "resources/"],
+ "resources": ["database/vault.db"],
"linux": {
"appimage": {
diff --git a/src/components/vault/button/create.vue b/src/components/vault/button/create.vue
index 0e9dade..2a1e259 100644
--- a/src/components/vault/button/create.vue
+++ b/src/components/vault/button/create.vue
@@ -69,6 +69,9 @@ import { save } from '@tauri-apps/plugin-dialog'
import { onKeyStroke } from '@vueuse/core'
import { useVaultStore } from '~/stores/vault'
import { vaultDatabaseSchema } from './schema'
+import { BaseDirectory, readFile, writeFile } from '@tauri-apps/plugin-fs'
+import { resolveResource } from '@tauri-apps/api/path'
+//import { convertFileSrc } from "@tauri-apps/api/tauri";
onKeyStroke('Enter', (e) => {
e.preventDefault()
@@ -123,12 +126,22 @@ const onCreateAsync = async () => {
open.value = false
try {
+ const template_vault_path = await resolveResource('database/vault.db')
+
+ const template_vault = await readFile(template_vault_path)
+
database.path = await save({
defaultPath: database.name.endsWith('.db')
? database.name
: `${database.name}.db`,
})
+ if (!database.path) return
+
+ await writeFile('temp_vault.db', template_vault, {
+ baseDir: BaseDirectory.AppLocalData,
+ })
+
console.log('data', database)
if (database.path && database.password) {
@@ -146,7 +159,7 @@ const onCreateAsync = async () => {
}
} catch (error) {
console.error(error)
- add({ type: 'error', text: JSON.stringify(error) })
+ add({ type: 'error', text: `${error}` })
}
}
diff --git a/src/components/vault/button/open.vue b/src/components/vault/button/open.vue
index 20fb502..338a504 100644
--- a/src/components/vault/button/open.vue
+++ b/src/components/vault/button/open.vue
@@ -18,7 +18,7 @@
HaexVault
-
+ Path1: {{ test }}
{{ props.path ?? database.path }}
@@ -41,6 +41,15 @@
diff --git a/src/pages/vault/[vaultId]/index.vue b/src/pages/vault/[vaultId]/index.vue
index 375fa56..8080e78 100644
--- a/src/pages/vault/[vaultId]/index.vue
+++ b/src/pages/vault/[vaultId]/index.vue
@@ -5,6 +5,8 @@
v-bind="extension"
:key="extension.id"
/>
+ Storage Request
+ res: {{ res }}
@@ -13,5 +15,17 @@ definePageMeta({
name: 'vaultOverview',
})
+const storage = useAndroidStorage()
const extensionStore = useExtensionsStore()
+
+const res = ref()
+
+const requesty = async () => {
+ try {
+ res.value = await storage.requestStoragePermission()
+ res.value += ' wat the fuk'
+ } catch (error) {
+ res.value = error
+ }
+}
diff --git a/src/stores/vault/index.ts b/src/stores/vault/index.ts
index 86c5f08..4650b62 100644
--- a/src/stores/vault/index.ts
+++ b/src/stores/vault/index.ts
@@ -51,8 +51,8 @@ export const useVaultStore = defineStore('vaultStore', () => {
if (result !== 'success') throw new Error(result)
const vaultId = await getVaultIdAsync(path)
- const seperator = platform() === 'windows' ? '\\' : '/'
- const fileName = path.split(seperator).pop()
+
+ const fileName = getFileName(path)
openVaults.value = {
...openVaults.value,
diff --git a/src/utils/androidStorage.ts b/src/utils/androidStorage.ts
new file mode 100644
index 0000000..c9d16ed
--- /dev/null
+++ b/src/utils/androidStorage.ts
@@ -0,0 +1,38 @@
+import { invoke } from '@tauri-apps/api/core'
+
+export const useAndroidStorage = () => {
+ const requestStoragePermission = async (): Promise => {
+ try {
+ return await invoke(
+ 'plugin:android-fs|openManageAllFilesAccessPermissionSettings',
+ )
+ } catch (error) {
+ console.error('Failed to request storage permission:', error)
+ throw error
+ }
+ }
+
+ const hasStoragePermission = async (): Promise => {
+ try {
+ return await invoke('has_storage_permission')
+ } catch (error) {
+ console.error('Failed to check storage permission:', error)
+ return false
+ }
+ }
+
+ const getExternalStoragePaths = async (): Promise => {
+ try {
+ return await invoke('get_external_storage_paths')
+ } catch (error) {
+ console.error('Failed to get storage paths:', error)
+ return []
+ }
+ }
+
+ return {
+ requestStoragePermission,
+ hasStoragePermission,
+ getExternalStoragePaths,
+ }
+}
diff --git a/src/utils/helper.ts b/src/utils/helper.ts
index 582ba40..9693121 100644
--- a/src/utils/helper.ts
+++ b/src/utils/helper.ts
@@ -1,3 +1,4 @@
+import { platform } from '@tauri-apps/plugin-os'
import type { LocationQueryValue, RouteLocationRawI18n } from 'vue-router'
export const bytesToBase64DataUrlAsync = async (
@@ -67,7 +68,7 @@ export const readableFileSize = (sizeInByte: number | string = 0) => {
export const getSingleRouteParam = (
param: string | string[] | LocationQueryValue | LocationQueryValue[],
): string => {
- const _param = Array.isArray(param) ? param.at(0) ?? '' : param ?? ''
+ const _param = Array.isArray(param) ? (param.at(0) ?? '') : (param ?? '')
//console.log('getSingleRouteParam found:', _param, param)
return decodeURIComponent(_param)
}
@@ -230,3 +231,8 @@ export const areObjectsEqual = (valueA: unknown, valueB: unknown): boolean => {
// 5. Wenn die Schleife durchläuft, sind die Objekte gleich
return true
}
+
+export const getFileName = (fullPath: string) => {
+ const seperator = platform() === 'windows' ? '\\' : '/'
+ return fullPath.split(seperator).pop()
+}