Skip to content

Commit dc9a9d7

Browse files
Revert "feat(backend): organise service dependencies"
This reverts commit 2a35d93.
1 parent 15a3e49 commit dc9a9d7

File tree

15 files changed

+322
-255
lines changed

15 files changed

+322
-255
lines changed

invokeai/app/api/dependencies.py

Lines changed: 83 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
# Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654)
22

3+
import sqlite3
34
from logging import Logger
45

56
from invokeai.app.services.board_image_record_storage import SqliteBoardImageRecordStorage
6-
from invokeai.app.services.board_images import BoardImagesService
7+
from invokeai.app.services.board_images import BoardImagesService, BoardImagesServiceDependencies
78
from invokeai.app.services.board_record_storage import SqliteBoardRecordStorage
8-
from invokeai.app.services.boards import BoardService
9+
from invokeai.app.services.boards import BoardService, BoardServiceDependencies
910
from invokeai.app.services.config import InvokeAIAppConfig
1011
from invokeai.app.services.image_record_storage import SqliteImageRecordStorage
11-
from invokeai.app.services.images import ImageService
12+
from invokeai.app.services.images import ImageService, ImageServiceDependencies
1213
from invokeai.app.services.invocation_cache.invocation_cache_memory import MemoryInvocationCache
1314
from invokeai.app.services.resource_name import SimpleNameService
1415
from invokeai.app.services.session_processor.session_processor_default import DefaultSessionProcessor
1516
from invokeai.app.services.session_queue.session_queue_sqlite import SqliteSessionQueue
16-
from invokeai.app.services.shared.db import SqliteDatabase
1717
from invokeai.app.services.urls import LocalUrlService
1818
from invokeai.backend.util.logging import InvokeAILogger
1919
from invokeai.version.invokeai_version import __version__
@@ -29,6 +29,7 @@
2929
from ..services.model_manager_service import ModelManagerService
3030
from ..services.processor import DefaultInvocationProcessor
3131
from ..services.sqlite import SqliteItemStorage
32+
from ..services.thread import lock
3233
from .events import FastAPIEventService
3334

3435

@@ -62,64 +63,100 @@ def initialize(config: InvokeAIAppConfig, event_handler_id: int, logger: Logger
6263
logger.info(f"Root directory = {str(config.root_path)}")
6364
logger.debug(f"Internet connectivity is {config.internet_available}")
6465

66+
events = FastAPIEventService(event_handler_id)
67+
6568
output_folder = config.output_path
6669

67-
db = SqliteDatabase(config, logger)
70+
# TODO: build a file/path manager?
71+
if config.use_memory_db:
72+
db_location = ":memory:"
73+
else:
74+
db_path = config.db_path
75+
db_path.parent.mkdir(parents=True, exist_ok=True)
76+
db_location = str(db_path)
6877

69-
configuration = config
70-
logger = logger
78+
logger.info(f"Using database at {db_location}")
79+
db_conn = sqlite3.connect(db_location, check_same_thread=False) # TODO: figure out a better threading solution
80+
81+
if config.log_sql:
82+
db_conn.set_trace_callback(print)
83+
db_conn.execute("PRAGMA foreign_keys = ON;")
84+
85+
graph_execution_manager = SqliteItemStorage[GraphExecutionState](
86+
conn=db_conn, table_name="graph_executions", lock=lock
87+
)
7188

72-
board_image_records = SqliteBoardImageRecordStorage(db=db)
73-
board_images = BoardImagesService()
74-
board_records = SqliteBoardRecordStorage(db=db)
75-
boards = BoardService()
76-
events = FastAPIEventService(event_handler_id)
77-
graph_execution_manager = SqliteItemStorage[GraphExecutionState](db=db, table_name="graph_executions")
78-
graph_library = SqliteItemStorage[LibraryGraph](db=db, table_name="graphs")
79-
image_files = DiskImageFileStorage(f"{output_folder}/images")
80-
image_records = SqliteImageRecordStorage(db=db)
81-
images = ImageService()
82-
invocation_cache = MemoryInvocationCache(max_cache_size=config.node_cache_size)
83-
latents = ForwardCacheLatentsStorage(DiskLatentsStorage(f"{output_folder}/latents"))
84-
model_manager = ModelManagerService(config, logger)
85-
names = SimpleNameService()
86-
performance_statistics = InvocationStatsService()
87-
processor = DefaultInvocationProcessor()
88-
queue = MemoryInvocationQueue()
89-
session_processor = DefaultSessionProcessor()
90-
session_queue = SqliteSessionQueue(db=db)
9189
urls = LocalUrlService()
90+
image_record_storage = SqliteImageRecordStorage(conn=db_conn, lock=lock)
91+
image_file_storage = DiskImageFileStorage(f"{output_folder}/images")
92+
names = SimpleNameService()
93+
latents = ForwardCacheLatentsStorage(DiskLatentsStorage(f"{output_folder}/latents"))
94+
95+
board_record_storage = SqliteBoardRecordStorage(conn=db_conn, lock=lock)
96+
board_image_record_storage = SqliteBoardImageRecordStorage(conn=db_conn, lock=lock)
97+
98+
boards = BoardService(
99+
services=BoardServiceDependencies(
100+
board_image_record_storage=board_image_record_storage,
101+
board_record_storage=board_record_storage,
102+
image_record_storage=image_record_storage,
103+
url=urls,
104+
logger=logger,
105+
)
106+
)
107+
108+
board_images = BoardImagesService(
109+
services=BoardImagesServiceDependencies(
110+
board_image_record_storage=board_image_record_storage,
111+
board_record_storage=board_record_storage,
112+
image_record_storage=image_record_storage,
113+
url=urls,
114+
logger=logger,
115+
)
116+
)
117+
118+
images = ImageService(
119+
services=ImageServiceDependencies(
120+
board_image_record_storage=board_image_record_storage,
121+
image_record_storage=image_record_storage,
122+
image_file_storage=image_file_storage,
123+
url=urls,
124+
logger=logger,
125+
names=names,
126+
graph_execution_manager=graph_execution_manager,
127+
)
128+
)
92129

93130
services = InvocationServices(
94-
board_image_records=board_image_records,
95-
board_images=board_images,
96-
board_records=board_records,
97-
boards=boards,
98-
configuration=configuration,
131+
model_manager=ModelManagerService(config, logger),
99132
events=events,
100-
graph_execution_manager=graph_execution_manager,
101-
graph_library=graph_library,
102-
image_files=image_files,
103-
image_records=image_records,
104-
images=images,
105-
invocation_cache=invocation_cache,
106133
latents=latents,
134+
images=images,
135+
boards=boards,
136+
board_images=board_images,
137+
queue=MemoryInvocationQueue(),
138+
graph_library=SqliteItemStorage[LibraryGraph](conn=db_conn, lock=lock, table_name="graphs"),
139+
graph_execution_manager=graph_execution_manager,
140+
processor=DefaultInvocationProcessor(),
141+
configuration=config,
142+
performance_statistics=InvocationStatsService(graph_execution_manager),
107143
logger=logger,
108-
model_manager=model_manager,
109-
names=names,
110-
performance_statistics=performance_statistics,
111-
processor=processor,
112-
queue=queue,
113-
session_processor=session_processor,
114-
session_queue=session_queue,
115-
urls=urls,
144+
session_queue=SqliteSessionQueue(conn=db_conn, lock=lock),
145+
session_processor=DefaultSessionProcessor(),
146+
invocation_cache=MemoryInvocationCache(max_cache_size=config.node_cache_size),
116147
)
117148

118149
create_system_graphs(services.graph_library)
119150

120151
ApiDependencies.invoker = Invoker(services)
121152

122-
db.clean()
153+
try:
154+
lock.acquire()
155+
db_conn.execute("VACUUM;")
156+
db_conn.commit()
157+
logger.info("Cleaned database")
158+
finally:
159+
lock.release()
123160

124161
@staticmethod
125162
def shutdown():

invokeai/app/services/board_image_record_storage.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
from invokeai.app.services.image_record_storage import OffsetPaginatedResults
77
from invokeai.app.services.models.image_record import ImageRecord, deserialize_image_record
8-
from invokeai.app.services.shared.db import SqliteDatabase
98

109

1110
class BoardImageRecordStorageBase(ABC):
@@ -58,11 +57,13 @@ class SqliteBoardImageRecordStorage(BoardImageRecordStorageBase):
5857
_cursor: sqlite3.Cursor
5958
_lock: threading.Lock
6059

61-
def __init__(self, db: SqliteDatabase) -> None:
60+
def __init__(self, conn: sqlite3.Connection, lock: threading.Lock) -> None:
6261
super().__init__()
63-
self._lock = db.lock
64-
self._conn = db.conn
62+
self._conn = conn
63+
# Enable row factory to get rows as dictionaries (must be done before making the cursor!)
64+
self._conn.row_factory = sqlite3.Row
6565
self._cursor = self._conn.cursor()
66+
self._lock = lock
6667

6768
try:
6869
self._lock.acquire()

invokeai/app/services/board_images.py

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
from abc import ABC, abstractmethod
2+
from logging import Logger
23
from typing import Optional
34

4-
from invokeai.app.services.board_record_storage import BoardRecord
5-
from invokeai.app.services.invoker import Invoker
5+
from invokeai.app.services.board_image_record_storage import BoardImageRecordStorageBase
6+
from invokeai.app.services.board_record_storage import BoardRecord, BoardRecordStorageBase
7+
from invokeai.app.services.image_record_storage import ImageRecordStorageBase
68
from invokeai.app.services.models.board_record import BoardDTO
9+
from invokeai.app.services.urls import UrlServiceBase
710

811

912
class BoardImagesServiceABC(ABC):
@@ -43,36 +46,60 @@ def get_board_for_image(
4346
pass
4447

4548

49+
class BoardImagesServiceDependencies:
50+
"""Service dependencies for the BoardImagesService."""
51+
52+
board_image_records: BoardImageRecordStorageBase
53+
board_records: BoardRecordStorageBase
54+
image_records: ImageRecordStorageBase
55+
urls: UrlServiceBase
56+
logger: Logger
57+
58+
def __init__(
59+
self,
60+
board_image_record_storage: BoardImageRecordStorageBase,
61+
image_record_storage: ImageRecordStorageBase,
62+
board_record_storage: BoardRecordStorageBase,
63+
url: UrlServiceBase,
64+
logger: Logger,
65+
):
66+
self.board_image_records = board_image_record_storage
67+
self.image_records = image_record_storage
68+
self.board_records = board_record_storage
69+
self.urls = url
70+
self.logger = logger
71+
72+
4673
class BoardImagesService(BoardImagesServiceABC):
47-
__invoker: Invoker
74+
_services: BoardImagesServiceDependencies
4875

49-
def start(self, invoker: Invoker) -> None:
50-
self.__invoker = invoker
76+
def __init__(self, services: BoardImagesServiceDependencies):
77+
self._services = services
5178

5279
def add_image_to_board(
5380
self,
5481
board_id: str,
5582
image_name: str,
5683
) -> None:
57-
self.__invoker.services.board_image_records.add_image_to_board(board_id, image_name)
84+
self._services.board_image_records.add_image_to_board(board_id, image_name)
5885

5986
def remove_image_from_board(
6087
self,
6188
image_name: str,
6289
) -> None:
63-
self.__invoker.services.board_image_records.remove_image_from_board(image_name)
90+
self._services.board_image_records.remove_image_from_board(image_name)
6491

6592
def get_all_board_image_names_for_board(
6693
self,
6794
board_id: str,
6895
) -> list[str]:
69-
return self.__invoker.services.board_image_records.get_all_board_image_names_for_board(board_id)
96+
return self._services.board_image_records.get_all_board_image_names_for_board(board_id)
7097

7198
def get_board_for_image(
7299
self,
73100
image_name: str,
74101
) -> Optional[str]:
75-
board_id = self.__invoker.services.board_image_records.get_board_for_image(image_name)
102+
board_id = self._services.board_image_records.get_board_for_image(image_name)
76103
return board_id
77104

78105

invokeai/app/services/board_record_storage.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
from invokeai.app.services.image_record_storage import OffsetPaginatedResults
99
from invokeai.app.services.models.board_record import BoardRecord, deserialize_board_record
10-
from invokeai.app.services.shared.db import SqliteDatabase
1110
from invokeai.app.util.misc import uuid_string
1211

1312

@@ -92,11 +91,13 @@ class SqliteBoardRecordStorage(BoardRecordStorageBase):
9291
_cursor: sqlite3.Cursor
9392
_lock: threading.Lock
9493

95-
def __init__(self, db: SqliteDatabase) -> None:
94+
def __init__(self, conn: sqlite3.Connection, lock: threading.Lock) -> None:
9695
super().__init__()
97-
self._lock = db.lock
98-
self._conn = db.conn
96+
self._conn = conn
97+
# Enable row factory to get rows as dictionaries (must be done before making the cursor!)
98+
self._conn.row_factory = sqlite3.Row
9999
self._cursor = self._conn.cursor()
100+
self._lock = lock
100101

101102
try:
102103
self._lock.acquire()

0 commit comments

Comments
 (0)