From e59dac81ec54b38925f33be6b008501f74c8a10d Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Fri, 7 Apr 2023 21:57:44 +0800 Subject: [PATCH] Refine project operation --- api/__init__.py | 2 +- api/project.py | 31 ++++++++++++++----------------- main.py | 4 ---- test_tjnetwork.py | 17 ----------------- tjnetwork.py | 3 --- 5 files changed, 15 insertions(+), 42 deletions(-) diff --git a/api/__init__.py b/api/__init__.py index 7af0370..d0ff572 100644 --- a/api/__init__.py +++ b/api/__init__.py @@ -1,5 +1,5 @@ from .project import list_project, have_project, create_project, delete_project, clean_project -from .project import is_project_open, get_project_open_count, open_project, close_project +from .project import is_project_open, open_project, close_project from .project import copy_project from .inp_in import read_inp, import_inp diff --git a/api/project.py b/api/project.py index 0db3c7b..78c7cb4 100644 --- a/api/project.py +++ b/api/project.py @@ -4,10 +4,9 @@ from .connection import g_conn_dict as conn # no undo/redo -_project_open_count: dict[str, int] = {} - _server_databases = ['template0', 'template1', 'postgres', 'project'] + def list_project() -> list[str]: ps = [] with pg.connect(conninfo="dbname=postgres host=127.0.0.1", autocommit=True) as conn: @@ -16,25 +15,31 @@ def list_project() -> list[str]: ps.append(p['datname']) return ps + def have_project(name: str) -> bool: with pg.connect(conninfo="dbname=postgres host=127.0.0.1", autocommit=True) as conn: with conn.cursor() as cur: cur.execute(f"select * from pg_database where datname = '{name}'") return cur.rowcount > 0 + def copy_project(source: str, new: str) -> None: with pg.connect(conninfo="dbname=postgres host=127.0.0.1", autocommit=True) as conn: with conn.cursor() as cur: cur.execute(f"create database {new} with template = {source}") + def create_project(name: str) -> None: return copy_project('project', name) + def delete_project(name: str) -> None: with pg.connect(conninfo="dbname=postgres host=127.0.0.1", autocommit=True) as conn: with conn.cursor() as cur: + cur.execute(f"select pg_terminate_backend(pid) from pg_stat_activity where datname = '{name}'") cur.execute(f"drop database {name}") + def clean_project(excluded: list[str] = []) -> None: projects = list_project() with pg.connect(conninfo="dbname=postgres host=127.0.0.1", autocommit=True) as conn: @@ -50,25 +55,17 @@ def clean_project(excluded: list[str] = []) -> None: cur.execute(f"select pg_terminate_backend(pid) from pg_stat_activity where datname = '{project}'") cur.execute(f"drop database {project}") -def open_project(name: str) -> None: - if name not in _project_open_count: - conn[name] = pg.connect(conninfo=f"dbname={name} host=127.0.0.1", autocommit=True) - _project_open_count[name] = 0 - _project_open_count[name] += 1 +def open_project(name: str) -> None: + if name not in conn: + conn[name] = pg.connect(conninfo=f"dbname={name} host=127.0.0.1", autocommit=True) + def is_project_open(name: str) -> bool: return name in conn -def get_project_open_count(name: str) -> int: - if is_project_open(name): - return _project_open_count[name] - return 0 def close_project(name: str) -> None: - if name in _project_open_count: - _project_open_count[name] -= 1 - if _project_open_count[name] == 0: - conn[name].close() - del conn[name] - del _project_open_count[name] + if name in conn: + conn[name].close() + del conn[name] diff --git a/main.py b/main.py index 354885f..ea78c3d 100644 --- a/main.py +++ b/main.py @@ -58,10 +58,6 @@ async def fastapi_delete_project(network: str): async def fastapi_is_project_open(network: str): return is_project_open(network) -@app.get('/getprojectopencount/') -async def fastapi_get_project_open_count(network: str) -> int: - return get_project_open_count(network) - @app.post("/openproject/") async def fastapi_open_project(network: str): open_project(network) diff --git a/test_tjnetwork.py b/test_tjnetwork.py index 1271e93..8fd2532 100644 --- a/test_tjnetwork.py +++ b/test_tjnetwork.py @@ -27,43 +27,26 @@ class TestApi: assert not have_project(p) assert not is_project_open(p) - assert get_project_open_count(p) == 0 create_project(p) assert have_project(p) assert not is_project_open(p) - assert get_project_open_count(p) == 0 open_project(p) assert have_project(p) assert is_project_open(p) - assert get_project_open_count(p) == 1 - - open_project(p) - - assert have_project(p) - assert is_project_open(p) - assert get_project_open_count(p) == 2 close_project(p) - assert have_project(p) - assert is_project_open(p) - assert get_project_open_count(p) == 1 - - close_project(p) - assert have_project(p) assert not is_project_open(p) - assert get_project_open_count(p) == 0 delete_project(p) assert not have_project(p) assert not is_project_open(p) - assert get_project_open_count(p) == 0 # operation diff --git a/tjnetwork.py b/tjnetwork.py index 35867da..76e06eb 100644 --- a/tjnetwork.py +++ b/tjnetwork.py @@ -185,9 +185,6 @@ def clean_project(excluded: list[str] = []) -> None: def is_project_open(name: str) -> bool: return api.is_project_open(name) -def get_project_open_count(name: str) -> int: - return api.get_project_open_count(name) - def open_project(name: str) -> None: return api.open_project(name)