diff --git a/init-db.py b/init-db.py new file mode 100755 index 0000000..bf0d1cb --- /dev/null +++ b/init-db.py @@ -0,0 +1,123 @@ +#! /usr/bin/python3 +import pymysql +from common import norm, get_tile_width, get_tile, get_area_name + +# TODO set default to false +force = True + +states = [ + "pending", + "started", + "done", + "packaged", + "skip", + "rebuild" +] + +#try: +db = pymysql.connect("localhost", dbuser, dbpw, "worldbuild") + +cursor = db.cursor() + +if force: + cursor.execute("DROP TABLE tile") + cursor.execute("DROP TABLE secondLevel") + cursor.execute("DROP TABLE topLevel") + cursor.execute("DROP TABLE status") + +cursor.execute("CREATE TABLE IF NOT EXISTS status (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(15) UNIQUE NOT NULL);") +cursor.execute("CREATE TABLE IF NOT EXISTS topLevel (id INT PRIMARY KEY AUTO_INCREMENT, name CHAR(7) UNIQUE NOT NULL, status_id INT NOT NULL, FOREIGN KEY (status_id) REFERENCES status(id));") +cursor.execute("CREATE TABLE IF NOT EXISTS secondLevel (id INT PRIMARY KEY AUTO_INCREMENT, name CHAR(7) UNIQUE NOT NULL, status_id INT NOT NULL, parent_id INT NOT NULL, FOREIGN KEY (status_id) REFERENCES status(id), FOREIGN KEY (parent_id) REFERENCES topLevel(id));") +cursor.execute("CREATE TABLE IF NOT EXISTS tile (id INT PRIMARY KEY AUTO_INCREMENT, status_id INT NOT NULL, parent_id INT NOT NULL, FOREIGN KEY (status_id) REFERENCES status(id), FOREIGN KEY (parent_id) REFERENCES secondLevel(id));") + + +for state in states: + sql = "INSERT INTO status(name) VALUES ('" + state + "')" + cursor.execute(sql) + +sql = "SELECT id FROM status WHERE name='pending'" +cursor.execute(sql) +result = cursor.fetchall() +for row in result: + sid = str(row[0]) + +print("Creating tile groups") +ii = -9 +while ii < 9: + i = ii * 10 + jj = -18 + while jj < 18: + j = jj * 10 + major = get_area_name(i, j) + + sql = "INSERT INTO topLevel (name, status_id) VALUES ('" + major + "', " + sid + ");" + cursor.execute(sql) + + sql = "SELECT id FROM topLevel WHERE name='" + major + "'" + cursor.execute(sql) + result = cursor.fetchall() + for row in result: + major_id = str(row[0]) + + for k in range(0, 10): + iii = i + for l in range(0, 10): + minor = get_area_name(iii, j) + sql = "INSERT INTO secondLevel (parent_id, name, status_id) VALUES (" + major_id + ", '" + minor + "', " + sid + ")" + cursor.execute(sql) + iii += 1 + j += 1 + jj += 1 + ii += 1 + +print("Creating tiles") +lat = -90 +while lat < 90: + lon = -180 + while lon < 180: + tile = get_tile(lat, lon) + parent = get_area_name(int(lat), int(lon)) + sql="SELECT id FROM secondLevel WHERE name='" + parent + "'" + cursor.execute(sql) + result = cursor.fetchall() + for row in result: + pid = row[0] + sql = "INSERT INTO tile (id, parent_id, status_id) VALUES (" + str(tile) + ", " + str(pid) + ", " + sid + ")" + cursor.execute(sql) + lon += get_tile_width(lat) + lat += 0.125 + +db.commit() + +# TODO create trigger +# Get states +#SELECT status.name AS state, COUNT(status.name) AS occ FROM tile INNER JOIN status ON tile.status_id = status.id WHERE tile.parent_id = 400 GROUP BY status.name; +''' +DELIMITER // +CREATE OR REPLACE TRIGGER update_second_level +AFTER UPDATE ON tile +FOR EACH ROW +BEGIN + IF (SELECT COUNT(status_id) FROM tile WHERE tile.parent_id = NEW.parent_id) = (SELECT COUNT(status_id) FROM tile WHERE tile.parent_id = NEW.parent_id AND status_id = (SELECT id FROM status WHERE name = "packaged")) THEN + UPDATE secondLevel SET status_id = (SELECT id FROM status WHERE name = "packaged") WHERE id = NEW.parent_id; + ELSEIF (SELECT COUNT(status_id) FROM tile WHERE tile.parent_id = NEW.parent_id) = (SELECT COUNT(status_id) FROM tile WHERE tile.parent_id = NEW.parent_id AND status_id = (SELECT id FROM status WHERE name = "done")) THEN + UPDATE secondLevel SET status_id = (SELECT id FROM status WHERE name = "done") WHERE id = NEW.parent_id; + ELSEIF (SELECT COUNT(status_id) FROM tile WHERE tile.parent_id = NEW.parent_id AND status_id = (SELECT id FROM status WHERE name = "started")) > 0 THEN + UPDATE secondLevel SET status_id = (SELECT id FROM status WHERE name = "started") WHERE id = NEW.parent_id; + ELSEIF (SELECT COUNT(status_id) FROM tile WHERE tile.parent_id = NEW.parent_id AND status_id = (SELECT id FROM status WHERE name = "rebuild")) > 0 THEN + UPDATE secondLevel SET status_id = (SELECT id FROM status WHERE name = "rebuild") WHERE id = NEW.parent_id; + ELSEIF (SELECT COUNT(status_id) FROM tile WHERE tile.parent_id = NEW.parent_id AND status_id = (SELECT id FROM status WHERE name = "skip")) > 0 THEN + UPDATE secondLevel SET status_id = (SELECT id FROM status WHERE name = "skip") WHERE id = NEW.parent_id; + ELSE + UPDATE secondLevel SET status_id = (SELECT id FROM status WHERE name = "pending") WHERE id = NEW.parent_id; + END IF; +END; // +DELIMITER ; + +''' + +#except: +# db.rollback() +# print("Failed to setup database...") +#finally: +db.close()