1 | import os |
---|
2 | import sys |
---|
3 | import transaction |
---|
4 | from zope.app.appsetup import database, config |
---|
5 | from zope.app.publication.zopepublication import ZopePublication |
---|
6 | from waeup.kofa.app import University |
---|
7 | |
---|
8 | #: The name under which any artificially created University instance |
---|
9 | #: will be put into the root folder |
---|
10 | APP_NAME = 'stress_app' |
---|
11 | |
---|
12 | def open_zodb(instance_path=''): |
---|
13 | """Open a ZODB and configure it using a site.zcml file. |
---|
14 | |
---|
15 | If `instance_path` is not given, we assume to be in the root of |
---|
16 | some Zope instance and compute relative paths to |
---|
17 | 'parts/etc/site.zcml' and 'var/filestorage/Data.fs'. |
---|
18 | |
---|
19 | If `instance_path` is given, these paths are os.path.joined with |
---|
20 | it. |
---|
21 | |
---|
22 | Returns a tuple containing a database object, an open connection |
---|
23 | to this DB and the root folder. |
---|
24 | """ |
---|
25 | config_file = os.path.join( |
---|
26 | instance_path, 'parts', 'etc', 'site.zcml') |
---|
27 | zodb_file = os.path.join( |
---|
28 | instance_path, 'var', 'filestorage', 'Data.fs') |
---|
29 | print "WAEUP.STRESS: configuring ZODB from %s / %s" % ( |
---|
30 | config_file, zodb_file) |
---|
31 | context = config(config_file) |
---|
32 | db = database(zodb_file) |
---|
33 | conn = db.open() |
---|
34 | root = conn.root() |
---|
35 | root_folder = root.get(ZopePublication.root_name, None) |
---|
36 | return db, conn, root_folder |
---|
37 | |
---|
38 | def close_zodb(db): |
---|
39 | print "WAEUP.STRESS: closing ZODB" |
---|
40 | transaction.commit() # make sure changes are saved |
---|
41 | db.close() |
---|
42 | return |
---|
43 | |
---|
44 | def zodb(func): |
---|
45 | """A decorator that does a ZODB setup and calls the decorated |
---|
46 | function with the ZODB root folder as first argument. |
---|
47 | """ |
---|
48 | def wrapped(*args, **kw): |
---|
49 | instance_path = kw.get('instance_path', '') |
---|
50 | db, conn, root_folder = open_zodb(instance_path) |
---|
51 | try: |
---|
52 | func(root_folder, *args, **kw) |
---|
53 | finally: |
---|
54 | close_zodb(db) |
---|
55 | return wrapped |
---|
56 | |
---|
57 | @zodb |
---|
58 | def create_app(root_folder): |
---|
59 | """Create a University instance named 'stress_app' in ZODB. |
---|
60 | |
---|
61 | The `root_folder` arg is injected by the decorator and represents |
---|
62 | the root folder of an opened, writable ZODB. |
---|
63 | """ |
---|
64 | print [x for x in root_folder] |
---|
65 | root_folder['stress_app'] = University() |
---|
66 | print "WAEUP.STRESS.SCRIPTS: created 'stress_app' in root folder." |
---|
67 | return |
---|
68 | |
---|
69 | create_app() |
---|