Changeset 153
- Timestamp:
- 04/26/08 15:34:30 (4 months ago)
- Files:
-
- sucrose/trunk/python/api/sucrose.py (modified) (3 diffs)
- sucrose/trunk/python/mysql/db.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
sucrose/trunk/python/api/sucrose.py
r152 r153 18 18 class Sucrose(object): 19 19 20 @db.read_or_die 20 21 def user_from_uin(self, uin): 21 22 return self.users.filter_by(uin=uin).first() 22 23 24 @db.read_or_die 23 25 def tray_from_location(self, location): 24 26 if not ( ( location[0] in '12345' and location[1] in '1237' ) or … … 28 30 return self.trays.filter_by(machine_tray_id=int(location)).first() 29 31 30 32 @db.read_or_die 31 33 def item_from_tray(self, tray): 32 34 return self.items.filter_by(item_id=tray.item_id).first() 33 35 36 @db.read_or_die 34 37 def balance_for_user(self, user): 35 38 return self.vending.filter_by(uid=user.uid).first().balance 36 39 40 @db.read_or_die 37 41 def recent_purchases_for_user(self, user): 38 42 transactions = self.transactions.filter_by(user=user).\ … … 42 46 return [(t.item_name, t.cost) for t in transactions] 43 47 48 @db.read_or_die 44 49 def total_spent_by_user(self, user): 45 50 return self.transactions.filter_by(user=user).\ sucrose/trunk/python/mysql/db.py
r121 r153 1 from sqlalchemy import create_engine, Table, Column, Integer, Numeric, String,\2 MetaData, ForeignKey1 from sqlalchemy import create_engine, Table, Column, Integer, Numeric, \ 2 String, MetaData, ForeignKey 3 3 from sqlalchemy.databases.mysql import MSEnum, MSInteger 4 4 from sqlalchemy.ext.declarative import declarative_base … … 6 6 from sqlalchemy.orm import mapper, relation, sessionmaker 7 7 8 DB_URL = 'mysql://soda:m568EXUFS@db 1.acm.uiuc.edu'8 DB_URL = 'mysql://soda:m568EXUFS@db2.acm.uiuc.edu' 9 9 # XXX change 'sucrose' to 'vending' once caffeine is migrated 10 10 _sucrose = create_engine('%s/sucrose' % DB_URL) … … 72 72 _Session = sessionmaker(transactional=False, autoflush=False, twophase=True) 73 73 session = _Session() 74 75 try: 76 from functools import wraps 77 except ImportError: 78 wraps = lambda wrapped: lambda wrapper: wrapper 79 from sqlalchemy.exceptions import DBAPIError 80 import logging, os 81 def read_or_die(f): 82 """ 83 Retry a repeatable database read operation a few times before 84 exiting - handling temporary database failure. 85 """ 86 @wraps(f) 87 def wrapper(self, *args, **kw): 88 for retry_count in xrange(5, 0, -1): 89 try: 90 return f(self, *args, **kw) 91 except DBAPIError, e: 92 logging.warn('Retrying database query - %d left' % retry_count, 93 exc_info=True) 94 except ValueError, e: # XXX replace with Sucrose-specific exception 95 raise 96 except: 97 logging.critical('Unexpected exception on DB read', 98 exc_info=True) 99 os._exit(1) 100 logging.critical('No retries left') 101 os._exit(1) 102 return wrapper 103
