##// END OF EJS Templates
models: new sqlalchemy logic and encryption setup for python3
super-admin -
r5069:aafa637a default
parent child Browse files
Show More
@@ -27,25 +27,32 b' from rhodecode.lib.utils2 import obfusca'
27 log = logging.getLogger(__name__)
27 log = logging.getLogger(__name__)
28
28
29
29
30 def init_model(engine, encryption_key=None):
30 def init_model(engine, encryption_key: bytes = b''):
31 """
31 """
32 Initializes db session, bind the engine with the metadata,
32 Initializes db session, bind the engine with the metadata,
33 Call this before using any of the tables or classes in the model,
33 Call this before using any of the tables or classes in the model,
34 preferably once in application start
34 preferably once in application start
35
35
36 :param engine: engine to bind to
36 :param engine: engine to bind to
37 :param encryption_key: key used for encryption
37 """
38 """
39
38 engine_str = obfuscate_url_pw(str(engine.url))
40 engine_str = obfuscate_url_pw(str(engine.url))
39 log.info("RhodeCode %s initializing db for %s", rhodecode.__version__, engine_str)
41 log.info("RhodeCode %s initializing db for %s", rhodecode.__version__, engine_str)
40 meta.Base.metadata.bind = engine
42
41 db.ENCRYPTION_KEY = encryption_key
43 meta.bind_engine_to_session(engine)
44 init_model_encryption(db, enc_key=encryption_key)
42
45
43
46
44 def init_model_encryption(migration_models, config=None):
47 def init_model_encryption(*db_models, enc_key: bytes = b'', config=None):
48 if not enc_key:
45 from pyramid.threadlocal import get_current_registry
49 from pyramid.threadlocal import get_current_registry
46 config = config or get_current_registry().settings
50 config = config or get_current_registry().settings
47 migration_models.ENCRYPTION_KEY = get_encryption_key(config)
51 enc_key = get_encryption_key(config)
48 db.ENCRYPTION_KEY = get_encryption_key(config)
52
53 for db_model in db_models:
54 log.debug('setting encryption key for model %s', db_model)
55 db_model.ENCRYPTION_KEY = enc_key
49
56
50
57
51 class BaseModel(object):
58 class BaseModel(object):
@@ -23,33 +23,53 b' SQLAlchemy Metadata and Session object'
23
23
24 from sqlalchemy.orm import declarative_base
24 from sqlalchemy.orm import declarative_base
25 from sqlalchemy.orm import scoped_session, sessionmaker
25 from sqlalchemy.orm import scoped_session, sessionmaker
26 from sqlalchemy.orm import Session as SASession
26 from sqlalchemy.orm import Session as SA_Session
27 from rhodecode.lib.caching_query import ORMCache
27 from rhodecode.lib.caching_query import ORMCache
28
28
29
29
30 __all__ = ['Base', 'Session', 'raw_query_executor']
30 __all__ = [
31 'Base', 'Session', 'SA_Session',
32 'raw_query_executor',
33 'bind_engine_to_session',
34 'get_engine'
35 ]
31
36
32 # scoped_session. Apply our custom CachingQuery class to it,
37 # scoped_session. Apply our custom CachingQuery class to it,
33 # using a callable that will associate the dictionary
38 # using a callable that will associate the dictionary
34 # of regions with the Query.
39 # of regions with the Query.
35 # to use cache use this in query
40 # to use cache use this in query
36 # .options(FromCache("sqlalchemy_cache_type", "cachekey"))
41 # .options(FromCache("sqlalchemy_cache_type", "cachekey"))
37 Session = scoped_session(
42 session_factory = sessionmaker(
38 sessionmaker(
39 expire_on_commit=True,
43 expire_on_commit=True,
40 )
44 future=True
41 )
45 )
42
46
43 # pass empty regions so we can fetch it on-demand inside ORMCache
47 Session = scoped_session(session_factory)
48
49 # The declarative Base
50 Base = declarative_base()
51
52 # pass empty regions, so we can fetch it on-demand inside ORMCache
44 cache = ORMCache(regions={})
53 cache = ORMCache(regions={})
45 cache.listen_on_session(Session)
54 cache.listen_on_session(Session)
46
55
47
56
48 # The declarative Base
57 def raw_query_executor(engine=None):
49 Base = declarative_base()
58 """
59
60 :param engine:
61 :return:
62 """
63 if not engine:
64 engine = Session.bind
65 session = SA_Session(engine)
66 return session
50
67
51
68
52 def raw_query_executor():
69 def get_engine():
53 engine = Base.metadata.bind
70 return Session.bind
54 session = SASession(engine)
71
55 return session
72
73 def bind_engine_to_session(engine):
74 Session.remove()
75 Session.configure(bind=engine)
General Comments 0
You need to be logged in to leave comments. Login now