1
2
3
4
5
6
7
8
9
10
11 __doc__="""PostgresqlZodbFactory
12 """
13
14 import logging
15 log = logging.getLogger("zen.PostgresqlZodbFactory")
16
17 import optparse
18 from zope.interface import implements
19 import ZODB
20 import relstorage.storage
21 import relstorage.adapters.postgresql
22 import relstorage.options
23
24 import psycopg2 as db_exceptions
25
26 from Products.ZenUtils.GlobalConfig import globalConfToDict
27 from Products.ZenUtils.ZodbFactory import IZodbFactory
28
30 if options is None:
31 o = globalConfToDict()
32 else:
33 o = options
34 settings = {
35 'host': o.get('zodb-host', "localhost"),
36 'port': o.get('zodb-port', 5432),
37 'user': o.get('zodb-user', 'zenoss'),
38 'password': o.get('zodb-password', 'zenoss'),
39 'dbname': o.get('zodb-db', 'zodb'),
40 }
41 if 'zodb-socket' in o:
42 settings['socket'] = o['zodb-socket']
43 return settings
44
45
47 implements(IZodbFactory)
48
49
50 exceptions = db_exceptions
51
52
54 """Return a zope.conf style zodb config."""
55 settings = _getDefaults()
56 dsn = []
57 keys = ['host', 'port', 'socket', 'user', 'password', 'dbname']
58 for key in keys:
59 if key in settings:
60 dsn.append("%s=%s" % (key, settings[key],))
61
62 stanza = "\n".join([
63 "<postgresql>",
64 " dsn %s" % (" ".join(dsn),),
65 "</postgresql>\n",
66 ])
67 return stanza
68
69 - def getConnection(self, **kwargs):
70 """Return a ZODB connection."""
71 connectionParams = _getDefaults(kwargs)
72 kwargs = {
73 'cache_module_name':'memcache',
74 'keep_history': kwargs.get('zodb_keep_history', False)
75 }
76 adapter = relstorage.adapters.postgresql.PostgreSQLAdapter(
77 dsn="dbname=%(dbname)s port=%(port)s user=%(user)s password=%(password)s" % connectionParams,
78 options=relstorage.options.Options(**kwargs))
79
80
81
82 if 'zodb_poll_interval' in kwargs:
83 kwargs['poll_interval'] = kwargs['zodb_poll_interval']
84 if 'zodb_cacheservers' in kwargs:
85 kwargs['cache_servers'] = kwargs['zodb_cacheservers']
86
87 if 'poll_interval' in kwargs:
88 poll_interval = kwargs['poll_interval']
89 if 'cache_servers' in kwargs:
90 if poll_interval is None:
91 log.info("Using default poll-interval of 60 seconds because "
92 "cache-servers was set.")
93 kwargs['poll_interval'] = 60
94 else:
95 kwargs['poll_interval'] = poll_interval
96 else:
97 log.warn("poll-interval of %r is being ignored because "
98 "cache-servers was not set." % poll_interval)
99 storage = relstorage.storage.RelStorage(adapter, **kwargs)
100 cache_size = kwargs.get('zodb_cachesize', 1000)
101 db = ZODB.DB(storage, cache_size=cache_size)
102 return db, storage
103
104 - def buildOptions(self, parser):
105 """build OptParse options for ZODB connections"""
106 group = optparse.OptionGroup(parser, "ZODB Options",
107 "ZODB connection options and PostgreSQL Adapter options.")
108 group.add_option('-R', '--zodb-dataroot',
109 dest="dataroot",
110 default="/zport/dmd",
111 help="root object for data load (i.e. /zport/dmd)")
112 group.add_option('--zodb-cachesize',
113 dest="zodb_cachesize",default=1000, type='int',
114 help="in memory cachesize default: 1000")
115 group.add_option('--zodb-host',
116 dest="zodb_host",default="localhost",
117 help="hostname of the PostgreSQL server for ZODB")
118 group.add_option('--zodb-port',
119 dest="zodb_port", type="int", default=5432,
120 help="port of the PostgreSQL server for ZODB")
121 group.add_option('--zodb-user', dest='zodb_user', default='zenoss',
122 help='user of the PostgreSQL server for ZODB')
123 group.add_option('--zodb-password', dest='zodb_password', default='zenoss',
124 help='password of the PostgreSQL server for ZODB')
125 group.add_option('--zodb-db', dest='zodb_db', default='zodb',
126 help='Name of database for PostgreSQL object store')
127
128 group.add_option('--zodb-socket', dest='zodb_socket', default=None,
129 help='Name of socket file for PostgreSQL server connection if host is localhost')
130 group.add_option('--zodb-cacheservers', dest='zodb_cacheservers', default="",
131 help='memcached servers to use for object cache (eg. 127.0.0.1:11211)')
132 group.add_option('--zodb-poll-interval', dest='zodb_poll_interval', default=None, type='int',
133 help='Defer polling the database for the specified maximum time interval, in seconds.'
134 ' This will default to 60 only if --zodb-cacheservers is set.')
135 parser.add_option_group(group)
136