-class DispenseDatabaseException(Exception): pass
-
-class DispenseDatabase:
- def __init__(self, vending_machine, host, name, user, password):
- self.vending_machine = vending_machine
- self.db = pg.DB(dbname = name, host = host, user = user, passwd = password)
- self.db.query('LISTEN vend_requests')
-
- def process_requests(self):
- logging.debug('database processing')
- query = 'SELECT request_id, request_slot FROM vend_requests WHERE request_handled = false'
- try:
- outstanding = self.db.query(query).getresult()
- except (pg.error,), db_err:
- raise DispenseDatabaseException('Failed to query database: %s\n'%(db_err.strip()))
- for (id, slot) in outstanding:
- (worked, code, string) = self.vending_machine.vend(slot)
- logging.debug (str((worked, code, string)))
- if worked:
- query = 'SELECT vend_success(%s)'%id
- self.db.query(query).getresult()
- else:
- query = 'SELECT vend_failed(%s)'%id
- self.db.query(query).getresult()
-
- def handle_events(self):
- notifier = self.db.getnotify()
- while notifier is not None:
- self.process_requests()
- notify = self.db.getnotify()