Esempio n. 1
0
bool SafePluginMap::addPlugin(const char *path, const char *dllname)
{
    if (!endsWithIgnoreCase(path, SharedObjectExtension))
    {
        if (trace)
            DBGLOG("Ecl plugin %s ignored", path);
        return false;
    }

    try
    {
        CriticalBlock b(crit);
        ILoadedDllEntry *dll = map.getValue(dllname);
        if (!dll)
        {
            Owned<PluginDll> n = new PluginDll(path, NULL);
            if (!n->load(true, false) || !n->init(pluginCtx))
                throw MakeStringException(0, "Failed to load plugin %s", path);
            if (trace)
                n->logLoaded();
            map.setValue(dllname, n);  // note: setValue links arg
            return true;
        }
        return false;
    }
    catch (IException * e) // MORE - not sure why we don't throw exceptions back here...
    {
        EXCLOG(e, "Loading plugin");
        e->Release();
        return false;
    }
}
Esempio n. 2
0
void gsp_addWhereClause( gsp_sqlparser *parser, gsp_base_statement* stmt, char* text )
{
	gsp_selectStatement* select = NULL;
	gsp_updateStatement* update = NULL;
	gsp_deleteStatement* deleteStmt = NULL;
	gsp_whereClause *whereClause = NULL;

	if(stmt->nodeType == t_gsp_selectStatement){
		select = (gsp_selectStatement*)stmt;
		whereClause = select->whereCondition;
	}
	else if(stmt->nodeType == t_gsp_updateStatement){
		update = (gsp_updateStatement*)stmt;
		whereClause = update->whereCondition;
	}
	else if(stmt->nodeType == t_gsp_deleteStatement){
		deleteStmt = (gsp_deleteStatement*)stmt;
		whereClause = deleteStmt->whereCondition;
	}

	if(whereClause!=NULL && whereClause->condition!=NULL){
		gsp_expr *expr = whereClause->condition;
		int startPos = gsp_getNodeStartToken((gsp_node*)expr)->nPosInList;
		int endPos = gsp_getNodeEndToken((gsp_node*)expr)->nPosInList;
		gsp_sourcetoken* endToken = expr->fragment.endToken;
		CString* content = CStringNew();
		char* exprText = gsp_getNodeText((gsp_node*)whereClause->condition);
		CStringAppend(content, exprText);
		if(endsWithIgnoreCase(exprText, " ") || endsWithIgnoreCase(exprText, "\n") || endsWithIgnoreCase(exprText, "\t")){
			CStringAppend(content, "AND " );
		}
		else{
			CStringAppend(content, " AND " );
		}
		CStringAppend(content, text );

		gsp_setNodeText(parser, (gsp_node*)whereClause->condition, content->buffer, FALSE);

		{
			gsp_node *currentNode = (gsp_node*)expr;

			gsp_node *node = currentNode->pNext;
			while(node!=NULL){
				gsp_node *temp = node->pNext;
				if(gsp_isInNodeRange(node, startPos, endPos)){
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = expr->fragment.endToken;
				}
				node = temp;
			}

			node = (gsp_node*)currentNode->pPrev;
			while(node!=NULL){
				gsp_node *temp = node->pPrev;
				if(gsp_isInNodeRange(node, startPos, endPos)){
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = expr->fragment.endToken;
				}
				node = temp;
			}
		}
		CStringDeleteWithoutBuffer(content);
	}
	else{
		gsp_sourcetoken *endToken = NULL;
		gsp_node* currentNode = NULL;
		CString* content = CStringNew();
		BOOL isEndTerminate = FALSE;

		if(!startsWithIgnoreCase(trimString(text), "WHERE ")){
			CStringAppend(content, " WHERE ");
		}
		else
			CStringAppend(content, " ");
		CStringAppend(content, text);

		whereClause = (gsp_whereClause *)malloc(sizeof(gsp_whereClause));
		whereClause->nodeType = t_gsp_whereClause;
		whereClause->fragment.startToken = NULL;
		whereClause->fragment.endToken = NULL;
		whereClause->fragment.text = NULL;
		whereClause->condition = NULL;
		whereClause->pNext = NULL;
		whereClause->pPrev = NULL;

		collectMallocMemroy(parser, whereClause);
		collectMallocMemroy(parser, content->buffer);

		gsp_setNodeText(parser, (gsp_node*)whereClause, content->buffer, FALSE);	

		if(select!=NULL){
			if(select->fromTableList!=NULL && select->fromTableList->length>0){
				endToken =  (gsp_list_last(select->fromTableList))->fragment.endToken;
			}
			else if(select->groupByClause!=NULL){
				endToken =  select->groupByClause->fragment.startToken->pPrev;
			}
			else if(select->orderbyClause!=NULL){
				endToken =  select->orderbyClause->fragment.startToken->pPrev;
			}
			else if(select->resultColumnList!=NULL && select->resultColumnList->length>0){
				endToken =  (gsp_list_last(select->resultColumnList))->fragment.endToken;
			}
			else{
				endToken = select->fragment.endToken;
			}
		}
		else if(update!=NULL){
			if(update->resultColumnList!=NULL && update->resultColumnList->length>0){
				endToken =  (gsp_list_last(update->resultColumnList))->fragment.endToken;
			}
			else{
				endToken = select->fragment.endToken;
			}
		}
		else if(deleteStmt!=NULL){
			endToken = deleteStmt->fragment.endToken;
		}

		if(endToken->pNext == NULL)
			isEndTerminate = TRUE;

		adjustNodeTokensPosition((gsp_node*)whereClause, endToken);

		currentNode = (gsp_node *)select;
		{	
			gsp_node *node = currentNode->pNext;
			while(node!=NULL){
				gsp_node *temp = node->pNext;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = whereClause->fragment.endToken;
				}
				node = temp;
			}

			node = (gsp_node*)currentNode->pPrev;
			while(node!=NULL){
				gsp_node *temp = node->pPrev;
				if(gsp_isInnerNode(node, currentNode)){
					if(node->fragment.endToken == endToken)
						node->fragment.endToken = whereClause->fragment.endToken;
				}
				node = temp;
			}

			if(isEndTerminate)
				currentNode->fragment.endToken = whereClause->fragment.endToken;
		}

		select->whereCondition = whereClause;
		CStringDeleteWithoutBuffer(content);	
	}
}