Пример #1
0
// _____________________________________________________________________________
ParsedQuery SparqlParser::parse(const string& query) {
  ParsedQuery result;
  result._originalString = query;

  // Split prologue
  size_t i = query.find("SELECT");
  if (i == string::npos) {
    throw ParseException("Missing keyword \"SELECT\", "
                             "currently only select queries are supported.");
  }

  size_t j = query.find("WHERE");
  if (j == string::npos) {
    throw ParseException("Missing keyword \"WHERE\", "
                             "currently only select queries are supported.");
  }

  if (i >= j) {
    throw ParseException("Keyword \"WHERE\" "
                             "found after keyword \"SELECT\". Invalid query.");
  }

  size_t k = query.find("}", j);
  if (k == string::npos) {
    throw ParseException("Missing \"}\" symbol after \"WHERE\".");
  }

  parsePrologue(ad_utility::strip(query.substr(0, i), " \n\t"), result);
  parseSelect(ad_utility::strip(query.substr(i, j - i), " \n\t"), result);
  parseWhere(ad_utility::strip(query.substr(j, k - j + 1), " \n\t"), result);

  parseSolutionModifiers(ad_utility::strip(query.substr(k + 1), " \n\t"),
                         result);
  return result;
}
Пример #2
0
PARSENODE_PTR SQLParser::parseStatement() {
    if (!startsStatement(nowReading)) {
        syntaxError(nowReading, "expect start token!");
        return nullptr;
    }
    if (startsCreate(nowReading)) {
        return parseCreate();
    }
    else if (startsSelect(nowReading)) {
        return parseSelect();
    }
    else if (startsDelete(nowReading)) {
        return parseDelete();
    }
    else if (startsInsert(nowReading)) {
        return parseInsert();
    }
    else if (startsDrop(nowReading)) {
        return parseDrop();
    }
    else if (nowReading == QUIT) {
        readToken();
        expect(TERMINATOR);
        return PARSENODE_PTR(new ParseNode(QUIT));
    }
    else if (nowReading == EXECFILE) {
        readToken();
        expect(TERMINATOR);
        return PARSENODE_PTR(new ParseNode(EXECFILE));
    }
    else {
        assert(false);
        return nullptr;
    }
}
Пример #3
0
static int
parseSelect(char *resReq, struct resVal *resVal, struct lsInfo *lsInfo, bool_t parseXor, int options)
{
    static char fname[] = "parseSelect";
    int cc;
    enum syntaxType syntax;
    char *expr, *countPtr;
    int i, numXorExprs;
    struct resVal tmpResVal;
    char *resReq2 = NULL;

    if (logclass & (LC_TRACE | LC_SCHED))
        ls_syslog(LOG_DEBUG3, "%s: resReq=%s", fname, resReq);



    if (parseXor && resReq[0] != '\0') {

	countPtr = (char *)malloc(strlen(resReq)+1);
	if (countPtr == NULL) {
	    return(PARSE_BAD_MEM);
	}
	strcpy(countPtr, resReq);
	expr = strtok(countPtr, ",");
	if (expr == NULL) {

	    numXorExprs = 0;
	} else {
	    numXorExprs = 1;

	    while (strtok(NULL, ",")) {
	        numXorExprs++;
            }
	}
	free(countPtr);

	if (logclass & (LC_TRACE |LC_SCHED))
	    ls_syslog(LOG_DEBUG3,"%s: numXorExprs = %d", fname, numXorExprs);


        if (numXorExprs > 1) {

	    resVal->xorExprs =
		(char **)calloc(numXorExprs + 1, sizeof(char*));
	    if (resVal->xorExprs == NULL)
		return(PARSE_BAD_MEM);


            resReq2 = (char *)malloc(strlen(resReq) + numXorExprs * 4 - 1);
	    if ( resReq2== NULL)
		return (PARSE_BAD_MEM);
	    resReq2[0] = '\0';
	    expr = strtok(resReq, ",");
	    for ( i =0 ; i < numXorExprs; i++) {
		initResVal(&tmpResVal);

		ALLOC_STRING(tmpResVal.selectStr, tmpResVal.selectStrSize,
                             MAX(3*strlen(expr) + 1, MAXLINELEN + MAXLSFNAMELEN));

    		if (tmpResVal.selectStr == NULL) {
		    FREEUP(resReq2);
        	    return PARSE_BAD_MEM;
		}
		if (setDefaults(&tmpResVal, lsInfo, options) < 0) {
		    FREEUP(resReq2);
		    return (PARSE_BAD_MEM);
		}
		if ((cc = parseSelect(expr, &tmpResVal, lsInfo, FALSE, options)) != PARSE_OK) {
		    for (i--;i>=0; i--) {
			FREEUP(resVal->xorExprs[i]);
		    }
		    FREEUP(resReq2);
		    return cc;
                }
                resVal->xorExprs[i] =
		    (char *)calloc(strlen(tmpResVal.selectStr) + 1,
				   sizeof(char));
		if (resVal->xorExprs[i] == NULL)
		    return (PARSE_BAD_MEM);

		strcpy(resVal->xorExprs[i], tmpResVal.selectStr);
		if (logclass & (LC_TRACE | LC_SCHED))
		    ls_syslog(LOG_DEBUG3,"%s: xorExprs[%d] = %s", fname, i, resVal->xorExprs[i]);
                if (i == 0 ) {
                    sprintf(resReq2, "(%s)", expr);
		} else {
                    sprintf(resReq2, "%s||(%s)", resReq2, expr);
		}
		freeResVal(&tmpResVal);
		expr = strtok(NULL, ",");
	    }
	    resVal->xorExprs[i] = NULL;
	    if (logclass & (LC_TRACE | LC_SCHED))
		ls_syslog(LOG_DEBUG3,"%s: new selectStr=%s", fname, resReq2);
            resReq = resReq2;
	} else {
	    if (numXorExprs == 1) {

		if (strchr(resReq,',')) {
	            return(PARSE_BAD_EXP);
		}
	    } else {

	        return(PARSE_BAD_EXP);
	    }
	}
    }

    syntax = getSyntax(resReq);
    switch(syntax) {
        case OLD:
            if ((cc =resToClassOld(resReq, resVal, lsInfo)) != PARSE_OK) {
                resVal->selectStr[0] = '\0';
                FREEUP(resReq2);
                return cc;
            }
            break;
        case NEW:
            if ((cc =resToClassNew(resReq, resVal, lsInfo)) != PARSE_OK) {
                resVal->selectStr[0] = '\0';
                FREEUP(resReq2);
                return cc;
            }
            break;
        case EITHER:
            if ((cc =resToClassOld(resReq, resVal, lsInfo)) != PARSE_OK)  {

                if (cc == PARSE_BAD_NAME || cc == PARSE_BAD_VAL) {
                    resVal->selectStr[0] = '\0';
                    FREEUP(resReq2);
                    return cc;
                }
                if ( (cc =resToClassNew(resReq, resVal, lsInfo)) != PARSE_OK) {
                    resVal->selectStr[0] = '\0';
                    FREEUP(resReq2);
                    return cc;
                }
            }
            break;
        default:
            FREEUP(resReq2);
            return PARSE_BAD_EXP;
    }

    FREEUP(resReq2);
    return PARSE_OK;

}
Пример #4
0
int
parseResReq(char *resReq,
            struct resVal *resVal,
            struct lsInfo *lsInfo,
            int options)
{
    static char       fname[] = "parseResReq()";
    int               cc;
    struct sections   reqSect;

    if (logclass & (LC_TRACE | LC_SCHED))
        ls_syslog(LOG_DEBUG3, "%s: resReq=%s", fname, resReq);

    initResVal(resVal);

    ALLOC_STRING(resVal->selectStr,
                 resVal->selectStrSize,
                 MAX(3*strlen(resReq) + 1, MAXLINELEN + MAXLSFNAMELEN));

    if ((cc = parseSection(resReq, &reqSect)) != PARSE_OK)
        return cc;

    if ((cc = setDefaults(resVal, lsInfo, options)) < 0)
        return cc;

    if (options & PR_SELECT) {

        if (options & PR_XOR) {
            if ((cc = parseSelect(reqSect.select,
                                  resVal,
                                  lsInfo,
                                  TRUE,
                                  options)) != PARSE_OK)
                return cc;
        } else {
            if ((cc = parseSelect(reqSect.select,
                                  resVal,
                                  lsInfo,
                                  FALSE,
                                  options)) != PARSE_OK)
                return cc;
	}
    }

    if (options & PR_ORDER) {
        if ((cc = parseOrder(reqSect.order,
                             resVal,
                             lsInfo)) != PARSE_OK)
            return cc;
    }

    if (options & PR_RUSAGE) {
        if ((cc = parseUsage(reqSect.rusage,
                             resVal,
                             lsInfo)) != PARSE_OK)
            return cc;
    }

    if (options & PR_FILTER) {
        if ((cc = parseFilter(reqSect.filter,
                              resVal,
                              lsInfo)) != PARSE_OK)
            return cc;
    }

    if (options & PR_SPAN) {
        if ((cc = parseSpan(reqSect.span,
                            resVal)) != PARSE_OK)
            return cc;
    }

    return(PARSE_OK);
}