public boolean OpenDatabase() {
		try {
			Class.forName("org.sqlite.JDBC");
			Conn = DriverManager.getConnection("jdbc:sqlite:plugins/" + plugin.getName() + "/" + DBFilename);
			IsConnected = true;
			
			if (TableExists(Conn, "birthdaygift")) {
				// Check/update existing table
				if (!ColumnExists(Conn, "birthdaygift", "lastAnnouncedDate")) {
					plugin.Warn("Old table format detected!");
					
					// Backup existing database
					plugin.Log("Creating backup of existing database...");
					Path src = Paths.get("plugins/" + plugin.getName() + "/" + DBFilename);
					Path dst = Paths.get("plugins/" + plugin.getName() + "/backup.db");
					
					try {
						Files.copy(src, dst, new CopyOption[] { REPLACE_EXISTING });
					} catch (IOException e) {
						plugin.Warn("Unable to create database backup! Refusing to continue!!");
						Conn.close();
						IsConnected = false;
						e.printStackTrace();
						return false;
					}
					
					// Make changes to database
					plugin.Log("Updating database table...");
					int result = ExecuteUpdate("ALTER TABLE birthdaygift ADD COLUMN `lastAnnouncedDate` DATE");
					plugin.Debug("SQL Result: " + result);
				}
			} else {
				// Create new table schema
				plugin.Log("Database table does not exist, creating one.");
				ExecuteUpdate("CREATE TABLE IF NOT EXISTS birthdaygift (" +
						"`player` varchar(250) NOT NULL PRIMARY KEY, " +
						"`birthdayDate` DATE," +
						"`lastGiftDate` DATE," +
						"`lastAnnouncedDate` DATE)");
			}
			IsConnected = true;
			return false;
		} catch (SQLException e) {
			plugin.Warn("Unable to open database!");
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			plugin.Warn("Unable to find a suitable SQLite driver!");
			e.printStackTrace();
		}
		return false;
	}