Refine project operation

This commit is contained in:
WQY\qiong
2023-04-07 21:57:44 +08:00
parent da80d689ed
commit e59dac81ec
5 changed files with 15 additions and 42 deletions

View File

@@ -1,5 +1,5 @@
from .project import list_project, have_project, create_project, delete_project, clean_project 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 .project import copy_project
from .inp_in import read_inp, import_inp from .inp_in import read_inp, import_inp

View File

@@ -4,10 +4,9 @@ from .connection import g_conn_dict as conn
# no undo/redo # no undo/redo
_project_open_count: dict[str, int] = {}
_server_databases = ['template0', 'template1', 'postgres', 'project'] _server_databases = ['template0', 'template1', 'postgres', 'project']
def list_project() -> list[str]: def list_project() -> list[str]:
ps = [] ps = []
with pg.connect(conninfo="dbname=postgres host=127.0.0.1", autocommit=True) as conn: 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']) ps.append(p['datname'])
return ps return ps
def have_project(name: str) -> bool: def have_project(name: str) -> bool:
with pg.connect(conninfo="dbname=postgres host=127.0.0.1", autocommit=True) as conn: with pg.connect(conninfo="dbname=postgres host=127.0.0.1", autocommit=True) as conn:
with conn.cursor() as cur: with conn.cursor() as cur:
cur.execute(f"select * from pg_database where datname = '{name}'") cur.execute(f"select * from pg_database where datname = '{name}'")
return cur.rowcount > 0 return cur.rowcount > 0
def copy_project(source: str, new: str) -> None: def copy_project(source: str, new: str) -> None:
with pg.connect(conninfo="dbname=postgres host=127.0.0.1", autocommit=True) as conn: with pg.connect(conninfo="dbname=postgres host=127.0.0.1", autocommit=True) as conn:
with conn.cursor() as cur: with conn.cursor() as cur:
cur.execute(f"create database {new} with template = {source}") cur.execute(f"create database {new} with template = {source}")
def create_project(name: str) -> None: def create_project(name: str) -> None:
return copy_project('project', name) return copy_project('project', name)
def delete_project(name: str) -> None: def delete_project(name: str) -> None:
with pg.connect(conninfo="dbname=postgres host=127.0.0.1", autocommit=True) as conn: with pg.connect(conninfo="dbname=postgres host=127.0.0.1", autocommit=True) as conn:
with conn.cursor() as cur: 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}") cur.execute(f"drop database {name}")
def clean_project(excluded: list[str] = []) -> None: def clean_project(excluded: list[str] = []) -> None:
projects = list_project() projects = list_project()
with pg.connect(conninfo="dbname=postgres host=127.0.0.1", autocommit=True) as conn: 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"select pg_terminate_backend(pid) from pg_stat_activity where datname = '{project}'")
cur.execute(f"drop database {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: def is_project_open(name: str) -> bool:
return name in conn 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: def close_project(name: str) -> None:
if name in _project_open_count: if name in conn:
_project_open_count[name] -= 1 conn[name].close()
if _project_open_count[name] == 0: del conn[name]
conn[name].close()
del conn[name]
del _project_open_count[name]

View File

@@ -58,10 +58,6 @@ async def fastapi_delete_project(network: str):
async def fastapi_is_project_open(network: str): async def fastapi_is_project_open(network: str):
return is_project_open(network) 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/") @app.post("/openproject/")
async def fastapi_open_project(network: str): async def fastapi_open_project(network: str):
open_project(network) open_project(network)

View File

@@ -27,43 +27,26 @@ class TestApi:
assert not have_project(p) assert not have_project(p)
assert not is_project_open(p) assert not is_project_open(p)
assert get_project_open_count(p) == 0
create_project(p) create_project(p)
assert have_project(p) assert have_project(p)
assert not is_project_open(p) assert not is_project_open(p)
assert get_project_open_count(p) == 0
open_project(p) open_project(p)
assert have_project(p) assert have_project(p)
assert is_project_open(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) 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 have_project(p)
assert not is_project_open(p) assert not is_project_open(p)
assert get_project_open_count(p) == 0
delete_project(p) delete_project(p)
assert not have_project(p) assert not have_project(p)
assert not is_project_open(p) assert not is_project_open(p)
assert get_project_open_count(p) == 0
# operation # operation

View File

@@ -185,9 +185,6 @@ def clean_project(excluded: list[str] = []) -> None:
def is_project_open(name: str) -> bool: def is_project_open(name: str) -> bool:
return api.is_project_open(name) 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: def open_project(name: str) -> None:
return api.open_project(name) return api.open_project(name)