Source code for adpay.db
import logging
import txmongo
from twisted.internet import defer
from txmongo import filter
from adpay.db import consts as db_const
[docs]@defer.inlineCallbacks
def configure_db():
"""
Initialize the database, configure indexes.
Add a dummy campaigns for events without campaigns.
:return:
"""
logger = logging.getLogger(__name__)
yield get_mongo_db()
campaign_idx = filter.sort(filter.ASCENDING("campaign_id"))
banner_idx = filter.sort(filter.ASCENDING("banner_id"))
timestamp_idx = filter.sort(filter.ASCENDING("timestamp"))
event_idx = filter.sort(filter.ASCENDING("event_id"))
user_idx = filter.sort(filter.ASCENDING("user_id"))
keyword_idx = filter.sort(filter.ASCENDING("keyword"))
updated_idx = filter.sort(filter.ASCENDING("updated"))
campaign_event_idx = filter.sort(filter.ASCENDING("campaign_id") + filter.ASCENDING("event_id"))
campaign_collection = yield get_campaign_collection()
yield campaign_collection.create_index(campaign_idx, unique=True)
banner_collection = yield get_banner_collection()
yield banner_collection.create_index(banner_idx, unique=True)
yield banner_collection.create_index(campaign_idx)
event_collection = yield get_event_collection()
yield event_collection.create_index(event_idx, unique=True)
yield event_collection.create_index(timestamp_idx)
yield event_collection.create_index(banner_idx)
yield event_collection.create_index(user_idx)
payment_collection = yield get_payment_collection()
yield payment_collection.create_index(timestamp_idx)
yield payment_collection.create_index(campaign_event_idx)
payment_round_collection = yield get_payment_rounds_collection()
yield payment_round_collection.create_index(timestamp_idx, unique=True)
user_value_collection = yield get_user_value_collection()
yield user_value_collection.create_index(user_idx)
yield user_value_collection.create_index(campaign_idx)
user_score_collection = yield get_user_score_collection()
yield user_score_collection.create_index(timestamp_idx)
yield user_value_collection.create_index(campaign_idx)
yield user_value_collection.create_index(user_idx)
user_keyword_frequency_collection = yield get_user_keyword_frequency_collection()
yield user_keyword_frequency_collection.create_index(user_idx)
yield user_keyword_frequency_collection.create_index(keyword_idx)
user_profile_collection = yield get_user_profile_collection()
yield user_profile_collection.create_index(user_idx)
keyword_frequency_collection = yield get_keyword_frequency_collection()
yield keyword_frequency_collection.create_index(updated_idx)
yield keyword_frequency_collection.create_index(keyword_idx)
yield logger.debug('Database configured successfully.')
# Add default campaign
yield campaign_collection.replace_one({'campaign_id': 'not_found'},
{
'campaign_id': 'not_found',
'time_start': 0,
'time_end': 2147483646,
'filters': {'require': {},
'exclude': {}},
'keywords': {},
'banners': [],
'max_cpc': 0,
'max_cpm': 0,
'budget': 0
},
upsert=True)
[docs]@defer.inlineCallbacks
def get_mongo_db():
"""
Return specific, named database for this application.
:return: Database
"""
conn = yield get_mongo_connection()
defer.returnValue(getattr(conn, db_const.MONGO_DB_NAME))
[docs]@defer.inlineCallbacks
def get_payment_collection():
"""
Return collection for payments.
:return: Payments collection
"""
mongo_db = yield get_mongo_db()
defer.returnValue(mongo_db.payments)
[docs]@defer.inlineCallbacks
def get_payment_rounds_collection():
"""
Return collection for payment rounds.
:return: Payment rounds collection
"""
mongo_db = yield get_mongo_db()
defer.returnValue(mongo_db.payments_rounds)
[docs]@defer.inlineCallbacks
def get_campaign_collection():
"""
Return collection for campaigns.
:return: Campaign collection
"""
mongo_db = yield get_mongo_db()
defer.returnValue(mongo_db.campaign)
[docs]@defer.inlineCallbacks
def get_banner_collection():
"""
Return collection for banners.
:return: Banner collection
"""
mongo_db = yield get_mongo_db()
defer.returnValue(mongo_db.banners)
[docs]@defer.inlineCallbacks
def get_event_collection():
"""
Return collection for events.
:return: Event collection
"""
mongo_db = yield get_mongo_db()
defer.returnValue(mongo_db.events)
[docs]@defer.inlineCallbacks
def get_user_value_collection():
"""
Return collection for user values (legacy).
:return: User values collection
"""
mongo_db = yield get_mongo_db()
defer.returnValue(mongo_db.user_values)
[docs]@defer.inlineCallbacks
def get_user_score_collection():
"""
Return collection for user scores (legacy).
:return: User score collection
"""
mongo_db = yield get_mongo_db()
defer.returnValue(mongo_db.user_scores)
[docs]@defer.inlineCallbacks
def get_user_keyword_frequency_collection():
"""
Return collection for keywords frequencies in user profiles (legacy).
:return: User keyword frequency collection
"""
mongo_db = yield get_mongo_db()
defer.returnValue(mongo_db.user_keyword_frequency)
[docs]@defer.inlineCallbacks
def get_user_profile_collection():
"""
Return collection for user profiles (legacy).
:return: User profile collection
"""
mongo_db = yield get_mongo_db()
defer.returnValue(mongo_db.user_profile)
[docs]@defer.inlineCallbacks
def get_keyword_frequency_collection():
"""
Return collection for keyword frequencies (legacy).
:return: Keyword frequency collection
"""
mongo_db = yield get_mongo_db()
defer.returnValue(mongo_db.keyword_frequency)
#: Global MongoDB connection
MONGO_CONNECTION = None
[docs]@defer.inlineCallbacks
def get_mongo_connection():
"""
:return: Global MongoDB connection (adpay.db.MONGO_CONNECTION)
"""
global MONGO_CONNECTION
if MONGO_CONNECTION is None:
MONGO_CONNECTION = yield txmongo.lazyMongoConnectionPool(port=db_const.MONGO_DB_PORT)
defer.returnValue(MONGO_CONNECTION)
[docs]@defer.inlineCallbacks
def disconnect():
"""
Disconnect the global connection
:return: None
"""
global MONGO_CONNECTION
conn = yield get_mongo_connection()
yield conn.disconnect()
MONGO_CONNECTION = None