Skip to content

Commit b947f92

Browse files
author
Alexander Smishlajev
committed
if optimize is set, load all extension modules in __init__()...
...and do database schema check (db.post_init) only once, upon the first call to open()
1 parent 803f82f commit b947f92

File tree

1 file changed

+43
-7
lines changed

1 file changed

+43
-7
lines changed

roundup/instance.py

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
1616
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
1717
#
18-
# $Id: instance.py,v 1.29 2004-11-10 08:05:21 a1s Exp $
18+
# $Id: instance.py,v 1.30 2004-11-10 08:58:47 a1s Exp $
1919

2020
'''Tracker handling (open tracker).
2121
@@ -53,6 +53,13 @@ def __init__(self, tracker_home, optimize=0):
5353
self.backend = backends.get_backend(self.get_backend_name())
5454
if self.optimize:
5555
self.templates.precompileTemplates()
56+
# initialize tracker extensions
57+
for extension in self.get_extensions('extensions'):
58+
extension(self)
59+
# load database detectors
60+
self.detectors = self.get_extensions('detectors')
61+
# db_open is set to True after first open()
62+
self.db_open = 0
5663

5764
def get_backend_name(self):
5865
o = __builtins__['open']
@@ -62,6 +69,10 @@ def get_backend_name(self):
6269
return name
6370

6471
def open(self, name=None):
72+
# load the database schema
73+
# we cannot skip this part even if self.optimize is set
74+
# because the schema has security settings that must be
75+
# applied to each database instance
6576
backend = self.backend
6677
vars = {
6778
'Class': backend.Class,
@@ -80,10 +91,23 @@ def open(self, name=None):
8091
self._load_python('schema.py', vars)
8192
db = vars['db']
8293

83-
self.load_extensions(db, 'detectors')
84-
self.load_extensions(self, 'extensions')
85-
86-
db.post_init()
94+
if self.optimize:
95+
# use preloaded detectors
96+
detectors = self.detectors
97+
else:
98+
# reload extensions and detectors
99+
for extension in self.get_extensions('extensions'):
100+
extension(self)
101+
detectors = self.get_extensions('detectors')
102+
# apply the detectors
103+
for detector in detectors:
104+
detector(db)
105+
# if we are running in debug mode
106+
# or this is the first time the database is opened,
107+
# do database upgrade checks
108+
if not (self.optimize and self.db_open):
109+
db.post_init()
110+
self.db_open = 1
87111
return db
88112

89113
def load_interfaces(self):
@@ -94,15 +118,27 @@ def load_interfaces(self):
94118
self.Client = vars.get('Client', client.Client)
95119
self.MailGW = vars.get('MailGW', mailgw.MailGW)
96120

97-
def load_extensions(self, parent, dirname):
121+
def get_extensions(self, dirname):
122+
"""Load python extensions
123+
124+
Parameters:
125+
dirname:
126+
extension directory name relative to tracker home
127+
128+
Return value:
129+
list of init() functions for each extension
130+
131+
"""
132+
extensions = []
98133
dirpath = os.path.join(self.tracker_home, dirname)
99134
if os.path.isdir(dirpath):
100135
for name in os.listdir(dirpath):
101136
if not name.endswith('.py'):
102137
continue
103138
vars = {}
104139
self._load_python(os.path.join(dirname, name), vars)
105-
vars['init'](parent)
140+
extensions.append(vars['init'])
141+
return extensions
106142

107143
def init(self, adminpw):
108144
db = self.open('admin')

0 commit comments

Comments
 (0)