#! /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()