Guest User

Untitled

a guest
Apr 11th, 2018
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.43 KB | None | 0 0
  1. from twisted.internet import reactor, threads
  2.  
  3. from sqlalchemy import *
  4.  
  5. meta = MetaData()
  6.  
  7. def init(uri, strategy):
  8. engine = create_engine('sqlite://%s' % uri, strategy=strategy)
  9. meta.bind = engine
  10. reactor.suggestThreadPoolSize(1)
  11.  
  12. def _transact(meta):
  13. """
  14. return an high level function bind to a particular sqlalchemy engine
  15.  
  16. this function is suitable to use as a decorator
  17.  
  18. a decorated function returns a Deferred while its body
  19. is running in a separate thread
  20. """
  21. def _transaction(f):
  22. # _transaction *is* the decorator
  23. def _wrap(*args, **kwargs):
  24. def _1():
  25. conn = meta.engine.connect()
  26. session = create_session(bind=conn)
  27. trans = conn.begin()
  28. try:
  29. r = f(session, *args, **kwargs)
  30. session.flush()
  31. except:
  32. trans.rollback()
  33. conn.close()
  34. raise
  35. else:
  36. trans.commit()
  37. conn.close()
  38. return r
  39. return threads.deferToThread(_1)
  40. _wrap.__name__ = f.__name__
  41. return _wrap
  42. return _transaction
  43.  
  44. users = Table('users', meta,
  45. Column('email', String(50), unique=True, nullable=False),
  46. Column('username', String(50), primary_key=True, nullable=False),
  47. Column('password', String(32), nullable=False),
  48. Column('role', String(30), nullable=False, default=u'user'),
  49. Column('enabled', Boolean, nullable=False, default=False)
  50. )
  51.  
  52. class User(object):
  53. def __init__(self, email, username, password):
  54. self.email = email
  55. self.username = username
  56. self.password = password
  57.  
  58. def __str__(self):
  59. return "%s(%s)" % (self.__class__.__name__, self.username)
  60.  
  61. mapper(User, users)
  62.  
  63. transact = _transact(meta)
  64.  
  65. @transact
  66. def doSomething(session):
  67. return session.query(User).select()
  68.  
  69. def presult(results):
  70. for user in results:
  71. print user
  72.  
  73. @transact
  74. def setup(session):
  75. meta.create_all()
  76. user = User('dialtone@gmail.com', 'dialtone', 'test')
  77. user2 = User('aaron@adroll.com', 'aaron', 'test2')
  78. session.save(user)
  79. session.save(user2)
  80.  
  81. init('/:memory:', 'threadlocal')
  82. setup().addCallback(lambda _: doSomething()
  83. ).addCallback(presult
  84. ).addCallback(lambda _: reactor.stop())
  85. reactor.run()
Add Comment
Please, Sign In to add comment