3 # Debian Archive Kit Database Update Script
4 # Copyright (C) 2008 Michael Casadevall <mcasadevall@debian.org>
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 ################################################################################
22 # <Ganneff> when do you have it written?
23 # <NCommander> Ganneff, after you make my debian account
24 # <Ganneff> blackmail wont work
25 # <NCommander> damn it
27 ################################################################################
32 from daklib import database
33 from daklib import utils
35 ################################################################################
39 required_database_schema = 1
41 ################################################################################
44 def usage (self, exit_code=0):
45 print """Usage: dak update-db
46 Updates dak's database schema to the lastest version. You should disable crontabs while this is running
48 -h, --help show this help and exit."""
52 ################################################################################
53 def update_db_to_zero(self):
54 # This function will attempt to update a pre-zero database schema to zero
56 # First, do the sure thing, and create the configuration table
58 print "Creating configuration table ..."
60 c.execute("""CREATE TABLE config (
61 id SERIAL PRIMARY KEY NOT NULL,
62 name TEXT UNIQUE NOT NULL,
65 c.execute("INSERT INTO config VALUES ( nextval('config_id_seq'), 'db_revision', '0')");
68 except psycopg2.ProgrammingError:
70 print "Failed to create configuration table."
71 print "Can the projectB user CREATE TABLE?"
73 print "Aborting update."
76 ################################################################################
81 # We keep database revision info the config table
86 q = c.execute("SELECT value FROM config WHERE name = 'db_revision';");
87 return c.fetchone()[0]
89 except psycopg2.ProgrammingError:
90 # Whoops .. no config table ...
92 print "No configuration table found, assuming dak database revision to be pre-zero"
95 ################################################################################
98 # Ok, try and find the configuration table
99 print "Determining dak database revision ..."
102 self.db = psycopg2.connect("dbname='" + Cnf["DB::Name"] + "' host='" + Cnf["DB::Host"] + "' port='" + str(Cnf["DB::Port"]) + "'")
105 print "FATAL: Failed connect to database"
108 database_revision = int(self.get_db_rev())
110 if database_revision == -1:
111 print "dak database schema predates update-db."
113 print "This script will attempt to upgrade it to the lastest, but may fail."
114 print "Please make sure you have a database backup handy. If you don't, press Ctrl-C now!"
116 print "Continuing in five seconds ..."
119 print "Attempting to upgrade pre-zero database to zero"
121 self.update_db_to_zero()
122 database_revision = 0
124 print "dak database schema at " + str(database_revision)
125 print "dak version requires schema " + str(required_database_schema)
127 if database_revision == required_database_schema:
128 print "no updates required"
131 for i in range (database_revision, required_database_schema):
132 print "updating databse schema from " + str(database_revision) + " to " + str(i+1)
133 dakdb = __import__("dakdb", globals(), locals(), ['update'+str(i+1)])
134 update_module = getattr(dakdb, "update"+str(i+1))
135 update_module.do_update(self)
136 database_revision /+ 1
138 ################################################################################
143 Cnf = utils.get_conf()
144 arguments = [('h', "help", "Update-DB::Options::Help")]
146 if not Cnf.has_key("Update-DB::Options::%s" % (i)):
147 Cnf["Update-DB::Options::%s" % (i)] = ""
149 arguments = apt_pkg.ParseCommandLine(Cnf, arguments, sys.argv)
151 options = Cnf.SubTree("Update-DB::Options")
155 utils.warn("dak update-db takes no arguments.")
160 ################################################################################
162 if __name__ == '__main__':