diff --git a/supysonic/cli.py b/supysonic/cli.py index f41f0a5..34f6f80 100755 --- a/supysonic/cli.py +++ b/supysonic/cli.py @@ -14,10 +14,9 @@ import getpass import sys import time -from pony.orm import db_session from pony.orm import ObjectNotFound -from .db import Folder, User +from .db import Folder, User, db_session from .managers.folder import FolderManager from .managers.user import UserManager from .scanner import Scanner diff --git a/supysonic/db.py b/supysonic/db.py index e5e46ec..db7b009 100644 --- a/supysonic/db.py +++ b/supysonic/db.py @@ -17,6 +17,7 @@ from pony.orm import Database, Required, Optional, Set, PrimaryKey, LongStr from pony.orm import ObjectNotFound from pony.orm import buffer from pony.orm import min, max, avg, sum, exists +from pony.orm import db_session as pony_session from uuid import UUID, uuid4 from .py23 import dict, strtype @@ -469,6 +470,26 @@ class Playlist(db.Entity): self.tracks = ','.join(t for t in tracks if t) +class DBSessionContextWrapper(object): + def __ensure_sqlite_case_insensitive_like(self): + if db.provider.dialect == 'SQLite': + db.execute('PRAGMA case_sensitive_like = OFF') + + def __call__(self, func, *args, **kwargs): + def new_func(*args, **kwargs): + self.__ensure_sqlite_case_insensitive_like() + return func(*args, **kwargs) + return pony_session(new_func, *args, **kwargs) + + def __enter__(self): + pony_session.__enter__() + self.__ensure_sqlite_case_insensitive_like() + + def __exit__(self, *args, **kwargs): + pony_session.__exit__(*args, **kwargs) + +db_session = DBSessionContextWrapper() + def parse_uri(database_uri): if not isinstance(database_uri, strtype): raise TypeError('Expecting a string') diff --git a/supysonic/scanner.py b/supysonic/scanner.py index 1c2f718..ccf3038 100644 --- a/supysonic/scanner.py +++ b/supysonic/scanner.py @@ -12,12 +12,11 @@ import mimetypes import mutagen import time -from pony.orm import db_session - from .covers import find_cover_in_folder from .db import Folder, Artist, Album, Track, User from .db import StarredFolder, StarredArtist, StarredAlbum, StarredTrack from .db import RatingFolder, RatingTrack +from .db import db_session from .py23 import strtype class StatsDetails(object): diff --git a/supysonic/watcher.py b/supysonic/watcher.py index 2f6d794..adafa9a 100644 --- a/supysonic/watcher.py +++ b/supysonic/watcher.py @@ -11,13 +11,12 @@ import logging import time from logging.handlers import TimedRotatingFileHandler -from pony.orm import db_session from signal import signal, SIGTERM, SIGINT from threading import Thread, Condition, Timer from watchdog.observers import Observer from watchdog.events import PatternMatchingEventHandler -from .db import init_database, release_database, Folder +from .db import init_database, release_database, db_session, Folder from .py23 import dict from .scanner import Scanner diff --git a/supysonic/web.py b/supysonic/web.py index ac5259d..2814612 100644 --- a/supysonic/web.py +++ b/supysonic/web.py @@ -12,10 +12,9 @@ import mimetypes from flask import Flask from os import makedirs, path -from pony.orm import db_session from .config import IniConfig -from .db import init_database +from .db import init_database, db_session def create_application(config = None): global app diff --git a/tests/api/test_album_songs.py b/tests/api/test_album_songs.py index e77d5e7..0a8583e 100644 --- a/tests/api/test_album_songs.py +++ b/tests/api/test_album_songs.py @@ -10,9 +10,7 @@ import uuid -from pony.orm import db_session - -from supysonic.db import Folder, Artist, Album, Track +from supysonic.db import Folder, Artist, Album, Track, db_session from .apitestbase import ApiTestBase diff --git a/tests/api/test_annotation.py b/tests/api/test_annotation.py index 52f81f7..b552912 100644 --- a/tests/api/test_annotation.py +++ b/tests/api/test_annotation.py @@ -10,9 +10,7 @@ import uuid -from pony.orm import db_session - -from supysonic.db import Folder, Artist, Album, Track, User, ClientPrefs +from supysonic.db import Folder, Artist, Album, Track, User, ClientPrefs, db_session from .apitestbase import ApiTestBase diff --git a/tests/api/test_browse.py b/tests/api/test_browse.py index 05ca9cb..69e0761 100644 --- a/tests/api/test_browse.py +++ b/tests/api/test_browse.py @@ -12,9 +12,8 @@ import time import uuid from lxml import etree -from pony.orm import db_session -from supysonic.db import Folder, Artist, Album, Track +from supysonic.db import Folder, Artist, Album, Track, db_session from .apitestbase import ApiTestBase diff --git a/tests/api/test_media.py b/tests/api/test_media.py index 26b43f7..c5c4526 100644 --- a/tests/api/test_media.py +++ b/tests/api/test_media.py @@ -13,9 +13,8 @@ import uuid from io import BytesIO from PIL import Image -from pony.orm import db_session -from supysonic.db import Folder, Artist, Album, Track +from supysonic.db import Folder, Artist, Album, Track, db_session from .apitestbase import ApiTestBase diff --git a/tests/api/test_playlist.py b/tests/api/test_playlist.py index 0e9b063..aace508 100644 --- a/tests/api/test_playlist.py +++ b/tests/api/test_playlist.py @@ -10,9 +10,7 @@ import uuid -from pony.orm import db_session - -from supysonic.db import Folder, Artist, Album, Track, Playlist, User +from supysonic.db import Folder, Artist, Album, Track, Playlist, User, db_session from .apitestbase import ApiTestBase diff --git a/tests/api/test_search.py b/tests/api/test_search.py index 8216257..ec62db2 100644 --- a/tests/api/test_search.py +++ b/tests/api/test_search.py @@ -11,9 +11,9 @@ import time import unittest -from pony.orm import db_session, commit +from pony.orm import commit -from supysonic.db import Folder, Artist, Album, Track +from supysonic.db import Folder, Artist, Album, Track, db_session from .apitestbase import ApiTestBase diff --git a/tests/api/test_transcoding.py b/tests/api/test_transcoding.py index 0b3f959..4a85373 100644 --- a/tests/api/test_transcoding.py +++ b/tests/api/test_transcoding.py @@ -10,9 +10,7 @@ import unittest -from pony.orm import db_session - -from supysonic.db import Folder, Track +from supysonic.db import Folder, Track, db_session from supysonic.managers.folder import FolderManager from supysonic.scanner import Scanner diff --git a/tests/base/test_cli.py b/tests/base/test_cli.py index b0e11d0..d05c364 100644 --- a/tests/base/test_cli.py +++ b/tests/base/test_cli.py @@ -15,14 +15,13 @@ import tempfile import unittest from contextlib import contextmanager -from pony.orm import db_session try: # Don't use io.StringIO on py2, it only accepts unicode and the CLI spits strs from StringIO import StringIO except ImportError: from io import StringIO -from supysonic.db import Folder, User, init_database, release_database +from supysonic.db import Folder, User, init_database, release_database, db_session from supysonic.cli import SupysonicCLI from ..testbase import TestConfig diff --git a/tests/base/test_db.py b/tests/base/test_db.py index 8421f7f..a3ebe51 100644 --- a/tests/base/test_db.py +++ b/tests/base/test_db.py @@ -13,10 +13,10 @@ import unittest import uuid from collections import namedtuple -from pony.orm import db_session from supysonic import db +db_session = db.db_session date_regex = re.compile(r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$') class DbTestCase(unittest.TestCase): diff --git a/tests/base/test_scanner.py b/tests/base/test_scanner.py index 74be660..b570c73 100644 --- a/tests/base/test_scanner.py +++ b/tests/base/test_scanner.py @@ -15,12 +15,14 @@ import tempfile import unittest from contextlib import contextmanager -from pony.orm import db_session, commit +from pony.orm import commit from supysonic import db from supysonic.managers.folder import FolderManager from supysonic.scanner import Scanner +db_session = db.db_session + class ScannerTestCase(unittest.TestCase): def setUp(self): db.init_database('sqlite:', True) diff --git a/tests/base/test_watcher.py b/tests/base/test_watcher.py index 2c19253..8cf63a5 100644 --- a/tests/base/test_watcher.py +++ b/tests/base/test_watcher.py @@ -18,10 +18,9 @@ import unittest from contextlib import contextmanager from hashlib import sha1 -from pony.orm import db_session from threading import Thread -from supysonic.db import init_database, release_database, Track, Artist +from supysonic.db import init_database, release_database, db_session, Track, Artist from supysonic.managers.folder import FolderManager from supysonic.watcher import SupysonicWatcher diff --git a/tests/frontend/test_folder.py b/tests/frontend/test_folder.py index c42107c..0d88a1d 100644 --- a/tests/frontend/test_folder.py +++ b/tests/frontend/test_folder.py @@ -10,9 +10,7 @@ import uuid -from pony.orm import db_session - -from supysonic.db import Folder +from supysonic.db import Folder, db_session from .frontendtestbase import FrontendTestBase diff --git a/tests/frontend/test_login.py b/tests/frontend/test_login.py index 5dde4ff..f5eb3fc 100644 --- a/tests/frontend/test_login.py +++ b/tests/frontend/test_login.py @@ -11,9 +11,7 @@ import uuid -from pony.orm import db_session - -from supysonic.db import User +from supysonic.db import User, db_session from .frontendtestbase import FrontendTestBase diff --git a/tests/frontend/test_playlist.py b/tests/frontend/test_playlist.py index 67bdb22..a5df907 100644 --- a/tests/frontend/test_playlist.py +++ b/tests/frontend/test_playlist.py @@ -10,9 +10,7 @@ import uuid -from pony.orm import db_session - -from supysonic.db import Folder, Artist, Album, Track, Playlist, User +from supysonic.db import Folder, Artist, Album, Track, Playlist, User, db_session from .frontendtestbase import FrontendTestBase diff --git a/tests/frontend/test_user.py b/tests/frontend/test_user.py index 67f72c3..2bcdd7f 100644 --- a/tests/frontend/test_user.py +++ b/tests/frontend/test_user.py @@ -11,9 +11,8 @@ import uuid from flask import escape -from pony.orm import db_session -from supysonic.db import User, ClientPrefs +from supysonic.db import User, ClientPrefs, db_session from .frontendtestbase import FrontendTestBase diff --git a/tests/issue101.py b/tests/issue101.py index 98b68a5..c089315 100644 --- a/tests/issue101.py +++ b/tests/issue101.py @@ -12,9 +12,7 @@ import shutil import tempfile import unittest -from pony.orm import db_session - -from supysonic.db import init_database, release_database +from supysonic.db import init_database, release_database, db_session from supysonic.db import Folder from supysonic.managers.folder import FolderManager from supysonic.scanner import Scanner diff --git a/tests/managers/test_manager_folder.py b/tests/managers/test_manager_folder.py index 8430479..c6ac034 100644 --- a/tests/managers/test_manager_folder.py +++ b/tests/managers/test_manager_folder.py @@ -18,7 +18,9 @@ import tempfile import unittest import uuid -from pony.orm import db_session, ObjectNotFound +from pony.orm import ObjectNotFound + +db_session = db.db_session class FolderManagerTestCase(unittest.TestCase): def setUp(self): diff --git a/tests/managers/test_manager_user.py b/tests/managers/test_manager_user.py index 082cdb2..d723b11 100644 --- a/tests/managers/test_manager_user.py +++ b/tests/managers/test_manager_user.py @@ -17,9 +17,11 @@ import io import unittest import uuid -from pony.orm import db_session, commit +from pony.orm import commit from pony.orm import ObjectNotFound +db_session = db.db_session + class UserManagerTestCase(unittest.TestCase): def setUp(self): # Create an empty sqlite database in memory diff --git a/tests/testbase.py b/tests/testbase.py index d93b477..6a294f2 100644 --- a/tests/testbase.py +++ b/tests/testbase.py @@ -14,9 +14,7 @@ import shutil import unittest import tempfile -from pony.orm import db_session - -from supysonic.db import init_database, release_database +from supysonic.db import init_database, release_database, db_session from supysonic.config import DefaultConfig from supysonic.managers.user import UserManager from supysonic.web import create_application