Source code for pyvsim.DBFacade
"""
.. module :: DBFacade
:platform: Unix, Windows
:synopsis: Interface with couchdb
As interfacing with the couchdb package requires very specific function calls,
a facade pattern was implemented (what is also good, should we change the db)
.. moduleauthor :: Ricardo Entz <maiko at thebigheads.net>
.. license::
PyVSim v.1
Copyright 2013 Ricardo Entz
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
import couchdb
import json
import System
[docs]class Couchpyvsim(object):
COUCH = None
TIMEOUT = 10
def __init__(self, dburl, dbName, username, password):
self.dburl = dburl
self.dbName = dbName
self.username = username
self.password = password
self.db = None
self._initializeDB()
def _initializeDB(self):
if Couchpyvsim.COUCH is None:
print "Connecting to DB ", self.dburl
try:
couch = couchdb.Server(self.dburl)
couch.resource.credentials = (self.username, self.password)
except couchdb.http.ServerError, e:
raise e
print "Connection open, waiting for answer",
while not couch.__nonzero__():
print ".",
print "Connection successful"
Couchpyvsim.COUCH = couch
self.db = Couchpyvsim.COUCH[self.dbName]
[docs] def todb(self, name, dbdict, overwrite = False):
"""
Contributes to the database with the current object parameters. By
default no overwriting is allowed. Each entry is defined by the
"name" field.
Parameters
----------
overwrite : boolean
If False, will not allow an entry in the database to be modified.
Raises
------
ValueError
When an entry with the same name already exists in the database
"""
dbdict = json.dumps(dbdict, cls = System.pyvsimJSONEncoder)
dbdict = json.loads(dbdict)
try:
self.db[name] = dbdict()
except couchdb.http.ResourceConflict:
if overwrite:
print "Overwriting existing entry"
doc = self.db[name]
self.db.delete(doc)
self.db[name] = dbdict()
else:
print "Could not write to DB, probably doc already exists"
raise ValueError
def fromdb(self, name):
dbdict = self.db[name]
for key in dbdict.keys():
dbdict[key] = json.loads(json.dumps(dbdict[key]),
cls = System.pyvsimJSONDecoder)
return dbdict
[docs] def listdb(self):
"""
Returns a list listing the current database entries in the category of
the object. E.g.: using this method in a Glass material will list only
the available glasses, etc.
Returns
-------
dblist : list
List of strings containing all entries in a database category
"""
dblist = []
for r in self.db.view("_all_docs"):
dblist.append(r.key)
return dblist