final public Boolean saveLink(String link) throws ForceErrorException {

		// TODO przerobić na obiekt Link

		PreparedStatement prepared;

		long hostId = this.getHostID(link);

		try {

			prepared = this.con
					.prepareStatement("INSERT INTO urls(HostID,`Hash`,Url) VALUES(?,?,?)");
			prepared.setLong(1, hostId);
			prepared.setString(2, Utils.MD5(link));
			prepared.setString(3, link);
			prepared.executeUpdate();
			prepared.close();

		} catch (MySQLIntegrityConstraintViolationException e) {

			/*
			 * Jeśli zduplikowany klucz, jest OK, jeśli coś innego, zapisz
			 */
			if (e.getMessage().startsWith("Duplicate entry") == false) {
				ErrorLog.getInstance().write(
						"Datamodel.saveLink: " + link + " :" + e.getClass()
								+ ": " + e.getMessage() + " "
								+ e.getStackTrace().toString());
				throw new ForceErrorException();
			}

		} catch (SQLException e) {
			/*
			 * Wystąpił inny błąd zapisu
			 */
			ErrorLog.getInstance().write(
					"Datamodel.saveLink: " + link + " :" + e.getClass() + ": "
							+ e.getMessage() + " "
							+ e.getStackTrace().toString());

			throw new ForceErrorException();
		}

		return true;
	}