commit: db2e846fa244514f72611630f7ba4e343aa71802
Author: Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Sat Aug 8 00:25:27 2020 +0000
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Sun Aug 9 00:48:12 2020 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=db2e846f
sqlite: add lazy connection init
Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
lib/portage/cache/sqlite.py | 29 ++++++++++++++++++++++++-----
1 file changed, 24 insertions(+), 5 deletions(-)
diff --git a/lib/portage/cache/sqlite.py b/lib/portage/cache/sqlite.py
index 55ae8f0e5..0395dd516 100644
--- a/lib/portage/cache/sqlite.py
+++ b/lib/portage/cache/sqlite.py
@@ -1,6 +1,7 @@
# Copyright 1999-2020 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
+import collections
import re
from portage.cache import fs_template
@@ -23,6 +24,9 @@ class database(fs_template.FsBased):
# equation: cache_bytes = page_bytes * page_count
cache_bytes = 1024 * 1024 * 10
+ _connection_info_entry =
collections.namedtuple('_connection_info_entry',
+ ('connection', 'cursor'))
+
def __init__(self, *args, **config):
super(database, self).__init__(*args, **config)
self._import_sqlite()
@@ -44,8 +48,8 @@ class database(fs_template.FsBased):
# Set longer timeout for throwing a "database is locked"
exception.
# Default timeout in sqlite3 module is 5.0 seconds.
config.setdefault("timeout", 15)
- self._db_init_connection(config)
- self._db_init_structures()
+ self._config = config
+ self._db_connection_info = None
def _import_sqlite(self):
# sqlite3 is optional with >=python-2.5
@@ -65,7 +69,20 @@ class database(fs_template.FsBased):
s = str(s)
return "'%s'" % s.replace("'", "''")
- def _db_init_connection(self, config):
+ @property
+ def _db_cursor(self):
+ if self._db_connection_info is None:
+ self._db_init_connection()
+ return self._db_connection_info.cursor
+
+ @property
+ def _db_connection(self):
+ if self._db_connection_info is None:
+ self._db_init_connection()
+ return self._db_connection_info.connection
+
+ def _db_init_connection(self):
+ config = self._config
self._dbpath = self.location + ".sqlite"
#if os.path.exists(self._dbpath):
# os.unlink(self._dbpath)
@@ -74,14 +91,16 @@ class database(fs_template.FsBased):
try:
if not self.readonly:
self._ensure_dirs()
- self._db_connection = self._db_module.connect(
+ connection = self._db_module.connect(
database=_unicode_decode(self._dbpath),
**connection_kwargs)
- self._db_cursor = self._db_connection.cursor()
+ cursor = connection.cursor()
+ self._db_connection_info =
self._connection_info_entry(connection, cursor)
self._db_cursor.execute("PRAGMA encoding = %s" %
self._db_escape_string("UTF-8"))
if not self.readonly and not
self._ensure_access(self._dbpath):
raise
cache_errors.InitializationError(self.__class__, "can't ensure perms on %s" %
self._dbpath)
self._db_init_cache_size(config["cache_bytes"])
self._db_init_synchronous(config["synchronous"])
+ self._db_init_structures()
except self._db_error as e:
raise cache_errors.InitializationError(self.__class__,
e)