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