aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin/db/sql/convert.py
diff options
context:
space:
mode:
Diffstat (limited to 'mediagoblin/db/sql/convert.py')
-rw-r--r--mediagoblin/db/sql/convert.py131
1 files changed, 91 insertions, 40 deletions
diff --git a/mediagoblin/db/sql/convert.py b/mediagoblin/db/sql/convert.py
index d1492977..ac64cf8d 100644
--- a/mediagoblin/db/sql/convert.py
+++ b/mediagoblin/db/sql/convert.py
@@ -15,26 +15,27 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from copy import copy
+from itertools import chain, imap
-from mediagoblin.init import setup_global_and_app_config, setup_database
-from mediagoblin.db.mongo.util import ObjectId
+from mediagoblin.init import setup_global_and_app_config
-from mediagoblin.db.sql.models import (Base, User, MediaEntry, MediaComment,
- Tag, MediaTag, MediaFile, MediaAttachmentFile, MigrationData)
-from mediagoblin.media_types.image.models import ImageData
-from mediagoblin.media_types.video.models import VideoData
+from mediagoblin.db.sql.base import Session
+from mediagoblin.db.sql.models_v0 import Base_v0
+from mediagoblin.db.sql.models_v0 import (User, MediaEntry, MediaComment,
+ Tag, MediaTag, MediaFile, MediaAttachmentFile, MigrationData,
+ ImageData, VideoData, AsciiData, AudioData)
from mediagoblin.db.sql.open import setup_connection_and_db_from_config as \
sql_connect
from mediagoblin.db.mongo.open import setup_connection_and_db_from_config as \
mongo_connect
-from mediagoblin.db.sql.base import Session
obj_id_table = dict()
+
def add_obj_ids(entry, new_entry):
global obj_id_table
- print "%r -> %r" % (entry._id, new_entry.id)
+ print "\t%r -> SQL id %r" % (entry._id, new_entry.id)
obj_id_table[entry._id] = new_entry.id
@@ -43,6 +44,7 @@ def copy_attrs(entry, new_entry, attr_list):
val = entry[a]
setattr(new_entry, a, val)
+
def copy_reference_attr(entry, new_entry, ref_attr):
val = entry[ref_attr]
val = obj_id_table[val]
@@ -115,12 +117,9 @@ def convert_image(mk_db):
{'media_type': 'mediagoblin.media_types.image'}).sort('created'):
media_data = copy(media.media_data)
- # TODO: Fix after exif is migrated
- media_data.pop('exif', None)
-
if len(media_data):
media_data_row = ImageData(**media_data)
- media_data_row.media_entry = obj_id_table[media._id]
+ media_data_row.media_entry = obj_id_table[media['_id']]
session.add(media_data_row)
session.commit()
@@ -133,7 +132,7 @@ def convert_video(mk_db):
for media in mk_db.MediaEntry.find(
{'media_type': 'mediagoblin.media_types.video'}).sort('created'):
media_data_row = VideoData(**media.media_data)
- media_data_row.media_entry = obj_id_table[media._id]
+ media_data_row.media_entry = obj_id_table[media['_id']]
session.add(media_data_row)
session.commit()
@@ -178,53 +177,105 @@ def convert_media_comments(mk_db):
copy_attrs(entry, new_entry,
('created',
'content',))
- copy_reference_attr(entry, new_entry, "media_entry")
- copy_reference_attr(entry, new_entry, "author")
- session.add(new_entry)
- session.flush()
- add_obj_ids(entry, new_entry)
+ try:
+ copy_reference_attr(entry, new_entry, "media_entry")
+ copy_reference_attr(entry, new_entry, "author")
+ except KeyError as e:
+ print('KeyError in convert_media_comments(): {0}'.format(e))
+ else:
+ session.add(new_entry)
+ session.flush()
+ add_obj_ids(entry, new_entry)
session.commit()
session.close()
-def convert_add_migration_versions():
+media_types_tables = (
+ ("mediagoblin.media_types.image", (ImageData,)),
+ ("mediagoblin.media_types.video", (VideoData,)),
+ ("mediagoblin.media_types.ascii", (AsciiData,)),
+ ("mediagoblin.media_types.audio", (AudioData,)),
+ )
+
+
+def convert_add_migration_versions(dummy_sql_db):
session = Session()
- for name in ("__main__",
- "mediagoblin.media_types.image",
- "mediagoblin.media_types.video",
- ):
- m = MigrationData(name=name, version=0)
+ for name in chain(("__main__",),
+ imap(lambda e: e[0], media_types_tables)):
+ print "\tAdding %s" % (name,)
+ m = MigrationData(name=unicode(name), version=0)
session.add(m)
session.commit()
session.close()
+def cleanup_sql_tables(sql_db):
+ for mt, table_list in media_types_tables:
+ session = Session()
+
+ count = session.query(MediaEntry.media_type). \
+ filter_by(media_type=unicode(mt)).count()
+ print " %s: %d entries" % (mt, count)
+
+ if count == 0:
+ print "\tAnalyzing tables"
+ for tab in table_list:
+ cnt2 = session.query(tab).count()
+ print "\t %s: %d entries" % (tab.__tablename__, cnt2)
+ assert cnt2 == 0
+
+ print "\tRemoving migration info"
+ mi = session.query(MigrationData).filter_by(name=unicode(mt)).one()
+ session.delete(mi)
+ session.commit()
+ session.close()
+
+ print "\tDropping tables"
+ tables = [model.__table__ for model in table_list]
+ Base_v0.metadata.drop_all(sql_db.engine, tables=tables)
+
+ session.close()
+
+
+def print_header(title):
+ print "\n=== %s ===" % (title,)
+
+
+convert_call_list = (
+ ("Converting Users", convert_users),
+ ("Converting Media Entries", convert_media_entries),
+ ("Converting Media Data for Images", convert_image),
+ ("Cnnverting Media Data for Videos", convert_video),
+ ("Converting Tags for Media", convert_media_tags),
+ ("Converting Media Comments", convert_media_comments),
+ )
+
+sql_call_list = (
+ ("Filling Migration Tables", convert_add_migration_versions),
+ ("Analyzing/Cleaning SQL Data", cleanup_sql_tables),
+ )
+
def run_conversion(config_name):
global_config, app_config = setup_global_and_app_config(config_name)
sql_conn, sql_db = sql_connect(app_config)
mk_conn, mk_db = mongo_connect(app_config)
- Base.metadata.create_all(sql_db.engine)
-
- convert_users(mk_db)
- Session.remove()
- convert_media_entries(mk_db)
- Session.remove()
- convert_image(mk_db)
- Session.remove()
- convert_video(mk_db)
- Session.remove()
- convert_media_tags(mk_db)
- Session.remove()
- convert_media_comments(mk_db)
- Session.remove()
- convert_add_migration_versions()
- Session.remove()
+ Base_v0.metadata.create_all(sql_db.engine)
+
+ for title, func in convert_call_list:
+ print_header(title)
+ func(mk_db)
+ Session.remove()
+
+ for title, func in sql_call_list:
+ print_header(title)
+ func(sql_db)
+ Session.remove()
if __name__ == '__main__':