@Override
	public QueryResult execQuery(Query q) {
		Statement st = null;
		
		ArrayList<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
		
		if(!q.isParsed()) {
			q.parse();
		}
		
		try {
			st = con.createStatement();
			ResultSet res = st.executeQuery(q.getParsedQuery());
			while(res.next()) {
				HashMap<String, String> row = new HashMap<String, String>();

				ResultSetMetaData rsmd = res.getMetaData();
				int columns = rsmd.getColumnCount();
				for(int i = 1; i < columns + 1; i++) {
					row.put(rsmd.getColumnName(i).toLowerCase(), res.getString(i));
				}
				data.add(row);
			}
		}catch (SQLException e) {
			plugin.getLogger().log(Level.SEVERE, " Could not execute query!");
			if(this.dbg) {
				plugin.getLogger().log(Level.INFO, e.getMessage(), e);
			}
		} finally {
			try {
				if(st != null) {
					st.close();
				}
			}catch (Exception e) {
				plugin.getLogger().log(Level.SEVERE, " Could not close database connection");
				if(this.dbg) {
					plugin.getLogger().log(Level.INFO, e.getMessage(), e);
				}
			}
		}
		
		return QueryResult.QR(data);
	}