diff --git a/Design/Database/YouTubeMDBot.drawio b/Design/Database/YouTubeMDBot.drawio
index 61a985a..6e7c827 100644
--- a/Design/Database/YouTubeMDBot.drawio
+++ b/Design/Database/YouTubeMDBot.drawio
@@ -1 +1 @@
-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
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/Design/Database/database_model.mwb b/Design/Database/database_model.mwb
deleted file mode 100755
index e36a68a..0000000
Binary files a/Design/Database/database_model.mwb and /dev/null differ
diff --git a/Design/Database/database_model.mwb.bak b/Design/Database/database_model.mwb.bak
deleted file mode 100755
index 03ffdc9..0000000
Binary files a/Design/Database/database_model.mwb.bak and /dev/null differ
diff --git a/Design/Database/exporter.py b/Design/Database/exporter.py
deleted file mode 100755
index 937d141..0000000
--- a/Design/Database/exporter.py
+++ /dev/null
@@ -1,257 +0,0 @@
-#!/usr/bin/env python
-#
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2011 by Aevum Softwares LTDA ME
-#
-# This is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-import sys
-import optparse
-import os
-import re
-
-__version__ = 0.1
-SEQUENCE_SUFFIX = "sequence"
-SCHEMA = "";
-
-def remove_comments(string):
- string = re.sub(re.compile("/\*.*?\*/", re.DOTALL), "", string) # remove all block comments (/*COMMENT */)
- string = re.sub(re.compile("//.*?\n"), "", string) # remove all single line comments (//COMMENT\n)
- return string
-
-
-def remove_lines_started_with(word, lines):
- toRemove = []
- for line in lines:
- if line.startswith(word):
- toRemove.append(line)
- for line in toRemove:
- lines.remove(line)
-
-
-def remove_lines_with(word, lines):
- toRemove = []
- for line in lines:
- if word in line:
- toRemove.append(line)
- for line in toRemove:
- lines.remove(line)
-
-
-def remove_word(word, lines, numberOfNextWords=0):
- substitute = "@@@"
- for i in range(len(lines)):
- if not numberOfNextWords:
- lines[i] = lines[i].replace(word, "")
- else:
- line = lines[i]
- line = line.replace(word, substitute)
- if substitute in line:
- split = line.split()
- nextWords = []
- for j in range(len(split)):
- if split[j] == substitute:
- for k in range(numberOfNextWords):
- nextWords.append(split[k + j + 1])
- replaceString = substitute
- for k in range(numberOfNextWords):
- replaceString = "{0} {1}".format(replaceString, nextWords[k])
- lines[i] = line.replace(replaceString, "")
-
-
-def put_semicolons(lines):
- numberOfOpenningParenthesis = 0
- numberOfClosingParenthesis = 0
- for i in range(len(lines)):
- line = lines[i]
- split = lines[i].split()
- if "CREATE" in split and "TABLE" in split:
- if split.index("CREATE") == split.index("TABLE") - 1:
- numberOfOpenningParenthesis = 0
- numberOfClosingParenthesis = 0
-
- while "(" in line:
- line = line.replace("(", "", 1)
- numberOfOpenningParenthesis = numberOfOpenningParenthesis + 1
-
- while ")" in line:
- line = line.replace(")", "", 1)
- numberOfClosingParenthesis = numberOfClosingParenthesis + 1
-
- if numberOfOpenningParenthesis == numberOfClosingParenthesis:
- if numberOfOpenningParenthesis != 0:
- lines[i] = lines[i].replace("\n", "") + ";\n"
- numberOfOpenningParenthesis = 0
- numberOfClosingParenthesis = 0
-
-
-def create_sequences(lines):
- sequences = []
- lastTable = None
- for i in range(len(lines)):
- line = lines[i]
- split = line.split()
- if "CREATE" in split and "TABLE" in split:
- if split.index("CREATE") == split.index("TABLE") - 1:
- lastTable = split[split.index("CREATE") + 2]
- elif "AUTO_INCREMENT" in line:
- if "." in lastTable:
- spl = lastTable.replace("\"", "").split(".")
- schema = "\"" + spl[0] + "\"."
- table = spl[1]
- else:
- table = lastTable.replace("\"", "")
- schema = ""
-
- column = split[0].replace("\"", "")
- sequences.append({"table": table, "column": column, "schema": schema})
-
- for sequence in sequences:
- lines.append("{0} {1}\"{2}_{3}_{4}\";\n".format(
- "DROP SEQUENCE IF EXISTS",
- sequence["schema"],
- sequence["table"],
- sequence["column"],
- SEQUENCE_SUFFIX))
- lines.append("{0} {1}\"{2}_{3}_{4}\";\n".format(
- "CREATE SEQUENCE ",
- sequence["schema"],
- sequence["table"],
- sequence["column"],
- SEQUENCE_SUFFIX))
- lines.append("ALTER TABLE {0}\"{1}\" ALTER COLUMN \"{2}\" SET DEFAULT NEXTVAL('{0}\"{1}_{2}_{3}\"');\n".format(
- sequence["schema"],
- sequence["table"],
- sequence["column"],
- SEQUENCE_SUFFIX,))
-def get_current_schema(lines):
- for line in lines:
- if "CREATE SCHEMA" in line:
- return re.sub('\s+',' ',line.replace(';', '').replace('"', '')).strip().split(' ')[-1]
- elif "CREATE TABLE" in line:
- tbl = re.search("CREATE TABLE (.*) \(", line).group(1).replace('"', '')
- if "." in tbl:
- return tbl.split('.')[0].strip()
- return None
-
-def set_schema(lines):
- currSchema = get_current_schema(lines)
- if currSchema == None:
- print("There is no schema set on the original script! Will default to public schema") # Not implemented: add schema to all statements
- else:
- for i in range(len(lines)):
- line = lines[i]
- regex = re.compile("((" + currSchema + ")(\")?(\.|;))")
- search = regex.search(line)
- if search:
- sufix = ''
- if search.group(3):
- sufix += search.group(3);
- if search.group(4):
- sufix += search.group(4)
-
- line = re.sub(regex, SCHEMA + sufix, line)
- lines[i] = line
-
-def replace_word(word, replace, lines):
- for i in range(len(lines)):
- lines[i] = lines[i].replace(word, replace)
-
-
-def replace_regex(search, replace, lines):
- for i in range(len(lines)):
- lines[i] = re.sub(re.compile(search), replace, lines[i])
-
-def add_cascade_to_drops(lines):
- for i in range(len(lines)):
- line = lines[i]
- if line.startswith("DROP"):
- lines[i] = line.replace(";", "CASCADE;")
-
-
-def convert(input, output):
- contents = input.read()
- lines = remove_comments(contents).splitlines(True)
- remove_lines_with("ASC)", lines)
- remove_lines_started_with("SET", lines)
- remove_lines_started_with("COLLATE", lines)
- remove_lines_started_with("ENGINE", lines)
- remove_lines_started_with("COMMENT", lines)
- remove_lines_started_with("PACK_KEYS", lines)
- replace_regex("COMMENT .*,\n", ",\n", lines)
- remove_word(" COMMENT ", lines)
- remove_lines_started_with("USE", lines)
- replace_word("`", "\"", lines)
- #remove_word("'", lines) # this breaks DEFAULT '' statements
- remove_word("UNSIGNED", lines)
- remove_word("IF NOT EXISTS", lines)
- replace_regex("CREATE SCHEMA (.*);", r"CREATE SCHEMA IF NOT EXISTS \1;", lines)
- remove_word("DEFAULT CHARACTER SET =", lines, 1)
- remove_word("DEFAULT CHARACTER SET", lines, 1)
- remove_word("CHARACTER SET", lines, 1)
- remove_word("COLLATE", lines, 1)
- replace_word("DATETIME", "TIMESTAMP", lines)
- replace_word("TINYINT(1)", "BOOLEAN", lines)
- replace_word("LONGTEXT", "TEXT", lines)
- replace_regex("INT\(\d*\)", "INT", lines)
- remove_word("CONSTRAINT \"\"", lines)
- remove_word("FOREIGN KEY ()", lines)
- put_semicolons(lines)
- add_cascade_to_drops(lines)
- create_sequences(lines)
- remove_word("AUTO_INCREMENT", lines)
- if SCHEMA != "":
- set_schema(lines);
-
- output.writelines(lines)
-
-def main(args):
- """Check arguments from the command line and executed the required action"""
- parser = optparse.OptionParser(
- usage="Usage: %prog [options] []",
- version="%prog {0}".format(__version__))
- parser.add_option("-s", "--schema",
- action="store", dest="schema",
- help="Schema name for the Postgre script. Default value is the table name for MySQL Workbench.");
- # parser.add_option("-o", "--output",
- # action="store", dest="output",
- # help="Generates the output")
- (options, args) = parser.parse_args()
- if len(args) > 0:
- input_path = args[0]
- if not os.path.exists(input_path):
- print("First argument should be a valid sql file")
- return
-
- if len(args) < 2:
- output_path = "{0}_postgre.{1}".format(*input_path.rsplit('.', 1))
- else:
- output_path = args[1]
-
- if options.schema != "" and options.schema != None:
- global SCHEMA
- SCHEMA = options.schema
-
- input = open(input_path, "r")
- output = open(output_path, "w")
- convert(input, output)
- else:
- print ("Invalid parameters. You should run YYY [