It's 2012 all up in here
[mediagoblin.git] / mediagoblin / db / mongo / open.py
1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU Affero General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17 import pymongo
18 import mongokit
19 from paste.deploy.converters import asint
20 from mediagoblin.db.mongo import models
21 from mediagoblin.db.mongo.util import MigrationManager
22
23
24 def connect_database_from_config(app_config, use_pymongo=False):
25 """
26 Connect to the main database, take config from app_config
27
28 Optionally use pymongo instead of mongokit for the connection.
29 """
30 port = app_config.get('db_port')
31 if port:
32 port = asint(port)
33
34 if use_pymongo:
35 connection = pymongo.Connection(
36 app_config.get('db_host'), port)
37 else:
38 connection = mongokit.Connection(
39 app_config.get('db_host'), port)
40 return connection
41
42
43 def setup_connection_and_db_from_config(app_config, use_pymongo=False):
44 """
45 Setup connection and database from config.
46
47 Optionally use pymongo instead of mongokit.
48 """
49 connection = connect_database_from_config(app_config, use_pymongo)
50 database_path = app_config['db_name']
51 db = connection[database_path]
52
53 if not use_pymongo:
54 models.register_models(connection)
55
56 return (connection, db)
57
58
59 def check_db_migrations_current(db):
60 # This MUST be imported so as to set up the appropriate migrations!
61 from mediagoblin.db.mongo import migrations
62
63 # Init the migration number if necessary
64 migration_manager = MigrationManager(db)
65 migration_manager.install_migration_version_if_missing()
66
67 # Tiny hack to warn user if our migration is out of date
68 if not migration_manager.database_at_latest_migration():
69 db_migration_num = migration_manager.database_current_migration()
70 latest_migration_num = migration_manager.latest_migration()
71 if db_migration_num < latest_migration_num:
72 print (
73 "*WARNING:* Your migrations are out of date, "
74 "maybe run ./bin/gmg migrate?")
75 elif db_migration_num > latest_migration_num:
76 print (
77 "*WARNING:* Your migrations are out of date... "
78 "in fact they appear to be from the future?!")