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; } }
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); } }