@Override
  public DatabaseInfo parse(String url) {
    if (url == null) {
      return JDBCUrlParser.createUnknownDataBase(
          ServiceType.CUBRID, ServiceType.CUBRID_EXECUTE_QUERY, null);
    }

    final Matcher matcher = PATTERN.matcher(url);
    if (!matcher.find()) {
      logger.warn("Cubrid connectionString parse fail. url:{}", url);
      return JDBCUrlParser.createUnknownDataBase(
          ServiceType.CUBRID, ServiceType.CUBRID_EXECUTE_QUERY, url);
    }

    String host = matcher.group(2);
    String portString = matcher.group(3);
    String db = matcher.group(4);
    String user = matcher.group(5);
    //        String pass = matcher.group(6);
    //        String prop = matcher.group(7);

    int port = DEFAULT_PORT;

    //        String resolvedUrl;

    if (host == null || host.length() == 0) {
      host = DEFAULT_HOSTNAME;
    }

    if (portString == null || portString.length() == 0) {
      port = DEFAULT_PORT;
    } else {
      try {
        port = Integer.parseInt(portString);
      } catch (NumberFormatException e) {
        logger.warn("cubrid portString parsing fail. portString:{}, url:{}", portString, url);
      }
    }

    if (user == null) {
      user = DEFAULT_USER;
    }

    //        if (pass == null) {
    //            pass = DEFAULT_PASSWORD;
    //        }

    //        resolvedUrl = "jdbc:cubrid:" + host + ":" + port + ":" + db + ":" + user +
    // ":********:";

    StringMaker maker = new StringMaker(url);
    String normalizedUrl = maker.clear().before('?').value();

    List<String> hostList = new ArrayList<String>(1);
    final String hostAndPort = host + ":" + portString;
    hostList.add(hostAndPort);

    // skip alt host

    return new DefaultDatabaseInfo(
        ServiceType.CUBRID, ServiceType.CUBRID_EXECUTE_QUERY, url, normalizedUrl, hostList, db);
  }