passwd = self.cfg.get('target', 'pass'),
charset = 'utf8')
- self.logger = Logger(self.cfg.get('report', 'filename'))
-
def run(self, only_task = None):
"""Run all tasks or a single one identified by its name with only_task"""
+ self.logger = Logger(self.cfg.get('report', 'filename'))
self.done = []
try:
self.done.extend(self.run_tasks(self.initializers, "initializer", only_task = only_task))
self.done.extend(self.run_tasks(self.migrators, "migrator", only_task = only_task))
if only_task and not len(self.done):
raise "No such task: %s" % only_task
+ else:
+ self.logger.terminate()
except KeyboardInterrupt:
self.logger.interrupt()
import time
import warnings
import _mysql_exceptions
+import subprocess
+
class DataMigrationTask(Component):
def setup(self, cfg, src_db, target_db, logger):
def __init__(self, report_filename = None):
self.report_filename = report_filename
+ self.version = subprocess.Popen(["svnversion"], stdout=subprocess.PIPE).communicate()[0].strip()
+ self.appname = "CREM Database Migrator r%s" % self.version
+ self.run_start_time = time.time()
+ s = "%s starting on %s" % (self.appname, time.strftime("%Y-%m-%d %H:%M:%S"))
+ self.color(s + "\n")
+ self.sep = ""
+ for i in range(0,len(s)):
+ self.sep += "~"
+ self.color3("%s\n" % self.sep)
+ if self.report_filename:
+ self.report_file = open(self.report_filename, "a")
+ self.report_file.write("========================================================================\n")
+ self.report_file.write("%s\n" % s)
+ self.report_file.close()
+ else:
+ self.report_file = None
def warn(self, message):
self.warnings.append(message)
self.color(msg, self.CRED)
def print_progress(self, ratio, end = False):
- msg = "Running %s %s..." % (self.task.get_name(), self.task.get_type())
+ msg = "* Running %s %s..." % (self.task.get_name(), self.task.get_type())
msg = "%-46s" % msg
- barwidth = 10
+ barwidth = 18
p = ""
r = int(round(ratio * barwidth))
for i in range(0, r):
p += ' '
self.color1("\r" + msg)
- self.color2(" [%s] %d%%" % (p, ratio * 100))
+ self.color1(" [%s] %d%%" % (p, ratio * 100))
if end:
- self.color2(" (%.2fs)" % (time.time() - self.start_time))
+ self.color1(" (%.2fs)" % (time.time() - self.start_time))
- self.color("\n%s" % self.task.__doc__)
+ self.color("\n %s" % self.task.__doc__)
#self.color3(" warnings: %d" % len(self.warnings))
stats = self.task.get_stats()
if len(self.warnings):
stats['warnings'] = len(self.warnings)
if stats:
- stdout.write("\n%s" % self.fmt_stats(stats))
+ stdout.write("\n %s" % self.fmt_stats(stats))
stdout.write("\n")
if not end:
stdout.write(self.CREVERSENL + self.CREVERSENL)
def fmt_stats(self, stats, colors = True):
if colors:
- fmt = [k + ": " + self.CBOLD + self.CRED + str(stats[k]) + self.CDEFAULT for k in stats]
+ fmt = [k + ": " + self.CBOLD + self.CCYAN + str(stats[k]) + self.CDEFAULT for k in stats]
else:
fmt = [k + ": " + str(stats[k]) for k in stats]
self.print_progress(1, True)
if self.report_file:
self.write_report(self.report_file)
+ self.report_file.close()
self.need_newline = False
self.task = None
stdout.write(self.CRESET)
+ def terminate(self):
+ self.color3(self.sep + "\n")
+ runtime = "%.2fs" % (time.time() - self.run_start_time)
+ s = "Done. Total runtime: %s\n" % runtime
+ self.color(s)
+ if self.report_filename:
+ self.report_file = open(self.report_filename, "a")
+ self.report_file.write("========================================================================\n")
+ self.report_file.write("%s\n" % s)
+ self.report_file.close()
+