mirror of
https://github.com/spl0k/supysonic.git
synced 2024-11-14 14:12:17 +00:00
Properly close database connections when they're not in use
Daemon startup, background scans Ref #253
This commit is contained in:
parent
893a007f29
commit
32a74706c2
@ -1,7 +1,7 @@
|
|||||||
# This file is part of Supysonic.
|
# This file is part of Supysonic.
|
||||||
# Supysonic is a Python implementation of the Subsonic server API.
|
# Supysonic is a Python implementation of the Subsonic server API.
|
||||||
#
|
#
|
||||||
# Copyright (C) 2019-2022 Alban 'spl0k' Féron
|
# Copyright (C) 2019-2023 Alban 'spl0k' Féron
|
||||||
#
|
#
|
||||||
# Distributed under terms of the GNU AGPLv3 license.
|
# Distributed under terms of the GNU AGPLv3 license.
|
||||||
|
|
||||||
@ -12,7 +12,7 @@ from multiprocessing.connection import Listener, Client
|
|||||||
from threading import Thread, Event
|
from threading import Thread, Event
|
||||||
|
|
||||||
from .client import DaemonCommand
|
from .client import DaemonCommand
|
||||||
from ..db import Folder
|
from ..db import Folder, open_connection, close_connection
|
||||||
from ..jukebox import Jukebox
|
from ..jukebox import Jukebox
|
||||||
from ..scanner import Scanner
|
from ..scanner import Scanner
|
||||||
from ..utils import get_secret_key
|
from ..utils import get_secret_key
|
||||||
@ -59,6 +59,8 @@ class Daemon:
|
|||||||
if self.__config.DAEMON["jukebox_command"]:
|
if self.__config.DAEMON["jukebox_command"]:
|
||||||
self.__jukebox = Jukebox(self.__config.DAEMON["jukebox_command"])
|
self.__jukebox = Jukebox(self.__config.DAEMON["jukebox_command"])
|
||||||
|
|
||||||
|
close_connection()
|
||||||
|
|
||||||
Thread(target=self.__listen).start()
|
Thread(target=self.__listen).start()
|
||||||
while not self.__stopped.is_set():
|
while not self.__stopped.is_set():
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
@ -72,9 +74,11 @@ class Daemon:
|
|||||||
|
|
||||||
def start_scan(self, folders=[], force=False):
|
def start_scan(self, folders=[], force=False):
|
||||||
if not folders:
|
if not folders:
|
||||||
|
open_connection()
|
||||||
folders = [
|
folders = [
|
||||||
t[0] for t in Folder.select(Folder.name).where(Folder.root).tuples()
|
t[0] for t in Folder.select(Folder.name).where(Folder.root).tuples()
|
||||||
]
|
]
|
||||||
|
close_connection()
|
||||||
|
|
||||||
if self.__scanner is not None and self.__scanner.is_alive():
|
if self.__scanner is not None and self.__scanner.is_alive():
|
||||||
for f in folders:
|
for f in folders:
|
||||||
|
@ -681,8 +681,8 @@ def release_database():
|
|||||||
db.initialize(None)
|
db.initialize(None)
|
||||||
|
|
||||||
|
|
||||||
def open_connection():
|
def open_connection(reuse=False):
|
||||||
db.connect()
|
return db.connect(reuse)
|
||||||
|
|
||||||
|
|
||||||
def close_connection():
|
def close_connection():
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# This file is part of Supysonic.
|
# This file is part of Supysonic.
|
||||||
# Supysonic is a Python implementation of the Subsonic server API.
|
# Supysonic is a Python implementation of the Subsonic server API.
|
||||||
#
|
#
|
||||||
# Copyright (C) 2013-2022 Alban 'spl0k' Féron
|
# Copyright (C) 2013-2023 Alban 'spl0k' Féron
|
||||||
#
|
#
|
||||||
# Distributed under terms of the GNU AGPLv3 license.
|
# Distributed under terms of the GNU AGPLv3 license.
|
||||||
|
|
||||||
@ -16,7 +16,7 @@ from queue import Queue, Empty as QueueEmpty
|
|||||||
from threading import Thread, Event
|
from threading import Thread, Event
|
||||||
|
|
||||||
from .covers import find_cover_in_folder, CoverFile
|
from .covers import find_cover_in_folder, CoverFile
|
||||||
from .db import Folder, Artist, Album, Track
|
from .db import Folder, Artist, Album, Track, open_connection, close_connection
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -95,6 +95,8 @@ class Scanner(Thread):
|
|||||||
self.__queue.put(folder_name)
|
self.__queue.put(folder_name)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
opened = open_connection(True)
|
||||||
|
|
||||||
while not self.__stopped.is_set():
|
while not self.__stopped.is_set():
|
||||||
try:
|
try:
|
||||||
folder_name = self.__queue.get(False)
|
folder_name = self.__queue.get(False)
|
||||||
@ -113,6 +115,9 @@ class Scanner(Thread):
|
|||||||
if self.__on_done is not None:
|
if self.__on_done is not None:
|
||||||
self.__on_done()
|
self.__on_done()
|
||||||
|
|
||||||
|
if opened:
|
||||||
|
close_connection()
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
self.__stopped.set()
|
self.__stopped.set()
|
||||||
|
|
||||||
|
@ -51,7 +51,11 @@ def create_application(config=None):
|
|||||||
# Initialize database
|
# Initialize database
|
||||||
init_database(app.config["BASE"]["database_uri"])
|
init_database(app.config["BASE"]["database_uri"])
|
||||||
if not app.testing:
|
if not app.testing:
|
||||||
app.before_request(open_connection)
|
|
||||||
|
def open_conn(): # Just to discard the return value
|
||||||
|
open_connection()
|
||||||
|
|
||||||
|
app.before_request(open_conn)
|
||||||
app.teardown_request(lambda exc: close_connection())
|
app.teardown_request(lambda exc: close_connection())
|
||||||
|
|
||||||
# Insert unknown mimetypes
|
# Insert unknown mimetypes
|
||||||
|
Loading…
Reference in New Issue
Block a user