Datum demoprot_validate_urls(PG_FUNCTION_ARGS) { List *urls; int nurls; int i; ValidatorDirection direction; /* Must be called via the external table format manager */ if (!CALLED_AS_EXTPROTOCOL_VALIDATOR(fcinfo)) elog(ERROR, "demoprot_validate_urls: not called by external protocol manager"); nurls = EXTPROTOCOL_VALIDATOR_GET_NUM_URLS(fcinfo); urls = EXTPROTOCOL_VALIDATOR_GET_URL_LIST(fcinfo); direction = EXTPROTOCOL_VALIDATOR_GET_DIRECTION(fcinfo); /* * Dumb example 1: search each url for a substring * we don't want to be used in a url. in this example * it's 'secured_directory'. */ for (i = 1 ; i <= nurls ; i++) { char *url = EXTPROTOCOL_VALIDATOR_GET_NTH_URL(fcinfo, i); if (strstr(url, "secured_directory") != 0) { ereport(ERROR, (errcode(ERRCODE_PROTOCOL_VIOLATION), errmsg("using 'secured_directory' in a url isn't allowed "))); } } /* * Dumb example 2: set a limit on the number of urls * used. In this example we limit readable external * tables that use our protocol to 2 urls max. */ if(direction == EXT_VALIDATE_READ && nurls > 2) { ereport(ERROR, (errcode(ERRCODE_PROTOCOL_VIOLATION), errmsg("more than 2 urls aren't allowed in this protocol "))); } PG_RETURN_VOID(); }
/** * Validate the URLs */ Datum gphdfsprotocol_validate_urls(PG_FUNCTION_ARGS) { /* Must be called via the external table format manager */ if (!CALLED_AS_EXTPROTOCOL_VALIDATOR(fcinfo)) elog(ERROR, "cannot execute gphdfsprotocol_validate_urls outside protocol manager"); /* * Condition 1: there must be only ONE url. */ if (EXTPROTOCOL_VALIDATOR_GET_NUM_URLS(fcinfo) != 1) ereport(ERROR, (errcode(ERRCODE_PROTOCOL_VIOLATION), errmsg("number of URLs must be one"))); /* Check for illegal characters. */ char* url_user = EXTPROTOCOL_VALIDATOR_GET_NTH_URL(fcinfo, 1); if (hasIllegalCharacters(url_user)) { ereport(ERROR, (0, errmsg("illegal char in url"))); } PG_RETURN_VOID(); }