diff --git a/bitbake/lib/prserv/db.py b/bitbake/lib/prserv/db.py index 36c9f7b630..2a86184170 100644 --- a/bitbake/lib/prserv/db.py +++ b/bitbake/lib/prserv/db.py @@ -231,6 +231,14 @@ class PRTable(object): datainfo.append(col) return (metainfo, datainfo) + def dump_db(self, fd): + writeCount = 0 + for line in self.conn.iterdump(): + writeCount = writeCount + len(line) + 1 + fd.write(line) + fd.write('\n') + return writeCount + class PRData(object): """Object representing the PR database""" def __init__(self, filename, nohist=True): diff --git a/bitbake/lib/prserv/serv.py b/bitbake/lib/prserv/serv.py index f588f4dc27..affccd9b3b 100644 --- a/bitbake/lib/prserv/serv.py +++ b/bitbake/lib/prserv/serv.py @@ -4,6 +4,7 @@ from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler import threading import Queue import socket +import StringIO try: import sqlite3 @@ -59,6 +60,7 @@ class PRServer(SimpleXMLRPCServer): self.register_function(self.quit, "quit") self.register_function(self.ping, "ping") self.register_function(self.export, "export") + self.register_function(self.dump_db, "dump_db") self.register_function(self.importone, "importone") self.register_introspection_functions() @@ -115,6 +117,26 @@ class PRServer(SimpleXMLRPCServer): logger.error(str(exc)) return None + def dump_db(self): + """ + Returns a script (string) that reconstructs the state of the + entire database at the time this function is called. The script + language is defined by the backing database engine, which is a + function of server configuration. + Returns None if the database engine does not support dumping to + script or if some other error is encountered in processing. + """ + buff = StringIO.StringIO() + try: + self.table.sync() + self.table.dump_db(buff) + return buff.getvalue() + except Exception as exc: + logger.error(str(exc)) + return None + finally: + buff.close() + def importone(self, version, pkgarch, checksum, value): return self.table.importone(version, pkgarch, checksum, value) @@ -288,6 +310,9 @@ class PRServerConnection(object): def export(self,version=None, pkgarch=None, checksum=None, colinfo=True): return self.connection.export(version, pkgarch, checksum, colinfo) + def dump_db(self): + return self.connection.dump_db() + def importone(self, version, pkgarch, checksum, value): return self.connection.importone(version, pkgarch, checksum, value)