From f2ede0044bbb0b6f3a3dfbd588fb0cb8646c0b80 Mon Sep 17 00:00:00 2001 From: ET <57718207+turbotimon@users.noreply.github.com> Date: Thu, 8 Feb 2024 08:35:45 +0000 Subject: [PATCH 1/3] improve ux when trying to open sqlite without protocol --- optuna_dashboard/_storage_url.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/optuna_dashboard/_storage_url.py b/optuna_dashboard/_storage_url.py index 351f9f546..a9b49d870 100644 --- a/optuna_dashboard/_storage_url.py +++ b/optuna_dashboard/_storage_url.py @@ -1,6 +1,7 @@ from __future__ import annotations import os.path +from pathlib import Path import re from typing import TYPE_CHECKING @@ -58,11 +59,22 @@ def get_storage( return guess_storage_from_url(storage) +def _has_sqlite_suffix(storage_url: str) -> bool: + storage_path = Path(storage_url) + SQLITE_EXTENSIONS = (".db", ".sqlite3") + return storage_path.suffix in SQLITE_EXTENSIONS + + def guess_storage_from_url(storage_url: str) -> BaseStorage: if storage_url.startswith("redis"): return get_journal_redis_storage(storage_url) if os.path.isfile(storage_url): + if _has_sqlite_suffix(storage_url): + raise ValueError( + "It looks like you are trying to open a sqlite db. " + + "Please make sure you specify the driver, e.g.: sqlite:///example.db" + ) return get_journal_file_storage(storage_url) if rfc1738_pattern.match(storage_url) is not None: From 9e94da03323d8c510e87981788b78b8d4609fe12 Mon Sep 17 00:00:00 2001 From: ET <57718207+turbotimon@users.noreply.github.com> Date: Mon, 12 Feb 2024 09:57:48 +0000 Subject: [PATCH 2/3] change to check sqlite header --- optuna_dashboard/_storage_url.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/optuna_dashboard/_storage_url.py b/optuna_dashboard/_storage_url.py index a9b49d870..2d660d3d3 100644 --- a/optuna_dashboard/_storage_url.py +++ b/optuna_dashboard/_storage_url.py @@ -59,10 +59,12 @@ def get_storage( return guess_storage_from_url(storage) -def _has_sqlite_suffix(storage_url: str) -> bool: +def _has_sqlite_header(storage_url: str) -> bool: storage_path = Path(storage_url) - SQLITE_EXTENSIONS = (".db", ".sqlite3") - return storage_path.suffix in SQLITE_EXTENSIONS + SQLITE_HEADER = b"SQLite format 3\x00" # see https://github.com/optuna/optuna-dashboard/pull/800 + with storage_path.open(mode="rb") as f: + header = f.read(len(SQLITE_HEADER)) + return header == SQLITE_HEADER def guess_storage_from_url(storage_url: str) -> BaseStorage: @@ -70,12 +72,10 @@ def guess_storage_from_url(storage_url: str) -> BaseStorage: return get_journal_redis_storage(storage_url) if os.path.isfile(storage_url): - if _has_sqlite_suffix(storage_url): - raise ValueError( - "It looks like you are trying to open a sqlite db. " - + "Please make sure you specify the driver, e.g.: sqlite:///example.db" - ) - return get_journal_file_storage(storage_url) + if _has_sqlite_header(storage_url): + return get_rdb_storage("sqlite:///" + storage_url) + else: + return get_journal_file_storage(storage_url) if rfc1738_pattern.match(storage_url) is not None: return get_rdb_storage(storage_url) From d425b2f586485f52ff95e18c2442ed7823f8b80f Mon Sep 17 00:00:00 2001 From: ET <57718207+turbotimon@users.noreply.github.com> Date: Wed, 14 Feb 2024 11:22:50 +0000 Subject: [PATCH 3/3] lint --- optuna_dashboard/_storage_url.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/optuna_dashboard/_storage_url.py b/optuna_dashboard/_storage_url.py index 2d660d3d3..e272236ef 100644 --- a/optuna_dashboard/_storage_url.py +++ b/optuna_dashboard/_storage_url.py @@ -61,7 +61,9 @@ def get_storage( def _has_sqlite_header(storage_url: str) -> bool: storage_path = Path(storage_url) - SQLITE_HEADER = b"SQLite format 3\x00" # see https://github.com/optuna/optuna-dashboard/pull/800 + SQLITE_HEADER = ( + b"SQLite format 3\x00" # see https://github.com/optuna/optuna-dashboard/pull/800 + ) with storage_path.open(mode="rb") as f: header = f.read(len(SQLITE_HEADER)) return header == SQLITE_HEADER