#!/usr/bin/env python # ********************************************************************** # # Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved. # # This copy of Ice is licensed to you under the terms described in the # ICE_LICENSE file included in this distribution. # # ********************************************************************** # # This script upgrades an IceStorm registry database environment from # the 3.1.x version of IceStorm to the new format. # # Usage: # # python upgradeicestorm.py olddbenv newdbenv # # Where: # # olddbenv is the path of the Ice 3.1.x registry database environment # newdbenv is the path of the Ice 3.2 registry database environment # import sys, os, tempfile olddbenv = None newdbenv = None bindir = None slicedir = None # # Show usage information. # def usage(): print "Usage: " + sys.argv[0] + " [options] olddbenv newdbenv" print print "Options:" print "-h Show this message." def printOutputFromPipe(pipe): while 1: line = pipe.readline() if not line: break if line.find("warning") == -1: os.write(1, line) def error(message): print "error: " + message sys.exit(1) def transformdb(db, desc, oldSlice, newSlice): global olddbenv, newdbenv, slicedir, bindir temp, oldSliceFile = tempfile.mkstemp("oldslice.ice") os.write(temp, oldSlice) os.close(temp) temp, newSliceFile = tempfile.mkstemp("newslice.ice") os.write(temp, newSlice) os.close(temp) temp, descFile = tempfile.mkstemp("desc.xml") os.write(temp, desc) os.close(temp) transformdb = os.path.join(bindir, "transformdb") + " -i --old " + oldSliceFile + " --new " + newSliceFile + \ " -f " + descFile + " " + olddbenv + " " + db + " " + newdbenv + " 2>&1" pipe = os.popen(transformdb) printOutputFromPipe(pipe) os.remove(oldSliceFile) os.remove(newSliceFile) os.remove(descFile) if pipe.close(): sys.exit(1) # # Check arguments # olddbenv = "" newdbenv = "" for x in sys.argv[1:]: if x == "-h": usage() sys.exit(0) elif x.startswith("-"): print sys.argv[0] + ": unknown option `" + x + "'" print usage() sys.exit(1) elif olddbenv == "": olddbenv = x elif newdbenv == "": newdbenv = x else: usage() sys.exit(0) if not os.path.exists(olddbenv): error("database environment `" + olddbenv + "' doesn't exist") if not os.path.exists(newdbenv): error("database environment `" + newdbenv + "' doesn't exist") elif os.path.exists(os.path.join(newdbenv, "topics")): error("database environment `" + newdbenv + "' already has databases") icedir = os.getenv("ICE_HOME") if icedir == None: icedir = os.path.join(os.path.dirname(sys.argv[0]), "..") for bindir in [os.path.join(icedir, "bin"), "/usr/bin"]: bindir = os.path.normpath(bindir) if os.path.exists(os.path.join(bindir, "transformdb")): break else: error("can't locate the `transformdb' executable") desc = \ '' + \ ' ' + \ ' ' + \ ' ' + \ ' ' + \ ' ' + \ ' ' + \ ' ' + \ ' ' + \ '' oldSlice = \ 'module IceStorm' + \ '{' + \ 'interface TopicLink;' + \ 'interface Topic;' + \ 'struct LinkRecord' + \ '{' + \ ' TopicLink* obj;' + \ ' int cost;' + \ ' Topic* theTopic;' + \ '};' + \ 'dictionary LinkRecordDict;' + \ '};' newSlice = \ 'module Ice' + \ '{' + \ 'struct Identity' + \ '{' + \ ' string name;' + \ ' string category;' + \ '};' + \ '};' + \ 'module IceStorm' + \ '{' + \ 'interface TopicLink;' + \ 'interface Topic;' + \ 'struct LinkRecord' + \ '{' + \ ' TopicLink* obj;' + \ ' int cost;' + \ ' Topic* theTopic;' + \ '};' + \ 'sequence LinkRecordSeq;' + \ '};' transformdb("topics", desc, oldSlice, newSlice)