From: <ibr...@us...> - 2011-10-10 15:37:04
|
Revision: 4109 http://tora.svn.sourceforge.net/tora/?rev=4109&view=rev Author: ibre5041 Date: 2011-10-10 15:36:57 +0000 (Mon, 10 Oct 2011) Log Message: ----------- Modified Paths: -------------- branches/tora-trotl/src/docklets/toastwalk.cpp branches/tora-trotl/src/parsing/tplsqlparseoracle.cpp branches/tora-trotl/src/parsing/tsqlparse.cpp branches/tora-trotl/src/parsing/tsqlparse.h branches/tora-trotl/src/parsing/tsqlparseoracle.cpp Modified: branches/tora-trotl/src/docklets/toastwalk.cpp =================================================================== --- branches/tora-trotl/src/docklets/toastwalk.cpp 2011-10-10 10:59:11 UTC (rev 4108) +++ branches/tora-trotl/src/docklets/toastwalk.cpp 2011-10-10 15:36:57 UTC (rev 4109) @@ -116,7 +116,7 @@ case SQLParser::Token::S_SUBQUERY_NESTED: { SQLParser::TokenSubquery const* snode = static_cast<SQLParser::TokenSubquery const*>(&*node); - QSet<SQLParser::Token const*> const& tables = snode->nodeTables(); + QList<SQLParser::Token*> tables = snode->nodeTables().values(); QString clusterName; QMap<QString,QString> sg; @@ -134,52 +134,58 @@ snode->setNodeID(sg["id"]); target->addNewSubgraph(sg); - TLOG(0,toDecorator,__HERE__) << "Subgraph: " << clusterName << ":" << node->toStringRecursive(false) << std::endl; - foreach(SQLParser::Token const* table, tables) + TLOG(0,toNoDecorator,__HERE__) << "Subgraph: " << clusterName << ":" << node->toStringRecursive(false) << std::endl; + foreach(SQLParser::Token *table, tables) { if( table->getTokenType() != SQLParser::Token::S_TABLE_REF) continue; - SQLParser::TokenTable const* t = static_cast<SQLParser::TokenTable const*>(table); + // In fact S_TABLE_REF can be alias for S_SUBQUERY_FACTORED + if( source->translateAlias(table->child(0)->toStringRecursive(false).toUpper(), &*node)) + continue; + SQLParser::TokenTable *tt = static_cast<SQLParser::TokenTable*>(table); QMap<QString,QString> ta; // table attributes - QString tableName = t->toStringRecursive(false); // DOT does not allow ant "dots" in identifier names + QString tableName = tt->toStringRecursive(false); // DOT does not allow ant "dots" in identifier names tableName.replace('.', GLUE); tableName.replace(':', GLUE); - ta["name"] = t->toStringRecursive(false); - ta["label"] = t->toStringRecursive(false); + ta["name"] = tt->toStringRecursive(false); + ta["label"] = tt->toStringRecursive(false); ta["fontsize"] = "10"; - ta["comment"]= t->toStringRecursive(false); + ta["comment"]= tt->toStringRecursive(false); ta["id"]= clusterName + GLUE + tableName; - if(t->nodeAlias() != NULL) - ta["tooltip"] = t->nodeAlias()->toString(); - t->setNodeID(ta["id"]); + if(tt->nodeAlias() != NULL) + ta["tooltip"] = tt->nodeAlias()->toString(); + tt->setNodeID(ta["id"]); target->addNewNodeToSubgraph(ta, sg["id"]); - TLOG(0,toDecorator,__HERE__) << "new node:" << ta["id"] << " in subgraph: " << sg["id"] << std::endl; + TLOG(0,toNoDecorator,__HERE__) << "new node:" << ta["id"] << " in subgraph: " << sg["id"] << std::endl; } break; } case SQLParser::Token::X_ROOT: { SQLParser::TokenSubquery const* snode = static_cast<SQLParser::TokenSubquery const*>(&*node); - QSet<SQLParser::Token const*> const& tables = snode->nodeTables(); - foreach(SQLParser::Token const* table, tables) + QList<SQLParser::Token*> tables = snode->nodeTables().values(); + foreach(SQLParser::Token *table, tables) { if( table->getTokenType() != SQLParser::Token::S_TABLE_REF) - continue; - SQLParser::TokenTable const* t = static_cast<SQLParser::TokenTable const*>(table); + continue; + // In fact S_TABLE_REF can be alias for S_SUBQUERY_FACTORED + if( source->translateAlias(table->child(0)->toStringRecursive(false).toUpper(), &*node)) + continue; + SQLParser::TokenTable *tt = static_cast<SQLParser::TokenTable*>(table); QMap<QString,QString> ta; // table atributes - QString tableName = t->toStringRecursive(false); // DOT does not allow ant "dots" in identifier names + QString tableName = tt->toStringRecursive(false); // DOT does not allow ant "dots" in identifier names tableName.replace('.', '_'); tableName.replace(':', '_'); - ta["name"] = t->toStringRecursive(false); - ta["label"] = t->toStringRecursive(false); + ta["name"] = tt->toStringRecursive(false); + ta["label"] = tt->toStringRecursive(false); ta["fontsize"] = "10"; - ta["comment"]= t->toStringRecursive(false); + ta["comment"]= tt->toStringRecursive(false); ta["id"]= QString("ROOT") + GLUE + tableName; - if(t->nodeAlias() != NULL) - ta["tooltip"] = t->nodeAlias()->toString(); - t->setNodeID(ta["id"]); + if(tt->nodeAlias() != NULL) + ta["tooltip"] = tt->nodeAlias()->toString(); + tt->setNodeID(ta["id"]); target->addNewNode(ta); - TLOG(0,toDecorator,__HERE__) << "new node:" << ta["id"] << " under X_ROOT" << std::endl; + TLOG(0,toNoDecorator,__HERE__) << "new node:" << ta["id"] << " under X_ROOT" << std::endl; } break; } @@ -194,11 +200,11 @@ bool isJoinON = false; bool isJoinUSING = false; - TLOG(0,toDecorator,__HERE__) << "JC:(" << node.depth() << ')' << std::endl + TLOG(0,toNoDecorator,__HERE__) << "JC:(" << node.depth() << ')' << std::endl << node->toStringRecursive().toStdString() << std::endl; while(subnode.depth() > node.depth()) { - ///TLOG(0,toDecorator,__HERE__) << "JC:(" << subnode.depth() << ')' << subnode->toString() << std::endl; + ///TLOG(0,toNoDecorator,__HERE__) << "JC:(" << subnode.depth() << ')' << subnode->toString() << std::endl; switch(subnode->getTokenType()) { case SQLParser::Token::L_RESERVED: @@ -215,7 +221,7 @@ { firstTable = subnode->child(0); secondTable= subnode->child(2); - TLOG(0,toDecorator,__HERE__) << "!?" << firstTable->toStringRecursive(false) << "->" << secondTable->toStringRecursive(false) << std::endl; + TLOG(0,toNoDecorator,__HERE__) << "!?" << firstTable->toStringRecursive(false) << "->" << secondTable->toStringRecursive(false) << std::endl; } break; } @@ -228,39 +234,43 @@ ) { SQLParser::Token const *t1 = source->translateAlias(firstTable->child(0)->toStringRecursive(false).toUpper(), &*node); + if( t1) + firstTable = t1; + else + firstTable = source->getTableRef(firstTable->child(0)->toStringRecursive(false).toUpper(), &*node); + SQLParser::Token const *t2 = source->translateAlias(secondTable->child(0)->toStringRecursive(false).toUpper(), &*node); + if( t2) + secondTable = t2; + else + secondTable = source->getTableRef(secondTable->child(0)->toStringRecursive(false).toUpper(), &*node); + QString e1, e2; - if(t1 && ( - t1->getTokenType() == SQLParser::Token::S_SUBQUERY_NESTED || - t1->getTokenType() == SQLParser::Token::S_SUBQUERY_FACTORED)) + if(firstTable && ( + firstTable->getTokenType() == SQLParser::Token::S_SUBQUERY_NESTED || + firstTable->getTokenType() == SQLParser::Token::S_SUBQUERY_FACTORED)) { - if(!static_cast<SQLParser::TokenSubquery const*>(t1)->nodeID().isEmpty()) - e1 = static_cast<SQLParser::TokenSubquery const*>(t1)->nodeID(); + if(!static_cast<SQLParser::TokenSubquery const*>(firstTable)->nodeID().isEmpty()) + e1 = static_cast<SQLParser::TokenSubquery const*>(firstTable)->nodeID(); } - if(t1 && t1->getTokenType() == SQLParser::Token::S_TABLE_REF) + if(firstTable && firstTable->getTokenType() == SQLParser::Token::S_TABLE_REF) { - e1 = QString("ROOT") + GLUE + t1->child(0)->toString(); - if(t1->childCount() >= 3) - e1 += GLUE + t1->child(2)->toString(); - + e1 = static_cast<SQLParser::TokenTable const*>(firstTable)->nodeID(); } - if(t2 && ( - t2->getTokenType() == SQLParser::Token::S_SUBQUERY_NESTED || - t2->getTokenType() == SQLParser::Token::S_SUBQUERY_FACTORED)) + if(secondTable && ( + secondTable->getTokenType() == SQLParser::Token::S_SUBQUERY_NESTED || + secondTable->getTokenType() == SQLParser::Token::S_SUBQUERY_FACTORED)) { - if(!static_cast<SQLParser::TokenSubquery const*>(t2)->nodeID().isEmpty()) - e2 = static_cast<SQLParser::TokenSubquery const*>(t2)->nodeID(); + if(!static_cast<SQLParser::TokenSubquery const*>(secondTable)->nodeID().isEmpty()) + e2 = static_cast<SQLParser::TokenSubquery const*>(secondTable)->nodeID(); } - if(t2 && t2->getTokenType() == SQLParser::Token::S_TABLE_REF) + if(secondTable && secondTable->getTokenType() == SQLParser::Token::S_TABLE_REF) { - e2 = QString("ROOT") + GLUE + t2->child(0)->toString(); - if(t2->childCount() >= 3) - e2 += GLUE + t2->child(2)->toString(); - + e2 = static_cast<SQLParser::TokenTable const*>(secondTable)->nodeID(); } QMap<QString,QString> ea; // edge attreibutes @@ -270,9 +280,9 @@ e1, e2, ea); - TLOG(0,toDecorator,__HERE__) << "!!" << e1.toStdString() << "->" << e2.toStdString() << std::endl; + TLOG(0,toNoDecorator,__HERE__) << "!!" << e1.toStdString() << "->" << e2.toStdString() << std::endl; } else { - ////TLOG(0,toDecorator,__HERE__) << "??" << firstTable->toStringRecursive(false) << "->" << secondTable->toStringRecursive(false) << std::endl; + ////TLOG(0,toNoDecorator,__HERE__) << "??" << firstTable->toStringRecursive(false) << "->" << secondTable->toStringRecursive(false) << std::endl; } } break; @@ -288,7 +298,7 @@ { case SQLParser::Token::S_OPERATOR_BINARY: { - TLOG(0,toDecorator,__HERE__) << "S_OPERATOR_BINARY: " << std::endl + TLOG(0,toNoDecorator,__HERE__) << "S_OPERATOR_BINARY: " << std::endl << subnode->toStringRecursive() << std::endl; SQLParser::Token const* firstTable = NULL; @@ -301,7 +311,7 @@ { firstTable = subnode->child(0); secondTable= subnode->child(2); - TLOG(0,toDecorator,__HERE__) << "!?" << firstTable->toStringRecursive(false) << "->" << secondTable->toStringRecursive(false) << std::endl; + TLOG(0,toNoDecorator,__HERE__) << "!?" << firstTable->toStringRecursive(false) << "->" << secondTable->toStringRecursive(false) << std::endl; } SQLParser::Token const *t1 = firstTable ? source->translateAlias(firstTable->child(0)->toStringRecursive(false).toUpper(), &*node) : NULL; @@ -347,9 +357,9 @@ e1, e2, ea); - TLOG(0,toDecorator,__HERE__) << "!!" << e1.toStdString() << "->" << e2.toStdString() << std::endl; + TLOG(0,toNoDecorator,__HERE__) << "!!" << e1.toStdString() << "->" << e2.toStdString() << std::endl; } else { - ////TLOG(0,toDecorator,__HERE__) << "??" << firstTable->toStringRecursive(false) << "->" << secondTable->toStringRecursive(false) << std::endl; + ////TLOG(0,toNoDecorator,__HERE__) << "??" << firstTable->toStringRecursive(false) << "->" << secondTable->toStringRecursive(false) << std::endl; } break; Modified: branches/tora-trotl/src/parsing/tplsqlparseoracle.cpp =================================================================== --- branches/tora-trotl/src/parsing/tplsqlparseoracle.cpp 2011-10-10 10:59:11 UTC (rev 4108) +++ branches/tora-trotl/src/parsing/tplsqlparseoracle.cpp 2011-10-10 15:36:57 UTC (rev 4109) @@ -167,7 +167,8 @@ if (psr->pParser->rec->state->errorCount > 0) { - fprintf(stderr, "The parser returned %d errors, tree walking aborted.\n", psr->pParser->rec->state->errorCount); + // TODO throw reasonable expeption here + // fprintf(stderr, "The parser returned %d errors, tree walking aborted.\n", psr->pParser->rec->state->errorCount); throw ParseException(); } Modified: branches/tora-trotl/src/parsing/tsqlparse.cpp =================================================================== --- branches/tora-trotl/src/parsing/tsqlparse.cpp 2011-10-10 10:59:11 UTC (rev 4108) +++ branches/tora-trotl/src/parsing/tsqlparse.cpp 2011-10-10 15:36:57 UTC (rev 4109) @@ -144,7 +144,7 @@ TokenSubquery const &s = static_cast<TokenSubquery const&>(*k); if( s.aliasTranslation().contains(alias.toUpper())) { - Token const* a1 = s.aliasTranslation().value(alias); + Token const* a1 = s.aliasTranslation().value(alias.toUpper()); if( a1->getTokenType() == Token::S_TABLE_REF && a1->childCount() == 1 ) // In fact S_TABLE_REF can be alias for S_SUBQUERY_FACTORED { Token const* a2 = translateAlias( a1->toStringRecursive(false), &*k); @@ -158,6 +158,30 @@ return NULL; }; + TSQLPARSER_EXPORT Token const* Statement::getTableRef(QString const& tableName, Token const *context) + { + for( SQLParser::Statement::token_const_iterator_to_root k(context); k->parent(); ++k) + { + if( k->getTokenType() == Token::S_SUBQUERY_NESTED || + k->getTokenType() == Token::S_SUBQUERY_FACTORED || + k->getTokenType() == Token::X_ROOT) + { + TokenSubquery const &s = static_cast<TokenSubquery const&>(*k); + if( s.nodeTables().contains(tableName.toUpper())) + { + Token const* t1 = s.nodeTables().value(tableName.toUpper()); + Token const* t2 = s.aliasTranslation().value(tableName.toUpper()); // In fact S_TABLE_REF can be alias for S_SUBQUERY_FACTORED + if( t2) + return t2; + if( t1) + return t1; + } + } + } + return NULL; + }; + + TSQLPARSER_EXPORT void Statement::token_const_iterator::increment() { if(m_token->isLeaf()) Modified: branches/tora-trotl/src/parsing/tsqlparse.h =================================================================== --- branches/tora-trotl/src/parsing/tsqlparse.h 2011-10-10 10:59:11 UTC (rev 4108) +++ branches/tora-trotl/src/parsing/tsqlparse.h 2011-10-10 15:36:57 UTC (rev 4109) @@ -348,14 +348,14 @@ inline void setNodeAlias(Token const *t) { _mAlias = t; }; inline QString nodeID() const { return _mNodeID; }; - inline void setNodeID(QString const &id) const { _mNodeID = id; }; + inline void setNodeID(QString const &id) { _mNodeID = id; }; protected: /* Translate table ref SCHEMA.TABLE_A -> table alias "A" this pointer is present only if token is of type SUBQUERY, ROOT, TABLE_REF(schema.tablename) */ Token const* _mAlias; - mutable QString _mNodeID; + QString _mNodeID; }; class TSQLPARSER_EXPORT TokenSubquery: public Token @@ -387,8 +387,8 @@ inline Translation& aliasTranslation() { return _mAliasTranslation; }; inline Translation const& aliasTranslation() const { return _mAliasTranslation; }; - inline QSet<Token const*>& nodeTables() { return _mTables; }; - inline const QSet<Token const*>& nodeTables() const { return _mTables; }; + inline Translation& nodeTables() { return _mTables; }; + inline Translation const& nodeTables() const { return _mTables; }; protected: /* Translate table ref SCHEMA.TABLE_A -> table alias "A" @@ -403,7 +403,7 @@ /* Set of tables used in a (sub)query. This list is present only if token is of type SUBQUERY or ROOT */ - QSet<Token const*> _mTables; + Translation _mTables; mutable QString _mNodeID; }; @@ -497,6 +497,7 @@ }; Token const* translateAlias(QString const& alias, Token const *context); + Token const* getTableRef(QString const& tableName, Token const *context); class token_const_iterator : public boost::iterator_facade < Modified: branches/tora-trotl/src/parsing/tsqlparseoracle.cpp =================================================================== --- branches/tora-trotl/src/parsing/tsqlparseoracle.cpp 2011-10-10 10:59:11 UTC (rev 4108) +++ branches/tora-trotl/src/parsing/tsqlparseoracle.cpp 2011-10-10 15:36:57 UTC (rev 4109) @@ -249,7 +249,8 @@ if (psr->pParser->rec->state->errorCount > 0) { - fprintf(stderr, "The parser returned %d errors, tree walking aborted.\n", psr->pParser->rec->state->errorCount); + // TODO throw reasonable exception HERE + // fprintf(stderr, "The parser returned %d errors, tree walking aborted.\n", psr->pParser->rec->state->errorCount); throw ParseException(); } @@ -344,10 +345,10 @@ } // TODO check for EOF in lexer stream */ - printf("Leaf node \'%s\'(%d)\n", - (const char*)pChildNode->getText(pChildNode)->chars, - lastindex - ); + //printf("Leaf node \'%s\'(%d)\n", + // (const char*)pChildNode->getText(pChildNode)->chars, + // lastindex + // ); Token *childToken = new OracleSQLToken ( root , Position(pChildLexeme->getLine(pChildLexeme), pChildLexeme->getCharPositionInLine(pChildLexeme)) @@ -513,7 +514,7 @@ { //loop over rigth brothers until you find S_SUBQUERY_FACTORED QList<QPointer<Token> > const& brothers = node.parent()->getChildren(); - for( int j = node.row() - 1 ; j >= 0; --j) + for( int j = node.row() + 1 ; j < node.parent()->childCount() ; ++j) { Token *brother = brothers.at(j); @@ -572,7 +573,7 @@ stopToken = k->toString(); if( k->getTokenType() == Token::S_COLUMN_LIST) { - TLOG(0,toDecorator,__HERE__) << " Dont Resolve identifier: " << i->toStringRecursive(false).toStdString() << "\t under: " << stopToken.toStdString() << std::endl; + TLOG(0,toNoDecorator,__HERE__) << " Dont Resolve identifier: " << i->toStringRecursive(false).toStdString() << "\t under: " << stopToken.toStdString() << std::endl; insideColumnList = true; break; } @@ -590,7 +591,7 @@ continue; TokenIdentifier const& id = static_cast<TokenIdentifier const&>(*i); - TLOG(0,toDecorator,__HERE__) << "Resolve identifier: " << id.toStringRecursive(false).toStdString() << "\t under: " << stopToken.toStdString() << std::endl; + TLOG(0,toNoDecorator,__HERE__) << "Resolve identifier: " << id.toStringRecursive(false).toStdString() << "\t under: " << stopToken.toStdString() << std::endl; QString schemaName, tableName, columnName; @@ -599,7 +600,7 @@ case 0: case 2: case 4: - TLOG(0,toDecorator,__HERE__) << " invalid length:" << id.childCount() << std::endl; + TLOG(0,toNoDecorator,__HERE__) << " invalid length:" << id.childCount() << std::endl; break; case 1: // We have column name only @@ -626,7 +627,7 @@ } } bool columnExists = o->columnExists(cs, tableName, columnName); - TLOG(0,toDecorator,__HERE__) << " identifier found " << cs << '.' << tableName << '.' << columnName << ':' << columnExists << std::endl; + TLOG(0,toNoDecorator,__HERE__) << " identifier found " << cs << '.' << tableName << '.' << columnName << ':' << columnExists << std::endl; } break; label5: @@ -639,17 +640,19 @@ columnName = id.child(4)->toStringRecursive(false).toUpper(); } bool columnExists = o->columnExists(schemaName, tableName, columnName); - TLOG(0,toDecorator,__HERE__) << " identifier found: " << schemaName << '.' << tableName << '.' << columnName << ':' << columnExists << std::endl; + TLOG(0,toNoDecorator,__HERE__) << " identifier found: " << schemaName << '.' << tableName << '.' << columnName << ':' << columnExists << std::endl; } break; default: - TLOG(0,toDecorator,__HERE__) << " unsupported length:" << id.childCount() << std::endl; + TLOG(0,toNoDecorator,__HERE__) << " unsupported length:" << id.childCount() << std::endl; break; } // switch(id.childCount()) // odd children should be dots. } } }; + /* Information stored using this function can be queried using translateAlias + */ void OracleSQLStatement::addTranslation(QString const& alias, Token const *tableOrSubquery, Token const *context) { for( SQLParser::Statement::token_iterator_to_root k(const_cast<Token*>(context)); k->parent(); ++k) @@ -667,7 +670,9 @@ } }; - void OracleSQLStatement::addTableRef(Token const *tableOrSubquery, Token const *context) + /* Information stored using this function can be queried using getTableRef + */ + void OracleSQLStatement::addTableRef(Token const *tableRef, Token const *context) { for( SQLParser::Statement::token_iterator_to_root k(const_cast<Token*>(context)); k->parent(); ++k) { @@ -677,7 +682,7 @@ k->getTokenType() == Token::X_ROOT) { TokenSubquery &s = static_cast<TokenSubquery&>(*k); - s.nodeTables().insert(tableOrSubquery); + s.nodeTables().insert(tableRef->toStringRecursive(false).toUpper(), const_cast<Token*>(tableRef)); //std::cout << "Table ref added:" << tableOrSubquery->toStringRecursive(false).toStdString() << " context: " << k->toString().toStdString() << std::endl; break; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2011-10-11 15:34:05
|
Revision: 4111 http://tora.svn.sourceforge.net/tora/?rev=4111&view=rev Author: ibre5041 Date: 2011-10-11 15:33:56 +0000 (Tue, 11 Oct 2011) Log Message: ----------- get rid of unwanteed comma in .dot file Modified Paths: -------------- branches/tora-trotl/src/docklets/toastwalk.cpp branches/tora-trotl/src/ermodel/graphelement.cpp branches/tora-trotl/src/ermodel/graphsubgraph.cpp Modified: branches/tora-trotl/src/docklets/toastwalk.cpp =================================================================== --- branches/tora-trotl/src/docklets/toastwalk.cpp 2011-10-10 21:11:51 UTC (rev 4110) +++ branches/tora-trotl/src/docklets/toastwalk.cpp 2011-10-11 15:33:56 UTC (rev 4111) @@ -304,7 +304,7 @@ e2 = static_cast<SQLParser::TokenTable const*>(secondTable)->nodeID(); } - QMap<QString,QString> ea; // edge attreibutes + QMap<QString,QString> ea; // edge attributes if(!e1.isEmpty() && !e2.isEmpty()) // TODO this is wrong { target->addNewEdge( Modified: branches/tora-trotl/src/ermodel/graphelement.cpp =================================================================== --- branches/tora-trotl/src/ermodel/graphelement.cpp 2011-10-10 21:11:51 UTC (rev 4110) +++ branches/tora-trotl/src/ermodel/graphelement.cpp 2011-10-11 15:33:56 UTC (rev 4111) @@ -141,28 +141,27 @@ it = attributes().begin(); it_end = attributes().end(); for (;it != it_end; it++) { - if (!it.value().isEmpty()) - { - if (it.key() == "label") - { - QString label = it.value(); - if (label != "label") - { - label.replace(QRegExp("\n"),"\\n"); - // kDebug() << it.key() << "=\"" << label << "\","; - agsafeset(element, it.key().toUtf8().data(), label.toUtf8().data(), QString().toUtf8().data()); - } - } - else if (it.key() == "_draw_" || it.key() == "_ldraw_") - { - } - else if (originalAttributes().isEmpty() || originalAttributes().contains(it.key())) - { - // kDebug() << it.key() << it.value(); - - agsafeset(element, it.key().toUtf8().data(), it.value().toUtf8().data(), QString().toUtf8().data()); - } - } + if (it.value().isEmpty()) + continue; + if (it.key() == "label") + { + QString label = it.value(); + if (label != "label") + { + label.replace(QRegExp("\n"),"\\n"); + // kDebug() << it.key() << "=\"" << label << "\","; + agsafeset(element, it.key().toUtf8().data(), label.toUtf8().data(), QString().toUtf8().data()); + } + } + else if (it.key() == "_draw_" || it.key() == "_ldraw_") + { + } + else if (originalAttributes().isEmpty() || originalAttributes().contains(it.key())) + { + // kDebug() << it.key() << it.value(); + + agsafeset(element, it.key().toUtf8().data(), it.value().toUtf8().data(), QString().toUtf8().data()); + } } } @@ -170,30 +169,37 @@ { QMap<QString,QString>::const_iterator it, it_end; it = n.attributes().begin(); it_end = n.attributes().end(); + bool firstAttr = true; for (;it != it_end; it++) { - if (!it.value().isEmpty()) - { - if (it.key() == "label") - { - QString label = it.value(); - if (label != "label") - { - label.replace(QRegExp("\n"),"\\n"); -// kDebug() << it.key() << "=\"" << label << "\","; - s << it.key() << "=\"" << label << "\","; - } - } - else if (it.key() == "_draw_" || it.key() == "_ldraw_") - { - } - else if (n.originalAttributes().isEmpty() || n.originalAttributes().contains(it.key())) - { -// kDebug() << it.key() << it.value(); - - s << it.key() << "=\"" << it.value() << "\","; - } - } + if (it.value().isEmpty()) + continue; + if (it.key() == "_draw_" || it.key() == "_ldraw_") + continue; + if (it.key() == "label") + { + QString label = it.value(); + if (label != "label") + { + label.replace(QRegExp("\n"),"\\n"); + // kDebug() << it.key() << "=\"" << label << "\","; + if( firstAttr) + firstAttr = false; + else + s << ','; + s << it.key() << "=\"" << label << '"'; + } + } + else if (n.originalAttributes().isEmpty() || n.originalAttributes().contains(it.key())) + { + // kDebug() << it.key() << it.value(); + + if( firstAttr) + firstAttr = false; + else + s << ','; + s << it.key() << "=\"" << it.value() << '"'; + } } return s; } Modified: branches/tora-trotl/src/ermodel/graphsubgraph.cpp =================================================================== --- branches/tora-trotl/src/ermodel/graphsubgraph.cpp 2011-10-10 21:11:51 UTC (rev 4110) +++ branches/tora-trotl/src/ermodel/graphsubgraph.cpp 2011-10-11 15:33:56 UTC (rev 4111) @@ -280,7 +280,7 @@ QTextStream& operator<<(QTextStream& s, const GraphSubgraph& sg) { s << "subgraph " << sg.id() << " {" - << dynamic_cast<const GraphElement&>(sg); + << dynamic_cast<const GraphElement&>(sg) << endl; foreach (const GraphElement* el, sg.content()) { s << *(dynamic_cast<const GraphNode*>(el)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2011-10-14 13:45:27
|
Revision: 4116 http://tora.svn.sourceforge.net/tora/?rev=4116&view=rev Author: ibre5041 Date: 2011-10-14 13:45:20 +0000 (Fri, 14 Oct 2011) Log Message: ----------- Sync with KGRAPHVIEWER trunk Modified Paths: -------------- branches/tora-trotl/src/docklets/toastwalk.cpp branches/tora-trotl/src/docklets/toastwalk.h branches/tora-trotl/src/docklets/toquerymodel.cpp branches/tora-trotl/src/docklets/toquerymodel.h branches/tora-trotl/src/ermodel/DotGraphParsingHelper.cpp branches/tora-trotl/src/ermodel/DotGraphParsingHelper.h branches/tora-trotl/src/ermodel/FontsCache.cpp branches/tora-trotl/src/ermodel/FontsCache.h branches/tora-trotl/src/ermodel/canvasedge.cpp branches/tora-trotl/src/ermodel/canvasedge.h branches/tora-trotl/src/ermodel/canvaselement.cpp branches/tora-trotl/src/ermodel/canvaselement.h branches/tora-trotl/src/ermodel/canvasnode.cpp branches/tora-trotl/src/ermodel/canvasnode.h branches/tora-trotl/src/ermodel/canvassubgraph.cpp branches/tora-trotl/src/ermodel/canvassubgraph.h branches/tora-trotl/src/ermodel/dot2qtconsts.cpp branches/tora-trotl/src/ermodel/dot2qtconsts.h branches/tora-trotl/src/ermodel/dotdefaults.h branches/tora-trotl/src/ermodel/dotgrammar.cpp branches/tora-trotl/src/ermodel/dotgrammar.h branches/tora-trotl/src/ermodel/dotgraph.cpp branches/tora-trotl/src/ermodel/dotgraph.h branches/tora-trotl/src/ermodel/dotgraphview.cpp branches/tora-trotl/src/ermodel/dotgraphview.h branches/tora-trotl/src/ermodel/dotrenderop.h branches/tora-trotl/src/ermodel/fdstream.hpp branches/tora-trotl/src/ermodel/graphedge.cpp branches/tora-trotl/src/ermodel/graphedge.h branches/tora-trotl/src/ermodel/graphelement.cpp branches/tora-trotl/src/ermodel/graphelement.h branches/tora-trotl/src/ermodel/graphexporter.cpp branches/tora-trotl/src/ermodel/graphexporter.h branches/tora-trotl/src/ermodel/graphnode.cpp branches/tora-trotl/src/ermodel/graphnode.h branches/tora-trotl/src/ermodel/graphsubgraph.cpp branches/tora-trotl/src/ermodel/graphsubgraph.h branches/tora-trotl/src/ermodel/kgraphviewer_interface.h branches/tora-trotl/src/ermodel/layoutagraphthread.cpp branches/tora-trotl/src/ermodel/layoutagraphthread.h branches/tora-trotl/src/ermodel/loadagraphthread.cpp branches/tora-trotl/src/ermodel/loadagraphthread.h branches/tora-trotl/src/ermodel/pannerview.cpp branches/tora-trotl/src/ermodel/pannerview.h Removed Paths: ------------- branches/tora-trotl/src/ermodel/simpleprintingcommand.h branches/tora-trotl/src/ermodel/simpleprintingengine.h branches/tora-trotl/src/ermodel/simpleprintingsettings.h Modified: branches/tora-trotl/src/docklets/toastwalk.cpp =================================================================== --- branches/tora-trotl/src/docklets/toastwalk.cpp 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/docklets/toastwalk.cpp 2011-10-14 13:45:20 UTC (rev 4116) @@ -7,7 +7,7 @@ #include <QMap> -void toASTWalk(SQLParser::Statement *source, KGraphViewer::DotGraph *target) +void toASTWalk(SQLParser::Statement *source, DotGraph *target) { SQLParser::ObjectCache *o = new SQLParser::ObjectCache(); QList<QString> cols; Modified: branches/tora-trotl/src/docklets/toastwalk.h =================================================================== --- branches/tora-trotl/src/docklets/toastwalk.h 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/docklets/toastwalk.h 2011-10-14 13:45:20 UTC (rev 4116) @@ -46,10 +46,10 @@ class Statement; }; -namespace KGraphViewer { +///namespace KGraphViewer { class DotGraph; -}; +///}; -void toASTWalk(SQLParser::Statement *source, KGraphViewer::DotGraph *target); +void toASTWalk(SQLParser::Statement *source, DotGraph *target); #endif Modified: branches/tora-trotl/src/docklets/toquerymodel.cpp =================================================================== --- branches/tora-trotl/src/docklets/toquerymodel.cpp 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/docklets/toquerymodel.cpp 2011-10-14 13:45:20 UTC (rev 4116) @@ -78,7 +78,7 @@ toEditWidget::addHandler(m_currentEditor); { - m_widget = new KGraphViewer::DotGraphView( NULL /*actionCollection()*/, this); + m_widget = new DotGraphView( NULL /*actionCollection()*/, this); m_widget->initEmpty(); m_widget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); // connect( m_widget, SIGNAL( graphLoaded() ), Modified: branches/tora-trotl/src/docklets/toquerymodel.h =================================================================== --- branches/tora-trotl/src/docklets/toquerymodel.h 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/docklets/toquerymodel.h 2011-10-14 13:45:20 UTC (rev 4116) @@ -49,9 +49,7 @@ #include <QSortFilterProxyModel> -namespace KGraphViewer { - class DotGraphView; -}; +class DotGraphView; class QTimerEvent; class toQueryModel : public toDocklet @@ -76,7 +74,7 @@ }; private: - KGraphViewer::DotGraphView *m_widget; + DotGraphView *m_widget; editHandlerHolder *m_currentEditor; QString m_lastText; Modified: branches/tora-trotl/src/ermodel/DotGraphParsingHelper.cpp =================================================================== --- branches/tora-trotl/src/ermodel/DotGraphParsingHelper.cpp 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/ermodel/DotGraphParsingHelper.cpp 2011-10-14 13:45:20 UTC (rev 4116) @@ -1,344 +1,343 @@ -/* This file is part of KGraphViewer. - Copyright (C) 2006-2007 Gael de Chalendar <kl...@fr...> - - KGraphViewer is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation, version 2. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA -*/ - - -#include "DotGraphParsingHelper.h" -#include "dotgraph.h" -#include "dotgrammar.h" -#include "dotdefaults.h" -//#include "graphsubgraph.h" -#include "graphnode.h" -#include "graphedge.h" - -#include <boost/throw_exception.hpp> -#include <boost/spirit/core.hpp> -#include <boost/spirit/utility/distinct.hpp> -#include <boost/spirit/utility/loops.hpp> -#include <boost/spirit/utility/confix.hpp> - - -#include <iostream> - -///#include <kdebug.h> - -#include <QFile> -#include <QUuid> - -using namespace std; - -extern KGraphViewer::DotGraphParsingHelper* phelper; - -namespace KGraphViewer -{ -#define KGV_MAX_ITEMS_TO_LOAD std::numeric_limits<int>::max() - -DotGraphParsingHelper::DotGraphParsingHelper(): - attrid(), - valid(), - attributed(), - subgraphid(), - uniq(0), - attributes(), - graphAttributes(), - nodesAttributes(), - edgesAttributes(), - graphAttributesStack(), - nodesAttributesStack(), - edgesAttributesStack(), - edgebounds(), - z(0), - maxZ(0), - graph(0), - gs(0), - gn(0), - ge(0) -{ -} - -void DotGraphParsingHelper::setgraphelementattributes(GraphElement* ge, const AttributesMap& attributes) -{ - AttributesMap::const_iterator it, it_end; - it = attributes.begin(); it_end = attributes.end(); - for (; it != it_end; it++) - { -// kDebug() << " " << QString::fromStdString((*it).first) << "\t=\t'" << QString::fromStdString((*it).second) <<"'"; - if ((*it).first=="label") - { - QString label = QString::fromUtf8((*it).second.c_str()); - label.replace("\\n","\n"); - (*ge).attributes()["label"] = label; - } - else - { - (*ge).attributes()[QString::fromStdString((*it).first)] = - QString::fromStdString((*it).second); - } - } - - if (attributes.find("_draw_") != attributes.end()) - { - parse_renderop((attributes.find("_draw_"))->second, ge->renderOperations()); -// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); - } - if (attributes.find("_ldraw_") != attributes.end()) - { - parse_renderop(attributes.find("_ldraw_")->second, ge->renderOperations()); -// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); - } - if (attributes.find("_hldraw_") != attributes.end()) - { - parse_renderop(attributes.find("_hldraw_")->second, ge->renderOperations()); -// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); - } - if (attributes.find("_tldraw_") != attributes.end()) - { - parse_renderop(attributes.find("_tldraw_")->second, ge->renderOperations()); -// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); - } -} - -void DotGraphParsingHelper::setgraphattributes() -{ -// kDebug() << "Attributes for graph are : "; - setgraphelementattributes(graph, graphAttributes); -} - -void DotGraphParsingHelper::setsubgraphattributes() -{ -// kDebug() << "Attributes for subgraph are : "; - gs->setZ(z); -// kDebug() << "z="<<gs->z(); - setgraphelementattributes(gs, graphAttributes); -} - -void DotGraphParsingHelper::setnodeattributes() -{ -// kDebug() << "setnodeattributes with z = " << z; - - if (gn == 0) - { -// kDebug() << "gn is null"; - return; - } -// kDebug() << "Attributes for node " << gn->id() << " are : "; - gn->setZ(z+1); -// kDebug() << "z="<<gn->z(); - setgraphelementattributes(gn, nodesAttributes); -} - -void DotGraphParsingHelper::setedgeattributes() -{ -// kDebug() << "setedgeattributeswith z = " << z; - -// kDebug() << "Attributes for edge " << ge->fromNode()->id() << "->" << ge->toNode()->id() << " are : "; - ge->setZ(z+1); -// kDebug() << "z="<<ge->z(); - setgraphelementattributes(ge, edgesAttributes); - - if (edgesAttributes.find("_tdraw_") != edgesAttributes.end()) - { - parse_renderop(edgesAttributes["_tdraw_"], ge->renderOperations()); -// kDebug() << "edge renderOperations size is now " << ge->renderOperations().size(); - DotRenderOpVec::const_iterator it, it_end; - it = ge->renderOperations().constBegin(); it_end = ge->renderOperations().constEnd(); - for (; it != it_end; it++) - ge->arrowheads().push_back(*it); - } - if (edgesAttributes.find("_hdraw_") != edgesAttributes.end()) - { - parse_renderop(edgesAttributes["_hdraw_"], ge->renderOperations()); -// kDebug() << "edge renderOperations size is now " << ge->renderOperations().size(); - DotRenderOpVec::const_iterator it, it_end; - it = ge->renderOperations().constBegin(); it_end = ge->renderOperations().constEnd(); - for (; it != it_end; it++) - ge->arrowheads().push_back(*it); - } -} - -void DotGraphParsingHelper::setattributedlist() -{ -// // kDebug() << "Setting attributes list for " << QString::fromStdString(attributed); - if (attributed == "graph") - { - if (attributes.find("bb") != attributes.end()) - { - std::vector< int > v; - parse_integers(attributes["bb"].c_str(), v); - if (v.size()>=4) - { -// kDebug() << "setting width and height to " << v[2] << v[3]; - graph->width(v[2]); - graph->height(v[3]); - } - } - AttributesMap::const_iterator it, it_end; - it = attributes.begin(); it_end = attributes.end(); - for (; it != it_end; it++) - { -// kDebug() << " " << QString::fromStdString((*it).first) << " = " << QString::fromStdString((*it).second); - graphAttributes[(*it).first] = (*it).second; - } - } - else if (attributed == "node") - { - AttributesMap::const_iterator it, it_end; - it = attributes.begin(); it_end = attributes.end(); - for (; it != it_end; it++) - { -// kDebug() << " " << QString::fromStdString((*it).first) << " = " << QString::fromStdString((*it).second); - nodesAttributes[(*it).first] = (*it).second; - } - } - else if (attributed == "edge") - { - AttributesMap::const_iterator it, it_end; - it = attributes.begin(); it_end = attributes.end(); - for (; it != it_end; it++) - { -// kDebug() << " " << QString::fromStdString((*it).first) << " = " << QString::fromStdString((*it).second); - edgesAttributes[(*it).first] = (*it).second; - } - } - attributes.clear(); -} - -void DotGraphParsingHelper::createnode(const std::string& nodeid) -{ - QString id = QString::fromStdString(nodeid); -// kDebug() << id; - gn = dynamic_cast<GraphNode*>(graph->elementNamed(id)); - if (gn==0 && graph->nodes().size() < KGV_MAX_ITEMS_TO_LOAD) - { -// kDebug() << "Creating a new node" << z << (void*)gs; - gn = new GraphNode(); - gn->setId(id); -// gn->label(QString::fromStdString(nodeid)); - if (z>0 && gs != 0) - { -// kDebug() << "Adding node" << id << "in subgraph" << gs->id(); - gs->content().push_back(gn); - } - else - { -// kDebug() << "Adding node" << id; - graph->nodes()[id] = gn; - } - } - edgebounds.clear(); -} - -void DotGraphParsingHelper::createsubgraph() -{ -// kDebug() ; - if (phelper) - { - std::string str = phelper->subgraphid; - if (str.empty()) - { - std::ostringstream oss; - oss << "kgv_id_" << phelper->uniq++; - str = oss.str(); - } -// kDebug() << QString::fromStdString(str); - if (graph->subgraphs().find(QString::fromStdString(str)) == graph->subgraphs().end()) - { -// kDebug() << "Creating a new subgraph"; - gs = new GraphSubgraph(); - gs->setId(QString::fromStdString(str)); -// gs->label(QString::fromStdString(str)); - graph->subgraphs().insert(QString::fromStdString(str), gs); -// kDebug() << "there is now"<<graph->subgraphs().size()<<"subgraphs in" << graph; - } - else - { -// kDebug() << "Found existing subgraph"; - gs = *(graph->subgraphs().find(QString::fromStdString(str))); - } - phelper->subgraphid = ""; - } -} - -void DotGraphParsingHelper::createedges() -{ -// kDebug(); - std::string node1Name, node2Name; - node1Name = edgebounds.front(); - edgebounds.pop_front(); - while (!edgebounds.empty()) - { - node2Name = edgebounds.front(); - edgebounds.pop_front(); - - if (graph->nodes().size() >= KGV_MAX_ITEMS_TO_LOAD || graph->edges().size() >= KGV_MAX_ITEMS_TO_LOAD) - { - return; - } -// kDebug() << QString::fromStdString(node1Name) << ", " << QString::fromStdString(node2Name); - ge = new GraphEdge(); - GraphElement* gn1 = graph->elementNamed(QString::fromStdString(node1Name)); - if (gn1 == 0) - { -// kDebug() << "new node 1"; - gn1 = new GraphNode(); - gn1->setId(QString::fromStdString(node1Name)); - graph->nodes()[QString::fromStdString(node1Name)] = dynamic_cast<GraphNode*>(gn1); - } - GraphElement* gn2 = graph->elementNamed(QString::fromStdString(node2Name)); - if (gn2 == 0) - { -// kDebug() << "new node 2"; - gn2 = new GraphNode(); - gn2->setId(QString::fromStdString(node2Name)); - graph->nodes()[QString::fromStdString(node2Name)] = dynamic_cast<GraphNode*>(gn2); - } -// kDebug() << "Found gn1="<<gn1<<" and gn2=" << gn2; - if (gn1 == 0 || gn2 == 0) - { - ///kError() << "Unable to find or create edge bound(s) gn1=" << gn1 << "; gn2=" << gn2; - } - ge->setFromNode(gn1); - ge->setToNode(gn2); -// kDebug() << ge->fromNode()->id() << " -> " << ge->toNode()->id(); - setedgeattributes(); -// kDebug() << ge->id(); - if (ge->id().isEmpty()) - { - ge->setId(QString::fromStdString(node1Name)+QString::fromStdString(node2Name)+QUuid::createUuid().toString().remove('{').remove('}').remove('-')); - } -// kDebug() << ge->id(); -// kDebug() << "num before=" << graph->edges().size(); - graph->edges().insert(ge->id(), ge); -// kDebug() << "num after=" << graph->edges().size(); - - - node1Name = node2Name; - } - edgebounds.clear(); -} - -void DotGraphParsingHelper::finalactions() -{ - GraphEdgeMap::iterator it, it_end; - it = graph->edges().begin(); it_end = graph->edges().end(); - for (; it != it_end; it++) - { - (*it)->setZ(maxZ+1); - } -} - -} +/* This file is part of KGraphViewer. + Copyright (C) 2006-2007 Gael de Chalendar <kl...@fr...> + + KGraphViewer is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation, version 2. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA +*/ + + +#include "DotGraphParsingHelper.h" +#include "dotgraph.h" +#include "dotgrammar.h" +#include "dotdefaults.h" +//#include "graphsubgraph.h" +#include "graphnode.h" +#include "graphedge.h" + +#include <boost/throw_exception.hpp> +#include <boost/spirit/core.hpp> +#include <boost/spirit/utility/distinct.hpp> +#include <boost/spirit/utility/loops.hpp> +#include <boost/spirit/utility/confix.hpp> + + +#include <iostream> + +///#include <kdebug.h> + +#include <QFile> +#include<QUuid> + +using namespace std; + +///namespace KGraphViewer +///{ +#define KGV_MAX_ITEMS_TO_LOAD std::numeric_limits<int>::max() + +extern DotGraphParsingHelper* phelper; + +DotGraphParsingHelper::DotGraphParsingHelper(): + attrid(), + valid(), + attributed(), + subgraphid(), + uniq(0), + attributes(), + graphAttributes(), + nodesAttributes(), + edgesAttributes(), + graphAttributesStack(), + nodesAttributesStack(), + edgesAttributesStack(), + edgebounds(), + z(0), + maxZ(0), + graph(0), + gs(0), + gn(0), + ge(0) +{ +} + +void DotGraphParsingHelper::setgraphelementattributes(GraphElement* ge, const AttributesMap& attributes) +{ + AttributesMap::const_iterator it, it_end; + it = attributes.begin(); it_end = attributes.end(); + for (; it != it_end; it++) + { +// kDebug() << " " << QString::fromStdString((*it).first) << "\t=\t'" << QString::fromStdString((*it).second) <<"'"; + if ((*it).first=="label") + { + QString label = QString::fromUtf8((*it).second.c_str()); + label.replace("\\n","\n"); + (*ge).attributes()["label"] = label; + } + else + { + (*ge).attributes()[QString::fromStdString((*it).first)] = + QString::fromStdString((*it).second); + } + } + + if (attributes.find("_draw_") != attributes.end()) + { + parse_renderop((attributes.find("_draw_"))->second, ge->renderOperations()); +// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); + } + if (attributes.find("_ldraw_") != attributes.end()) + { + parse_renderop(attributes.find("_ldraw_")->second, ge->renderOperations()); +// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); + } + if (attributes.find("_hldraw_") != attributes.end()) + { + parse_renderop(attributes.find("_hldraw_")->second, ge->renderOperations()); +// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); + } + if (attributes.find("_tldraw_") != attributes.end()) + { + parse_renderop(attributes.find("_tldraw_")->second, ge->renderOperations()); +// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); + } +} + +void DotGraphParsingHelper::setgraphattributes() +{ +// kDebug() << "Attributes for graph are : "; + setgraphelementattributes(graph, graphAttributes); +} + +void DotGraphParsingHelper::setsubgraphattributes() +{ +// kDebug() << "Attributes for subgraph are : "; + gs->setZ(z); +// kDebug() << "z="<<gs->z(); + setgraphelementattributes(gs, graphAttributes); +} + +void DotGraphParsingHelper::setnodeattributes() +{ +// kDebug() << "setnodeattributes with z = " << z; + + if (gn == 0) + { +// kDebug() << "gn is null"; + return; + } +// kDebug() << "Attributes for node " << gn->id() << " are : "; + gn->setZ(z+1); +// kDebug() << "z="<<gn->z(); + setgraphelementattributes(gn, nodesAttributes); +} + +void DotGraphParsingHelper::setedgeattributes() +{ +// kDebug() << "setedgeattributeswith z = " << z; + +// kDebug() << "Attributes for edge " << ge->fromNode()->id() << "->" << ge->toNode()->id() << " are : "; + ge->setZ(z+1); +// kDebug() << "z="<<ge->z(); + setgraphelementattributes(ge, edgesAttributes); + + if (edgesAttributes.find("_tdraw_") != edgesAttributes.end()) + { + parse_renderop(edgesAttributes["_tdraw_"], ge->renderOperations()); +// kDebug() << "edge renderOperations size is now " << ge->renderOperations().size(); + DotRenderOpVec::const_iterator it, it_end; + it = ge->renderOperations().constBegin(); it_end = ge->renderOperations().constEnd(); + for (; it != it_end; it++) + ge->arrowheads().push_back(*it); + } + if (edgesAttributes.find("_hdraw_") != edgesAttributes.end()) + { + parse_renderop(edgesAttributes["_hdraw_"], ge->renderOperations()); +// kDebug() << "edge renderOperations size is now " << ge->renderOperations().size(); + DotRenderOpVec::const_iterator it, it_end; + it = ge->renderOperations().constBegin(); it_end = ge->renderOperations().constEnd(); + for (; it != it_end; it++) + ge->arrowheads().push_back(*it); + } +} + +void DotGraphParsingHelper::setattributedlist() +{ +// // kDebug() << "Setting attributes list for " << QString::fromStdString(attributed); + if (attributed == "graph") + { + if (attributes.find("bb") != attributes.end()) + { + std::vector< int > v; + parse_integers(attributes["bb"].c_str(), v); + if (v.size()>=4) + { +// kDebug() << "setting width and height to " << v[2] << v[3]; + graph->width(v[2]); + graph->height(v[3]); + } + } + AttributesMap::const_iterator it, it_end; + it = attributes.begin(); it_end = attributes.end(); + for (; it != it_end; it++) + { +// kDebug() << " " << QString::fromStdString((*it).first) << " = " << QString::fromStdString((*it).second); + graphAttributes[(*it).first] = (*it).second; + } + } + else if (attributed == "node") + { + AttributesMap::const_iterator it, it_end; + it = attributes.begin(); it_end = attributes.end(); + for (; it != it_end; it++) + { +// kDebug() << " " << QString::fromStdString((*it).first) << " = " << QString::fromStdString((*it).second); + nodesAttributes[(*it).first] = (*it).second; + } + } + else if (attributed == "edge") + { + AttributesMap::const_iterator it, it_end; + it = attributes.begin(); it_end = attributes.end(); + for (; it != it_end; it++) + { +// kDebug() << " " << QString::fromStdString((*it).first) << " = " << QString::fromStdString((*it).second); + edgesAttributes[(*it).first] = (*it).second; + } + } + attributes.clear(); +} + +void DotGraphParsingHelper::createnode(const std::string& nodeid) +{ + QString id = QString::fromStdString(nodeid); +// kDebug() << id; + gn = dynamic_cast<GraphNode*>(graph->elementNamed(id)); + if (gn==0 && graph->nodes().size() < KGV_MAX_ITEMS_TO_LOAD) + { +// kDebug() << "Creating a new node" << z << (void*)gs; + gn = new GraphNode(); + gn->setId(id); +// gn->label(QString::fromStdString(nodeid)); + if (z>0 && gs != 0) + { +// kDebug() << "Adding node" << id << "in subgraph" << gs->id(); + gs->content().push_back(gn); + } + else + { +// kDebug() << "Adding node" << id; + graph->nodes()[id] = gn; + } + } + edgebounds.clear(); +} + +void DotGraphParsingHelper::createsubgraph() +{ +// kDebug() ; + if (phelper) + { + std::string str = phelper->subgraphid; + if (str.empty()) + { + std::ostringstream oss; + oss << "kgv_id_" << phelper->uniq++; + str = oss.str(); + } +// kDebug() << QString::fromStdString(str); + if (graph->subgraphs().find(QString::fromStdString(str)) == graph->subgraphs().end()) + { +// kDebug() << "Creating a new subgraph"; + gs = new GraphSubgraph(); + gs->setId(QString::fromStdString(str)); +// gs->label(QString::fromStdString(str)); + graph->subgraphs().insert(QString::fromStdString(str), gs); +// kDebug() << "there is now"<<graph->subgraphs().size()<<"subgraphs in" << graph; + } + else + { +// kDebug() << "Found existing subgraph"; + gs = *(graph->subgraphs().find(QString::fromStdString(str))); + } + phelper->subgraphid = ""; + } +} + +void DotGraphParsingHelper::createedges() +{ +// kDebug(); + std::string node1Name, node2Name; + node1Name = edgebounds.front(); + edgebounds.pop_front(); + while (!edgebounds.empty()) + { + node2Name = edgebounds.front(); + edgebounds.pop_front(); + + if (graph->nodes().size() >= KGV_MAX_ITEMS_TO_LOAD || graph->edges().size() >= KGV_MAX_ITEMS_TO_LOAD) + { + return; + } +// kDebug() << QString::fromStdString(node1Name) << ", " << QString::fromStdString(node2Name); + ge = new GraphEdge(); + GraphElement* gn1 = graph->elementNamed(QString::fromStdString(node1Name)); + if (gn1 == 0) + { +// kDebug() << "new node 1"; + gn1 = new GraphNode(); + gn1->setId(QString::fromStdString(node1Name)); + graph->nodes()[QString::fromStdString(node1Name)] = dynamic_cast<GraphNode*>(gn1); + } + GraphElement* gn2 = graph->elementNamed(QString::fromStdString(node2Name)); + if (gn2 == 0) + { +// kDebug() << "new node 2"; + gn2 = new GraphNode(); + gn2->setId(QString::fromStdString(node2Name)); + graph->nodes()[QString::fromStdString(node2Name)] = dynamic_cast<GraphNode*>(gn2); + } +// kDebug() << "Found gn1="<<gn1<<" and gn2=" << gn2; + if (gn1 == 0 || gn2 == 0) + { + ///kError() << "Unable to find or create edge bound(s) gn1=" << gn1 << "; gn2=" << gn2; + } + ge->setFromNode(gn1); + ge->setToNode(gn2); +// kDebug() << ge->fromNode()->id() << " -> " << ge->toNode()->id(); + setedgeattributes(); +// kDebug() << ge->id(); + if (ge->id() == "") + { + ge->setId(QString::fromStdString(node1Name)+QString::fromStdString(node2Name)+QUuid::createUuid().toString().remove("{").remove("}").remove("-")); + } +// kDebug() << ge->id(); +// kDebug() << "num before=" << graph->edges().size(); + graph->edges().insert(ge->id(), ge); +// kDebug() << "num after=" << graph->edges().size(); + + + node1Name = node2Name; + } + edgebounds.clear(); +} + +void DotGraphParsingHelper::finalactions() +{ + GraphEdgeMap::iterator it, it_end; + it = graph->edges().begin(); it_end = graph->edges().end(); + for (; it != it_end; it++) + { + (*it)->setZ(maxZ+1); + } +} +///} Modified: branches/tora-trotl/src/ermodel/DotGraphParsingHelper.h =================================================================== --- branches/tora-trotl/src/ermodel/DotGraphParsingHelper.h 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/ermodel/DotGraphParsingHelper.h 2011-10-14 13:45:20 UTC (rev 4116) @@ -1,84 +1,84 @@ -/* This file is part of KGraphViewer. - Copyright (C) 2006-2007 Gael de Chalendar <kl...@fr...> - - KGraphViewer is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation, version 2. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA -*/ - -#ifndef DOT_GRAPHPARSINGHELPER_H -#define DOT_GRAPHPARSINGHELPER_H - -#include <map> -#include <list> -#include <string> - -namespace KGraphViewer -{ -class DotGraph; -class GraphSubgraph; -class GraphNode; -class GraphEdge; -class GraphElement; - -struct DotGraphParsingHelper -{ - typedef std::map< std::string, std::string > AttributesMap; - - DotGraphParsingHelper(); - - void createnode(const std::string& nodeid); - void createsubgraph(); - void setgraphattributes(); - void setsubgraphattributes(); - void setnodeattributes(); - void setedgeattributes(); - void setattributedlist(); - void createedges(); - void edgebound(const std::string& bound) {edgebounds.push_back(bound);} - void finalactions(); - void setgraphelementattributes(GraphElement* ge, const AttributesMap& attributes); - - std::string attrid; - std::string valid; - std::string attributed; - std::string subgraphid; - - unsigned int uniq; - - AttributesMap attributes; - AttributesMap graphAttributes; - AttributesMap nodesAttributes; - AttributesMap edgesAttributes; - std::list< AttributesMap > graphAttributesStack; - std::list< AttributesMap > nodesAttributesStack; - std::list< AttributesMap > edgesAttributesStack; - - std::list< std::string > edgebounds; - - unsigned int z; - unsigned int maxZ; - - DotGraph* graph; - - GraphSubgraph* gs; - GraphNode* gn; - GraphEdge* ge; -}; - -} - -#endif - - - +/* This file is part of KGraphViewer. + Copyright (C) 2006-2007 Gael de Chalendar <kl...@fr...> + + KGraphViewer is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation, version 2. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA +*/ + +#ifndef DOT_GRAPHPARSINGHELPER_H +#define DOT_GRAPHPARSINGHELPER_H + +#include <map> +#include <list> +#include <string> + +///namespace KGraphViewer +///{ + +class DotGraph; +class GraphSubgraph; +class GraphNode; +class GraphEdge; +class GraphElement; + +struct DotGraphParsingHelper +{ + typedef std::map< std::string, std::string > AttributesMap; + + DotGraphParsingHelper(); + + void createnode(const std::string& nodeid); + void createsubgraph(); + void setgraphattributes(); + void setsubgraphattributes(); + void setnodeattributes(); + void setedgeattributes(); + void setattributedlist(); + void createedges(); + void edgebound(const std::string& bound) {edgebounds.push_back(bound);} + void finalactions(); + void setgraphelementattributes(GraphElement* ge, const AttributesMap& attributes); + + std::string attrid; + std::string valid; + std::string attributed; + std::string subgraphid; + + unsigned int uniq; + + AttributesMap attributes; + AttributesMap graphAttributes; + AttributesMap nodesAttributes; + AttributesMap edgesAttributes; + std::list< AttributesMap > graphAttributesStack; + std::list< AttributesMap > nodesAttributesStack; + std::list< AttributesMap > edgesAttributesStack; + + std::list< std::string > edgebounds; + + unsigned int z; + unsigned int maxZ; + + DotGraph* graph; + + GraphSubgraph* gs; + GraphNode* gn; + GraphEdge* ge; +}; + +///} +#endif + + + Modified: branches/tora-trotl/src/ermodel/FontsCache.cpp =================================================================== --- branches/tora-trotl/src/ermodel/FontsCache.cpp 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/ermodel/FontsCache.cpp 2011-10-14 13:45:20 UTC (rev 4116) @@ -1,51 +1,51 @@ -/* This file is part of KGraphViewer. - Copyright (C) 2005-2007 Gael de Chalendar <kl...@fr...> - - KGraphViewer is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation, version 2. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA -*/ - - -#include "FontsCache.h" - -#include "dot2qtconsts.h" - -FontsCache::~FontsCache() -{ - FontsCache::iterator it, it_end; - it = begin(); it_end = end(); - for (; it != it_end; it++) - { - delete (*it); - } -} - -QFont* FontsCache::cachedFont(const QFont& font) -{ - if (find(font.key()) == end()) - { - (*this)[font.key()] = new QFont(font); - } - return (*this)[font.key()]; -} - -QFont* FontsCache::fromName(const QString& fontName) -{ - if (m_namesToFonts.find(fontName) == m_namesToFonts.end()) - { - QFont font(Dot2QtConsts::componentData().qtFont(fontName)); - m_namesToFonts[fontName] = cachedFont(font); - } - return m_namesToFonts[fontName]; -} +/* This file is part of KGraphViewer. + Copyright (C) 2005-2007 Gael de Chalendar <kl...@fr...> + + KGraphViewer is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation, version 2. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA +*/ + + +#include "FontsCache.h" + +#include "dot2qtconsts.h" + +FontsCache::~FontsCache() +{ + FontsCache::iterator it, it_end; + it = begin(); it_end = end(); + for (; it != it_end; it++) + { + delete (*it); + } +} + +QFont* FontsCache::cachedFont(const QFont& font) +{ + if (find(font.key()) == end()) + { + (*this)[font.key()] = new QFont(font); + } + return (*this)[font.key()]; +} + +QFont* FontsCache::fromName(const QString& fontName) +{ + if (m_namesToFonts.find(fontName) == m_namesToFonts.end()) + { + QFont font(Dot2QtConsts::componentData().qtFont(fontName)); + m_namesToFonts[fontName] = cachedFont(font); + } + return m_namesToFonts[fontName]; +} Modified: branches/tora-trotl/src/ermodel/FontsCache.h =================================================================== --- branches/tora-trotl/src/ermodel/FontsCache.h 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/ermodel/FontsCache.h 2011-10-14 13:45:20 UTC (rev 4116) @@ -1,53 +1,53 @@ -/* This file is part of KGraphViewer. - Copyright (C) 2005-2007 Gael de Chalendar <kl...@fr...> - - KGraphViewer is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation, version 2. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA -*/ - - -#ifndef KGRAPHVIEWER_FONTSCACHE_H -#define KGRAPHVIEWER_FONTSCACHE_H - -#include "Singleton.h" - -#include <qfont.h> -#include <qmap.h> -#include <qstring.h> - -/** - * This is a map of fonts used in KgraphViewer - * - * @short A fonts map - * @author Gaël de Chalendar <kl...@fr...> - */ -class FontsCache : - public Singleton<FontsCache>, - public QMap<QString, QFont*> -{ -friend class Singleton<FontsCache>; - -public: - virtual ~FontsCache(); - - QFont* cachedFont(const QFont& font); - QFont* fromName(const QString& font); - -private: - FontsCache() {} - - QMap<QString, QFont*> m_namesToFonts; -}; - -#endif +/* This file is part of KGraphViewer. + Copyright (C) 2005-2007 Gael de Chalendar <kl...@fr...> + + KGraphViewer is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation, version 2. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA +*/ + + +#ifndef KGRAPHVIEWER_FONTSCACHE_H +#define KGRAPHVIEWER_FONTSCACHE_H + +#include "Singleton.h" + +#include <qfont.h> +#include <qmap.h> +#include <qstring.h> + +/** + * This is a map of fonts used in KgraphViewer + * + * @short A fonts map + * @author Gaël de Chalendar <kl...@fr...> + */ +class FontsCache : + public Singleton<FontsCache>, + public QMap<QString, QFont*> +{ +friend class Singleton<FontsCache>; + +public: + virtual ~FontsCache(); + + QFont* cachedFont(const QFont& font); + QFont* fromName(const QString& font); + +private: + FontsCache() {} + + QMap<QString, QFont*> m_namesToFonts; +}; + +#endif Modified: branches/tora-trotl/src/ermodel/canvasedge.cpp =================================================================== --- branches/tora-trotl/src/ermodel/canvasedge.cpp 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/ermodel/canvasedge.cpp 2011-10-14 13:45:20 UTC (rev 4116) @@ -1,589 +1,575 @@ -/* This file is part of KGraphViewer. - Copyright (C) 2005-2007 Gael de Chalendar <kl...@fr...> - - KGraphViewer is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation, version 2. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA -*/ - -/* This file was callgraphview.cpp, part of KCachegrind. - Copyright (C) 2003 Josef Weidendorfer <Jos...@gm...> - - KCachegrind is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation, version 2. -*/ - - -#include "canvasedge.h" -#include "graphedge.h" -#include "graphnode.h" -#include "dotdefaults.h" -#include "dot2qtconsts.h" -#include "dotgraphview.h" -#include "FontsCache.h" - -///#include <KAction> - -#include <QPainter> -#include <QGraphicsSceneMouseEvent> -#include <QMenu> - -#include <iostream> - -// -// CanvasEdge -// - -namespace KGraphViewer -{ - -CanvasEdge::CanvasEdge(DotGraphView* view, GraphEdge* e, - qreal scaleX, qreal scaleY, - qreal xMargin, qreal yMargin, qreal gh, - qreal wdhcf, qreal hdvcf, - QGraphicsItem* parent) - : QAbstractGraphicsShapeItem(parent), - m_scaleX(scaleX), m_scaleY(scaleY), - m_xMargin(xMargin), m_yMargin(yMargin), - m_gh(/*gh*/0), m_wdhcf(wdhcf), m_hdvcf(hdvcf), m_edge(e), - m_font(0), m_view(view), m_popup(new QMenu()) -{ - ///kDebug() << "edge " << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << m_gh; - setBoundingRegionGranularity(0.9); - m_font = FontsCache::changeable().fromName(e->fontName()); - - computeBoundingRect(); -// kDebug() << "boundingRect computed: " << m_boundingRect; - - QString tipStr = QString("%1 -> %2\nlabel='%3'") - .arg(edge()->fromNode()->id()) - .arg(edge()->toNode()->id()) - .arg(e->label()); - setToolTip(tipStr); - - // the message should be given (or possible to be given) by the part user - /// KAction* removeEdgeAction = new KAction(i18n("Remove selected edge(s)"), this); - /// m_popup->addAction(removeEdgeAction); - /// connect(removeEdgeAction,SIGNAL(triggered(bool)),this,SLOT(slotRemoveEdge())); - - - connect(e,SIGNAL(changed()),this,SLOT(modelChanged())); - connect(this, SIGNAL(selected(CanvasEdge*, Qt::KeyboardModifiers)), view, SLOT(slotEdgeSelected(CanvasEdge*, Qt::KeyboardModifiers))); - - connect(this, SIGNAL(edgeContextMenuEvent(const QString&, const QPoint&)), view, SLOT(slotContextMenuEvent(const QString&, const QPoint&))); - - setAcceptHoverEvents ( true ); - - ///kDebug() << "connect slotElementHoverEnter"; - connect(this, SIGNAL(hoverEnter(CanvasEdge*)), view, SLOT(slotElementHoverEnter(CanvasEdge*))); - connect(this, SIGNAL(hoverLeave(CanvasEdge*)), view, SLOT(slotElementHoverLeave(CanvasEdge*))); - -} - -CanvasEdge::~CanvasEdge() -{ - delete m_popup; -} - - -QRectF CanvasEdge::boundingRect() const -{ - return m_boundingRect; -} - -QPainterPath CanvasEdge::shape () const -{ -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id(); - if (m_boundingRegion.isEmpty()) { - m_boundingRegion.addRegion(boundingRegion(QTransform())); - } - return m_boundingRegion; - /* - foreach (const DotRenderOp& dro, edge()->renderOperations()) - { - if ( dro.renderop == "B" ) - { - for (int splineNum = 0; splineNum < edge()->colors().count() || (splineNum==0 && edge()->colors().count()==0); splineNum++) - { - QPolygonF points(dro.integers[0]); - for (int i = 0; i < dro.integers[0]; i++) - { - qreal nom = (dro.integers[2*dro.integers[0]]-dro.integers[2]); - qreal denom = (dro.integers[2*dro.integers[0]-1]-dro.integers[1]); - qreal diffX, diffY; - if (nom == 0) - { - diffX = 0; - diffY = 2*(edge()->colors().count()/2 - splineNum); - } - else if (denom ==0) - { - diffX = 2*(edge()->colors().count()/2 - splineNum); - diffY = 0; - } - else - { - double pente = nom/denom; - if (pente < 0) - { - diffX = 2*(edge()->colors().count()/2 - splineNum); - diffY = edge()->colors().count()/2 + splineNum; - } - else - { - diffX = 2*(edge()->colors().count()/2 - splineNum); - diffY = 2*(edge()->colors().count()/2 - splineNum); - } - } - QPointF p( - //NOTE: when uncommenting, fix nested comments in here: - (dro.integers[2*i+1]/ *%m_wdhcf* /*m_scaleX) +m_xMargin + diffX, - (m_gh-dro.integers[2*i+2]/ *%m_hdvcf* /)*m_scaleY + m_yMargin + diffY - ); - points[i] = p; - } - path.moveTo(points[0]); - for (int j = 0; j < (points.size()-1)/3; j++) - { - path.cubicTo(points[3*j + 1],points[3*j+1 + 1], points[3*j+2 + 1]); - } - for (int j = (points.size()-1)/3-3; j >= 0 ; j--) - { - path.cubicTo(points[3*j + 1],points[3*j+1 + 1], points[3*j+2 + 1]); - } - } - } - } - return path; - */ -} - - - -void CanvasEdge::paint(QPainter* p, const QStyleOptionGraphicsItem* option, - QWidget* widget) -{ -// kDebug(); -Q_UNUSED(option) -Q_UNUSED(widget) - if (m_boundingRect == QRectF()) - { - return; - } - /// computes the scaling of line width - qreal widthScaleFactor = (m_scaleX+m_scaleY)/2; - if (widthScaleFactor < 1) - { - widthScaleFactor = 1; - } - - if (edge()->style()=="invis") - { - return; - } - if (edge()->renderOperations().isEmpty()) - { - if ((edge()->fromNode()->canvasElement()!=0) - && (edge()->toNode()->canvasElement()!=0)) - { - p->drawLine( - edge()->fromNode()->canvasElement()->boundingRect().center()+edge()->fromNode()->canvasElement()->pos(), - edge()->toNode()->canvasElement()->boundingRect().center()+edge()->toNode()->canvasElement()->pos()); - } - return; - } - - QColor lineColor = Dot2QtConsts::componentData().qtColor(edge()->color(0)); - QColor backColor; - - QList<QPointF> allPoints; - foreach (const DotRenderOp& dro, edge()->renderOperations()) - { - // kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << "renderop" << dro.renderop << "; selected:" << edge()->isSelected(); - if (dro.renderop == "c") - { - QColor c(dro.str.mid(0,7)); - bool ok; - c.setAlpha(255-dro.str.mid(8).toInt(&ok,16)); - lineColor = c; -// kDebug() << "c" << dro.str.mid(0,7) << lineColor; - } - else if (dro.renderop == "C") - { - QColor c(dro.str.mid(0,7)); - bool ok; - c.setAlpha(255-dro.str.mid(8).toInt(&ok,16)); -/* if (m_hovered && m_view->highlighting()) - { - c = c.lighter(); - }*/ - backColor = c; -// kDebug() << "C" << dro.str.mid(0,7) << backColor; - } - else if ( dro.renderop == "T" ) - { - const QString& str = dro.str; - - qreal stringWidthGoal = dro.integers[3] * m_scaleX; - int fontSize = edge()->fontSize(); - m_font->setPointSize(fontSize); - QFontMetrics fm(*m_font); - while (fm.width(str) > stringWidthGoal && fontSize > 1) - { - fontSize--; - m_font->setPointSize(fontSize); - fm = QFontMetrics(*m_font); - } - p->save(); - p->setFont(*m_font); - - p->setPen(Dot2QtConsts::componentData().qtColor(edge()->fontColor())); - - qreal x = (m_scaleX * - ( - (dro.integers[0]) - + (((-dro.integers[2])*(fm.width(dro.str)))/2) - - ( (fm.width(dro.str))/2 ) - ) - ) - + m_xMargin; - qreal y = ((m_gh - (dro.integers[1]))*m_scaleY)+ m_yMargin; - QPointF point(x,y); -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << "drawText" << edge()->fontColor() << point; - - p->drawText(point,str); - p->restore(); - } - else if (( dro.renderop == "p" ) || (dro.renderop == "P" )) - { - QPolygonF polygon(dro.integers[0]); - for (int i = 0; i < dro.integers[0]; i++) - { - QPointF point( - (int(dro.integers[2*i+1])/*%m_wdhcf*/)*m_scaleX +m_xMargin, - (int(m_gh-dro.integers[2*i+2])/*%m_hdvcf*/)*m_scaleY + m_yMargin - ); - polygon[i] = point; -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << point; - allPoints.append(point); - } - if (dro.renderop == "P" ) - { - p->save(); - p->setBrush(lineColor); - p->drawPolygon(polygon); -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << "drawPolygon" << edge()->color(0) << polygon; - p->restore(); - } - else - { - p->setBrush(Dot2QtConsts::componentData().qtColor("white")); - } - QPen pen(lineColor); - if (edge()->style() == "bold") - { - pen.setStyle(Qt::SolidLine); - pen.setWidth((int)(2 * widthScaleFactor)); - } - else - { - pen.setWidth((int)(1 * widthScaleFactor)); - pen.setStyle(Dot2QtConsts::componentData().qtPenStyle(edge()->style())); - } - p->save(); - p->setPen(pen); -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << "drawPolyline" << edge()->color(0) << polygon; - p->drawPolyline(polygon); - p->restore(); - } - else if (( dro.renderop == "e" ) || (dro.renderop == "E" )) - { - qreal w = m_scaleX * dro.integers[2] * 2; - qreal h = m_scaleY * dro.integers[3] * 2; - qreal x = (m_xMargin + (dro.integers[0]/*%m_wdhcf*/)*m_scaleX) - w/2; - qreal y = ((m_gh - dro.integers[1]/*%m_hdvcf*/)*m_scaleY + m_yMargin) - h/2; - p->save(); - if (dro.renderop == "E" ) - { - p->setBrush(lineColor); - } - else - { - p->setBrush(Dot2QtConsts::componentData().qtColor("white")); - } - QPen pen(lineColor); - if (edge()->style() == "bold") - { - pen.setStyle(Qt::SolidLine); - pen.setWidth(int(2 * widthScaleFactor)); - } - else - { - pen.setWidth(int(1 * widthScaleFactor)); - pen.setStyle(Dot2QtConsts::componentData().qtPenStyle(edge()->style())); - } - p->setPen(pen); - QRectF rect(x,y,w,h); -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << "drawEllipse" << edge()->color(0) << rect; - p->drawEllipse(rect); - p->restore(); - } - else if ( dro.renderop == "B" ) - { - uint lineWidth = 1; - QPen pen; - if (edge()->style() == "bold") - { - pen.setStyle(Qt::SolidLine); - pen.setWidth(int(2 * widthScaleFactor)); - } - else if (edge()->style() != "filled") - { - pen.setStyle(Dot2QtConsts::componentData().qtPenStyle(edge()->style())); - } - if (edge()->style().left(12) == "setlinewidth") - { - bool ok; - lineWidth = edge()->style().mid(12, edge()->style().length()-1-12).toInt(&ok); - pen.setWidth(int(lineWidth * widthScaleFactor)); - } - if (edge()->attributes().contains("penwidth")) - { - bool ok; - lineWidth = edge()->attributes()["penwidth"].toInt(&ok); - pen.setWidth(int(lineWidth * widthScaleFactor)); - } - if (edge()->attributes().contains("color")) - { - ///kDebug() << "set edge color to " << QColor(edge()->attributes()["color"]).name(); - lineColor = QColor(edge()->attributes()["color"]); - } - for (int splineNum = 0; splineNum < edge()->colors().count() || (splineNum==0 && edge()->colors().count()==0); splineNum++) - { - QPolygonF points(dro.integers[0]); - for (int i = 0; i < dro.integers[0]; i++) - { - // computing of diffX and diffY to draw parallel edges - // when asked through the corresponding GraphViz feature - qreal nom = (dro.integers[2*dro.integers[0]]-dro.integers[2]); - qreal denom = (dro.integers[2*dro.integers[0]-1]-dro.integers[1]); - qreal diffX, diffY; - if (nom == 0) - { - diffX = 0; - diffY = 2*(edge()->colors().count()/2 - splineNum); - } - else if (denom ==0) - { - diffX = 2*(edge()->colors().count()/2 - splineNum); - diffY = 0; - } - else - { - double pente = nom/denom; - if (pente < 0) - { - diffX = 2*(edge()->colors().count()/2 - splineNum); - diffY = edge()->colors().count()/2 + splineNum; - } - else - { - diffX = 2*(edge()->colors().count()/2 - splineNum); - diffY = 2*(edge()->colors().count()/2 - splineNum); - } - } - QPointF p( - (dro.integers[2*i+1]/*%m_wdhcf*/*m_scaleX) +m_xMargin + diffX, - (m_gh-dro.integers[2*i+2]/*%m_hdvcf*/)*m_scaleY + m_yMargin + diffY - ); - points[i] = p; -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << p; - allPoints.append(p); - } - ///kDebug() << "Setting pen color to " << edge()->color(splineNum); - if (splineNum != 0) - lineColor = Dot2QtConsts::componentData().qtColor(edge()->color(splineNum)); - pen.setColor(lineColor); - p->save(); -// p->setBrush(Dot2QtConsts::componentData().qtColor(edge()->color(0))); - p->setBrush(Qt::NoBrush); - p->setPen(pen); - QPainterPath path; - path.moveTo(points[0]); - for (int j = 0; j < (points.size()-1)/3; j++) - { - path.cubicTo(points[3*j + 1],points[3*j+1 + 1], points[3*j+2 + 1]); - } -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << "drawPath" << edge()->color(splineNum) << points.first() << points.last(); - p->drawPath(path); - p->restore(); - } - } - } - if (edge()->isSelected()) - { -// kDebug() << "draw square"; -// p->drawRect(m_boundingRect); - qreal maxDist = 0; - QPair<QPointF,QPointF> pointsPair; - foreach(const QPointF& point1, allPoints) - { - foreach(const QPointF& point2, allPoints) - { - if (distance(point1, point2) > maxDist) - { - maxDist = distance(point1, point2); - pointsPair = qMakePair(point1, point2); - } - } - } - if (maxDist>0) - { - p->save(); - // p->setBrush(Dot2QtConsts::componentData().qtColor(edge()->color(0))); - p->setBrush(Qt::black); - p->setPen(Qt::black); - p->drawRect(QRectF(pointsPair.first-QPointF(3,3),QSizeF(6,6))); - p->drawRect(QRectF(pointsPair.second-QPointF(3,3),QSizeF(6,6))); - p->restore(); - } - } -} - -void CanvasEdge::modelChanged() -{ -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id(); - prepareGeometryChange(); - computeBoundingRect(); -} - -void CanvasEdge::computeBoundingRect() -{ -// kDebug(); - //invalidate bounding region cache - m_boundingRegion = QPainterPath(); - if (edge()->renderOperations().isEmpty()) - { - if ((edge()->fromNode()->canvasElement()==0) - || (edge()->toNode()->canvasElement()==0) - || edge()->style()=="invis") - { - m_boundingRect = QRectF(); - } - else - { - QRectF br( - edge()->fromNode()->canvasElement()->boundingRect().center()+edge()->fromNode()->canvasElement()->pos(), - edge()->toNode()->canvasElement()->boundingRect().center()+edge()->toNode()->canvasElement()->pos()); -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() <<br; - m_boundingRect = br; - } - } - else - { - QPolygonF points; - foreach (const DotRenderOp& dro, edge()->renderOperations()) - { -// kDebug() << dro.renderop << ", "; - if ( (dro.renderop != "B") && (dro.renderop != "p") && (dro.renderop != "P") ) continue; - uint previousSize = points.size(); - points.resize(previousSize+dro.integers[0]); - for (int i = 0; i < dro.integers[0]; i++) - { - QPointF p( - ((dro.integers[2*i+1]/*%m_wdhcf*/)*m_scaleX) +m_xMargin, - ((m_gh-dro.integers[2*i+2]/*%m_hdvcf*/)*m_scaleY) + m_yMargin - ); - points[previousSize+i] = p; - } - } -// kDebug() << points.size() << "points"; - if (points.size() == 0) return; - - int len = points.count(); - QPolygonF a = points, b = points; - a.translate(-1, -1); - b.translate(1, 1); - a.resize(2*len); - for (int i=0;i<len;i++) - { - a[len+i] = b[i]; - } -// kDebug() << a.size() << "points"; - - m_boundingRect = a.boundingRect(); - } - ///kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << "New bounding rect is:" << m_boundingRect; -} - -void CanvasEdge::mousePressEvent(QGraphicsSceneMouseEvent * event) -{ - ///kDebug() << event; - if (m_view->isReadOnly()) - { - return; - } - if (event->button() == Qt::LeftButton) - { - edge()->setSelected(!edge()->isSelected()); - if (edge()->isSelected()) - { - emit(selected(this,event->modifiers())); - } - update(); - } - else if (event->button() == Qt::RightButton) - { - if (!edge()->isSelected()) - { - edge()->setSelected(true); - emit(selected(this,event->modifiers())); - update(); - } - ///kDebug() << "emiting edgeContextMenuEvent("<<m_edge->id()<<","<<event->screenPos()<<")"; - emit(edgeContextMenuEvent(m_edge->id(), event->screenPos() )); -// opens the selected edge contextual menu and if necessary select the edge -/* kDebug() << "opens the contextual menu"; - m_popup->exec(event->screenPos());*/ - } -} - -qreal CanvasEdge::distance(const QPointF& point1, const QPointF& point2) -{ - return sqrt(pow(point1.x()-point2.x(),2)+pow(point1.y()-point2.y(),2)); -} - -void CanvasEdge::slotRemoveEdge() -{ - ///kDebug(); - m_view->removeSelectedElements(); -} - -void CanvasEdge::hoverEnterEvent( QGraphicsSceneHoverEvent * event ) -{ - Q_UNUSED(event) - ///kDebug() << edge()->id(); - emit hoverEnter(this); -} - -void CanvasEdge::hoverLeaveEvent( QGraphicsSceneHoverEvent * event ) -{ - Q_UNUSED(event) - ///kDebug() << edge()->id(); - emit hoverLeave(this); -} - -} - -//#include "canvasedge.moc" +/* This file is part of KGraphViewer. + Copyright (C) 2005-2007 Gael de Chalendar <kl...@fr...> + + KGraphViewer is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation, version 2. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA +*/ + +/* This file was callgraphview.cpp, part of KCachegrind. + Copyright (C) 2003 Josef Weidendorfer <Jos...@gm...> + + KCachegrind is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation, version 2. +*/ + + +#include "canvasedge.h" +#include "graphedge.h" +#include "graphnode.h" +#include "dotdefaults.h" +#include "dot2qtconsts.h" +#include "dotgraphview.h" +#include "FontsCache.h" + +///#include <KAction> + +#include <QPainter> +#include <QGraphicsSceneMouseEvent> +#include <QMenu> + +#include <iostream> + +// +// CanvasEdge +// + +///namespace KGraphViewer +///{ +CanvasEdge::CanvasEdge(DotGraphView* view, GraphEdge* e, + qreal scaleX, qreal scaleY, + qreal xMargin, qreal yMargin, qreal gh, + qreal wdhcf, qreal hdvcf, + QGraphicsItem* parent) + : QAbstractGraphicsShapeItem(parent), + m_scaleX(scaleX), m_scaleY(scaleY), + m_xMargin(xMargin), m_yMargin(yMargin), + m_gh(/*gh*/0), m_wdhcf(wdhcf), m_hdvcf(hdvcf), m_edge(e), + m_font(0), m_view(view), m_popup(new QMenu()) +{ + ///kDebug() << "edge " << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << m_gh; + setBoundingRegionGranularity(0.9); + m_font = FontsCache::changeable().fromName(e->fontName()); + + computeBoundingRect(); +// kDebug() << "boundingRect computed: " << m_boundingRect; + + QString tipStr = QString("%1 -> %2\nlabel='%3'") + .arg(edge()->fromNode()->id()) + .arg(edge()->toNode()->id()) + .arg(e->label()); + setToolTip(tipStr); + + // the message should be given (or possible to be given) by the part user + /// KAction* removeEdgeAction = new KActi... [truncated message content] |
From: <ibr...@us...> - 2011-10-21 16:58:46
|
Revision: 4124 http://tora.svn.sourceforge.net/tora/?rev=4124&view=rev Author: ibre5041 Date: 2011-10-21 16:58:37 +0000 (Fri, 21 Oct 2011) Log Message: ----------- toCache rewritten Modified Paths: -------------- branches/tora-trotl/src/CMakeLists.txt branches/tora-trotl/src/main.cpp branches/tora-trotl/src/tobrowserconstraint.cpp branches/tora-trotl/src/tobrowserschemawidget.cpp branches/tora-trotl/src/tocache.cpp branches/tora-trotl/src/tocache.h branches/tora-trotl/src/toconnection.cpp branches/tora-trotl/src/toconnection.h branches/tora-trotl/src/todebug.cpp branches/tora-trotl/src/todescribe.cpp branches/tora-trotl/src/toeventquery.cpp branches/tora-trotl/src/toeventquery.h branches/tora-trotl/src/toeventquerytask.cpp branches/tora-trotl/src/toeventquerytask.h branches/tora-trotl/src/toglobalsetting.cpp branches/tora-trotl/src/tohighlightedtext.cpp branches/tora-trotl/src/tooracleconnection_trotl.cpp branches/tora-trotl/src/tooracleextract.cpp branches/tora-trotl/src/toqsqlconnection.cpp branches/tora-trotl/src/toquery.h branches/tora-trotl/src/toqueryimpl.h branches/tora-trotl/src/toresultbar.cpp branches/tora-trotl/src/toresultcols.cpp branches/tora-trotl/src/toresultcombo.cpp branches/tora-trotl/src/toresultcombo.h branches/tora-trotl/src/toresultitem.cpp branches/tora-trotl/src/toresultline.cpp branches/tora-trotl/src/toresultlock.cpp branches/tora-trotl/src/toresultlong.cpp branches/tora-trotl/src/toresultlong.h branches/tora-trotl/src/toresultmodel.cpp branches/tora-trotl/src/toresultstats.cpp branches/tora-trotl/src/toresultview.cpp branches/tora-trotl/src/tosecuritytreemodel.cpp branches/tora-trotl/src/tosql.h branches/tora-trotl/src/totemplate.cpp branches/tora-trotl/src/tothread.h Added Paths: ----------- branches/tora-trotl/src/tocachenew.cpp branches/tora-trotl/src/tocachenew.h Modified: branches/tora-trotl/src/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/CMakeLists.txt 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/CMakeLists.txt 2011-10-21 16:58:37 UTC (rev 4124) @@ -293,7 +293,8 @@ tobrowserdblinkswidget.cpp tobrowserdirectorieswidget.cpp # tobrowserschemabasewidget.cpp - tocache.cpp +# tocache.cpp + tocachenew.cpp toconfiguration.cpp toconnection.cpp toquery.cpp @@ -693,9 +694,18 @@ ${APPLE_BUNDLE_SOURCES} ${TROTL_TEST3_MOC_SOURCES} ) -#SET_TARGET_PROPERTIES(trotl_test3 PROPERTIES COMPILE_FLAGS "-DTROTL_DLL") TARGET_LINK_LIBRARIES(trotl_test3 ${TORA_LIBS} ${TORA_MOC_LIB}) +QT4_WRAP_CPP(TROTL_TEST3_MOC_SOURCES "trotl_test4.h") +ADD_EXECUTABLE(trotl_test4 ${GUI_TYPE} + trotl_test4.cpp + ${TORA_SOURCES} + ${TORA_RCC_SRCS} + ${APPLE_BUNDLE_SOURCES} + ${TROTL_TEST3_MOC_SOURCES} +) +TARGET_LINK_LIBRARIES(trotl_test4 ${TORA_LIBS} ${TORA_MOC_LIB}) + # Install IF (WIN32) INSTALL(TARGETS ${EXE_NAME} RUNTIME DESTINATION .) Modified: branches/tora-trotl/src/main.cpp =================================================================== --- branches/tora-trotl/src/main.cpp 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/main.cpp 2011-10-21 16:58:37 UTC (rev 4124) @@ -263,7 +263,7 @@ toMarkedText::setDefaultTabWidth(toConfigurationSingle::Instance().tabStop()); toMarkedText::setDefaultTabSpaces(toConfigurationSingle::Instance().tabSpaces()); - qRegisterMetaType<toQDescList>("toQDescList&"); + qRegisterMetaType<toQColumnDescriptionList>("toQColumnDescriptionList&"); qRegisterMetaType<ValuesList>("ValuesList&"); qRegisterMetaType<toConnection::exception>("toConnection::exception"); Modified: branches/tora-trotl/src/tobrowserconstraint.cpp =================================================================== --- branches/tora-trotl/src/tobrowserconstraint.cpp 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/tobrowserconstraint.cpp 2011-10-21 16:58:37 UTC (rev 4124) @@ -187,12 +187,12 @@ CheckColumn->changeParams(Owner, Table); ReferTable->clear(); - QList<toConnection::objectName> objects = connection().objects(false); + QList<toCacheNew::CacheEntry const*> objects = connection().objects(false); { - for (QList<toConnection::objectName>::iterator i = objects.begin();i != objects.end();i++) + for (QList<toCacheNew::CacheEntry const*>::iterator i = objects.begin();i != objects.end();i++) { - if ((*i).Type == "TABLE" && (*i).Owner == Owner) - ReferTable->addItem((*i).Name); + if ((*i)->type == toCacheNew::TABLE && (*i)->name.first == Owner) + ReferTable->addItem((*i)->name.second); } } Modified: branches/tora-trotl/src/tobrowserschemawidget.cpp =================================================================== --- branches/tora-trotl/src/tobrowserschemawidget.cpp 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/tobrowserschemawidget.cpp 2011-10-21 16:58:37 UTC (rev 4124) @@ -80,7 +80,8 @@ sch = "%"; else sch = schema; - if (toCurrentConnection(this).Cache->objectExists(sch, "TORA_LIST", ObjectType)) + + if (toCurrentConnection(this).CacheNew->findEntry(toCacheNew::ObjectRef(sch, ObjectType))) // search for entry of type TORA_SCHEMA_LIST { this->queryFromCache(sch, ObjectType); return; @@ -95,30 +96,27 @@ void toBrowserSchemaTableView::updateCache(void) { // Update list of objects - QList<toCache::objectName> rows; - toCache::objectName obj; - obj.Owner = Schema; - obj.Type = ObjectType; + QList<toCacheNew::CacheEntry*> rows; + toCacheNew::CacheEntry *obj; // TODO: Check that result model rows are NOT sorted in descending order as that would break updating of cache!!! toResultModel::RowList modelRows = this->Model->getRawData(); for (QList<toResultModel::Row>::iterator i = modelRows.begin(); i != modelRows.end(); i++) { - obj.Name = (*i)[1]; - rows.append(obj); + obj = toCacheNew::createCacheEntry(Schema, (*i)[1], ObjectType, ""); + if (obj != NULL) // Some objects (like DBLINKs are not held in the toCache => obj == NULL + rows.append(obj); } // NOTE: Oracle directories do not belong to any particular schema. // Therefore they are saved as belonging to SYS schema. if (ObjectType == "DIRECTORY") Schema = "SYS"; - toCurrentConnection(this).Cache->updateObjects(Schema, ObjectType, rows); + toCurrentConnection(this).CacheNew->updateSchemaObjects(Schema, ObjectType, rows); + // Update information when list of this type of objects in this schema was updated // NOTE: Type is placed in the name field in order not to // mix this meta-information with actual list of objects. - obj.Owner = Schema; - obj.Type = "TORA_LIST"; - obj.Name = ObjectType; - toCurrentConnection(this).Cache->addIfNotExists(obj); + toCurrentConnection(this).CacheNew->addEntry(new toCacheNew::CacheEntry(Schema, ObjectType, toCacheNew::TORA_SCHEMA_LIST, "")); } // updateCache toBrowserSchemaCodeBrowser::toBrowserSchemaCodeBrowser(QWidget * parent) Modified: branches/tora-trotl/src/tocache.cpp =================================================================== --- branches/tora-trotl/src/tocache.cpp 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/tocache.cpp 2011-10-21 16:58:37 UTC (rev 4124) @@ -1,5 +1,5 @@ -#include "tocache.h" +#include "tocache.h.removed" #include "toconfiguration.h" #include "utils.h" #include <QtDebug> @@ -18,7 +18,9 @@ toCache::~toCache() { - /* toCache locked be parent toConnection */ + /* The parent toConnection is locked by this instance of toCache, + wail till background thread finishes + */ if(cacheRefreshRunning()) ReadingThread.down(); } Modified: branches/tora-trotl/src/tocache.h =================================================================== --- branches/tora-trotl/src/tocache.h 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/tocache.h 2011-10-21 16:58:37 UTC (rev 4124) @@ -1,3 +1,5 @@ +#error DO NOT INCLUDE + #ifndef TOCACHE_H #define TOCACHE_H Added: branches/tora-trotl/src/tocachenew.cpp =================================================================== --- branches/tora-trotl/src/tocachenew.cpp (rev 0) +++ branches/tora-trotl/src/tocachenew.cpp 2011-10-21 16:58:37 UTC (rev 4124) @@ -0,0 +1,492 @@ +#include "tocachenew.h" +#include "toconfiguration.h" +#include "utils.h" +#include <QtDebug> +#include <QDir> +#include <QDateTime> +#include <QTextStream> +#include <QProgressDialog> +//#include <boost/preprocessor/iteration/detail/local.hpp> + +toCacheNew::toCacheNew( QString const &description) + : ConnectionDescription(description) + , refCount(1) // we assume that we were created from 1s toConnection + , state(NOT_STARTED) + , ownersRead(false) + , usersRead(false) +{ +} + +toCacheNew::~toCacheNew() +{ + /* The parent toConnection is locked by this instance of toCache, + wail till background thread finishes + */ + //if(cacheRefreshRunning()) + // ReadingThread.down(); + { + toExclusiveLocker lock(cacheLock); + clearCache(); + } +} + +void toCacheNew::addEntry(toCacheNew::CacheEntry* e) +{ + toExclusiveLocker lock(cacheLock); + switch(e->type) + { + case SYNONYM: + synonymMap.insert(e->name, e); + case TABLE: + case VIEW: + case PROCEDURE: + case FUNCTION: + case PACKAGE: + case PACKAGE_BODY: + case INDEX: + case SEQUENCE: + case TRIGGER: + case DATABASE: + case TORA_SCHEMA_LIST: + { + QString const& schema = e->name.first; + + CacheEntry const* oldValue = entryMap.value(e->name, NULL); + if( oldValue) + delete oldValue; + entryMap.insert(e->name, e); + + if( !usersMap.contains(schema)) + { + usersMap.insert(schema, new toCacheEntryUser(schema)); + } + + if( !ownersMap.contains(e->name.first)) + { + ownersMap.insert(schema, usersMap.value(schema)); + } + } + break; + case USER: + { + CacheEntry const* oldValue = usersMap.value(e->name.first, NULL); + if( oldValue == NULL) + { + usersMap.insert(e->name.first, e); + } else { + delete e; + } + } + break; + default: + ;; // HERE we ignore directories, dblinks, ... + } +}; + +toCacheNew::CacheEntry const* toCacheNew::findEntry(toCacheNew::ObjectRef const& o) const +{ + toSharedLocker lock(cacheLock); + return entryMap.value(o, NULL); +} + +toCacheNew::ObjectRef toCacheNew::translateName(ObjectRef const& n) const +{ + toSharedLocker lock(cacheLock); + if( synonymMap.contains(n)) + return ObjectRef(synonymMap.value(n)->name); + else + return ObjectRef("", ""); +} + +void toCacheNew::updateSchemaObjects(QString const& schema, QString const& objType, QList<toCacheNew::CacheEntry*> const& rows) +{ + toExclusiveLocker lock(cacheLock); + CacheEntryType type = cacheEntryType(objType); + if( type == OTHER) + throw QString("toCacheNew: Unknown object type %1").arg(objType); + + // Clear whole schema + QList<ObjectRef> objs = entryMap.keys(); // TODO there must be a better way of deleting from QMap + Q_FOREACH(ObjectRef const& o, objs) + { + if( o.first == schema && entryMap.value(o)->type == type) + entryMap.remove(o); + } + + // Add new entries in the schema + Q_FOREACH(CacheEntry* e, rows) + { + entryMap.insert(e->name, e); + } + + // Check if user/owner exists + { + if( !usersMap.contains(schema)) + { + usersMap.insert(schema, new toCacheEntryUser(schema)); + } + + if( !rows.empty() && !ownersMap.contains(schema)) + { + ownersMap.insert(schema, usersMap.value(schema)); + } + } + + if( type == SYNONYM) + { + QList<ObjectRef> objs = synonymMap.keys(); // TODO there must be a better way of deleting from QMap + Q_FOREACH(ObjectRef const& o, objs) + { + if( o.first == schema) + synonymMap.remove(o); + } + + Q_FOREACH(CacheEntry* e, rows) + { + synonymMap.insert(e->name, e); + } + } +}; + +QList<toCacheNew::CacheEntry const*> toCacheNew::getObjectsInSchema(QString const& schema, CacheEntryType type) const +{ + toSharedLocker lock(cacheLock); + QList<toCacheNew::CacheEntry const*> retval; + + QList<ObjectRef> objs = entryMap.keys(); // TODO there must be a better way of searching QMap (do not copy keys) + Q_FOREACH(ObjectRef const& o, objs) + { + if( o.first == schema && (entryMap.value(o)->type == type || type == toCacheNew::ANY)) + retval.append(entryMap.value(o)); + } + + return retval; +}; + +QList<toCacheNew::CacheEntry const*> toCacheNew::getObjectsInSchema(QString const& schema, QString const& type) const +{ + CacheEntryType t = cacheEntryType(type); + if(t != toCacheNew::OTHER) + return getObjectsInSchema(schema, t); + else + return QList<toCacheNew::CacheEntry const*>(); +}; + +/** Clear current list of users and generate a new one */ +void toCacheNew::updateUserList(QList<CacheEntry*> const& r, UserListType listType) +{ + toExclusiveLocker lock(cacheLock); + QString username; + if( listType == USERS) + { + Q_FOREACH(CacheEntry const*e, r) + { + username = e->name.first; + if(usersMap.contains(username)) // Do not replace existing entry + delete e; + else + usersMap.insert(username, e); + } + } else { + Q_FOREACH(CacheEntry const*e, r) + { + username = e->name.first; + if(ownersMap.contains(username)) + { + delete e; + } else { + CacheEntry const* userPointer = usersMap.value(username, NULL); + if( userPointer) + { + ownersMap.insert(username, userPointer); + delete e; + } else + ownersMap.insert(username, e); + } + } + } + + if( listType == USERS) + usersRead = true; + else + ownersRead = true; +}; + +/** List of database users / database onject owners */ +QStringList toCacheNew::userList(UserListType listType) const +{ + toSharedLocker lock(cacheLock); + QStringList retval; + QMap<QString, CacheEntry const*> const& map = (listType == USERS ? usersMap : ownersMap); + unsigned s = map.size(); + Q_FOREACH(CacheEntry const*e, map) + { + retval.append(e->name.first); + } + return retval; +}; + +bool toCacheNew::userListExists(UserListType listType) const +{ + if( listType == USERS) + return usersRead; + else + return ownersRead; +} + +QList<toCacheNew::CacheEntry const*> toCacheNew::objects(bool wait) const +{ + toSharedLocker lock(cacheLock); + return entryMap.values(); +}; + +void toCacheNew::setCacheState(CacheState c) +{ + toExclusiveLocker lock(cacheLock); + state = c; +}; + +toCacheNew::CacheState toCacheNew::cacheState() const +{ + toSharedLocker lock(cacheLock); + return state; +} + +void toCacheNew::readObjects(toTask * t) +{ + if( toConfigurationSingle::Instance().objectCache() == toConfiguration::NEVER) + { + return; + } + + try + { + (new toThread(t))->start(); + ReadingThreadSemaphore.down(); // Wait till child thread starts + /// TODO migrate this too, probably somewhere in toConnection + toMainWidget()->checkCaching(); // notify main window about the change of cache's state + } + catch (...) + { + state = FAILED; + } +} + +void toCacheNew::rereadCache(toTask * t) +{ + if( toConfigurationSingle::Instance().objectCache() == toConfiguration::NEVER) + { + toExclusiveLocker lock(cacheLock); + clearCache(); + return; + } + + if( cacheRefreshRunning()) + { + toStatusMessage(qApp->translate("toConnection", "Not done caching objects, can not clear unread cache")); + return ; + } + + ///TODO + /** delete cache file to force reload + */ + //QString filename(cacheFile()); + //if (QFile::exists(filename)) + // QFile::remove(filename); + + readObjects(t); +} + +/** + * private functions + */ +void toCacheNew::clearCache() +{ + QList<CacheEntry const*> v = entryMap.values(); + Q_FOREACH(CacheEntry const*e, v) + { + delete e; + } + + entryMap.clear(); + synonymMap.clear(); + columnCache.clear(); + + QList<CacheEntry const*> u = usersMap.values(); + Q_FOREACH(CacheEntry const*e, u) + { + delete e; + } + ownersMap.clear(); + usersMap.clear(); +}; + +QString toCacheNew::cacheDir() +{ + QString home(QDir::homePath()); + QString dirname(toConfigurationSingle::Instance().cacheDir()); + + if (dirname.isEmpty()) + { +#ifdef Q_OS_WIN32 + if (getenv("TEMP")) + dirname = QString(getenv("TEMP")); + else +#endif + dirname = QString(home); + dirname += "/.tora_cache"; + } + return dirname; +} // cacheDir + + +/*static*/ toCacheNew::CacheEntryType toCacheNew::cacheEntryType(QString const& objType) +{ + if( objType == "TABLE") + return TABLE; + else if( objType == "VIEW") + return VIEW; + else if( objType == "SYNONYM") + return SYNONYM; + else if( objType == "PROCEDURE") + return PROCEDURE; + else if( objType == "FUNCTION") + return FUNCTION; + else if( objType == "PACKAGE") + return PACKAGE; + else if( objType == "PACKAGE BODY") + return PACKAGE_BODY; + else if( objType == "INDEX") + return INDEX; + else if( objType == "SEQUENCE") + return SEQUENCE; + else if( objType == "TRIGGER") + return TRIGGER; + else if( objType == "DATABASE") + return DATABASE; + else + return OTHER; +} + +bool toCacheNew::cacheRefreshRunning() const +{ + toSharedLocker lock(cacheLock); + return state != NOT_STARTED && state != DONE && state != FAILED; +} + +toCacheNew::CacheEntry* toCacheNew::createCacheEntry(const QString &objOwner, const QString &objName, const QString &objType, const QString &comment) +{ + switch(cacheEntryType(objType)) + { + case TABLE: + return new toCacheEntryTable(objOwner, objName, objType, comment); + case VIEW: + return new toCacheEntryView(objOwner, objName, objType, comment); + case SYNONYM: + return new toCacheEntrySynonym(objOwner, objName, objType, comment); + case PROCEDURE: + return new toCacheEntryProcedure(objOwner, objName, objType, comment); + case FUNCTION: + return new toCacheEntryFunction(objOwner, objName, objType, comment); + case PACKAGE: + return new toCacheEntryPackage(objOwner, objName, objType, comment); + case PACKAGE_BODY: + return new toCacheEntryPackageBody(objOwner, objName, objType, comment); + case INDEX: + return new toCacheEntryIndex(objOwner, objName, objType, comment); + case SEQUENCE: + return new toCacheEntrySequence(objOwner, objName, objType, comment); + case TRIGGER: + return new toCacheEntryTrigger(objOwner, objName, objType, comment); + case DATABASE: + return new toCacheEntryDatabase(objOwner, objName, objType, comment); + default: + return NULL; + ///throw QString("toCacheNew: Unknown object type %1").arg(objType); + } +}; + +toCacheNew::CacheEntry::CacheEntry(const QString &owner, const QString &objName, const QString &objType, const QString &objComment) + : name(ObjectRef(owner,objName)) + , type(cacheEntryType(objType)) + , comment(objComment) + , timestamp(QDate::currentDate()) + , described(false) +{ + if( type == OTHER) + throw QString("toCacheNew: Unknown object type %1").arg(objType); +}; + +/** TODO delete this - this is courious constructor used to hold TORAs internal cache intries */ +toCacheNew::CacheEntry::CacheEntry(const QString &owner, const QString &objName, toCacheNew::CacheEntryType objType, const QString &objComment) + : name(ObjectRef(owner,objName)) + , type(objType) + , comment(objComment) +{ + if( type == OTHER) + throw QString("toCacheNew: Unknown object type %1").arg(objType); +}; + +bool toCacheNew::CacheEntry::operator < (const toCacheNew::CacheEntry &other) const +{ + if( type < other.type) + return true; + if( type == other.type && name.first < other.name.first) + return true; + if( type == other.type && name.first == other.name.first && name.second < other.name.second) + return true; + return false; +}; + +bool toCacheNew::CacheEntry::operator == (const toCacheNew::CacheEntry &other) const +{ + return type == other.type && name == other.name; +}; + +toCacheEntryTable::toCacheEntryTable(const QString &owner, const QString &name, const QString &type, const QString &comment) + : toCacheNew::CacheEntry(owner, name, type, comment) +{}; + +toCacheEntryView::toCacheEntryView(const QString &owner, const QString &name, const QString &type, const QString &comment) + : toCacheNew::CacheEntry(owner, name, type, comment) +{}; + +toCacheEntrySynonym::toCacheEntrySynonym(const QString &owner, const QString &name, const QString &type, const QString &comment) + : toCacheNew::CacheEntry(owner, name, type, comment) +{}; + +toCacheEntryProcedure::toCacheEntryProcedure(const QString &owner, const QString &name, const QString &type, const QString &comment) + : toCacheNew::CacheEntry(owner, name, type, comment) +{}; + +toCacheEntryFunction::toCacheEntryFunction(const QString &owner, const QString &name, const QString &type, const QString &comment) + : toCacheNew::CacheEntry(owner, name, type, comment) +{}; + +toCacheEntryPackage::toCacheEntryPackage(const QString &owner, const QString &name, const QString &type, const QString &comment) + : toCacheNew::CacheEntry(owner, name, type, comment) +{}; + +toCacheEntryPackageBody::toCacheEntryPackageBody(const QString &owner, const QString &name, const QString &type, const QString &comment) + : toCacheNew::CacheEntry(owner, name, type, comment) +{}; + +toCacheEntryIndex::toCacheEntryIndex(const QString &owner, const QString &name, const QString &type, const QString &comment) + : toCacheNew::CacheEntry(owner, name, type, comment) +{}; + +toCacheEntrySequence::toCacheEntrySequence(const QString &owner, const QString &name, const QString &type, const QString &comment) + : toCacheNew::CacheEntry(owner, name, type, comment) +{}; + +toCacheEntryTrigger::toCacheEntryTrigger(const QString &owner, const QString &name, const QString &type, const QString &comment) + : toCacheNew::CacheEntry(owner, name, type, comment) +{}; + +toCacheEntryDatabase::toCacheEntryDatabase(const QString &owner, const QString &name, const QString &type, const QString &comment) + : toCacheNew::CacheEntry(owner, name, type, comment) +{}; + +toCacheEntryUser::toCacheEntryUser(const QString &schema) + : toCacheNew::CacheEntry(schema, schema, toCacheNew::USER, "") +{}; Added: branches/tora-trotl/src/tocachenew.h =================================================================== --- branches/tora-trotl/src/tocachenew.h (rev 0) +++ branches/tora-trotl/src/tocachenew.h 2011-10-21 16:58:37 UTC (rev 4124) @@ -0,0 +1,367 @@ +#ifndef TOCACHE_NEW_H +#define TOCACHE_NEW_H + +#include "tothread.h" +#include <QMetaType> +#include <QDate> +#include <QList> +#include <QVariant> +//#include <map> +#include <QList> +#include <QPair> +#include <QSet> + +/** Object cache for a connection. This class is accessed only through toConnection +a could be a nested class of toConnection. +*/ +class toConnection; +class toCacheEntryTable; +class toCacheEntryView; +class toCacheEntrySynonym; +class toCacheEntryFunction; +class toCacheEntryPackage; +class toCacheEntryPackageBody; +class toCacheEntryIndex; +class toCacheEntrySequence; +class toCacheEntryTrigger; + +class toGlobalSetting; + +class toCacheNew //: public QObject +{ + friend class toConnection; + friend class toGlobalSetting; +public: + /*** Nested types ***/ + + /** Object reference, used as a lookup key + */ + typedef QPair<QString,QString> ObjectRef; // 1st schema name, 2nd object name + + /** Nested class type + */ + enum CacheEntryType + { + TABLE, + VIEW, + SYNONYM, + PROCEDURE, + FUNCTION, + PACKAGE, + PACKAGE_BODY, + INDEX, + SEQUENCE, + TRIGGER, + DATABASE, // used by MySQL + ANY, // used for querying purposes only + TORA_SCHEMA_LIST, // courious object type - used internaly by TORA, if present browser knows that that schma was read from DB + //TORA_USER_LIST, // courious object type - used internaly by TORA purpose unknown so far. + USER, + OTHER + }; + + /** Contains information about a database object. sub-classed by particular object types + */ + struct CacheEntry + { + ObjectRef name; + /** Object type + */ + CacheEntryType type; + /** Comment about this object + */ + QString comment; + /** synonyms (used for faster disk caching...) + */ + QSet<CacheEntry const*> synonyms; + + /** A date when information about this particular object was last updated + */ + QDate timestamp; + + /** true if additional attributes were fetched from DB + */ + bool described; + + /** Create an object name with filled in values. + */ + CacheEntry(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + + /** TODO delete this - this is courious constructor used to hold TORAs internal cache intries */ + CacheEntry(const QString &owner, const QString &objName, toCacheNew::CacheEntryType objType, const QString &objComment); + + CacheEntry(CacheEntry const& other) + : name(other.name) + , type(other.type) + , comment(other.comment) + { }; + + /** Create an empty object name. + */ + CacheEntry() { }; + + /** This class will be sub-classed by particular object Types + */ + virtual ~CacheEntry() {}; + + bool operator < (const CacheEntry &) const; + bool operator == (const CacheEntry &) const; + }; // struct CacheEntry + + /** This structure is used to describe the resultset of a query. + */ + struct ColumnDescription + { + /** Column name + */ + QString Name; + /** Datatype of string. + */ + QString Datatype; + /** If column can contain null values. + */ + bool Null; + /** Preferred alignment of this kind of value. + */ + bool AlignRight; + /** Comment on column (Only filled out in column cache. + */ + QString Comment; + }; // struct ColumnDescription + + //typedef QList<QVariant> Row; // NOTE: first (0th) value in a row is a row number (see variable currRowKey) + //typedef QList<Row> RowList; + + /** Objects state - updated by background threads + */ + enum CacheState + { + NOT_STARTED = 0, + READING_FROM_DISK, + READING_FROM_DB, + DONE, + FAILED + }; + + enum UserListType + { + USERS, + OWNERS + }; + + /** Constructuctors, destructors + */ + toCacheNew(QString const &description); + + ~toCacheNew(); + + /** simple cacheEntry factory */ + static CacheEntry* createCacheEntry(const QString &owner, const QString &name, const QString &type, const QString &comment); + + /** add/update new entry into cache */ + void addEntry(CacheEntry* e); + + /** Perform direct lookup on object cache - no synonym translation is made */ + CacheEntry const* findEntry(ObjectRef const&) const; + + /** Use synonymMap to resolve object name */ + ObjectRef translateName(ObjectRef const&) const; + + /** add/update a list of objects in cache. + * This should add any new object to the list as well as remove no longer + * existing ones. + */ + void updateSchemaObjects(QString const& schema, QString const& objType, QList<CacheEntry*> const& r); + + QList<CacheEntry const*> getObjectsInSchema(QString const& schema, CacheEntryType type = ANY) const; + QList<CacheEntry const*> getObjectsInSchema(QString const& schema, QString const& type) const; + + bool entryExists(QString const& schema, QString& name, CacheEntryType entryType = ANY) const; + + /** Clear current list of users and generate a new one */ + void updateUserList(QList<CacheEntry*> const&r, UserListType listType = USERS); + + /** List of database users / database onject owners */ + QStringList userList(UserListType listType = USERS) const; + + bool userListExists(UserListType listType = USERS) const; + + + /** get list of the all the objects held in the cache */ + QList<CacheEntry const*> objects(bool wait = false) const; + + /** + * Starts a new thread which will read all objects and synonyms from the database. + */ + void readObjects(toTask * t); + + /** Reread the object and column cache. + */ + void rereadCache(toTask * t); + +private: + + /** setter for cache state */ + void setCacheState(CacheState); + + /** getter for cache state */ + CacheState cacheState() const; + + CacheState state; + + QMap<ObjectRef, CacheEntry const*> entryMap; + QMap<ObjectRef, CacheEntry const*> synonymMap; + QMap<QString, CacheEntry const*> columnCache; + QMap<QString, CacheEntry const*> ownersMap, usersMap; + bool ownersRead, usersRead; + + /** Return the file used to store cache contents for this connection. + * @return A string representing a full path and filename of cache file + */ + QString cacheFile(); + + /** Return the directory storing files (caches) of all connections. + * @return A string representing a full path to cache store directory + */ + static QString cacheDir(); + + /** Load cache information for current connection from a file on disk + * @return True if cache was loaded + */ + bool loadDiskCache(void); + + /** write disk cache + */ + void writeDiskCache(void); + + /** remove all the entries from all the maps, Note: caller should lock instance state first */ + void clearCache(); + + /** translate object type name QString("TABLE") => CacheEntryType::TABLE */ + static CacheEntryType cacheEntryType(QString const& objTypeName); + + /** Non-blocking version of cacheAvailable, used by toMain to update toBackgroundLabel + */ + bool cacheRefreshRunning() const; + + + /** This lock is used by all getters and setters + an Instance of toCacheNew is shared between multiple connections. + */ + mutable toSharedLock cacheLock; + + /* This semaphore is used to synchronize toConnection's constructor/destructor with background thread. + see: toConnection::cacheObjectsNew::run() + */ + toSemaphore ReadingThreadSemaphore; + + /** Description of connection for which this instance of cache is used. + * This name is used as a filename to store cache content between TOra runs. + */ + QString ConnectionDescription; + unsigned refCount; // Multiple connections can point onto same toCache instance, the last connection should delete me. +}; // toCacheNew + +/** A short representation of list<toCacheNew::ColumnDescription> +*/ +typedef QList<toCacheNew::ColumnDescription> toQColumnDescriptionList; +Q_DECLARE_METATYPE(toQColumnDescriptionList); + +class toCacheEntryTable :public toCacheNew::CacheEntry +{ +public: + toCacheEntryTable(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + +private: +}; + +class toCacheEntryView :public toCacheNew::CacheEntry +{ +public: + toCacheEntryView(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + +private: +}; + +class toCacheEntrySynonym :public toCacheNew::CacheEntry +{ +public: + toCacheEntrySynonym(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + +private: +}; + +class toCacheEntryProcedure:public toCacheNew::CacheEntry +{ +public: + toCacheEntryProcedure(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + +private: +}; + +class toCacheEntryFunction:public toCacheNew::CacheEntry +{ +public: + toCacheEntryFunction(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + +private: +}; + +class toCacheEntryPackage:public toCacheNew::CacheEntry +{ +public: + toCacheEntryPackage(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + +private: +}; + +class toCacheEntryPackageBody:public toCacheNew::CacheEntry +{ +public: + toCacheEntryPackageBody(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + +private: +}; + +class toCacheEntryIndex:public toCacheNew::CacheEntry +{ +public: + toCacheEntryIndex(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + +private: +}; + +class toCacheEntrySequence:public toCacheNew::CacheEntry +{ +public: + toCacheEntrySequence(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + +private: +}; + +class toCacheEntryTrigger:public toCacheNew::CacheEntry +{ +public: + toCacheEntryTrigger(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + +private: +}; + +class toCacheEntryDatabase:public toCacheNew::CacheEntry +{ +public: + toCacheEntryDatabase(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + +private: +}; + +// Special "fake" cache entry - not held in entryMap +class toCacheEntryUser:public toCacheNew::CacheEntry +{ +public: + toCacheEntryUser(const QString& user); +private: +}; + + +#endif Modified: branches/tora-trotl/src/toconnection.cpp =================================================================== --- branches/tora-trotl/src/toconnection.cpp 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/toconnection.cpp 2011-10-21 16:58:37 UTC (rev 4124) @@ -49,7 +49,6 @@ #include "tosql.h" #include "totool.h" #include "toconnectionpool.h" -#include "tocache.h" #include <string> #include <time.h> @@ -259,13 +258,20 @@ Connection = toConnectionProvider::connection(Provider, this); NeedCommit = Abort = false; ConnectionPool = new toConnectionPool(this); - Cache = new toCache(description(false).trimmed()); + ///Cache = new toCache(description(false).trimmed()); + CacheNew = new toCacheNew(description(false).trimmed()); PoolPtr sub(ConnectionPool); Version = Connection->version(*sub); - if (cache && toConfigurationSingle::Instance().objectCache() == toConfiguration::ON_CONNECT) - Cache->readObjects(new cacheObjects(this)); + { + toLocker clock(ConnectionLock); + //if (cache && toConfigurationSingle::Instance().objectCache() == toConfiguration::ON_CONNECT) + // Cache->readObjects(new cacheObjects(this)); + + if (cache && toConfigurationSingle::Instance().objectCache() == toConfiguration::ON_CONNECT) + CacheNew->readObjects(new cacheObjectsNew(this)); + } } toConnection::toConnection(const toConnection &conn) @@ -278,7 +284,8 @@ Color(conn.Color), Options(conn.Options), Connection(0), - Cache(conn.Cache) + //Cache(conn.Cache), + CacheNew(conn.CacheNew) { Connection = toConnectionProvider::connection(Provider, this); NeedCommit = Abort = false; @@ -287,8 +294,9 @@ PoolPtr sub(ConnectionPool); Version = Connection->version(*sub); { - toLocker clock(Cache->cacheLock); - Cache->refCount++; + toSharedLocker lock(CacheNew->cacheLock); + ///Cache->refCount++; + CacheNew->refCount++; } } @@ -317,18 +325,30 @@ toBusy busy; Abort = true; - unsigned cacheRefCnt; + //unsigned cacheRefCnt; + //{ + // toLocker clock(Cache->cacheLock); + // cacheRefCnt = --Cache->refCount; + //} + //if(cacheRefCnt == 0) + //{ + // this->Cache->writeDiskCache(); + // // this will wait for cacheObjects thread to finish in toCache::~toCache + // delete this->Cache; + //} + + unsigned cacheNewRefCnt; { - toLocker clock(Cache->cacheLock); - cacheRefCnt = --Cache->refCount; + toExclusiveLocker clock(CacheNew->cacheLock); + cacheNewRefCnt = --CacheNew->refCount; } - if(cacheRefCnt == 0) + if(cacheNewRefCnt == 0) { - this->Cache->writeDiskCache(); + ////TODO this->CacheNew->writeDiskCache(); // this will wait for cacheObjects thread to finish in toCache::~toCache - delete this->Cache; + delete this->CacheNew; } - + { closeWidgets(); @@ -752,51 +772,70 @@ /* This method runs as a separate thread executed from: toCache::readObjects(toTask * t) */ -void toConnection::cacheObjects::run() +void toConnection::cacheObjectsNew::run() { - bool diskloaded = false; - - try + /* Increase the semaphore to "unlock" parent thread, it's waiting for our start */ + Connection->CacheNew->ReadingThreadSemaphore.up(); + Connection->CacheNew->setCacheState(toCacheNew::READING_FROM_DB); + + QList<toCacheNew::CacheEntry*> objs = Connection->Connection->objectNamesNew(); + if (!Connection->Abort) { - Connection->Cache->setCacheState(toCache::READING_OBJECTS); - /* Increase the semaphore to "unlock" parent thread */ - Connection->Cache->ReadingThread.up(); - - diskloaded = Connection->Cache->loadDiskCache(); - if (!diskloaded && !Connection->Abort) + Q_FOREACH(toCacheNew::CacheEntry* o, objs) { - const QList<objectName> &n = Connection->Connection->objectNames(); - if (!Connection->Abort) - Connection->Cache->setObjectList(n); + Connection->CacheNew->addEntry(o); } - - if (!diskloaded && !Connection->Abort) - { - Connection->Cache->setCacheState(toCache::READING_SYNONYMS); - /* NOTE: we cannot pass n as parameter of synonymMap because - it's parameter needs to be sorted */ - std::map<QString, objectName> m = - Connection->Connection->synonymMap(Connection->Cache->objects(true)); - if (!Connection->Abort) - { - Connection->Cache->setSynonymList(m); - Connection->Cache->writeDiskCache(); - } - } - /* Increase the semaphore to "unlock" parent thread destructor */ - Connection->Cache->ReadingThread.up(); - Connection->Cache->setCacheState(toCache::DONE); - toMainWidget()->checkCaching(); } - catch (...) - { - Connection->Cache->ReadingThread.up(); - Connection->Cache->setCacheState(toCache::FAILED); - toMainWidget()->checkCaching(); - } -} + Connection->CacheNew->ownersRead = true; + Connection->CacheNew->setCacheState(toCacheNew::DONE); +}; +//void toConnection::cacheObjects::run() +//{ +// bool diskloaded = false; +// +// ///try +// ///{ +// /// Connection->Cache->setCacheState(toCache::READING_OBJECTS); +// /// /* Increase the semaphore to "unlock" parent thread */ +// ///Connection->Cache->ReadingThread.up(); +// +// /// diskloaded = Connection->Cache->loadDiskCache(); +// /// if (!diskloaded && !Connection->Abort) +// /// { +// /// const QList<objectName> &n = Connection->Connection->objectNames(); +// /// if (!Connection->Abort) +// /// Connection->Cache->setObjectList(n); +// /// } +// +// /// if (!diskloaded && !Connection->Abort) +// /// { +// /// Connection->Cache->setCacheState(toCache::READING_SYNONYMS); +// /// /* NOTE: we cannot pass n as parameter of synonymMap because +// /// it's parameter needs to be sorted */ +// /// std::map<QString, objectName> m = +// /// Connection->Connection->synonymMap(Connection->Cache->objects(true)); +// /// if (!Connection->Abort) +// /// { +// /// Connection->Cache->setSynonymList(m); +// /// Connection->Cache->writeDiskCache(); +// /// } +// /// } +// /// /* Increase the semaphore to "unlock" parent thread destructor */ +// ///Connection->Cache->ReadingThread.up(); +// ///Connection->Cache->setCacheState(toCache::DONE); +// /// toMainWidget()->checkCaching(); +// ///} +// ///catch (...) +// ///{ +// /// Connection->Cache->ReadingThread.up(); +// /// Connection->Cache->setCacheState(toCache::FAILED); +// /// toMainWidget()->checkCaching(); +// ///} +// +//} + QString toConnection::quote(const QString &name, const bool quoteLowercase) { if (!name.isNull()) @@ -821,89 +860,105 @@ return Connection->analyzer(); } -QList<toConnection::objectName> toConnection::connectionImpl::objectNames(const QString &owner, - const QString &type, - const QString &name) -{ - QList<objectName> ret; - return ret; -} +//QList<toConnection::objectName> toConnection::connectionImpl::objectNames(const QString &owner, +// const QString &type, +// const QString &name) +//{ +// QList<objectName> ret; +// return ret; +//} -std::map<QString, toConnection::objectName> toConnection::connectionImpl::synonymMap(QList<objectName> &) -{ - std::map<QString, objectName> ret; - return ret; -} +///TODO not needed if ObjectNamesNew is pure virtual +////*virtual*/ QList<toCacheNew::CacheEntry*> toConnection::connectionImpl::objectNamesNew() +///{ +/// +///} -toQDescList toConnection::connectionImpl::columnDesc(const objectName &) -{ - toQDescList ret; - return ret; -} +//std::map<QString, toConnection::objectName> toConnection::connectionImpl::synonymMap(QList<objectName> &) +//{ +// std::map<QString, objectName> ret; +// return ret; +//} -const toQDescList &toConnection::columns(const objectName &object, bool nocache) -{ - toQDescList& cols = Cache->columns(object); - if (cols.empty() || nocache) - { - Cache->addColumns(object, Connection->columnDesc(object)); - cols = Cache->columns(object); - } +//toQDescList toConnection::connectionImpl::columnDesc(const objectName &) +//{ +// toQDescList ret; +// return ret; +//} - return cols; -} +//const toQDescList &toConnection::columns(const objectName &object, bool nocache) +//{ +// toQDescList& cols = Cache->columns(object); +// if (cols.empty() || nocache) +// { +// Cache->addColumns(object, Connection->columnDesc(object)); +// cols = Cache->columns(object); +// } +// +// return cols; +//} void toConnection::rereadCache(void) { - Cache->rereadCache(new cacheObjects(this)); + ///Cache->rereadCache(new cacheObjects(this)); + CacheNew->rereadCache(new cacheObjectsNew(this)); } -const QList<toConnection::objectName> &toConnection::objects(bool block) const +//const QList<toConnection::objectName> &toConnection::objects(bool block) const +//{ +// return Cache->objects(block); +//} +QList<toCacheNew::CacheEntry const*> toConnection::objects(bool block) const { - return Cache->objects(block); + return CacheNew->objects(block); } -bool toConnection::rereadObjects(const QString &owner, - const QString &type, - const QString &name) +//bool toConnection::rereadObjects(const QString &owner, +// const QString &type, +// const QString &name) +//{ +// bool added = false; // did we actually add at least one new object? +// +// ///QList<toConnection::objectName> objects = this->Connection->objectNames(owner, type, name); +// ///for (QList<toConnection::objectName>::iterator i = objects.begin(); i != objects.end(); i++) +// ///{ +// /// added = added || Cache->addIfNotExists(*i); +// ///} +// // TODO: If all objects of a particular type/owner are fetched we should delete all non +// // matching records from the cache! +// return added; +//} // rereadObjects +bool toConnection::rereadObjectNew(const QString &owner, const QString &name) { - bool added = false; // did we actually add at least one new object? + bool added = false; + return added; +} - QList<toConnection::objectName> objects = this->Connection->objectNames(owner, type, name); - for (QList<toConnection::objectName>::iterator i = objects.begin(); i != objects.end(); i++) - { - added = added || Cache->addIfNotExists(*i); - } - // TODO: If all objects of a particular type/owner are fetched we should delete all non - // matching records from the cache! - return added; -} // rereadObjects +//bool toConnection::cacheAvailable(toCache::cacheEntryType type, bool block) +//{ +// return Cache->cacheAvailable(type, block, new cacheObjects(this)); +//} -bool toConnection::cacheAvailable(toCache::cacheEntryType type, bool block) -{ - return Cache->cacheAvailable(type, block, new cacheObjects(this)); -} - bool toConnection::cacheRefreshRunning() const { - return Cache->cacheRefreshRunning(); + return CacheNew->cacheRefreshRunning(); } -const toConnection::objectName& toConnection::realName(const QString &object, QString &synonym, bool block) const -{ - return Cache->realName(object, synonym, block, user(), database()); -} +//const toConnection::objectName& toConnection::realName(const QString &object, QString &synonym, bool block) const +//{ +// return Cache->realName(object, synonym, block, user(), database()); +//} -const toConnection::objectName& toConnection::realName(const QString &object, bool block) const -{ - QString dummy; - return Cache->realName(object, dummy, block, user(), database()); -} +//const toConnection::objectName& toConnection::realName(const QString &object, bool block) const +//{ +// QString dummy; +// return Cache->realName(object, dummy, block, user(), database()); +//} -const std::list<toConnection::objectName> toConnection::tables(const objectName &object, bool nocache) const -{ - return Cache->tables(object, nocache); -} +//const std::list<toConnection::objectName> toConnection::tables(const objectName &object, bool nocache) const +//{ +// return Cache->tables(object, nocache); +//} void toConnection::connectionImpl::parse(toConnectionSub *, const QString &) Modified: branches/tora-trotl/src/toconnection.h =================================================================== --- branches/tora-trotl/src/toconnection.h 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/toconnection.h 2011-10-21 16:58:37 UTC (rev 4124) @@ -45,7 +45,8 @@ #include "config.h" #include "toqvalue.h" #include "tothread.h" -#include "tocache.h" +///#include "tocache.h" +#include "tocachenew.h" #include "toqueryimpl.h" #include <list> @@ -143,7 +144,7 @@ public: - typedef toCache::objectName objectName; + //typedef toCache::objectName objectName; /** Class that could be used to throw exceptions in connection errors. Must use if you * want to indicate error offset. @@ -261,9 +262,12 @@ * goes wrong should throw exception. * @return List of available objects. */ - virtual QList<toConnection::objectName> objectNames(const QString &owner = "", - const QString &type = "", - const QString &name = ""); + ///virtual QList<toConnection::objectName> objectNames(const QString &owner = "", + /// const QString &type = "", + /// const QString &name = ""); + + virtual QList<toCacheNew::CacheEntry*> objectNamesNew(QString const& schema = "") = 0; + /** Get synonyms available for connection. Any access to the * database should always be run using a long running query. If something * goes wrong should throw exception. @@ -272,12 +276,14 @@ * this list. * @return Map of synonyms to objectnames. */ - virtual std::map<QString, toConnection::objectName> synonymMap(QList<toConnection::objectName> &objects); + ///virtual std::map<QString, toConnection::objectName> synonymMap(QList<toConnection::objectName> &objects); /** Extract available columns to query for a table. * @param table Table to get column for. * @return List of columns for table or view. */ - virtual toQDescList columnDesc(const toConnection::objectName &table); + ///virtual toQDescList columnDesc(const toConnection::objectName &table); + ///virtual toQDescList columnDesc(const toCacheNew::ObjectRef &table); + virtual void describeObject(toCacheNew::CacheEntry*) = 0; /** Create a new query implementation for this connection. * @return A query implementation, allocated with new. @@ -310,23 +316,35 @@ connectionImpl *Connection; - class cacheObjects : public toTask - { - QPointer<toConnection> Connection; - public: - cacheObjects(toConnection *conn) - : Connection(conn) - { } - virtual void run(void); - }; - friend class cacheObjects; + //class cacheObjects : public toTask + //{ + // QPointer<toConnection> Connection; + //public: + // cacheObjects(toConnection *conn) + // : Connection(conn) + // { } + // virtual void run(void); + //}; + //friend class cacheObjects; + class cacheObjectsNew : public toTask + { + QPointer<toConnection> Connection; + public: + cacheObjectsNew(toConnection *conn) + : Connection(conn) + { } + virtual void run(void); + }; + friend class cacheObjectsNew; + bool Abort; toConnectionSub* pooledConnection(void); public: - toCache * Cache; + ///toCache * Cache; + toCacheNew *CacheNew; /** Create a new connection. * @param provider Which database provider to use for this connection. @@ -611,7 +629,8 @@ * @return A list of object available for the current user. The list is sorted in * owner and name order. */ - const QList<toConnection::objectName>& objects(bool block) const; + ///const QList<toConnection::objectName>& objects(bool block) const; + QList<toCacheNew::CacheEntry const*> objects(bool block) const; /** * Reread specified objects from database to the cache. If null is given as value of any @@ -621,16 +640,18 @@ * @param name only read objects with given name. * @return true if at least one new object was added to cache */ - bool rereadObjects(const QString &owner = "", - const QString &type = "", - const QString &name = ""); + //bool rereadObjects(const QString &owner = "", + // const QString &type = "", + // const QString &name = ""); + bool rereadObjectNew(const QString &owner = "", const QString &name = ""); + /** Check if cache is available or not. * @param type (can be either OBJECTS or SYNONYMS) * @param block Block until cache is done. * @return True if cache is available. */ - bool cacheAvailable(toCache::cacheEntryType type, bool block = false); + ///bool cacheAvailable(toCache::cacheEntryType type, bool block = false); /** Non-blocking version of cacheAvailable, used by toMain to update toBackgroundLabel */ @@ -643,7 +664,8 @@ * @param nocache Don't use cached values even if they are available. * @return A list of the columns for a table. */ - const toQDescList& columns(const toConnection::objectName &table, bool nocache = false); + ///const toQDescList& columns(const toConnection::objectName &table, bool nocache = false); + /// toCacheNew BIG FAT TODO /** * Get the real object name of a synonym. @@ -651,21 +673,24 @@ * @param synonym Filled with the synonym used to access the object returned or empty. * @param block Block if not done caching object. */ - const toConnection::objectName& realName(const QString &object, QString &synonym, bool block) const; + ///const toConnection::objectName& realName(const QString &object, QString &synonym, bool block) const; + /// toCacheNew BIG FAT TODO /** * Get the real object name of an object. * @param object Object name * @param block Block if not done caching object. */ - const toConnection::objectName &realName(const QString &object, bool block) const; + ///const toConnection::objectName &realName(const QString &object, bool block) const; + /// toCacheNew BIG FAT TODO /** * Get a list of object names for a owner, typically this is a * list of tables for a database or schema. * */ - const std::list<toConnection::objectName> tables(const toConnection::objectName &object, bool nocache = false) const; + ///const std::list<toConnection::objectName> tables(const toConnection::objectName &object, bool nocache = false) const; + /// toCacheNew BIG FAT TODO /** * Reread the object and column cache. Modified: branches/tora-trotl/src/todebug.cpp =================================================================== --- branches/tora-trotl/src/todebug.cpp 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/todebug.cpp 2011-10-21 16:58:37 UTC (rev 4124) @@ -2966,11 +2966,7 @@ Type += QString::fromLatin1(" BODY"); readErrors(Debugger->connection()); setModified(false); - toConnection::objectName no; - no.Name = Object; - no.Owner = Schema; - no.Type = type; - Debugger->connection().Cache->addIfNotExists(no); + Debugger->connection().CacheNew->addEntry(toCacheNew::createCacheEntry(Schema, Object, type, "")); } catch (const QString &exc) { Modified: branches/tora-trotl/src/todescribe.cpp =================================================================== --- branches/tora-trotl/src/todescribe.cpp 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/todescribe.cpp 2011-10-21 16:58:37 UTC (rev 4124) @@ -85,55 +85,54 @@ widget = 0; } - QString objectType; - bool foundInCache = false; // was object found in cache? - bool addedNewObjects = false; // did we actually add new objects to cache during rereading? - bool newlyAddedObjectChecked = false; // did we try to go through a cache again after rereading? + toCacheNew::CacheEntryType objectType = toCacheNew::OTHER; + toCacheNew::CacheEntry const* cacheEntry; // was object found in cache? + bool addedNewObject = false; // did we actually add new objects to cache during rereading? - do { + { // Get a cached list of objects and then search in it without querying // the database in order to improve performance - QList<toConnection::objectName> objects = toCurrentConnection(this).Cache->objects(false); - for (QList<toConnection::objectName>::iterator i = objects.begin();i != objects.end();i++) - { - if ((*i).Name == object && (*i).Owner == owner) - { - objectType = (*i).Type; - foundInCache = true; - break; - } - } - if (addedNewObjects) - newlyAddedObjectChecked = true; + cacheEntry = toCurrentConnection(this).CacheNew->findEntry(toCacheNew::ObjectRef(owner,object)); + if( cacheEntry) + objectType = cacheEntry->type; - if (!foundInCache && // only check if object was not found in already cached list - !newlyAddedObjectChecked) // do not requery the database again + if ( !cacheEntry) // only check if object was not found in already cached list { - // If object was not found in cache, then try updating the cache - addedNewObjects = toCurrentConnection(this).rereadObjects(owner, "", object); + // If object was not found in cache, then try updating the cache + addedNewObject = toCurrentConnection(this).rereadObjectNew(owner, object); } - } while (!foundInCache && addedNewObjects && !newlyAddedObjectChecked); + } - if (objectType == "TABLE") - widget = new toBrowserTableWidget(this); - else if (objectType == "VIEW") - widget = new toBrowserViewWidget(this); - else if (objectType == "INDEX") - widget = new toBrowserIndexWidget(this); - else if (objectType == "SEQUENCE") - widget = new toBrowserSequenceWidget(this); - else if (objectType == "SYNONYM") - widget = new toBrowserSynonymWidget(this); - else if (objectType == "FUNCTION" - || objectType == "PROCEDURE" - || objectType == "PACKAGE" - || objectType == "PACKAGE BODY") + switch(objectType) + { + case toCacheNew::TABLE: + widget = new toBrowserTableWidget(this); + break; + case toCacheNew::VIEW: + widget = new toBrowserViewWidget(this); + break; + case toCacheNew::INDEX: + widget = new toBrowserIndexWidget(this); + break; + case toCacheNew::SEQUENCE: + widget = new toBrowserSequenceWidget(this); + break; + case toCacheNew::SYNONYM: + widget = new toBrowserSynonymWidget(this); + break; + case toCacheNew::FUNCTION: + case toCacheNew::PROCEDURE: + case toCacheNew::PACKAGE: + case toCacheNew::PACKAGE_BODY: widget = new toBrowserCodeWidget(this); - else if (objectType == "TRIGGER") + break; + case toCacheNew::TRIGGER: widget = new toBrowserTriggerWidget(this); - else + break; + default: QMessageBox::information(this, "Describe", tr("Object %1 (%2) cannot be described").arg(object, owner)); + } if (!widget) return; Modified: branches/tora-trotl/src/toeventquery.cpp =================================================================== --- branches/tora-trotl/src/toeventquery.cpp 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/toeventquery.cpp 2011-10-21 16:58:37 UTC (rev 4124) @@ -101,9 +101,9 @@ Task->ThreadAlive.lock(); connect(Task, - SIGNAL(headers(toQDescList &, int)), + SIGNAL(headers(toQColumnDescriptionList &, int)), this, - SLOT(taskDesc(toQDescList &, int)), + SLOT(taskDesc(toQColumnDescriptionList &, int)), Qt::QueuedConnection); connect(Task, @@ -178,7 +178,7 @@ } -void toEventQuery::taskDesc(toQDescList &desc, int column) { +void toEventQuery::taskDesc(toQColumnDescriptionList &desc, int column) { Description = desc; Columns = column; emit descriptionAvailable(); Modified: branches/tora-trotl/src/toeventquery.h =================================================================== --- branches/tora-trotl/src/toeventquery.h 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/toeventquery.h 2011-10-21 16:58:37 UTC (rev 4124) @@ -79,7 +79,7 @@ QPointer<toResultStats> Statistics; // Description of result - toQDescList Description; + toQColumnDescriptionList Description; // Number of columns in Description int Columns; @@ -154,7 +154,7 @@ * * @return Description of columns list. */ - inline toQDescList describe(void) const { + inline toQColumnDescriptionList describe(void) const { return Description; } @@ -226,7 +226,7 @@ void taskData(ValuesList &values); // handle tasks's headers() signal emits descriptionAvailable() - void taskDesc(toQDescList &desc, int columns); + void taskDesc(toQColumnDescriptionList &desc, int columns); // handle tasks's error() signal void taskError(const toConnection::exception &msg); Modified: branches/tora-trotl/src/toeventquerytask.cpp =================================================================== --- branches/tora-trotl/src/toeventquerytask.cpp 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/toeventquerytask.cpp 2011-10-21 16:58:37 UTC (rev 4124) @@ -114,7 +114,7 @@ SLOT(pread(bool)), Qt::QueuedConnection); - toQDescList desc = Query->describe(); + toQColumnDescriptionList desc = Query->describe(); Columns = Query->columns(); emit headers(desc, Columns); Modified: branches/tora-trotl/src/toeventquerytask.h =================================================================== --- branches/tora-trotl/src/toeventquerytask.h 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/toeventquerytask.h 2011-10-21 16:58:37 UTC (rev 4124) @@ -160,7 +160,7 @@ * @param desc list of header values * @param columns number of columns in result */ - void headers(toQDescList &desc, int columns); + void headers(toQColumnDescriptionList &desc, int columns); /** Modified: branches/tora-trotl/src/toglobalsetting.cpp =================================================================== --- branches/tora-trotl/src/toglobalsetting.cpp 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/toglobalsetting.cpp 2011-10-21 16:58:37 UTC (rev 4124) @@ -204,7 +204,7 @@ /** disk caching options */ - CacheDirectory->setText(toCache::cacheDir()); + CacheDirectory->setText(toCacheNew::cacheDir()); DiskCaching->setChecked(toConfigurationSingle::Instance().cacheDisk()); CustomSQL->setText(toConfigurationSingle::Instance().sqlFile()); Modified: branches/tora-trotl/src/tohighlightedtext.cpp =================================================================== --- branches/tora-trotl/src/tohighlightedtext.cpp 2011-10-21 16:42:28 UTC (rev 4123) +++ branches/tora-trotl/src/tohighlightedtext.cpp 2011-10-21 16:58:37 UTC (rev 4124) @@ -1008,34 +1008,34 @@ try { toConnection &conn = toCurrentConnection(this); - toConnection::objectName object = conn.realName(name, false); - if(object.... [truncated message content] |
From: <ibr...@us...> - 2011-10-26 07:01:51
|
Revision: 4126 http://tora.svn.sourceforge.net/tora/?rev=4126&view=rev Author: ibre5041 Date: 2011-10-26 07:01:43 +0000 (Wed, 26 Oct 2011) Log Message: ----------- Modified Paths: -------------- branches/tora-trotl/src/toconnection.h branches/tora-trotl/src/tooracleconnection_trotl.cpp branches/tora-trotl/src/toqsqlconnection.cpp branches/tora-trotl/src/toresulttableviewedit.h branches/tora-trotl/src/tothread.h branches/tora-trotl/src/trotl_test3.cpp Property Changed: ---------------- branches/tora-trotl/src/tologger.h branches/tora-trotl/src/ts_log/ Modified: branches/tora-trotl/src/toconnection.h =================================================================== --- branches/tora-trotl/src/toconnection.h 2011-10-24 14:02:36 UTC (rev 4125) +++ branches/tora-trotl/src/toconnection.h 2011-10-26 07:01:43 UTC (rev 4126) @@ -282,8 +282,8 @@ * @return List of columns for table or view. */ ///virtual toQDescList columnDesc(const toConnection::objectName &table); - ///virtual toQDescList columnDesc(const toCacheNew::ObjectRef &table); - virtual void describeObject(toCacheNew::CacheEntry*) = 0; + ///virtual toQDescList columnDesc(const toCacheNew::ObjectRef &table); + virtual void describeObject(toCacheNew::CacheEntry*, toConnectionSub *conn) = 0; /** Create a new query implementation for this connection. * @return A query implementation, allocated with new. @@ -711,7 +711,7 @@ friend class toQuery; friend class toConnectionPool; -}; +}; // toConnection Q_DECLARE_METATYPE(toConnection::exception); Property changes on: branches/tora-trotl/src/tologger.h ___________________________________________________________________ Modified: svn:mergeinfo - /branches/teradata/tora/src/tologger.h:3506-3558 /trunk/tora/src/tologger.h:3423-4114 /trunk/trunk/tora/src/tologger.h:3505-3556 + /branches/teradata/tora/src/tologger.h:3506-3558 /trunk/tora/src/tologger.h:3423-4125 /trunk/trunk/tora/src/tologger.h:3505-3556 Modified: branches/tora-trotl/src/tooracleconnection_trotl.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection_trotl.cpp 2011-10-24 14:02:36 UTC (rev 4125) +++ branches/tora-trotl/src/tooracleconnection_trotl.cpp 2011-10-26 07:01:43 UTC (rev 4126) @@ -57,6 +57,7 @@ #include <trotl_convertor.h> #include <trotl_anydata.h> #include <trotl_cursor.h> +#include <trotl_describe.h> #include "utils.h" #include "toconf.h" @@ -592,38 +593,10 @@ virtual void throwExtendedException(toConnection &conn, const ::trotl::OciException &exc) { TLOG(0,toDecorator,__HERE__) - << "What:" << exc.what() << std::endl + << "Throwing an exception - what:" << exc.what() << std::endl << exc.get_sql() << std::endl << "--------------------------------------------------------------------------------" << std::endl; - if (conn.version() < "0800" && exc.get_code() == 0) - { - // Serious OCI voodoo to get the Parse error location on Oracle7 servers - // TODO - /* - Lda_Def lda; - Cda_Def cda; - if (OCISvcCtxToLda(Connection->connect_struct.svchp, - Connection->connect_struct.errhp, - &lda) == OCI_SUCCESS) - { - if (oopen(&cda, - &lda, - (OraText *)0, -1, - -1, - (OraText *)0, -1) == OCI_SUCCESS) - { - cda.peo = 0; - oparse(&cda, (OraText *)exc.stm_text, -1, FALSE, 1); - ((::trotl::OciException &)exc).code = cda.peo; - oclose(&cda); - } - OCILdaToSvcCtx(&Connection->connect_struct.svchp, - Connection->connect_struct.errhp, - &lda); - } - */ - } ThrowException(exc); } }; @@ -886,6 +859,7 @@ } return true; } + return true; // never reached } virtual int rowsProcessed(void) @@ -949,12 +923,13 @@ } }; // class oracleQuery : public toQuery::queryImpl - class oracleConnection : public toConnection::connectionImpl + class oracleConnectionImpl : public toConnection::connectionImpl { ::trotl::OciEnv &_env; QString connectString(void); std::list<QString> RowIDs; - oracleSub *oracleConv(toConnectionSub *sub) + + static oracleSub *oracleConv(toConnectionSub *sub) { oracleSub *conn = dynamic_cast<oracleSub *>(sub); if (!conn) @@ -962,7 +937,7 @@ return conn; } public: - oracleConnection(toConnection *conn, ::trotl::OciEnv &env) : + oracleConnectionImpl(toConnection *conn, ::trotl::OciEnv &env) : toConnection::connectionImpl(conn), _env(env) { RowIDs.push_back("ROWID"); @@ -981,44 +956,9 @@ * When processing data entered by user quoteLowercase should be false * @return String addressing table. */ - virtual QString quote(const QString &name, const bool quoteLowercase) - { - bool ok = true; - // Identifiers starting with digit should be quoted - if (name.at(0).isDigit()) - ok = false; - else - for (int i = 0; i < name.length(); i++) - { - if ((name.at(i).toUpper() != name.at(i) && quoteLowercase) || !toIsIdent(name.at(i))) - ok = false; - } - - // Check if given identified is a reserved word - int i = 0; - while (ok && (DefaultKeywords[i] != NULL)) - { - if (name.compare(DefaultKeywords[i], Qt::CaseInsensitive) == 0) - ok = false; - i++; - } - if (ok) - { - if (toConfigurationSingle::Instance().objectNamesUpper()) - return name.toUpper(); - else - return name.toLower(); - } - else - return QString::fromLatin1("\"") + name + QString::fromLatin1("\""); - } + virtual QString quote(const QString &name, const bool quoteLowercase); - virtual QString unQuote(const QString &str) - { - if (str.at(0).toLatin1() == '\"' && str.at(str.length() - 1).toLatin1() == '\"') - return str.left(str.length() - 1).right(str.length() - 2); - return str.toUpper(); - } + virtual QString unQuote(const QString &str); /// virtual QList<toConnection::objectName> objectNames(const QString &owner, /// const QString &type, @@ -1071,9 +1011,10 @@ return ret; }; - virtual void describeObject(toCacheNew::CacheEntry*) + virtual void describeObject(toCacheNew::CacheEntry* e, toConnectionSub *sub) { - + oracleSub *s = oracleConnectionImpl::oracleConv(sub); + //::trotl::Describe *d = ::trotl::Describe::createDescription(conn._conn, objectName.toStdString()); }; /// virtual std::map<QString, toConnection::objectName> synonymMap(std::list<toConnection::objectName> &objects) @@ -1371,7 +1312,7 @@ virtual toConnection::connectionImpl *provideConnection(const QString &, toConnection *conn) { - return new oracleConnection(conn, *_envp); + return new oracleConnectionImpl(conn, *_envp); } virtual std::list<QString> providedOptions(const QString &) @@ -1697,7 +1638,7 @@ } -QString toOracleProvider::oracleConnection:: connectString(void) +QString toOracleProvider::oracleConnectionImpl::connectString(void) { QString ret; ret = connection().user().toUtf8(); @@ -1711,7 +1652,7 @@ return ret; } -toConnectionSub* toOracleProvider::oracleConnection::createConnection(void) +toConnectionSub* toOracleProvider::oracleConnectionImpl::createConnection(void) { ::trotl::OciConnection *conn = NULL; ::trotl::OciLogin *login = NULL; @@ -1895,6 +1836,46 @@ return new oracleSub(conn, login); } +/*virtual*/ QString toOracleProvider::oracleConnectionImpl::quote(const QString &name, const bool quoteLowercase) +{ + bool ok = true; + // Identifiers starting with digit should be quoted + if (name.at(0).isDigit()) + ok = false; + else + for (int i = 0; i < name.length(); i++) + { + if ((name.at(i).toUpper() != name.at(i) && quoteLowercase) || !toIsIdent(name.at(i))) + ok = false; + } + + // Check if given identified is a reserved word + int i = 0; + while (ok && (DefaultKeywords[i] != NULL)) + { + if (name.compare(DefaultKeywords[i], Qt::CaseInsensitive) == 0) + ok = false; + i++; + } + if (ok) + { + if (toConfigurationSingle::Instance().objectNamesUpper()) + return name.toUpper(); + else + return name.toLower(); + } + else + return QString::fromLatin1("\"") + name + QString::fromLatin1("\""); +} + +/*virtual*/ QString toOracleProvider::oracleConnectionImpl::unQuote(const QString &str) +{ + if (str.at(0).toLatin1() == '\"' && str.at(str.length() - 1).toLatin1() == '\"') + return str.left(str.length() - 1).right(str.length() - 2); + return str.toUpper(); +} + + /* ** 11g version, see $ORACLE_HOME/rdbms/admin/utlxplan.sql */ Modified: branches/tora-trotl/src/toqsqlconnection.cpp =================================================================== --- branches/tora-trotl/src/toqsqlconnection.cpp 2011-10-24 14:02:36 UTC (rev 4125) +++ branches/tora-trotl/src/toqsqlconnection.cpp 2011-10-26 07:01:43 UTC (rev 4126) @@ -1596,7 +1596,7 @@ return ret; }; - virtual void describeObject(toCacheNew::CacheEntry*) + virtual void describeObject(toCacheNew::CacheEntry*, toConnectionSub *conn) { }; Modified: branches/tora-trotl/src/toresulttableviewedit.h =================================================================== --- branches/tora-trotl/src/toresulttableviewedit.h 2011-10-24 14:02:36 UTC (rev 4125) +++ branches/tora-trotl/src/toresulttableviewedit.h 2011-10-26 07:01:43 UTC (rev 4126) @@ -137,7 +137,7 @@ */ bool changed(void) { - return Changes.size() > 0; + return !Changes.isEmpty(); } Modified: branches/tora-trotl/src/tothread.h =================================================================== --- branches/tora-trotl/src/tothread.h 2011-10-24 14:02:36 UTC (rev 4125) +++ branches/tora-trotl/src/tothread.h 2011-10-26 07:01:43 UTC (rev 4126) @@ -142,7 +142,7 @@ void sharedLock() { - if(sharedCount.fetchAndAddAcquire(1) == NULL) + if(sharedCount.fetchAndAddAcquire(1) == 0) { ExclusiveMutex.lock(); } Modified: branches/tora-trotl/src/trotl_test3.cpp =================================================================== --- branches/tora-trotl/src/trotl_test3.cpp 2011-10-24 14:02:36 UTC (rev 4125) +++ branches/tora-trotl/src/trotl_test3.cpp 2011-10-26 07:01:43 UTC (rev 4126) @@ -316,7 +316,7 @@ if (!user.isEmpty()) toConfigurationSingle::Instance().setDefaultUser(user); - qRegisterMetaType<toQDescList>("toQDescList&"); + qRegisterMetaType<toQColumnDescriptionList>("toQColumnDescriptionList&"); qRegisterMetaType<ValuesList>("ValuesList&"); qRegisterMetaType<toConnection::exception>("toConnection::exception"); Property changes on: branches/tora-trotl/src/ts_log ___________________________________________________________________ Modified: svn:mergeinfo - /branches/teradata/tora/src/ts_log:3506-3558 /trunk/tora/src/ts_log:3423-4114 /trunk/trunk/tora/src/ts_log:3505-3556 + /branches/teradata/tora/src/ts_log:3506-3558 /trunk/tora/src/ts_log:3423-4125 /trunk/trunk/tora/src/ts_log:3505-3556 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2011-10-26 13:25:10
|
Revision: 4128 http://tora.svn.sourceforge.net/tora/?rev=4128&view=rev Author: ibre5041 Date: 2011-10-26 13:24:59 +0000 (Wed, 26 Oct 2011) Log Message: ----------- Modified Paths: -------------- branches/tora-trotl/src/tocachenew.h branches/tora-trotl/src/toconnection.cpp branches/tora-trotl/src/toconnection.h Modified: branches/tora-trotl/src/tocachenew.h =================================================================== --- branches/tora-trotl/src/tocachenew.h 2011-10-26 13:13:41 UTC (rev 4127) +++ branches/tora-trotl/src/tocachenew.h 2011-10-26 13:24:59 UTC (rev 4128) @@ -259,7 +259,10 @@ * This name is used as a filename to store cache content between TOra runs. */ QString ConnectionDescription; - unsigned refCount; // Multiple connections can point onto same toCache instance, the last connection should delete me. + + /** Multiple connections can point onto same toCache instance, the last connection should delete me. + */ + QAtomicInt refCount; }; // toCacheNew /** A short representation of list<toCacheNew::ColumnDescription> Modified: branches/tora-trotl/src/toconnection.cpp =================================================================== --- branches/tora-trotl/src/toconnection.cpp 2011-10-26 13:13:41 UTC (rev 4127) +++ branches/tora-trotl/src/toconnection.cpp 2011-10-26 13:24:59 UTC (rev 4128) @@ -244,7 +244,7 @@ const QString &host, const QString &database, const QString &schema, const QString &color, - const std::set<QString> &options, bool cache) + const std::set<QString> &options) : Provider(provider), User(user), Password(password), @@ -269,34 +269,34 @@ //if (cache && toConfigurationSingle::Instance().objectCache() == toConfiguration::ON_CONNECT) // Cache->readObjects(new cacheObjects(this)); - if (cache && toConfigurationSingle::Instance().objectCache() == toConfiguration::ON_CONNECT) + if (toConfigurationSingle::Instance().objectCache() == toConfiguration::ON_CONNECT) CacheNew->readObjects(new cacheObjectsNew(this)); } } -toConnection::toConnection(const toConnection &conn) - : Provider(conn.Provider), - User(conn.User), - Password(conn.Password), - Host(conn.Host), - Database(conn.Database), - Schema(conn.Schema), - Color(conn.Color), - Options(conn.Options), +toConnection::toConnection(const toConnection &other) + : Provider(other.Provider), + User(other.User), + Password(other.Password), + Host(other.Host), + Database(other.Database), + Schema(other.Schema), + Color(other.Color), + Options(other.Options), Connection(0), - //Cache(conn.Cache), - CacheNew(conn.CacheNew) -{ + //Cache(other.Cache), + CacheNew(other.CacheNew) +{ Connection = toConnectionProvider::connection(Provider, this); NeedCommit = Abort = false; ConnectionPool = new toConnectionPool(this); PoolPtr sub(ConnectionPool); Version = Connection->version(*sub); + { - toSharedLocker lock(CacheNew->cacheLock); - ///Cache->refCount++; - CacheNew->refCount++; + toExclusiveLocker lock(CacheNew->cacheLock); + CacheNew->refCount.fetchAndAddAcquire(1); } } @@ -340,7 +340,7 @@ unsigned cacheNewRefCnt; { toExclusiveLocker clock(CacheNew->cacheLock); - cacheNewRefCnt = --CacheNew->refCount; + cacheNewRefCnt = CacheNew->refCount.deref(); } if(cacheNewRefCnt == 0) { Modified: branches/tora-trotl/src/toconnection.h =================================================================== --- branches/tora-trotl/src/toconnection.h 2011-10-26 13:13:41 UTC (rev 4127) +++ branches/tora-trotl/src/toconnection.h 2011-10-26 13:24:59 UTC (rev 4128) @@ -138,7 +138,7 @@ std::set<QString> Options; bool NeedCommit; - toLock ConnectionLock; + mutable toLock ConnectionLock; toConnectionPool *ConnectionPool; @@ -356,13 +356,11 @@ * @param schema Default schema to switch to. * @param color Highlighting color for GUI widgets * @param options Options used to connect to the database with. - * @param cache Enable object cache for this connection. */ toConnection(const QString &provider, const QString &user, const QString &password, const QString &host, const QString &database, const QString &schema, const QString &color, - const std::set<QString> &options, - bool cache = true); + const std::set<QString> &options); /** Create a copy of a connection. Will not cache objects, so objects will never be available * in a subconnection. * @param conn Connection to copy. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-03-16 10:06:38
|
Revision: 4244 http://tora.svn.sourceforge.net/tora/?rev=4244&view=rev Author: ibre5041 Date: 2012-03-16 10:06:31 +0000 (Fri, 16 Mar 2012) Log Message: ----------- new antlr runtimme library Added Paths: ----------- branches/tora-trotl/src/libantlr-cpp/ branches/tora-trotl/src/libantlr-cpp/include/ branches/tora-trotl/src/libantlr-cpp/include/antlr3.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3baserecognizer.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3baserecognizer.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3bitset.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3bitset.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3collections.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3collections.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3commontoken.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3commontoken.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3commontree.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3commontree.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3commontreeadaptor.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3commontreeadaptor.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3commontreenodestream.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3commontreenodestream.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3convertutf.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3cyclicdfa.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3cyclicdfa.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3debugeventlistener.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3defs.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3errors.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3exception.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3exception.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3filestream.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3filestream.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3input.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3input.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3interfaces.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3intstream.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3intstream.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3lexer.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3lexer.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3memory.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3parser.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3parser.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3recognizersharedstate.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3recognizersharedstate.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3rewritestreams.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3rewritestreams.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3tokenstream.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3tokenstream.inl branches/tora-trotl/src/libantlr-cpp/include/antlr3traits.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3treeparser.hpp branches/tora-trotl/src/libantlr-cpp/include/antlr3treeparser.inl Added: branches/tora-trotl/src/libantlr-cpp/include/antlr3.hpp =================================================================== --- branches/tora-trotl/src/libantlr-cpp/include/antlr3.hpp (rev 0) +++ branches/tora-trotl/src/libantlr-cpp/include/antlr3.hpp 2012-03-16 10:06:31 UTC (rev 4244) @@ -0,0 +1,60 @@ +#ifndef _ANTLR3_HPP +#define _ANTLR3_HPP + +// [The "BSD licence"] +// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. The name of the author may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include <string> +#include <sstream> + +#include "antlr3defs.hpp" + +#include "antlr3errors.hpp" +#include "antlr3memory.hpp" + +#include "antlr3recognizersharedstate.hpp" +#include "antlr3baserecognizer.hpp" +#include "antlr3bitset.hpp" +#include "antlr3collections.hpp" +#include "antlr3commontoken.hpp" +#include "antlr3commontree.hpp" +#include "antlr3commontreeadaptor.hpp" +#include "antlr3cyclicdfa.hpp" +#include "antlr3debugeventlistener.hpp" +#include "antlr3exception.hpp" +#include "antlr3filestream.hpp" +#include "antlr3intstream.hpp" +#include "antlr3input.hpp" +#include "antlr3tokenstream.hpp" +#include "antlr3commontreenodestream.hpp" +#include "antlr3lexer.hpp" +#include "antlr3parser.hpp" +#include "antlr3rewritestreams.hpp" +#include "antlr3traits.hpp" +#include "antlr3treeparser.hpp" + +#endif Property changes on: branches/tora-trotl/src/libantlr-cpp/include/antlr3.hpp ___________________________________________________________________ Added: svn:executable + * Added: branches/tora-trotl/src/libantlr-cpp/include/antlr3.inl =================================================================== --- branches/tora-trotl/src/libantlr-cpp/include/antlr3.inl (rev 0) +++ branches/tora-trotl/src/libantlr-cpp/include/antlr3.inl 2012-03-16 10:06:31 UTC (rev 4244) @@ -0,0 +1,9 @@ +ANTLR_BEGIN_NAMESPACE() + +//static +ANTLR_INLINE void GenericStream::displayRecognitionError( const StringType& str ) +{ + fprintf(stderr, str.c_str() ); +} + +ANTLR_END_NAMESPACE() \ No newline at end of file Property changes on: branches/tora-trotl/src/libantlr-cpp/include/antlr3.inl ___________________________________________________________________ Added: svn:executable + * Added: branches/tora-trotl/src/libantlr-cpp/include/antlr3baserecognizer.hpp =================================================================== --- branches/tora-trotl/src/libantlr-cpp/include/antlr3baserecognizer.hpp (rev 0) +++ branches/tora-trotl/src/libantlr-cpp/include/antlr3baserecognizer.hpp 2012-03-16 10:06:31 UTC (rev 4244) @@ -0,0 +1,512 @@ +/** \file + * Defines the basic structure to support recognizing by either a lexer, + * parser, or tree parser. + * \addtogroup BaseRecognizer + * @{ + */ +#ifndef _ANTLR3_BASERECOGNIZER_HPP +#define _ANTLR3_BASERECOGNIZER_HPP + +// [The "BSD licence"] +// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB + +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. The name of the author may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "antlr3defs.hpp" +#include "antlr3collections.hpp" + +ANTLR_BEGIN_NAMESPACE() + +/** \brief Base tracking context structure for all types of + * recognizers. + */ +template< class ImplTraits, class StreamType > +class BaseRecognizer : public ImplTraits::AllocPolicyType +{ +public: + typedef typename ImplTraits::AllocPolicyType AllocPolicyType; + typedef typename StreamType::IntStreamType IntStreamType; + typedef typename ComponentTypeFinder<ImplTraits, StreamType>::ComponentType SuperType; + typedef typename StreamType::UnitType UnitType; + typedef typename ImplTraits::template ExceptionBaseType<StreamType> ExceptionBaseType; + typedef typename ImplTraits::BitsetType BitsetType; + typedef typename ImplTraits::BitsetListType BitsetListType; + typedef typename ImplTraits::StringType StringType; + typedef typename ImplTraits::template RecognizerSharedStateType<StreamType> RecognizerSharedStateType; + typedef typename ImplTraits::DebugEventListenerType DebugEventListenerType; + typedef typename ImplTraits::LexerType LexerType; + typedef typename ImplTraits::ParserType ParserType; + typedef typename ImplTraits::TreeParserType TreeParserType; + + typedef typename AllocPolicyType::template StackType<StringType> StringStackType; + typedef typename AllocPolicyType::template ListType<StringType> StringListType; + +private: + /// A pointer to the shared recognizer state, such that multiple + /// recognizers can use the same inputs streams and so on (in + /// the case of grammar inheritance for instance. + /// + RecognizerSharedStateType* m_state; + + /// If set to something other than NULL, then this structure is + /// points to an instance of the debugger interface. In general, the + /// debugger is only referenced internally in recovery/error operations + /// so that it does not cause overhead by having to check this pointer + /// in every function/method + /// + DebugEventListenerType* m_debugger; + + +public: + BaseRecognizer(ANTLR_UINT32 sizeHint, RecognizerSharedStateType* state); + + SuperType* get_super(); + RecognizerSharedStateType* get_state() const; + DebugEventListenerType* get_debugger() const; + void set_state( RecognizerSharedStateType* state ); + void set_debugger( DebugEventListenerType* debugger ); + + /// Match current input symbol against ttype. Upon error, do one token + /// insertion or deletion if possible. + /// To turn off single token insertion or deletion error + /// recovery, override mismatchRecover() and have it call + /// plain mismatch(), which does not recover. Then any error + /// in a rule will cause an exception and immediate exit from + /// rule. Rule would recover by resynchronizing to the set of + /// symbols that can follow rule ref. + /// + const UnitType* match(ANTLR_UINT32 ttype, BitsetListType* follow); + + /// Consumes the next token, whatever it is, and resets the recognizer state + /// so that it is not in error. + /// + /// \param recognizer + /// Recognizer context pointer + /// + void matchAny(); + + /// function that decides if the token ahead of the current one is the + /// one we were loking for, in which case the curernt one is very likely extraneous + /// and can be reported that way. + /// + bool mismatchIsUnwantedToken(IntStreamType* input, ANTLR_UINT32 ttype); + + /// function that decides if the current token is one that can logically + /// follow the one we were looking for, in which case the one we were looking for is + /// probably missing from the input. + /// + bool mismatchIsMissingToken(IntStreamType* input, BitsetListType* follow); + + /// Factor out what to do upon token mismatch so tree parsers can behave + /// differently. Override and call mismatchRecover(input, ttype, follow) + /// to get single token insertion and deletion. Use this to turn off + /// single token insertion and deletion. Override mismatchRecover + /// to call this instead. + /// + /// \remark mismatch only works for parsers and must be overridden for anything else. + /// + void mismatch(ANTLR_UINT32 ttype, BitsetListType* follow); + + /// Report a recognition problem. + /// + /// This method sets errorRecovery to indicate the parser is recovering + /// not parsing. Once in recovery mode, no errors are generated. + /// To get out of recovery mode, the parser must successfully match + /// a token (after a resync). So it will go: + /// + /// 1. error occurs + /// 2. enter recovery mode, report error + /// 3. consume until token found in resynch set + /// 4. try to resume parsing + /// 5. next match() will reset errorRecovery mode + /// + /// If you override, make sure to update errorCount if you care about that. + /// + void reportError(); + void reportError( ClassForwarder<LexerType> ); + template<typename CompType> + void reportError( ClassForwarder<CompType> ); + + /** Function that is called to display a recognition error message. You may + * override this function independently of (*reportError)() above as that function calls + * this one to do the actual exception printing. + */ + void displayRecognitionError(ANTLR_UINT8** tokenNames); + + /// Get number of recognition errors (lexer, parser, tree parser). Each + /// recognizer tracks its own number. So parser and lexer each have + /// separate count. Does not count the spurious errors found between + /// an error and next valid token match + /// + /// \see reportError() + /// + ANTLR_UINT32 getNumberOfSyntaxErrors(); + + /** Function that recovers from an error found in the input stream. + * Generally, this will be a #ANTLR3_EXCEPTION_NOVIABLE_ALT but it could also + * be from a mismatched token that the (*match)() could not recover from. + */ + void recover(); + + /** function that is a hook to listen to token consumption during error recovery. + * This is mainly used by the debug parser to send events to the listener. + */ + void beginResync(); + + /** function that is a hook to listen to token consumption during error recovery. + * This is mainly used by the debug parser to send events to the listener. + */ + void endResync(); + + /** function that is a hook to listen to token consumption during error recovery. + * This is mainly used by the debug parser to send events to the listener. + */ + void beginBacktrack(ANTLR_UINT32 level); + + /** function that is a hook to listen to token consumption during error recovery. + * This is mainly used by the debug parser to send events to the listener. + */ + void endBacktrack(ANTLR_UINT32 level, bool successful); + + /// Compute the error recovery set for the current rule. + /// Documentation below is from the Java implementation. + /// + /// During rule invocation, the parser pushes the set of tokens that can + /// follow that rule reference on the stack; this amounts to + /// computing FIRST of what follows the rule reference in the + /// enclosing rule. This local follow set only includes tokens + /// from within the rule; i.e., the FIRST computation done by + /// ANTLR stops at the end of a rule. + // + /// EXAMPLE + // + /// When you find a "no viable alt exception", the input is not + /// consistent with any of the alternatives for rule r. The best + /// thing to do is to consume tokens until you see something that + /// can legally follow a call to r *or* any rule that called r. + /// You don't want the exact set of viable next tokens because the + /// input might just be missing a token--you might consume the + /// rest of the input looking for one of the missing tokens. + /// + /// Consider grammar: + /// + /// a : '[' b ']' + /// | '(' b ')' + /// ; + /// b : c '^' INT ; + /// c : ID + /// | INT + /// ; + /// + /// At each rule invocation, the set of tokens that could follow + /// that rule is pushed on a stack. Here are the various "local" + /// follow sets: + /// + /// FOLLOW(b1_in_a) = FIRST(']') = ']' + /// FOLLOW(b2_in_a) = FIRST(')') = ')' + /// FOLLOW(c_in_b) = FIRST('^') = '^' + /// + /// Upon erroneous input "[]", the call chain is + /// + /// a -> b -> c + /// + /// and, hence, the follow context stack is: + /// + /// depth local follow set after call to rule + /// 0 <EOF> a (from main()) + /// 1 ']' b + /// 3 '^' c + /// + /// Notice that ')' is not included, because b would have to have + /// been called from a different context in rule a for ')' to be + /// included. + /// + /// For error recovery, we cannot consider FOLLOW(c) + /// (context-sensitive or otherwise). We need the combined set of + /// all context-sensitive FOLLOW sets--the set of all tokens that + /// could follow any reference in the call chain. We need to + /// resync to one of those tokens. Note that FOLLOW(c)='^' and if + /// we resync'd to that token, we'd consume until EOF. We need to + /// sync to context-sensitive FOLLOWs for a, b, and c: {']','^'}. + /// In this case, for input "[]", LA(1) is in this set so we would + /// not consume anything and after printing an error rule c would + /// return normally. It would not find the required '^' though. + /// At this point, it gets a mismatched token error and throws an + /// exception (since LA(1) is not in the viable following token + /// set). The rule exception handler tries to recover, but finds + /// the same recovery set and doesn't consume anything. Rule b + /// exits normally returning to rule a. Now it finds the ']' (and + /// with the successful match exits errorRecovery mode). + /// + /// So, you can see that the parser walks up call chain looking + /// for the token that was a member of the recovery set. + /// + /// Errors are not generated in errorRecovery mode. + /// + /// ANTLR's error recovery mechanism is based upon original ideas: + /// + /// "Algorithms + Data Structures = Programs" by Niklaus Wirth + /// + /// and + /// + /// "A note on error recovery in recursive descent parsers": + /// http://portal.acm.org/citation.cfm?id=947902.947905 + /// + /// Later, Josef Grosch had some good ideas: + /// + /// "Efficient and Comfortable Error Recovery in Recursive Descent + /// Parsers": + /// ftp://www.cocolab.com/products/cocktail/doca4.ps/ell.ps.zip + /// + /// Like Grosch I implemented local FOLLOW sets that are combined + /// at run-time upon error to avoid overhead during parsing. + /// + BitsetType* computeErrorRecoverySet(); + + /// Compute the context-sensitive FOLLOW set for current rule. + /// Documentation below is from the Java runtime. + /// + /// This is the set of token types that can follow a specific rule + /// reference given a specific call chain. You get the set of + /// viable tokens that can possibly come next (look ahead depth 1) + /// given the current call chain. Contrast this with the + /// definition of plain FOLLOW for rule r: + /// + /// FOLLOW(r)={x | S=>*alpha r beta in G and x in FIRST(beta)} + /// + /// where x in T* and alpha, beta in V*; T is set of terminals and + /// V is the set of terminals and non terminals. In other words, + /// FOLLOW(r) is the set of all tokens that can possibly follow + /// references to r in///any* sentential form (context). At + /// runtime, however, we know precisely which context applies as + /// we have the call chain. We may compute the exact (rather + /// than covering superset) set of following tokens. + /// + /// For example, consider grammar: + /// + /// stat : ID '=' expr ';' // FOLLOW(stat)=={EOF} + /// | "return" expr '.' + /// ; + /// expr : atom ('+' atom)* ; // FOLLOW(expr)=={';','.',')'} + /// atom : INT // FOLLOW(atom)=={'+',')',';','.'} + /// | '(' expr ')' + /// ; + /// + /// The FOLLOW sets are all inclusive whereas context-sensitive + /// FOLLOW sets are precisely what could follow a rule reference. + /// For input input "i=(3);", here is the derivation: + /// + /// stat => ID '=' expr ';' + /// => ID '=' atom ('+' atom)* ';' + /// => ID '=' '(' expr ')' ('+' atom)* ';' + /// => ID '=' '(' atom ')' ('+' atom)* ';' + /// => ID '=' '(' INT ')' ('+' atom)* ';' + /// => ID '=' '(' INT ')' ';' + /// + /// At the "3" token, you'd have a call chain of + /// + /// stat -> expr -> atom -> expr -> atom + /// + /// What can follow that specific nested ref to atom? Exactly ')' + /// as you can see by looking at the derivation of this specific + /// input. Contrast this with the FOLLOW(atom)={'+',')',';','.'}. + /// + /// You want the exact viable token set when recovering from a + /// token mismatch. Upon token mismatch, if LA(1) is member of + /// the viable next token set, then you know there is most likely + /// a missing token in the input stream. "Insert" one by just not + /// throwing an exception. + /// + BitsetType* computeCSRuleFollow(); + + /// Compute the current followset for the input stream. + /// + BitsetType* combineFollows(bool exact); + + /// Attempt to recover from a single missing or extra token. + /// + /// EXTRA TOKEN + /// + /// LA(1) is not what we are looking for. If LA(2) has the right token, + /// however, then assume LA(1) is some extra spurious token. Delete it + /// and LA(2) as if we were doing a normal match(), which advances the + /// input. + /// + /// MISSING TOKEN + /// + /// If current token is consistent with what could come after + /// ttype then it is ok to "insert" the missing token, else throw + /// exception For example, Input "i=(3;" is clearly missing the + /// ')'. When the parser returns from the nested call to expr, it + /// will have call chain: + /// + /// stat -> expr -> atom + /// + /// and it will be trying to match the ')' at this point in the + /// derivation: + /// + /// => ID '=' '(' INT ')' ('+' atom)* ';' + /// ^ + /// match() will see that ';' doesn't match ')' and report a + /// mismatched token error. To recover, it sees that LA(1)==';' + /// is in the set of tokens that can follow the ')' token + /// reference in rule atom. It can assume that you forgot the ')'. + /// + /// The exception that was passed in, in the java implementation is + /// sorted in the recognizer exception stack in the C version. To 'throw' it we set the + /// error flag and rules cascade back when this is set. + /// + const UnitType* recoverFromMismatchedToken( ANTLR_UINT32 ttype, BitsetListType* follow); + + /** Function that recovers from a mismatched set in the token stream, in a similar manner + * to (*recoverFromMismatchedToken) + */ + const UnitType* recoverFromMismatchedSet(BitsetListType* follow); + + /** common routine to handle single token insertion for recovery functions. + */ + /// This code is factored out from mismatched token and mismatched set + /// recovery. It handles "single token insertion" error recovery for + /// both. No tokens are consumed to recover from insertions. Return + /// true if recovery was possible else return false. + /// + bool recoverFromMismatchedElement(BitsetListType* follow); + + /** function that consumes input until the next token matches + * the given token. + */ + void consumeUntil(ANTLR_UINT32 tokenType); + + /** function that consumes input until the next token matches + * one in the given set. + */ + void consumeUntilSet(BitsetType* set); + + /** function that returns an ANTLR3_LIST of the strings that identify + * the rules in the parser that got you to this point. Can be overridden by installing your + * own function set. + * + * \todo Document how to override invocation stack functions. + */ + StringStackType getRuleInvocationStack(); + StringStackType getRuleInvocationStackNamed(ANTLR_UINT8* name); + + /** function that converts an ANLR3_LIST of tokens to an ANTLR3_LIST of + * string token names. As this is mostly used in string template processing it may not be useful + * in the C runtime. + */ + StringListType toStrings( const StringListType& ); + + /** function to return whether the rule has parsed input starting at the supplied + * start index before. If the rule has not parsed input starting from the supplied start index, + * then it will return ANTLR3_MEMO_RULE_UNKNOWN. If it has parsed from the suppled start point + * then it will return the point where it last stopped parsing after that start point. + */ + ANTLR_MARKER getRuleMemoization( ANTLR_INTKEY ruleIndex, + ANTLR_MARKER ruleParseStart); + + /** function that determines whether the rule has parsed input at the current index + * in the input stream + */ + bool alreadyParsedRule(ANTLR_MARKER ruleIndex); + + /** Function that records whether the rule has parsed the input at a + * current position successfully or not. + */ + void memoize(ANTLR_MARKER ruleIndex, + ANTLR_MARKER ruleParseStart); + + /// Function that returns the current input symbol. + /// The is placed into any label for the associated token ref; e.g., x=ID. Token + /// and tree parsers need to return different objects. Rather than test + /// for input stream type or change the IntStream interface, I use + /// a simple method to ask the recognizer to tell me what the current + /// input symbol is. + /// + /// This is ignored for lexers and the lexer implementation of this + /// function should return NULL. + /// + const UnitType* getCurrentInputSymbol(IntStreamType* istream); + const UnitType* getCurrentInputSymbol(IntStreamType* istream, ClassForwarder<LexerType>); + const UnitType* getCurrentInputSymbol(IntStreamType* istream, ClassForwarder<ParserType>); + const UnitType* getCurrentInputSymbol(IntStreamType* istream, ClassForwarder<TreeParserType>); + + /// Conjure up a missing token during error recovery. + /// + /// The recognizer attempts to recover from single missing + /// symbols. But, actions might refer to that missing symbol. + /// For example, x=ID {f($x);}. The action clearly assumes + /// that there has been an identifier matched previously and that + /// $x points at that token. If that token is missing, but + /// the next token in the stream is what we want we assume that + /// this token is missing and we keep going. Because we + /// have to return some token to replace the missing token, + /// we have to conjure one up. This method gives the user control + /// over the tokens returned for missing tokens. Mostly, + /// you will want to create something special for identifier + /// tokens. For literals such as '{' and ',', the default + /// action in the parser or tree parser works. It simply creates + /// a CommonToken of the appropriate type. The text will be the token. + /// If you change what tokens must be created by the lexer, + /// override this method to create the appropriate tokens. + /// + UnitType* getMissingSymbol( IntStreamType* istream, ExceptionBaseType* e, + ANTLR_UINT32 expectedTokenType, + BitsetListType* follow); + + /** Function that returns whether the supplied grammar function + * will parse the current input stream or not. This is the way that syntactic + * predicates are evaluated. Unlike java, C is perfectly happy to invoke code + * via a pointer to a function (hence that's what all the ANTLR3 C interfaces + * do. + */ + template<typename Predicate> + bool synpred( ClassForwarder<Predicate> ); + + //In place of exConstruct, just directly instantiate the Exception Object + + /** Reset the recognizer + */ + void reset(); + void reset( ClassForwarder<LexerType> ); + template<typename CompType> + void reset( ClassForwarder<CompType> ); + + void exConstruct(); + + ~BaseRecognizer(); + +}; + +ANTLR_END_NAMESPACE() + +#include "antlr3baserecognizer.inl" + +/// @} +/// + +#endif /* _ANTLR3_BASERECOGNIZER_H */ + Property changes on: branches/tora-trotl/src/libantlr-cpp/include/antlr3baserecognizer.hpp ___________________________________________________________________ Added: svn:executable + * Added: branches/tora-trotl/src/libantlr-cpp/include/antlr3baserecognizer.inl =================================================================== --- branches/tora-trotl/src/libantlr-cpp/include/antlr3baserecognizer.inl (rev 0) +++ branches/tora-trotl/src/libantlr-cpp/include/antlr3baserecognizer.inl 2012-03-16 10:06:31 UTC (rev 4244) @@ -0,0 +1,919 @@ +ANTLR_BEGIN_NAMESPACE() + +template< class ImplTraits, class StreamType > +BaseRecognizer<ImplTraits, StreamType>::BaseRecognizer(ANTLR_UINT32 sizeHint, + RecognizerSharedStateType* state) +{ + m_debugger = NULL; + + // If we have been supplied with a pre-existing recognizer state + // then we just install it, otherwise we must create one from scratch + // + if (state == NULL) + { + m_state = new RecognizerSharedStateType(); + m_state->set_sizeHint( sizeHint ); + } + else + { + // Install the one we were given, and do not reset it here + // as it will either already have been initialized or will + // be in a state that needs to be preserved. + // + m_state = state; + } +} + +template< class ImplTraits, class StreamType > +ANTLR_INLINE typename BaseRecognizer<ImplTraits, StreamType>::SuperType* BaseRecognizer<ImplTraits, StreamType>::get_super() +{ + return static_cast<SuperType*>(this); +} + +template< class ImplTraits, class StreamType > +ANTLR_INLINE typename BaseRecognizer<ImplTraits, StreamType>::RecognizerSharedStateType* BaseRecognizer<ImplTraits, StreamType>::get_state() const +{ + return m_state; +} +template< class ImplTraits, class StreamType > +ANTLR_INLINE typename BaseRecognizer<ImplTraits, StreamType>::DebugEventListenerType* BaseRecognizer<ImplTraits, StreamType>::get_debugger() const +{ + return m_debugger; +} +template< class ImplTraits, class StreamType > +ANTLR_INLINE void BaseRecognizer<ImplTraits, StreamType>::set_state( RecognizerSharedStateType* state ) +{ + m_state = state; +} +template< class ImplTraits, class StreamType > +ANTLR_INLINE void BaseRecognizer<ImplTraits, StreamType>::set_debugger( DebugEventListenerType* debugger ) +{ + m_debugger = debugger; +} + +template< class ImplTraits, class StreamType > +const typename BaseRecognizer<ImplTraits, StreamType>::UnitType* +BaseRecognizer<ImplTraits, StreamType>::match(ANTLR_UINT32 ttype, BitsetListType* follow) +{ + SuperType* super = static_cast<SuperType*>(this); + IntStreamType* is = super->get_istream(); + + // Pick up the current input token/node for assignment to labels + // + const UnitType* matchedSymbol = this->getCurrentInputSymbol(is); + + if (is->_LA(1) == ttype) + { + // The token was the one we were told to expect + // + is->consume(); // Consume that token from the stream + m_state->set_errorRecovery(false); // Not in error recovery now (if we were) + m_state->set_failed(false); // The match was a success + return matchedSymbol; // We are done + } + + // We did not find the expected token type, if we are backtracking then + // we just set the failed flag and return. + // + if ( m_state->get_backtracking() > 0) + { + // Backtracking is going on + // + m_state->set_failed(true); + return matchedSymbol; + } + + // We did not find the expected token and there is no backtracking + // going on, so we mismatch, which creates an exception in the recognizer exception + // stack. + // + matchedSymbol = this->recoverFromMismatchedToken(ttype, follow); + return matchedSymbol; + +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::matchAny() +{ + SuperType* super = static_cast<SuperType*>(this); + IntStreamType* is = super->get_istream(); + + is->consume(); + m_state->set_errorRecovery(false); + m_state->set_failed(false); + return; +} + +template< class ImplTraits, class StreamType > +bool BaseRecognizer<ImplTraits, StreamType>::mismatchIsUnwantedToken(IntStreamType* is, ANTLR_UINT32 ttype) +{ + ANTLR_UINT32 nextt = is->_LA(2); + + if (nextt == ttype) + { + if(m_state->get_exception() != NULL) + m_state->get_exception()->set_expecting(nextt); + return true; // This token is unknown, but the next one is the one we wanted + } + else + return false; // Neither this token, nor the one following is the one we wanted +} + +template< class ImplTraits, class StreamType > +bool BaseRecognizer<ImplTraits, StreamType>::mismatchIsMissingToken(IntStreamType* is, BitsetListType* follow) +{ + bool retcode; + BitsetType* followClone; + BitsetType* viableTokensFollowingThisRule; + + if (follow == NULL) + { + // There is no information about the tokens that can follow the last one + // hence we must say that the current one we found is not a member of the + // follow set and does not indicate a missing token. We will just consume this + // single token and see if the parser works it out from there. + // + return false; + } + + followClone = NULL; + viableTokensFollowingThisRule = NULL; + + // The C bitset maps are laid down at compile time by the + // C code generation. Hence we cannot remove things from them + // and so on. So, in order to remove EOR (if we need to) then + // we clone the static bitset. + // + followClone = follow->bitsetLoad(); + if (followClone == NULL) + return false; + + // Compute what can follow this grammar reference + // + if (followClone->isMember( ImplTraits::CommonTokenType::EOR_TOKEN_TYPE)) + { + // EOR can follow, but if we are not the start symbol, we + // need to remove it. + // + followClone->remove(ImplTraits::CommonTokenType::EOR_TOKEN_TYPE); + + // Now compute the visiable tokens that can follow this rule, according to context + // and make them part of the follow set. + // + viableTokensFollowingThisRule = this->computeCSRuleFollow(); + followClone->borInPlace(viableTokensFollowingThisRule); + } + + /// if current token is consistent with what could come after set + /// then we know we're missing a token; error recovery is free to + /// "insert" the missing token + /// + /// BitSet cannot handle negative numbers like -1 (EOF) so I leave EOR + /// in follow set to indicate that the fall of the start symbol is + /// in the set (EOF can follow). + /// + if ( followClone->isMember(is->_LA(1)) + || followClone->isMember(ImplTraits::CommonTokenType::EOR_TOKEN_TYPE) + ) + { + retcode = true; + } + else + { + retcode = false; + } + + if (viableTokensFollowingThisRule != NULL) + { + delete viableTokensFollowingThisRule; + } + if (followClone != NULL) + { + delete followClone; + } + + return retcode; +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::mismatch(ANTLR_UINT32 ttype, BitsetListType* follow) +{ + this->get_super()->mismatch( ttype, follow ); +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::reportError() +{ + this->reportError( ClassForwarder<SuperType>() ); +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::reportError( ClassForwarder<LexerType> ) +{ + // Indicate this recognizer had an error while processing. + // + m_state->inc_errorCount(); + + this->displayRecognitionError(m_state->get_tokenNames()); +} + +template< class ImplTraits, class StreamType > +template<typename CompType> +void BaseRecognizer<ImplTraits, StreamType>::reportError(ClassForwarder<CompType> ) +{ + // Invoke the debugger event if there is a debugger listening to us + // + if ( m_debugger != NULL) + { + m_debugger->recognitionException( m_state->get_exception() ); + } + + if ( m_state->get_errorRecovery() == true) + { + // Already in error recovery so don't display another error while doing so + // + return; + } + + // Signal we are in error recovery now + // + m_state->set_errorRecovery(true); + + // Indicate this recognizer had an error while processing. + // + m_state->inc_errorCount(); + + // Call the error display routine + // + this->displayRecognitionError( m_state->get_tokenNames() ); +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::displayRecognitionError(ANTLR_UINT8** tokenNames) +{ + // Retrieve some info for easy reading. + // + ExceptionBaseType* ex = m_state->get_exception(); + StringType ttext; + + // See if there is a 'filename' we can use + // + SuperType* super = static_cast<SuperType*>(this); + super->displayRecognitionError(tokenNames, ex); +} + +template< class ImplTraits, class StreamType > +ANTLR_UINT32 BaseRecognizer<ImplTraits, StreamType>::getNumberOfSyntaxErrors() +{ + return m_state->get_errorCount(); +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::recover() +{ + SuperType* super = static_cast<SuperType*>(this); + IntStreamType* is = super->get_parser_istream(); + // Are we about to repeat the same error? + // + if ( m_state->get_lastErrorIndex() == is->index()) + { + // The last error was at the same token index point. This must be a case + // where LT(1) is in the recovery token set so nothing is + // consumed. Consume a single token so at least to prevent + // an infinite loop; this is a failsafe. + // + is->consume(); + } + + // Record error index position + // + m_state->set_lastErrorIndex( is->index() ); + + // Work out the follows set for error recovery + // + BitsetType* followSet = this->computeErrorRecoverySet(); + + // Call resync hook (for debuggers and so on) + // + this->beginResync(); + + // Consume tokens until we have resynced to something in the follows set + // + this->consumeUntilSet(followSet); + + // End resync hook + // + this->endResync(); + + // Destroy the temporary bitset we produced. + // + delete followSet; + + // Reset the inError flag so we don't re-report the exception + // + m_state->set_error(false); + m_state->set_failed(false); +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::beginResync() +{ + if (m_debugger != NULL) + { + m_debugger->beginResync(); + } +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::endResync() +{ + if (m_debugger != NULL) + { + m_debugger->endResync(); + } +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::beginBacktrack(ANTLR_UINT32 level) +{ + if (m_debugger != NULL) + { + m_debugger->beginBacktrack(level); + } +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::endBacktrack(ANTLR_UINT32 level, bool successful) +{ + if (m_debugger != NULL) + { + m_debugger->endBacktrack(level); + } +} + +template< class ImplTraits, class StreamType > +typename BaseRecognizer<ImplTraits, StreamType>::BitsetType* BaseRecognizer<ImplTraits, StreamType>::computeErrorRecoverySet() +{ + return this->combineFollows(false); +} + +template< class ImplTraits, class StreamType > +typename BaseRecognizer<ImplTraits, StreamType>::BitsetType* BaseRecognizer<ImplTraits, StreamType>::computeCSRuleFollow() +{ + return this->combineFollows(false); +} + +template< class ImplTraits, class StreamType > +typename BaseRecognizer<ImplTraits, StreamType>::BitsetType* BaseRecognizer<ImplTraits, StreamType>::combineFollows(bool exact) +{ + BitsetType* followSet; + BitsetType* localFollowSet; + ANTLR_UINT32 top; + ANTLR_UINT32 i; + + top = static_cast<ANTLR_UINT32>( m_state->get_following().size() ); + + followSet = new BitsetType(0); + localFollowSet = NULL; + + for (i = top; i>0; i--) + { + localFollowSet = m_state->get_following().at(i-1).bitsetLoad(); + + if (localFollowSet != NULL) + { + followSet->borInPlace(localFollowSet); + + if (exact == true) + { + if (localFollowSet->isMember( ImplTraits::CommonTokenType::EOR_TOKEN_TYPE) == false) + { + // Only leave EOR in the set if at top (start rule); this lets us know + // if we have to include the follow(start rule); I.E., EOF + // + if (i>1) + { + followSet->remove(ImplTraits::CommonTokenType::EOR_TOKEN_TYPE); + } + } + else + { + break; // Cannot see End Of Rule from here, just drop out + } + } + delete localFollowSet; + localFollowSet = NULL; + } + } + + if (localFollowSet != NULL) + { + delete localFollowSet; + } + return followSet; +} + +template< class ImplTraits, class StreamType > +const typename BaseRecognizer<ImplTraits, StreamType>::UnitType* +BaseRecognizer<ImplTraits, StreamType>::recoverFromMismatchedToken( ANTLR_UINT32 ttype, BitsetListType* follow) +{ + SuperType* super = static_cast<SuperType*>(this); + IntStreamType* is = super->get_parser_istream(); + const UnitType* matchedSymbol; + + // If the next token after the one we are looking at in the input stream + // is what we are looking for then we remove the one we have discovered + // from the stream by consuming it, then consume this next one along too as + // if nothing had happened. + // + if ( this->mismatchIsUnwantedToken( is, ttype) == true) + { + // Create an exception if we need one + // + new ANTLR_Exception<ImplTraits, UNWANTED_TOKEN_EXCEPTION, StreamType>(this, ""); + + // Call resync hook (for debuggers and so on) + // + if (m_debugger != NULL) + { + m_debugger->beginResync(); + } + + // "delete" the extra token + // + this->beginResync(); + is->consume(); + this->endResync(); + // End resync hook + // + if (m_debugger != NULL) + { + m_debugger->endResync(); + } + + // Print out the error after we consume so that ANTLRWorks sees the + // token in the exception. + // + this->reportError(); + + // Return the token we are actually matching + // + matchedSymbol = this->getCurrentInputSymbol(is); + + // Consume the token that the rule actually expected to get as if everything + // was hunky dory. + // + is->consume(); + + m_state->set_error(false); // Exception is not outstanding any more + + return matchedSymbol; + } + + // Single token deletion (Unwanted above) did not work + // so we see if we can insert a token instead by calculating which + // token would be missing + // + if ( this->mismatchIsMissingToken(is, follow)) + { + // We can fake the missing token and proceed + // + new ANTLR_Exception<ImplTraits, MISSING_TOKEN_EXCEPTION, StreamType>(this, ""); + matchedSymbol = this->getMissingSymbol( is, m_state->get_exception(), ttype, follow); + m_state->get_exception()->set_token( matchedSymbol ); + m_state->get_exception()->set_expecting(ttype); + + // Print out the error after we insert so that ANTLRWorks sees the + // token in the exception. + // + this->reportError(); + + m_state->set_error(false); // Exception is not outstanding any more + + return matchedSymbol; + } + + // Create an exception if we need one + // + new ANTLR_Exception<ImplTraits, RECOGNITION_EXCEPTION, StreamType>(this, ""); + + // Neither deleting nor inserting tokens allows recovery + // must just report the exception. + // + m_state->set_error(true); + return NULL; +} + +template< class ImplTraits, class StreamType > +const typename BaseRecognizer<ImplTraits, StreamType>::UnitType* +BaseRecognizer<ImplTraits, StreamType>::recoverFromMismatchedSet(BitsetListType* follow) +{ + SuperType* super = static_cast<SuperType*>(this); + IntStreamType* is = super->get_parser_istream(); + const UnitType* matchedSymbol; + + if (this->mismatchIsMissingToken(is, follow) == true) + { + // We can fake the missing token and proceed + // + new ANTLR_Exception<ImplTraits, MISSING_TOKEN_EXCEPTION, StreamType>(this); + matchedSymbol = this->getMissingSymbol(is, m_state->get_exception(), follow); + m_state->get_exception()->set_token(matchedSymbol); + + // Print out the error after we insert so that ANTLRWorks sees the + // token in the exception. + // + this->reportError(); + + m_state->set_error(false); // Exception is not outstanding any more + + return matchedSymbol; + } + + // TODO - Single token deletion like in recoverFromMismatchedToken() + // + m_state->set_error(true); + m_state->set_failed(true); + return NULL; +} + +template< class ImplTraits, class StreamType > +bool BaseRecognizer<ImplTraits, StreamType>::recoverFromMismatchedElement(BitsetListType* followBits) +{ + SuperType* super = static_cast<SuperType*>(this); + IntStreamType* is = super->get_parser_istream(); + + BitsetType* follow = followBits->load(); + BitsetType* viableToksFollowingRule; + + if (follow == NULL) + { + /* The follow set is NULL, which means we don't know what can come + * next, so we "hit and hope" by just signifying that we cannot + * recover, which will just cause the next token to be consumed, + * which might dig us out. + */ + return false; + } + + /* We have a bitmap for the follow set, hence we can compute + * what can follow this grammar element reference. + */ + if (follow->isMember( ImplTraits::CommonTokenType::EOR_TOKEN_TYPE) == true) + { + /* First we need to know which of the available tokens are viable + * to follow this reference. + */ + viableToksFollowingRule = this->computeCSRuleFollow(); + + /* Remove the EOR token, which we do not wish to compute with + */ + follow->remove( ImplTraits::CommonTokenType::EOR_TOKEN_TYPE); + delete viableToksFollowingRule; + /* We now have the computed set of what can follow the current token + */ + } + + /* We can now see if the current token works with the set of tokens + * that could follow the current grammar reference. If it looks like it + * is consistent, then we can "insert" that token by not throwing + * an exception and assuming that we saw it. + */ + if ( follow->isMember(is->_LA(1)) == true) + { + /* report the error, but don't cause any rules to abort and stuff + */ + this->reportError(); + if (follow != NULL) + { + delete follow; + } + m_state->set_error(false); + m_state->set_failed(false); + return true; /* Success in recovery */ + } + + if (follow != NULL) + { + delete follow; + } + + /* We could not find anything viable to do, so this is going to + * cause an exception. + */ + return false; +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::consumeUntil(ANTLR_UINT32 tokenType) +{ + SuperType* super = static_cast<SuperType*>(this); + IntStreamType* is = super->get_parser_istream(); + + // What do have at the moment? + // + ANTLR_UINT32 ttype = is->_LA(1); + + // Start eating tokens until we get to the one we want. + // + while (ttype != ImplTraits::CommonTokenType::TOKEN_EOF && ttype != tokenType) + { + is->consume(); + ttype = is->_LA(1); + } +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::consumeUntilSet(BitsetType* set) +{ + ANTLR_UINT32 ttype; + SuperType* super = static_cast<SuperType*>(this); + IntStreamType* is = super->get_parser_istream(); + + // What do have at the moment? + // + ttype = is->_LA(1); + + // Start eating tokens until we get to one we want. + // + while (ttype != ImplTraits::CommonTokenType::TOKEN_EOF && set->isMember(ttype) == false) + { + is->consume(); + ttype = is->_LA(1); + } + +} + +template< class ImplTraits, class StreamType > +ANTLR_MARKER BaseRecognizer<ImplTraits, StreamType>::getRuleMemoization( ANTLR_INTKEY ruleIndex, ANTLR_MARKER ruleParseStart) +{ + /* The rule memos are an ANTLR3_LIST of ANTLR3_LIST. + */ + typedef IntTrie<ImplTraits, ANTLR_MARKER> RuleListType; + typedef TrieEntry<ImplTraits, RuleListType*> EntryType; + typedef TrieEntry<ImplTraits, ANTLR_MARKER> SubEntryType; + ANTLR_MARKER stopIndex; + EntryType* entry; + + /* See if we have a list in the ruleMemos for this rule, and if not, then create one + * as we will need it eventually if we are being asked for the memo here. + */ + entry = m_state->get_ruleMemo()->get(ruleIndex); + + if (entry == NULL) + { + /* Did not find it, so create a new one for it, with a bit depth based on the + * size of the input stream. We need the bit depth to incorporate the number if + * bits required to represent the largest possible stop index in the input, which is the + * last character. An int stream is free to return the largest 64 bit offset if it has + * no idea of the size, but you should remember that this will cause the leftmost + * bit match algorithm to run to 63 bits, which will be the whole time spent in the trie ;-) + */ + m_state->get_ruleMemo()->add( ruleIndex, new RuleListType(63) ); + + /* We cannot have a stopIndex in a trie we have just created of course + */ + return MEMO_RULE_UNKNOWN; + } + + RuleListType* ruleList = entry->get_data(); + + /* See if there is a stop index associated with the supplied start index. + */ + stopIndex = 0; + + SubEntryType* sub_entry = ruleList->get(ruleParseStart); + if (sub_entry != NULL) + { + stopIndex = sub_entry->get_data(); + } + + if (stopIndex == 0) + { + return MEMO_RULE_UNKNOWN; + } + + return stopIndex; +} + +template< class ImplTraits, class StreamType > +bool BaseRecognizer<ImplTraits, StreamType>::alreadyParsedRule(ANTLR_MARKER ruleIndex) +{ + SuperType* super = static_cast<SuperType*>(this); + IntStreamType* is = super->get_istream(); + + /* See if we have a memo marker for this. + */ + ANTLR_MARKER stopIndex = this->getRuleMemoization( ruleIndex, is->index() ); + + if (stopIndex == MEMO_RULE_UNKNOWN) + { + return false; + } + + if (stopIndex == MEMO_RULE_FAILED) + { + m_state->set_failed(true); + } + else + { + is->seek(stopIndex+1); + } + + /* If here then the rule was executed for this input already + */ + return true; +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::memoize(ANTLR_MARKER ruleIndex, ANTLR_MARKER ruleParseStart) +{ + /* The rule memos are an ANTLR3_LIST of ANTLR3_LIST. + */ + typedef IntTrie<ImplTraits, ANTLR_MARKER> RuleListType; + typedef TrieEntry<ImplTraits, RuleListType*> EntryType; + EntryType* entry; + ANTLR_MARKER stopIndex; + SuperType* super = static_cast<SuperType*>(this); + IntStreamType* is = super->get_istream(); + + stopIndex = (m_state->get_failed() == true) ? MEMO_RULE_FAILED : is->index() - 1; + + entry = m_state->get_ruleMemo()->get(ruleIndex); + + if (entry != NULL) + { + RuleListType* ruleList = entry->get_data(); + + /* If we don't already have this entry, append it. The memoize trie does not + * accept duplicates so it won't add it if already there and we just ignore the + * return code as we don't care if it is there already. + */ + ruleList->add(ruleParseStart, stopIndex); + } +} + +template< class ImplTraits, class StreamType > +const typename BaseRecognizer<ImplTraits, StreamType>::UnitType* +BaseRecognizer<ImplTraits, StreamType>::getCurrentInputSymbol( IntStreamType* istream ) +{ + return this->getCurrentInputSymbol( istream, ClassForwarder<SuperType>() ); +} + +template< class ImplTraits, class StreamType > +const typename BaseRecognizer<ImplTraits, StreamType>::UnitType* +BaseRecognizer<ImplTraits, StreamType>::getCurrentInputSymbol(IntStreamType* istream, ClassForwarder<LexerType>) +{ + return NULL; +} + +template< class ImplTraits, class StreamType > +const typename BaseRecognizer<ImplTraits, StreamType>::UnitType* +BaseRecognizer<ImplTraits, StreamType>::getCurrentInputSymbol(IntStreamType* istream, ClassForwarder<ParserType>) +{ + typedef typename ImplTraits::TokenStreamType TokenStreamType; + TokenStreamType* token_stream = static_cast<TokenStreamType*>(istream); + return token_stream->_LT(1); +} + +template< class ImplTraits, class StreamType > +const typename BaseRecognizer<ImplTraits, StreamType>::UnitType* +BaseRecognizer<ImplTraits, StreamType>::getCurrentInputSymbol(IntStreamType* istream, ClassForwarder<TreeParserType>) +{ + typedef typename ImplTraits::TreeNodeStreamType TreeNodeStreamType; + TreeNodeStreamType* ctns = static_cast<TreeNodeStreamType*>(istream); + return ctns->_LT(1); +} + + +template< class ImplTraits, class StreamType > +typename BaseRecognizer<ImplTraits, StreamType>::UnitType* BaseRecognizer<ImplTraits, StreamType>::getMissingSymbol( IntStreamType* istream, + ExceptionBaseType* e, + ANTLR_UINT32 expectedTokenType, + BitsetListType* follow) +{ + return this->get_super()->getMissingSymbol( istream, e, expectedTokenType, follow ); +} + + +template< class ImplTraits, class StreamType > + template<typename Predicate> +bool BaseRecognizer<ImplTraits, StreamType>::synpred(ClassForwarder<Predicate> pred) +{ + ANTLR_MARKER start; + SuperType* super = static_cast<SuperType*>(this); + IntStreamType* is = super->get_istream(); + + /* Begin backtracking so we can get back to where we started after trying out + * the syntactic predicate. + */ + start = is->mark(); + m_state->inc_backtracking(); + + /* Try the syntactical predicate + */ + this->get_super()->synpred( pred ); + + /* Reset + */ + is->rewind(start); + m_state->dec_backtracking(); + + if ( m_state->get_failed() == true) + { + /* Predicate failed + */ + m_state->set_failed(false); + return false; + } + else + { + /* Predicate was successful + */ + m_state->set_failed(false); + return true; + } +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::exConstruct() +{ + this->get_super()->exConstruct(); +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::reset() +{ + this->reset( ClassForwarder<SuperType>() ); +} + +template< class ImplTraits, class StreamType > +template< typename CompType > +void BaseRecognizer<ImplTraits, StreamType>::reset( ClassForwarder<CompType> ) +{ + typedef typename RecognizerSharedStateType::RuleMemoType RuleMemoType; + m_state->get_following().clear(); + + // Reset the state flags + // + m_state->set_errorRecovery(false); + m_state->set_lastErrorIndex(-1); + m_state->set_failed(false); + m_state->set_errorCount(0); + m_state->set_backtracking(0); + + if (m_state->get_ruleMemo() != NULL) + { + delete m_state->get_ruleMemo(); + m_state->set_ruleMemo( new RuleMemoType(15) ); /* 16 bit depth is enough for 32768 rules! */ + } +} + +template< class ImplTraits, class StreamType > +void BaseRecognizer<ImplTraits, StreamType>::reset( ClassForwarder<LexerType> ) +{ + m_state->set_token_present( false ); + m_state->set_type( ImplTraits::CommonTokenType::TOKEN_INVALID ); + m_state->set_channel( TOKEN_DEFAULT_CHANNEL ); + m_state->set_tokenStartCharIndex( -1 ); + m_state->set_tokenStartCharPositionInLine(-1); + m_state->set_tokenStartLine( -1 ); + m_state->set_text(""); +} + +template< class ImplTraits, class StreamType > +BaseRecognizer<ImplTraits, StreamType>::~BaseRecognizer() +{ + // Did we have a state allocated? + // + if (m_state != NULL) + { + // Free any rule memoization we set up + // + if (m_state->get_ruleMemo() != NULL) + { + delete m_state->get_ruleMemo(); + m_state->set_ruleMemo(NULL); + } + + + // Free any exception space we have left around + // + ExceptionBaseType* thisE = m_state->get_exception(); + if (thisE != NULL) + { + delete thisE; + } + + // Free the shared state memory + // + delete m_state; + } + + // Free the actual recognizer space + // +} + + + +ANTLR_END_NAMESPACE() Property changes on: branches/tora-trotl/src/libantlr-cpp/include/antlr3baserecognizer.inl ___________________________________________________________________ Added: svn:executable + * Added: branches/tora-trotl/src/libantlr-cpp/include/antlr3bitset.hpp =================================================================== --- branches/tora-trotl/src/libantlr-cpp/include/antlr3bitset.hpp (rev 0) +++ branches/tora-trotl/src/libantlr-cpp/include/antlr3bitset.hpp 2012-03-16 10:06:31 UTC (rev 4244) @@ -0,0 +1,224 @@ +/** + * \file + * Defines the basic structures of an ANTLR3 bitset. this is a C version of the + * cut down Bitset class provided with the java version of antlr 3. + * + * + */ +#ifndef _ANTLR3_BITSET_HPP +#define _ANTLR3_BITSET_HPP + +// [The "BSD licence"] +// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB + +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. The name of the author may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "antlr3defs.hpp" + +ANTLR_BEGIN_NAMESPACE() + +/** How many bits in the elements + */ +static const ANTLR_UINT32 ANTLR_BITSET_BITS = 64; + +/** How many bits in a nible of bits + */ +static const ANTLR_UINT32 ANTLR_BITSET_NIBBLE = 4; + +/** log2 of ANTLR3_BITSET_BITS 2^ANTLR3_BITSET_LOG_BITS = ANTLR3_BITSET_BITS + */ +static const ANTLR_UINT32 ANTLR_BITSET_LOG_BITS = 6; + +/** We will often need to do a mod operator (i mod nbits). + * For powers of two, this mod operation is the + * same as: + * - (i & (nbits-1)). + * + * Since mod is relatively slow, we use an easily + * precomputed mod mask to do the mod instead. + */ +static const ANTLR_UINT32 ANTLR_BITSET_MOD_MASK = ANTLR_BITSET_BITS - 1; + +template <class ImplTraits> +class BitsetList : public ImplTraits::AllocPolicyType +{ +public: + typedef typename ImplTraits::AllocPolicyType AllocPolicyType; + typedef typename ImplTraits::BitsetType BitsetType; + +private: + /// Pointer to the allocated array of bits for this bit set, which + /// is an array of 64 bit elements (of the architecture). If we find a + /// machine/C compiler that does not know anything about 64 bit values + /// then it should be easy enough to produce a ... [truncated message content] |
From: <ibr...@us...> - 2012-04-21 12:45:25
|
Revision: 4270 http://tora.svn.sourceforge.net/tora/?rev=4270&view=rev Author: ibre5041 Date: 2012-04-21 12:45:17 +0000 (Sat, 21 Apr 2012) Log Message: ----------- Sync with Tora trunk Modified Paths: -------------- branches/tora-trotl/src/CMakeLists.txt branches/tora-trotl/src/tobrowserfilterui.ui branches/tora-trotl/src/tocache.cpp branches/tora-trotl/src/toeditextensions.cpp branches/tora-trotl/src/toextract.cpp branches/tora-trotl/src/tohighlightedtext.cpp branches/tora-trotl/src/tomain.h branches/tora-trotl/src/tomodeleditor.cpp branches/tora-trotl/src/tooracleconnection.cpp branches/tora-trotl/src/toplsqltext.cpp branches/tora-trotl/src/toreport.cpp branches/tora-trotl/src/toreport.h branches/tora-trotl/src/toresultplan.cpp branches/tora-trotl/src/toresultplan.h branches/tora-trotl/src/tosession.cpp branches/tora-trotl/src/toteradataconnection.cpp branches/tora-trotl/src/totreewidget.cpp branches/tora-trotl/src/totreewidget.h branches/tora-trotl/src/toworksheet.cpp Modified: branches/tora-trotl/src/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/CMakeLists.txt 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/CMakeLists.txt 2012-04-21 12:45:17 UTC (rev 4270) @@ -246,8 +246,6 @@ # docklets docklets/toviewconnections.h docklets/toviewdirectory.h - docklets/tocodeoutline.h - docklets/toquerymodel.h # ) IF (ORACLE_FOUND) @@ -257,6 +255,12 @@ IF (POPPLER_QT4_FOUND) LIST(APPEND TORA_MOC_CLASSES pdfview/documentwidget.h pdfview/pdfviewwidget.h) ENDIF (POPPLER_QT4_FOUND) +IF (USE_EXPERIMENTAL) + LIST(APPEND TORA_MOC_CLASSES docklets/tocodeoutline.h) + IF(graphviz_FOUND) + LIST(APPEND TORA_MOC_CLASSES docklets/toquerymodel.h) + ENDIF(graphviz_FOUND) +ENDIF (USE_EXPERIMENTAL) SET(TORA_SOURCES # main.cpp @@ -433,9 +437,6 @@ # docklets docklets/toviewconnections.cpp docklets/toviewdirectory.cpp - docklets/tocodeoutline.cpp - docklets/toquerymodel.cpp - docklets/toastwalk.cpp # tooracletable.cpp ) @@ -456,6 +457,12 @@ IF (POPPLER_QT4_FOUND) LIST(APPEND TORA_SOURCES pdfview/pdfviewwidget.cpp pdfview/documentwidget.cpp) ENDIF (POPPLER_QT4_FOUND) +IF (USE_EXPERIMENTAL) + LIST(APPEND TORA_SOURCES docklets/tocodeoutline.cpp) + IF(graphviz_FOUND) + LIST (APPEND TORA_SOURCES docklets/toquerymodel.cpp docklets/toastwalk.cpp) + ENDIF(graphviz_FOUND) +ENDIF (USE_EXPERIMENTAL) # compiled in icons for windows IF (WIN32 AND MSVC) @@ -544,7 +551,28 @@ IF (POPPLER_QT4_FOUND) INCLUDE_DIRECTORIES(${POPPLER_QT4_INCLUDE_DIR}) + ENDIF (POPPLER_QT4_FOUND) +IF (USE_EXPERIMENTAL) + LIST(APPEND TORA_SOURCES + "parsing/tsqlparse.cpp" + "parsing/tsqlparseoracle.cpp" + "parsing/tplsqlparseoracle.cpp" + "parsing/tsqllexeroracle.cpp" + "parsing/error_handler.c" + "parsing/OracleSQLLexer.c" + "parsing/OracleSQLParser.c" + "parsing/OraclePLSQLLexer.c" + "parsing/OraclePLSQLParser.c" + ) + INCLUDE_DIRECTORIES( + "${CMAKE_CURRENT_SOURCE_DIR}/libantlr3c-3.3/include" + "${CMAKE_CURRENT_BINARY_DIR}/libantlr3c-3.3" + ) + IF(graphviz_FOUND) + INCLUDE_DIRECTORIES(${graphviz_INCLUDE_DIRECTORIES}) + ENDIF(graphviz_FOUND) +ENDIF (USE_EXPERIMENTAL) IF(graphviz_FOUND) INCLUDE_DIRECTORIES(${graphviz_INCLUDE_DIRECTORIES}) Modified: branches/tora-trotl/src/tobrowserfilterui.ui =================================================================== --- branches/tora-trotl/src/tobrowserfilterui.ui 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/tobrowserfilterui.ui 2012-04-21 12:45:17 UTC (rev 4270) @@ -422,5 +422,85 @@ </hint> </hints> </connection> + <connection> + <sender>StartWith</sender> + <signal>toggled(bool)</signal> + <receiver>String</receiver> + <slot>setFocus()</slot> + <hints> + <hint type="sourcelabel"> + <x>370</x> + <y>77</y> + </hint> + <hint type="destinationlabel"> + <x>326</x> + <y>109</y> + </hint> + </hints> + </connection> + <connection> + <sender>EndWith</sender> + <signal>toggled(bool)</signal> + <receiver>String</receiver> + <slot>setFocus()</slot> + <hints> + <hint type="sourcelabel"> + <x>370</x> + <y>77</y> + </hint> + <hint type="destinationlabel"> + <x>326</x> + <y>109</y> + </hint> + </hints> + </connection> + <connection> + <sender>Contains</sender> + <signal>toggled(bool)</signal> + <receiver>String</receiver> + <slot>setFocus()</slot> + <hints> + <hint type="sourcelabel"> + <x>370</x> + <y>77</y> + </hint> + <hint type="destinationlabel"> + <x>326</x> + <y>109</y> + </hint> + </hints> + </connection> + <connection> + <sender>CommaSeparate</sender> + <signal>toggled(bool)</signal> + <receiver>String</receiver> + <slot>setFocus()</slot> + <hints> + <hint type="sourcelabel"> + <x>370</x> + <y>77</y> + </hint> + <hint type="destinationlabel"> + <x>326</x> + <y>109</y> + </hint> + </hints> + </connection> + <connection> + <sender>RegExp</sender> + <signal>toggled(bool)</signal> + <receiver>String</receiver> + <slot>setFocus()</slot> + <hints> + <hint type="sourcelabel"> + <x>370</x> + <y>77</y> + </hint> + <hint type="destinationlabel"> + <x>326</x> + <y>109</y> + </hint> + </hints> + </connection> </connections> </ui> Modified: branches/tora-trotl/src/tocache.cpp =================================================================== --- branches/tora-trotl/src/tocache.cpp 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/tocache.cpp 2012-04-21 12:45:17 UTC (rev 4270) @@ -81,7 +81,9 @@ } else { return currState != FAILED && cacheState() >= waitState; } - + default: + assert(0); + return true; // NEVER reached, just prevent MSVC warning } //switch } Modified: branches/tora-trotl/src/toeditextensions.cpp =================================================================== --- branches/tora-trotl/src/toeditextensions.cpp 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/toeditextensions.cpp 2012-04-21 12:45:17 UTC (rev 4270) @@ -766,14 +766,18 @@ qApp->translate("toEditExtensionTool", "Indent Block"), &toEditExtensionsSingle::Instance(), SLOT(indentBlock())); +#ifndef Q_WS_MAC Indent->setShortcut(Qt::ALT + Qt::Key_Right); +#endif Deindent = edit->addAction( QIcon(QPixmap(const_cast<const char**>(deindent_xpm))), qApp->translate("toEditExtensionTool", "De-indent Block"), &toEditExtensionsSingle::Instance(), SLOT(deindentBlock())); +#ifndef Q_WS_MAC Deindent->setShortcut(Qt::ALT + Qt::Key_Left); +#endif Quote = edit->addAction(qApp->translate("toEditExtensionTool", "Quote Selection"), Modified: branches/tora-trotl/src/toextract.cpp =================================================================== --- branches/tora-trotl/src/toextract.cpp 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/toextract.cpp 2012-04-21 12:45:17 UTC (rev 4270) @@ -39,26 +39,18 @@ * * END_COMMON_COPYRIGHT_HEADER */ +#include "toextract.h" #include "utils.h" - #include "toconf.h" #include "toconnection.h" -#include "toextract.h" -#include <stdio.h> - -#include <qapplication.h> -#include <qlabel.h> +#include <QApplication> +#include <QLabel> #include <QProgressDialog> -#include <qdatetime.h> - +#include <QDateTime> +#include <QHostInfo> #include <QString> -#ifdef Q_OS_WIN32 -#include <winsock2.h> -#endif - - std::map<QString, toExtract::extractor *> *toExtract::Extractors; void toExtract::extractor::registerExtract(const QString &db, @@ -686,8 +678,6 @@ { if (!Heading) return QString::null; - char host[1024]; - gethostname(host, 1024); QString db = Connection.host(); if (db.length() && db != QString::fromLatin1("*")) @@ -705,7 +695,7 @@ "-- on: %6\n" "--\n"). arg(QString::fromLatin1(TOVERSION)). - arg(QString::fromLatin1(host)). + arg(QHostInfo::localHostName()). arg(db). arg(QString(Connection.provider())). arg(QString(Connection.version())). Modified: branches/tora-trotl/src/tohighlightedtext.cpp =================================================================== --- branches/tora-trotl/src/tohighlightedtext.cpp 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/tohighlightedtext.cpp 2012-04-21 12:45:17 UTC (rev 4270) @@ -1037,7 +1037,7 @@ /// } ///} } - catch (QString e) + catch (QString const &e) { TLOG(2,toDecorator,__HERE__) << "toHighlightedText::getCompletionList:" << e << std::endl; } Modified: branches/tora-trotl/src/tomain.h =================================================================== --- branches/tora-trotl/src/tomain.h 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/tomain.h 2012-04-21 12:45:17 UTC (rev 4270) @@ -83,7 +83,7 @@ * This class defines the main window for TOra application * * NOTE: all methods inherited from toMainWindow are marked - * with /*virtual* + * with "virtual" */ class toMain : public toMainWindow { Modified: branches/tora-trotl/src/tomodeleditor.cpp =================================================================== --- branches/tora-trotl/src/tomodeleditor.cpp 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/tomodeleditor.cpp 2012-04-21 12:45:17 UTC (rev 4270) @@ -1,4 +1,3 @@ - /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers @@ -369,21 +368,21 @@ void toModelEditor::changePosition(QModelIndex index) { - Current = index; - QVariant const &data = Model->data(Current, Qt::UserRole); - if(data.type() == QVariant::UserType) - { - toQValue::complexType *i = data.value<toQValue::complexType*>(); - setText(i->editData()); - return; - } + Current = index; + QVariant const &data = Model->data(Current, Qt::UserRole); + if(data.type() == QVariant::UserType && data.canConvert<toQValue::complexType*>() ) + { + toQValue::complexType *i = data.value<toQValue::complexType*>(); + setText(i->editData()); + return; + } - if(Editable) - setText(Model->data(Current, Qt::EditRole).toString()); - else - { - setText(Model->data(Current, Qt::DisplayRole).toString()); - } + if(Editable) + setText(Model->data(Current, Qt::EditRole).toString()); + else + { + setText(Model->data(Current, Qt::DisplayRole).toString()); + } } void toModelEditor::firstColumn() Modified: branches/tora-trotl/src/tooracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection.cpp 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/tooracleconnection.cpp 2012-04-21 12:45:17 UTC (rev 4270) @@ -614,6 +614,9 @@ class oracleConnection : public toConnection::connectionImpl { + QString version_raw; + QString version_frm; + QString connectString(void) { QString ret; @@ -887,6 +890,7 @@ virtual QString version(toConnectionSub *sub) { + if (!version_raw.isNull()) return version_raw; oracleSub *conn = oracleConv(sub); try { @@ -899,13 +903,12 @@ version >> buffer; QStringList vl = QString(buffer).split('.'); QString ve; - QString verrj; for ( QStringList::iterator vi = vl.begin(); vi != vl.end(); ++vi ) { ve = *vi; - verrj += ve.rightJustified(2, '0'); + version_raw += ve.rightJustified(2, '0'); } - return verrj; + return version_raw; } } catch (...) @@ -915,6 +918,30 @@ return QString(); } + virtual QString versionfrm(toConnectionSub *sub) + { + if (!version_frm.isNull()) return version_frm; + oracleSub *conn = oracleConv(sub); + try + { + otl_stream version(1, + "SELECT version FROM product_component_version where product like 'Oracle%'", + *(conn->Connection)); + if (!version.eof()) + { + char buffer[1024]; + version >> buffer; + version_frm = QString::fromLatin1(buffer); + return version_frm; + } + } + catch (...) + { + // Ignore any errors here + } + return QString(); + } + virtual queryImpl *createQuery(toQuery *query, toConnectionSub *sub) { return new oracleQuery(query, oracleConv(sub)); Modified: branches/tora-trotl/src/toplsqltext.cpp =================================================================== --- branches/tora-trotl/src/toplsqltext.cpp 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/toplsqltext.cpp 2012-04-21 12:45:17 UTC (rev 4270) @@ -238,7 +238,7 @@ sql.append(schema); sql.append(QString::fromLatin1(".")); sql.append(object); - sql.append(QString::fromLatin1(" ")); + //sql.append(QString::fromLatin1(" ")); // TS 2012-01-19 There is an initial space at the start of str.mid(offset) sql.append(str.mid(offset)); // Remove empty space and the slash at the end of statement. @@ -274,8 +274,7 @@ try { - if (t == toPLSQLText::Warning) // TODO: TS 2009-12-21 is it actually compiling if - // button "compile (without warnings) was pressed? + if (t == toPLSQLText::Warning) { QString alter("ALTER %1 \"%2\".\"%3\" COMPILE "); if (body) @@ -398,8 +397,40 @@ toQuery lines(conn, SQLReadSource, Schema, Object, Type); QString str = "CREATE OR REPLACE "; - while (!lines.eof()) - str += lines.readValue(); + bool firstLine = true; // first line of code returned, this line contains program unit type, name etc. + while (!lines.eof()) { + if (firstLine) { + /* Process the first line of code as the code returned may contain some extra spaces after + * unit type and actual name which causes irritations when saving code to code versioning systems + */ + QString s = lines.readValue(); + int pos; + if (s.startsWith("PACKAGE BODY", Qt::CaseInsensitive)) { + pos = 13; + } + else if (s.startsWith("PACKAGE", Qt::CaseInsensitive)) { + pos = 8; + } + else if (s.startsWith("PROCEDURE", Qt::CaseInsensitive)) { + pos = 10; + } + else if (s.startsWith("FUNCTION", Qt::CaseInsensitive)) { + pos = 9; + } + else if (s.startsWith("TYPE BODY", Qt::CaseInsensitive)) { + pos = 10; + } + else if (s.startsWith("TYPE", Qt::CaseInsensitive)) { + pos = 5; + } + while (s.at(pos) == ' ') + s.remove(pos, 1); // remove all extra spaces between unit type and unit name + str += s; + firstLine = false; + } else { + str += lines.readValue(); + } + } str += "\n/"; setText(str); setModified(false); Modified: branches/tora-trotl/src/toreport.cpp =================================================================== --- branches/tora-trotl/src/toreport.cpp 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/toreport.cpp 2012-04-21 12:45:17 UTC (rev 4270) @@ -39,21 +39,17 @@ * * END_COMMON_COPYRIGHT_HEADER */ +#include "toreport.h" #include "utils.h" - #include "toconf.h" -#include "toconnection.h" + #include "tohtml.h" #include "toextract.h" -#include "toreport.h" -#include <qapplication.h> -#include <qdatetime.h> -#ifdef Q_OS_WIN32 -#include <winsock2.h> -#endif +#include <QApplication> +#include <QDateTime> +#include <QHostInfo> - static bool SameContext(const QString &str, const QString &str2) { if (str.startsWith(str2)) @@ -367,9 +363,6 @@ QString toGenerateReport(toConnection &conn, std::list<QString> &desc) { - char host[1024]; - gethostname(host, 1024); - QString db = conn.host(); if (db.length() && db != QString::fromLatin1("*")) db += QString::fromLatin1(":"); @@ -386,7 +379,7 @@ "<TR><TD VALIGN=top>On:</TD><TD VALIGN=top>%6</TD></TR>\n" "</TABLE>\n"). arg(QString::fromLatin1(TOVERSION)). - arg(QString::fromLatin1(host)). + arg(QHostInfo::localHostName()). arg(db). arg(QString(conn.provider())). arg(QString(conn.version())). Modified: branches/tora-trotl/src/toreport.h =================================================================== --- branches/tora-trotl/src/toreport.h 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/toreport.h 2012-04-21 12:45:17 UTC (rev 4270) @@ -43,6 +43,7 @@ #define TOREPORT_H #include "config.h" +#include "toconnection.h" #include <list> #include <algorithm> Modified: branches/tora-trotl/src/toresultplan.cpp =================================================================== --- branches/tora-trotl/src/toresultplan.cpp 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/toresultplan.cpp 2012-04-21 12:45:17 UTC (rev 4270) @@ -66,45 +66,59 @@ oracleSetup(); } +static toSQL SQLVSQLChildSel("toResultPlan:VSQLChildSel", + "SELECT distinct to_char(child_number)||' ('||to_char(plan_hash_value)||')' cn_disp, child_number, sql_id, plan_hash_value\n" + "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1'\n" + "ORDER BY child_number", + "Get list of child plans for cursor", + "1000"); + +static toSQL SQLVSQLChildSel9("toResultPlan:VSQLChildSel", + "SELECT distinct to_char(child_number) cn_disp, child_number, null sql_id, null plan_hash_value\n" + "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1'\n" + "ORDER BY child_number", + "", + "0900"); + static toSQL SQLViewVSQLPlan("toResultPlan:ViewVSQLPlan", "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" - " io_cost,Bytes,Cardinality,\n" - " partition_start,partition_stop,temp_space,time\n" - "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = 0" + " io_cost,Bytes,Cardinality,partition_start,partition_stop,\n" + " temp_space,time,access_predicates,filter_predicates\n" + "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = %2\n" "ORDER BY NVL(Parent_ID,0),ID", "Get the contents of SQL plan from V$SQL_PLAN.", "1000"); static toSQL SQLViewVSQLPlan92("toResultPlan:ViewVSQLPlan", "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" - " io_cost,Bytes,Cardinality,\n" - " partition_start,partition_stop,temp_space,null time\n" - "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = 0" + " io_cost,Bytes,Cardinality,partition_start,partition_stop,\n" + " temp_space,null time,access_predicates,filter_predicates\n" + "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = %2\n" "ORDER BY NVL(Parent_ID,0),ID", "", "0902"); static toSQL SQLViewVSQLPlan9("toResultPlan:ViewVSQLPlan", "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" - " io_cost,Bytes,Cardinality,\n" - " partition_start,partition_stop,null temp_space,null time\n" - "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = 0" + " io_cost,Bytes,Cardinality,partition_start,partition_stop,\n" + " null temp_space,null time,access_predicates,filter_predicates\n" + "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = %2\n" "ORDER BY NVL(Parent_ID,0),ID", "", "0900"); static toSQL SQLViewPlan("toResultPlan:ViewPlan", "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" - " io_cost,Bytes,Cardinality,\n" - " partition_start,partition_stop,temp_space,time\n" + " io_cost,Bytes,Cardinality,partition_start,partition_stop,\n" + " temp_space,time,access_predicates,filter_predicates\n" " FROM %1 WHERE Statement_ID = '%2' ORDER BY NVL(Parent_ID,0),ID", "Get the contents of a plan table. Observe the %1 and %2 which must be present. Must return same columns", "1000"); static toSQL SQLViewPlan8("toResultPlan:ViewPlan", "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" - " io_cost,Bytes,Cardinality,\n" - " partition_start,partition_stop,' ',' '\n" + " io_cost,Bytes,Cardinality,partition_start,partition_stop,\n" + " ' ',' ',' 'access_predicates,' 'filter_predicates\n" " FROM %1 WHERE Statement_ID = '%2' ORDER BY NVL(Parent_ID,0),ID", "", "0800"); @@ -126,27 +140,24 @@ setAllColumnsShowFocus(true); setSorting( -1); setRootIsDecorated(true); - addColumn(QString::fromLatin1("#")); - addColumn(tr("Operation")); - addColumn(tr("Options")); - addColumn(tr("Object name")); - addColumn(tr("Mode")); - addColumn(tr("Cost")); - addColumn(tr("%CPU")); - addColumn(tr("Bytes")); - addColumn(tr("Rows")); - addColumn(tr("TEMP Space")); - addColumn(tr("Time")); - addColumn(tr("Startpartition")); - addColumn(tr("Endpartition")); - setColumnAlignment(5, Qt::AlignRight); - setColumnAlignment(6, Qt::AlignRight); - setColumnAlignment(7, Qt::AlignRight); - setColumnAlignment(8, Qt::AlignRight); - setColumnAlignment(9, Qt::AlignRight); - setColumnAlignment(10, Qt::AlignRight); - setColumnAlignment(11, Qt::AlignRight); - setColumnAlignment(12, Qt::AlignRight); + + QTreeWidgetItem *header = new QTreeWidgetItem(); + header->setText(0, QString::fromLatin1("#")); + header->setText(1,tr("Operation")); + header->setText(2,tr("Options")); + header->setText(3,tr("Object name")); + header->setText(4,tr("Mode")); + header->setText(5,tr("Cost")); + header->setText(6,tr("%CPU")); + header->setText(7,tr("Bytes")); + header->setText(8,tr("Rows")); + header->setText(9,tr("Time")); + header->setText(10,tr("Access pred.")); + header->setText(11,tr("Filter pred.")); + header->setText(12,tr("TEMP Space")); + header->setText(13,tr("Startpartition")); + header->setText(14,tr("Endpartition")); + setHeaderItem(header); } // Connects query signals to appropriate slots. Created just in order not to repeat code... @@ -177,7 +188,7 @@ QString sql = toShift(Statements); if (sql.isNull()) { - return ; + return ; } if (sql.length() > 0 && sql.at(sql.length() - 1).toLatin1() == ';') sql = sql.mid(0, sql.length() - 1); @@ -336,20 +347,27 @@ } else if (sql.startsWith(QString::fromLatin1("SGA:"))) { - QString Address = sql.mid(4); + Ident = sql.mid(4); toConnection &conn = connection(); - toQList par; - Query = new toEventQuery(conn, toQuery::Background, - toSQL::string(SQLViewVSQLPlan, conn).arg(Address), - par); - connectSlotsAndStart(); - Reading = true; + LastTop = NULL; Parents.clear(); Last.clear(); TopItem = new toResultViewItem(this, NULL, QString::fromLatin1("V$SQL_PLAN:")); - TopItem->setText(1, toSQLString(conn, Address).left(50).trimmed()); - } + QString queryText = toSQLString(conn, Ident); + TopItem->setText(1, queryText.left(50).trimmed()); + TopItem->setToolTip(1, queryText); + + CursorChildSel = new toResultCombo(this, "toResultPlan"); + CursorChildSel->setSelectionPolicy(toResultCombo::First); + try + { + CursorChildSel->query(toSQL::string(SQLVSQLChildSel, conn).arg(Ident)); + } + TOCATCH; + setItemWidget(TopItem, 3, CursorChildSel); + connect(CursorChildSel, SIGNAL(done()), this, SLOT(ChildComboReady())); //Wait for cursor children combo to fill + } else { TopItem = NULL; @@ -387,6 +405,8 @@ QString endpartition = Query->readValue(); QString tempspace = Query->readValue().toSIsize(); QString time = Query->readValue(); + QString accesspred = Query->readValue(); + QString filterpred = Query->readValue(); toResultViewItem *item; if (!parentid.isNull() && Parents[parentid]) @@ -432,13 +452,24 @@ item->setText(3, object); item->setText(4, optimizer); item->setText(5, cost); + item->setTextAlignment (5,Qt::AlignRight); item->setText(6, cpupct); + item->setTextAlignment (6,Qt::AlignRight); item->setText(7, bytes); + item->setTextAlignment (7,Qt::AlignRight); item->setText(8, cardinality); - item->setText(9, tempspace); - item->setText(10, time); - item->setText(11, startpartition); - item->setText(12, endpartition); + item->setTextAlignment (8,Qt::AlignRight); + item->setText(9, time); + item->setText(10, accesspred); + item->setToolTip(10, accesspred); + item->setSizeHint(10, QSize(120,0)); + item->setText(11, filterpred); + item->setToolTip(11, filterpred); + item->setSizeHint(11, QSize(120,0)); + item->setText(12, tempspace); + item->setTextAlignment (12,Qt::AlignRight); + item->setText(13, startpartition); + item->setText(14, endpartition); Parents[id] = item; } expandAll(); @@ -452,6 +483,51 @@ } } +void toResultPlan::ChildComboReady() +{ + toConnection &conn = connection(); + QStringList cur_sel = CursorChildSel->itemData(0).toStringList(); + QString ChildNumber = cur_sel.at(0); + QString SInfo = QString::fromLatin1("V$SQL_PLAN: %1\nChild: %2 SQL_ID: %3").arg(cur_sel.at(2)).arg(ChildNumber).arg(cur_sel.at(1)); + TopItem->setText(0,SInfo); + connect(CursorChildSel, SIGNAL(currentIndexChanged (int) ), this, SLOT(ChildComboChanged(int))); + + toQList par; + Query = new toEventQuery(conn, toQuery::Background, + toSQL::string(SQLViewVSQLPlan, conn).arg(Ident).arg(ChildNumber), + par); + connectSlotsAndStart(); + Reading = true; +} + +void toResultPlan::ChildComboChanged(int NewIndex) +{ + if (NewIndex > -1 ) + { + toConnection &conn = connection(); + QStringList cur_sel = CursorChildSel->itemData(NewIndex).toStringList(); + QString ChildNumber = cur_sel.at(0); + QString SInfo = QString::fromLatin1("V$SQL_PLAN: %1\nChild: %2 SQL_ID: %3").arg(cur_sel.at(2)).arg(ChildNumber).arg(cur_sel.at(1)); + TopItem->setText(0,SInfo); + + /* + std::map <QString, toTreeWidgetItem *>::reverse_iterator it; + for (it=Parents.rbegin(); it!=Parents.rend(); it++) {printf("Aqq %s\n",it->first.toAscii().constData()); delete it->second;} + */ + TopItem->deleteChildren(); + LastTop = NULL; + Parents.clear(); + Last.clear(); + toQList par; + Query = new toEventQuery(conn, toQuery::Background, + toSQL::string(SQLViewVSQLPlan, conn).arg(Ident).arg(ChildNumber), + par); + connectSlotsAndStart(); + Reading = true; + } +} + + void toResultPlan::queryDone() { delete Query; @@ -470,6 +546,10 @@ connectSlotsAndStart(); Reading = true; } + else if (sql().startsWith(QString::fromLatin1("SGA:"))) + { + return; + } else { QString chkPoint(toConfigurationSingle::Instance().planCheckpoint()); Modified: branches/tora-trotl/src/toresultplan.h =================================================================== --- branches/tora-trotl/src/toresultplan.h 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/toresultplan.h 2012-04-21 12:45:17 UTC (rev 4270) @@ -45,6 +45,7 @@ #include "config.h" #include "tosqlparse.h" #include "toresultview.h" +#include "toresultcombo.h" #include <map> #include <stdio.h> @@ -69,6 +70,7 @@ bool Reading; // true when reading the plan, false when setting up the plan toEventQuery *Query; QString User; + toResultCombo *CursorChildSel; //Used for Oracle for V$SQL_PLAN to choose plans among cursor children void checkException(const QString &); void oracleSetup(void); @@ -88,6 +90,7 @@ /** Reimplemented for internal reasons. If you prepend "SAVED:" a saved plan is read * with the identified_by set to the string following the initial "SAVED:" string. + * If you prepend SGA: the rest is interpreted as cursor address:hash_value in V$SQL_PLAN. */ virtual void query(const QString &sql, const toQList ¶m); /** Reimplemented for internal reasons. @@ -103,6 +106,8 @@ private slots: void poll(); void queryDone(); + void ChildComboReady(); + void ChildComboChanged(int NewIndex); }; #endif Modified: branches/tora-trotl/src/tosession.cpp =================================================================== --- branches/tora-trotl/src/tosession.cpp 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/tosession.cpp 2012-04-21 12:45:17 UTC (rev 4270) @@ -692,17 +692,22 @@ if (toIsOracle(connection())) { QString extra; - if (Select->currentIndex() == 0) + switch(Select->currentIndex()) + { + case 0: extra = " AND a.Type != 'BACKGROUND' AND a.Status != 'INACTIVE'\n"; - else if (Select->currentIndex() == 1) - ; // Do nothing - else if (Select->currentIndex() == 2) + break; + case 1: + break; + case 2: extra = " AND a.Type != 'BACKGROUND'\n"; - else if (Select->currentIndex() == 3) + break; + case 3: extra = " AND a.SchemaName NOT IN ('SYS','SYSTEM')\n"; - else + break; + default: extra = " AND a.SchemaName = '" + Select->currentText() + "'\n"; - + } sql = sql.arg(extra); } Modified: branches/tora-trotl/src/toteradataconnection.cpp =================================================================== --- branches/tora-trotl/src/toteradataconnection.cpp 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/toteradataconnection.cpp 2012-04-21 12:45:17 UTC (rev 4270) @@ -546,7 +546,7 @@ if(callServer(request, DBFABT) != EM_OK) throw QString::fromLatin1("Error aborting request"); } - catch(QString err) + catch(QString const &err) { qDebug() << "Expected error in abort" << err; } Modified: branches/tora-trotl/src/totreewidget.cpp =================================================================== --- branches/tora-trotl/src/totreewidget.cpp 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/totreewidget.cpp 2012-04-21 12:45:17 UTC (rev 4270) @@ -654,7 +654,19 @@ QTreeWidgetItem::setFlags(fl); } +void toTreeWidgetItem::deleteChildren() +{ + QList<QTreeWidgetItem*> c_list = takeChildren(); + toTreeWidgetItem* it; + while (!c_list.isEmpty()) + { + it = (toTreeWidgetItem*)c_list.takeFirst(); + it->deleteChildren(); + delete it; + } +} + void toTreeWidgetItem::moveItem(toTreeWidgetItem *after) { return; // todo Modified: branches/tora-trotl/src/totreewidget.h =================================================================== --- branches/tora-trotl/src/totreewidget.h 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/totreewidget.h 2012-04-21 12:45:17 UTC (rev 4270) @@ -765,6 +765,11 @@ * */ virtual void moveItem(toTreeWidgetItem *after); + + /** + * Delete all item children + */ + virtual void deleteChildren(); /** Modified: branches/tora-trotl/src/toworksheet.cpp =================================================================== --- branches/tora-trotl/src/toworksheet.cpp 2012-04-20 19:01:30 UTC (rev 4269) +++ branches/tora-trotl/src/toworksheet.cpp 2012-04-21 12:45:17 UTC (rev 4270) @@ -544,7 +544,7 @@ connect(ResultTab, SIGNAL(currentChanged(int)), this, SLOT(changeResult(int))); - if (autoLoad) + if (autoLoad && !toConfigurationSingle::Instance().wsAutoLoad().isEmpty()) { Editor->editOpen(toConfigurationSingle::Instance().wsAutoLoad()); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-04-25 18:16:44
|
Revision: 4285 http://tora.svn.sourceforge.net/tora/?rev=4285&view=rev Author: ibre5041 Date: 2012-04-25 18:16:33 +0000 (Wed, 25 Apr 2012) Log Message: ----------- Herans patch temporarily removed Modified Paths: -------------- branches/tora-trotl/src/toconnection.cpp branches/tora-trotl/src/toconnection.h branches/tora-trotl/src/tooracleconnection_trotl.cpp branches/tora-trotl/src/toqvalue.cpp branches/tora-trotl/src/toqvalue.h branches/tora-trotl/src/toresult.cpp branches/tora-trotl/src/toresult.h branches/tora-trotl/src/toresultdata.cpp branches/tora-trotl/src/toresultmodel.cpp branches/tora-trotl/src/toresultmodel.h branches/tora-trotl/src/toresulttableview.cpp branches/tora-trotl/src/toresulttableview.h branches/tora-trotl/src/toresulttableviewedit.cpp branches/tora-trotl/src/toresulttableviewedit.h branches/tora-trotl/src/tosql.h branches/tora-trotl/src/tounittest.cpp Modified: branches/tora-trotl/src/toconnection.cpp =================================================================== --- branches/tora-trotl/src/toconnection.cpp 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/toconnection.cpp 2012-04-25 18:16:33 UTC (rev 4285) @@ -311,10 +311,6 @@ return ret; } -std::list<QString> toConnection::primaryKeys(){ - return Connection->primaryKeys(); -} - void toConnection::cancelAll(void) { ConnectionPool->cancelAll(); @@ -463,7 +459,15 @@ if (version) { - if (!Version.isEmpty()) + + if (toIsOracle(*this)) + { + PoolPtr sub(ConnectionPool); + ret += QString::fromLatin1(" ["); + ret += Connection->versionfrm(*sub); + ret += QString::fromLatin1("]"); + } + else if (!Version.isEmpty()) { ret += QString::fromLatin1(" ["); ret += Version; Modified: branches/tora-trotl/src/toconnection.h =================================================================== --- branches/tora-trotl/src/toconnection.h 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/toconnection.h 2012-04-25 18:16:33 UTC (rev 4285) @@ -233,6 +233,10 @@ */ virtual QString version(toConnectionSub *) = 0; + /** Get formated string of the version of the database connected to. + */ + virtual QString versionfrm(toConnectionSub *sub) {return version(sub);} + /** Return a string representation to address an object. * @param name The name to be quoted. * @param quoteLowercase Enclose in quotes when identifier has lowercase letters @@ -301,12 +305,6 @@ * @param sql SQL to parse */ virtual void parse(toConnectionSub *conn, const QString &sql); - /** Get a list for primary keys - * - */ - virtual std::list<QString> primaryKeys(){ - return std::list<QString>(); - } }; private: @@ -703,10 +701,6 @@ */ std::list<QString> running(void); - /** Get all necessary primary keys for row manipulation. - */ - std::list<QString> primaryKeys(); - friend class toQuery; friend class toConnectionPool; }; // toConnection Modified: branches/tora-trotl/src/tooracleconnection_trotl.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection_trotl.cpp 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/tooracleconnection_trotl.cpp 2012-04-25 18:16:33 UTC (rev 4285) @@ -87,12 +87,18 @@ static int toMaxLong = toConfigurationSingle::Instance().maxLong(); -//static toSQL SQLComment("toOracleConnection:Comments", -// "SELECT Column_name,Comments FROM sys.All_Col_Comments\n" -// " WHERE Owner = :f1<char[100]>\n" -// " AND Table_Name = :f2<char[100]>", -// "Display column comments"); +//PRODUCT_COMPONENT_VERSION view exists from Oracle7 at least and have grant select to public privs +static toSQL SQLDBVersion("toOracleConnection:DBVersion", + "SELECT version FROM PRODUCT_COMPONENT_VERSION\n" + " WHERE product like 'Oracle%'", + "Read Oracle RDBMS Version"); +static toSQL SQLComment("toOracleConnection:Comments", + "SELECT Column_name,Comments FROM sys.All_Col_Comments\n" + " WHERE Owner = :f1<char[100]>\n" + " AND Table_Name = :f2<char[100]>", + "Display column comments"); + //static toSQL SQLMembers("toOracleConnection:Members", // "SELECT object_name,overload,argument_name,data_type\n" // " FROM sys.All_Arguments\n" @@ -924,9 +930,11 @@ { ::trotl::OciEnv &_env; QString connectString(void); - std::list<QString> RowIDs; - - static oracleSub *oracleConv(toConnectionSub *sub) + + QString version_raw; + QString version_frm; + + oracleSub *oracleConv(toConnectionSub *sub) { oracleSub *conn = dynamic_cast<oracleSub *>(sub); if (!conn) @@ -936,10 +944,7 @@ public: oracleConnectionImpl(toConnection *conn, ::trotl::OciEnv &env) : toConnection::connectionImpl(conn), _env(env) - { - RowIDs.push_back("ROWID"); - RowIDs.push_back("ORA_ROWSCN"); - } + { } /** Return a string representation to address an object. * Checks if identifier has illegal characters, starts with digit, is a reserved @@ -1200,9 +1205,24 @@ virtual QString version(toConnectionSub *sub) { + if (!version_raw.isNull()) return version_raw; oracleSub *connp = oracleConv(sub); try { + toQuery dbversion(connection(), SQLDBVersion); + if (!dbversion.eof()) + { + QString ver = dbversion.readValue(); + QStringList vl = QString(ver).split('.'); + QString ve; + for ( QStringList::iterator vi = vl.begin(); vi != vl.end(); ++vi ) + { + ve = *vi; + version_raw += ve.rightJustified(2, '0'); + } + return version_raw; + } +/* ::trotl::OciLogin &login( *(connp->_login) ); ::std::stringstream version; version << login._server.versionNumber() << "." @@ -1212,8 +1232,9 @@ << login._server.portUpdateNumber(); return QString::fromLatin1(version.str().c_str()); +*/ } - catch (::trotl::OciException e) { + catch (::trotl::OciException const &e) { TLOG(0,toDecorator,__HERE__) << e.what() << std::endl; } catch (...) @@ -1225,6 +1246,31 @@ return QString::null; // ... so changed to this. } + virtual QString versionfrm(toConnectionSub *sub) + { + if (!version_frm.isNull()) return version_frm; + oracleSub *connp = oracleConv(sub); + try + { + toQuery dbversion(connection(), SQLDBVersion); + if (!dbversion.eof()) + { + version_frm = dbversion.readValue(); + return version_frm; + } + } + catch (::trotl::OciException const &e) { + TLOG(0,toDecorator,__HERE__) << e.what() << std::endl; + } + catch (...) + { + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; + // Ignore any errors here + } + //return QString::QString(); // TS 2010-12-05 couldn't compile with this... + return QString::null; // ... so changed to this. + } + virtual queryImpl *createQuery(toQuery *query, toConnectionSub *sub) { return new oracleQuery(query, oracleConv(sub)); @@ -1276,9 +1322,6 @@ ThrowException(exc); } } - virtual std::list<QString> primaryKeys(){ - return RowIDs; - } }; // class oracleConnection : public toConnection::connectionImpl Modified: branches/tora-trotl/src/toqvalue.cpp =================================================================== --- branches/tora-trotl/src/toqvalue.cpp 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/toqvalue.cpp 2012-04-25 18:16:33 UTC (rev 4285) @@ -55,32 +55,33 @@ static int NumberDecimals; -toQValue::toQValue(int i):Modified(false) +toQValue::toQValue(int i) { Value = i; } -toQValue::toQValue(double i):Modified(false) +toQValue::toQValue(double i) { Value = i; } -toQValue::toQValue(qlonglong d):Modified(false) +toQValue::toQValue(qlonglong d) { Value = d; } -toQValue::toQValue(qulonglong d):Modified(false) +toQValue::toQValue(qulonglong d) { Value = d; } -toQValue::toQValue(toRowDesc d):Modified(false) +toQValue::toQValue(toRowDesc d) { Value.setValue(d); } -toQValue::toQValue(const toQValue ©):Value(copy.Value),OldValue(copy.OldValue),Modified(copy.Modified) +toQValue::toQValue(const toQValue ©) { + Value = copy.Value; /** Be destructive only if complexType is held * There should be no copying of data read from a query, * but toQValue is also used for query parameters(toQList and others) @@ -93,8 +94,6 @@ const toQValue &toQValue::operator = (const toQValue & copy) { Value = copy.Value; - OldValue = copy.OldValue; - Modified = copy.Modified; /** Be destructive only if complexType is held * There should be no copying of data read from a query, * but toQValue is also used for query parameters(toQList and others) @@ -105,12 +104,12 @@ return *this; } -toQValue::toQValue(const QString &str):Modified(false) +toQValue::toQValue(const QString &str) { Value = str; } -toQValue::toQValue():Modified(false) +toQValue::toQValue() { } Modified: branches/tora-trotl/src/toqvalue.h =================================================================== --- branches/tora-trotl/src/toqvalue.h 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/toqvalue.h 2012-04-25 18:16:33 UTC (rev 4285) @@ -64,8 +64,7 @@ */ class toQValue { - QVariant Value, OldValue; - bool Modified; + QVariant Value; public: /** @@ -221,30 +220,6 @@ QString toSIsize() const; - int updateNewValue(toQValue value){ - if (Value.type() == QVariant::UserType) - return false; - if(!Modified){ - Modified=true; - OldValue=Value; - } - if(value.isComplexType()) - return false; - Value=value.Value; - return true; - } - - void popOldValue(){ - if(Modified){ - Modified=false; - Value=OldValue; - } - } - - bool isModified() const{ - return Modified; - } - /** Set numberformat. * @param format 0 = Default, 1 = Scientific, 2 = Fixed Decimals * @param decimals Number on decimals for fixed decimals. Modified: branches/tora-trotl/src/toresult.cpp =================================================================== --- branches/tora-trotl/src/toresult.cpp 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/toresult.cpp 2012-04-25 18:16:33 UTC (rev 4285) @@ -146,6 +146,7 @@ toQList params; query(sql, (const toQList)params); } + void toResult::query(const toSQL &sql) { setSQLName(sql.name()); @@ -162,12 +163,9 @@ setHandle(false); } } + void toResult::query(const toSQL &sql, const toQList &par) { - query(sql,par, std::list<QString>() ); -} -void toResult::query(const toSQL &sql, const toQList &par, const std::list<QString> priKeys) -{ setSQLName(sql.name()); FromSQL = true; try @@ -188,6 +186,7 @@ // TLOG(2,toDecorator,__HERE__) << "setSQL" << sql.name(); setSQLName(sql.name()); FromSQL = true; + try { // TLOG(2,toDecorator,__HERE__) << "setSQL 1"; Modified: branches/tora-trotl/src/toresult.h =================================================================== --- branches/tora-trotl/src/toresult.h 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/toresult.h 2012-04-25 18:16:33 UTC (rev 4285) @@ -98,7 +98,6 @@ bool DisableTab; protected: - std::list<QString> PriKeys; /** Set parameters of last query. */ void setParams(const toQList &par) @@ -224,11 +223,6 @@ * @param sql New sql. * @see setSQL */ - void query(const toSQL &sql, const toQList &par, const std::list<QString> priKeys); - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ void query(const toSQL &sql, const toQList &par); /** Get SQL to execute */ Modified: branches/tora-trotl/src/toresultdata.cpp =================================================================== --- branches/tora-trotl/src/toresultdata.cpp 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/toresultdata.cpp 2012-04-25 18:16:33 UTC (rev 4285) @@ -206,12 +206,8 @@ filterAct->setChecked(filter); toConnection &conn = connection(); - std::list<QString> priKeys = conn.primaryKeys(); - SQL = "SELECT "; - std::list<QString>::iterator ite; - for(ite=priKeys.begin();ite!=priKeys.end();ite++) - SQL = SQL + *ite + ","; - SQL = SQL + "%2.* FROM %1.%2"; + + SQL = "SELECT * FROM %1.%2"; SQL = SQL.arg(conn.quote(Owner)).arg(conn.quote(Table)); bool where = false; @@ -229,7 +225,7 @@ SQL += Order[FilterName]; } - Edit->query(SQL, params, priKeys); + Edit->query(SQL, params); } void toResultData::clearData() Modified: branches/tora-trotl/src/toresultmodel.cpp =================================================================== --- branches/tora-trotl/src/toresultmodel.cpp 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/toresultmodel.cpp 2012-04-25 18:16:33 UTC (rev 4285) @@ -48,10 +48,8 @@ #include "toqvalue.h" #include "toeventquery.h" -#include<QDebug> toResultModel::toResultModel(toEventQuery *query, - std::list<QString> priKeys, QObject *parent, bool edit, bool read) @@ -70,8 +68,6 @@ Query = query; Query->setParent(this); - PriKeys=priKeys; - connect(query, SIGNAL(descriptionAvailable()), this, @@ -112,6 +108,7 @@ CurrRowKey = 1; Query = 0; + setSupportedDragActions(Qt::CopyAction); // Manually add two columns (first one will be invisible) @@ -381,14 +378,12 @@ void toResultModel::clearStatus() { // Go through all records and set their status to be existed - for(RowList::iterator ite=Rows.begin();ite!=Rows.end();ite++) + for(QList<Row>::iterator ite=Rows.begin();ite!=Rows.end();ite++) { toRowDesc rowDesc = ite->at(0).getRowDesc(); if(rowDesc.status==REMOVED) { ite=Rows.erase(ite); - if(ite==Rows.end()) - break; } else if(rowDesc.status!=EXISTED) { @@ -608,10 +603,10 @@ if (!index.isValid()) return QVariant(); - if (index.row() > Rows.size() - 1 || index.column() > Headers.size() - PriKeys.size() - 1) + if (index.row() > Rows.size() - 1 || index.column() > Headers.size() - 1) return QVariant(); - toQValue const &data = Rows.at(index.row()).at(index.column()+PriKeys.size()); + toQValue const &data = Rows.at(index.row()).at(index.column()); toRowDesc rowDesc=Rows[index.row()][0].getRowDesc(); QFont fontRet; @@ -677,11 +672,13 @@ if (index.column() == 0) return false; // can't change number column - if (index.row() > Rows.size() - 1 || index.column() > Headers.size() - PriKeys.size() - 1) + if (index.row() > Rows.size() - 1 || index.column() > Headers.size() - 1) return false; Row &row = Rows[index.row()]; + Row oldRow = row; // keep old version toQValue newValue = toQValue::fromVariant(_value); + toRowDesc rowDesc = Rows.at(index.row())[0].getRowDesc(); if (rowDesc.status == EXISTED && !(row[index.column()] == newValue)) { @@ -689,17 +686,10 @@ rowDesc.status = MODIFIED; Rows[index.row()][0] = toQValue(rowDesc); } - if(PriKeys.size()==0){ - // If no prikey is used, data is recorded in change list - Row oldRow = row; // keep old version - row[index.column()+PriKeys.size()] = newValue; + row[index.column()] = newValue; + // for writing to the database emit columnChanged(index, newValue, oldRow); - }else{ - if(!row[index.column()+PriKeys.size()].updateNewValue(newValue)) - return false; - qDebug()<<"Value is changed from "<<row[index.column()+PriKeys.size()]<<" to "<<newValue<<"At "<<index; - } // for the view emit dataChanged(index, index); @@ -751,7 +741,7 @@ return QVariant(); if (role == Qt::DisplayRole) - return Headers[section+PriKeys.size()].name; + return Headers[section].name; else return QVariant(); } @@ -848,7 +838,7 @@ int toResultModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent); - return Headers.size()-PriKeys.size(); + return Headers.size(); } @@ -1010,128 +1000,3 @@ { return Rows; } - -void toResultModel::commitUpdate(toConnection &conn, const Row &row, unsigned int &updated){ - QString sql = QString("UPDATE %1.%2 SET ").arg(conn.quote(Owner)).arg(conn.quote(Table)); - int num = 0; - toQList args; - for (int i = PriKeys.size() + 1; i < Headers.size(); i++) { - if (row[i].isModified()) { - // Only append columns that is not null - if (num > 0) { - sql += ','; - } - num++; - // Construct place holder - sql += conn.quote(Headers[i].name)+"=:f"+QString::number(num); - - if (row[i].isBinary()) { - if (Headers[i].datatype.toUpper().contains("LOB")) - sql += ("<blob,in>"); - else - sql += ("<raw_long,in>"); - } else { - if (Headers[i].datatype.toUpper().contains("LOB")) - sql += ("<varchar_long,in>"); - else - sql += ("<char[4000],in>"); - } - // Construct value list - toPush(args, row[i]); - } - } - sql +=" WHERE "; - std::list<QString>::iterator ite; - int i; - for (i=1,ite=PriKeys.begin();ite!=PriKeys.end();ite++,i++){ - if(i>1){ - sql += " AND "; - } - sql +=*ite+"=:k"+QString::number(i); - sql +="<char[4000],in>"; - toPush(args, row[i]); - } - qDebug() << sql; - toQuery q(conn, sql, args); - updated+=q.rowsProcessed(); -} -void toResultModel::commitAdd(toConnection &conn, const Row &row, unsigned int &added){ - QString sql = QString("INSERT INTO %1.%2 (").arg(conn.quote(Owner)).arg(conn.quote(Table)); - QString sqlColumns, sqlValuePlaceHolders; - int num = 0; - toQList args; - for (int i = PriKeys.size() + 1; i < Headers.size(); i++) { - if (!row[i].isNull()) { - // Only append columns that is not null - if (num > 0) { - sqlColumns += ','; - sqlValuePlaceHolders += ','; - } - num++; - sqlColumns += conn.quote(Headers[i].name); - // Construct place holder - sqlValuePlaceHolders += (":f"); - sqlValuePlaceHolders += QString::number(num); - - if (row[i].isBinary()) { - if (Headers[i].datatype.toUpper().contains("LOB")) - sqlValuePlaceHolders += ("<blob,in>"); - else - sqlValuePlaceHolders += ("<raw_long,in>"); - } else { - if (Headers[i].datatype.toUpper().contains("LOB")) - sqlValuePlaceHolders += ("<varchar_long,in>"); - else - sqlValuePlaceHolders += ("<char[4000],in>"); - } - // Construct value list - toPush(args,row[i]); - } - } - sql = sql+sqlColumns+") VALUES ("+sqlValuePlaceHolders+")"; - qDebug()<<sql; - toQuery q(conn, sql, args); - added+=q.rowsProcessed(); -} -void toResultModel::commitDelete(toConnection &conn, const Row &row, unsigned int &deleted){ - QString sql = QString("DELETE FROM %1.%2 WHERE ").arg(conn.quote(Owner)).arg(conn.quote(Table)); - std::list<QString>::iterator ite; - int num = 0; - toQList args; - - for(ite=PriKeys.begin();ite!=PriKeys.end();ite++){ - if(num>0){ - sql+=" AND "; - } - num++; - sql+=*ite+"=:v"+QString::number(num); - sql+="<char[4000],in>"; - toPush(args,row[num]); - } - qDebug()<<sql; - toQuery q(conn, sql, args); - deleted+=q.rowsProcessed(); -} -void toResultModel::commitChanges(toConnection &conn, unsigned int &updated, unsigned int &added, unsigned int &deleted){ - RowList::const_iterator ite; - for(ite=Rows.constBegin();ite!=Rows.constEnd();ite++){ - //Scan the whole row and commit change when necessary - const Row &row=*ite; - const toRowDesc &rowDesc = row[0].getRowDesc(); - switch(rowDesc.status){ - case MODIFIED: - commitUpdate(conn, row, updated); - break; - case ADDED: - commitAdd(conn, row, added); - break; - case REMOVED: - commitDelete(conn, row, deleted); - break; - case EXISTED: - break; - default: - qDebug()<<"Undefined row type "<<rowDesc.status; - } - } -} Modified: branches/tora-trotl/src/toresultmodel.h =================================================================== --- branches/tora-trotl/src/toresultmodel.h 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/toresultmodel.h 2012-04-25 18:16:33 UTC (rev 4285) @@ -112,11 +112,7 @@ RowList mergesort(RowList&, int, Qt::SortOrder); RowList merge(RowList&, RowList&, int, Qt::SortOrder); - std::list<QString> PriKeys; - QString Owner,Table; - - private slots: // destroys query, stops timer, good things. @@ -127,7 +123,6 @@ public: explicit toResultModel(toEventQuery *query, - std::list<QString> priKeys, QObject *parent = 0, bool edit = false, bool read = false); @@ -385,30 +380,6 @@ */ RowList &getRawData(void); - /** - * Get PriKeys - */ - const std::list<QString> &getPriKeys(){ - return PriKeys; - } - - void setOwner(const QString &owner){ - this->Owner=owner; - } - void setTable(const QString &table){ - this->Table=table; - } - /** - * Update data - */ - void commitChanges(toConnection &conn, unsigned int &updated, unsigned int &added, unsigned int &deleted); -protected: - void commitUpdate(toConnection &conn, const Row &row, unsigned int &updated); - void commitAdd(toConnection &conn, const Row &row, unsigned int &added); - void commitDelete(toConnection &conn, const Row &row, unsigned int &deleted); - -public: - signals: /** Modified: branches/tora-trotl/src/toresulttableview.cpp =================================================================== --- branches/tora-trotl/src/toresulttableview.cpp 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/toresulttableview.cpp 2012-04-25 18:16:33 UTC (rev 4285) @@ -181,12 +181,11 @@ Filter = 0; } -void toResultTableView::query(const QString &sql, const toQList ¶m, const std::list<QString> priKeys) +void toResultTableView::query(const QString &sql, const toQList ¶m) { setSQLParams(sql, param); toEventQuery *query = NULL; - qDebug("Query from toResultTableView::query :%s",sql.toUtf8().constData()); try { if (Model && running()) @@ -213,9 +212,7 @@ param, Statistics); - PriKeys=priKeys; Model = new toResultModel(query, - priKeys, this, Editable, ReadableColumns); @@ -824,7 +821,6 @@ delete Model; Model = NULL; } - //TODO: Pass pri keys Model = new toResultModel(owner, type, Modified: branches/tora-trotl/src/toresulttableview.h =================================================================== --- branches/tora-trotl/src/toresulttableview.h 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/toresulttableview.h 2012-04-25 18:16:33 UTC (rev 4285) @@ -243,11 +243,7 @@ * Reimplemented to create query and new model. * */ - virtual void query(const QString &sql, const toQList ¶m){ - const static std::list<QString> emptyKeys; - query(sql,param, emptyKeys); - } - virtual void query(const QString &sql, const toQList ¶m, const std::list<QString> priKeys); + virtual void query(const QString &sql, const toQList ¶m); /** * Reimplemented to create query and new model. @@ -256,8 +252,7 @@ void query(const QString &sql) { toQList p; - const static std::list<QString> emptyList; - query(sql, p, emptyList); + query(sql, p); } /** Clear result widget */ Modified: branches/tora-trotl/src/toresulttableviewedit.cpp =================================================================== --- branches/tora-trotl/src/toresulttableviewedit.cpp 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/toresulttableviewedit.cpp 2012-04-25 18:16:33 UTC (rev 4285) @@ -75,13 +75,11 @@ } -void toResultTableViewEdit::query(const QString &SQL, const toQList ¶ms, const std::list<QString> priKeys) +void toResultTableViewEdit::query(const QString &SQL, const toQList ¶ms) { revertChanges(); - if (params.size() != 2) - ; // assume it's a refresh - else + if (params.size() == 2) { toQList::const_iterator par = params.begin(); Owner = *par; @@ -90,16 +88,13 @@ } toQList empty; - toResultTableView::query(SQL, empty, priKeys); + toResultTableView::query(SQL, empty); emit changed(false); if (!Model) return; // error - Model->setOwner(Owner); - Model->setTable(Table); - // must be reconnected after every query connect(Model, SIGNAL(columnChanged(const QModelIndex &, @@ -498,7 +493,7 @@ bool toResultTableViewEdit::commitChanges(bool status) { // Check to make sure some changes were actually made - if (Changes.size() < 1 && Model->getPriKeys().size()==0) + if (Changes.size() < 1) { if (status) toStatusMessage(tr("No changes made"), false, false); @@ -515,8 +510,6 @@ bool error = false; unsigned updated = 0, added = 0, deleted = 0; - if(Model->getPriKeys().size()==0){ - // No primary keys for (int changeIndex = 0; changeIndex < Changes.size(); changeIndex++) { progress.setValue(changeIndex); @@ -550,18 +543,6 @@ break; } } - }else{ - try{ - Model->commitChanges(conn, updated, added, deleted); - if (toConfigurationSingle::Instance().autoCommit()) - conn.commit(); - else - toMainWidget()->setNeedCommit(conn); - }catch(...){ - conn.rollback(); - throw; - } - } toStatusMessage(tr("Saved %1 changes(updated %2, added %3, deleted %4)") .arg(Changes.size(), 0, 10) @@ -569,6 +550,10 @@ .arg(added, 0, 10) .arg(deleted, 0, 10) , false, false); + /*if (error) + refresh(); + else + Changes.clear();*/ if (!error) Changes.clear(); Modified: branches/tora-trotl/src/toresulttableviewedit.h =================================================================== --- branches/tora-trotl/src/toresulttableviewedit.h 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/toresulttableviewedit.h 2012-04-25 18:16:33 UTC (rev 4285) @@ -114,10 +114,7 @@ * Reimplemented to create query and new model. * */ - virtual void query(const QString &sql, const toQList ¶m){ - query(sql,param, PriKeys); - } - virtual void query(const QString &, const toQList ¶ms, const std::list<QString> priKeys); + virtual void query(const QString &, const toQList ¶ms); /** Modified: branches/tora-trotl/src/tosql.h =================================================================== --- branches/tora-trotl/src/tosql.h 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/tosql.h 2012-04-25 18:16:33 UTC (rev 4285) @@ -169,7 +169,7 @@ static bool updateSQL(const QString &name, const QString &sql, const QString &description, - const QString &ver = "8.1", + const QString &ver = "0801", const QString &provider = "Oracle", bool modified = true); @@ -302,7 +302,7 @@ toSQL(const QString &name, const QString &sql, const QString &description = "", - const QString &ver = "8.1", + const QString &ver = "0801", const QString &provider = "Oracle"); }; Modified: branches/tora-trotl/src/tounittest.cpp =================================================================== --- branches/tora-trotl/src/tounittest.cpp 2012-04-25 15:24:42 UTC (rev 4284) +++ branches/tora-trotl/src/tounittest.cpp 2012-04-25 18:16:33 UTC (rev 4285) @@ -306,7 +306,7 @@ delete m_model; m_model = 0; } - m_model = new toResultModel(query, std::list<QString>(), this); + m_model = new toResultModel(query, this); m_model->readAll(); connect(m_model, SIGNAL(done()), this, SLOT(handleDone())); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-05-29 21:11:44
|
Revision: 4325 http://tora.svn.sourceforge.net/tora/?rev=4325&view=rev Author: ibre5041 Date: 2012-05-29 21:11:38 +0000 (Tue, 29 May 2012) Log Message: ----------- Modified Paths: -------------- branches/tora-trotl/src/CMakeLists.txt branches/tora-trotl/src/tologger.h branches/tora-trotl/src/toresultmodel.cpp branches/tora-trotl/src/toresulttableview.cpp branches/tora-trotl/src/trotl_test5.cpp branches/tora-trotl/src/trotl_test5.h Modified: branches/tora-trotl/src/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/CMakeLists.txt 2012-05-29 21:10:20 UTC (rev 4324) +++ branches/tora-trotl/src/CMakeLists.txt 2012-05-29 21:11:38 UTC (rev 4325) @@ -699,6 +699,7 @@ ) #SET_TARGET_PROPERTIES(trotl_test0 PROPERTIES COMPILE_FLAGS "-DTROTL_DLL") TARGET_LINK_LIBRARIES(trotl_test0 ${TORA_LIBS} ${TORA_MOC_LIB}) +ADD_DEPENDENCIES(trotl_test0 revisiontag) ADD_EXECUTABLE(trotl_test1 ${GUI_TYPE} trotl_test1.cpp @@ -708,6 +709,7 @@ ) #SET_TARGET_PROPERTIES(trotl_test1 PROPERTIES COMPILE_FLAGS "-DTROTL_DLL") TARGET_LINK_LIBRARIES(trotl_test1 ${TORA_LIBS} ${TORA_MOC_LIB}) +ADD_DEPENDENCIES(trotl_test1 revisiontag) # ADD_EXECUTABLE(trotl_test2 ${GUI_TYPE} # trotl_test2.cpp @@ -727,6 +729,7 @@ ${TROTL_TEST3_MOC_SOURCES} ) TARGET_LINK_LIBRARIES(trotl_test3 ${TORA_LIBS} ${TORA_MOC_LIB}) +ADD_DEPENDENCIES(trotl_test3 revisiontag) QT4_WRAP_CPP(TROTL_TEST4_MOC_SOURCES "trotl_test4.h") ADD_EXECUTABLE(trotl_test4 ${GUI_TYPE} @@ -737,6 +740,7 @@ ${TROTL_TEST4_MOC_SOURCES} ) TARGET_LINK_LIBRARIES(trotl_test4 ${TORA_LIBS} ${TORA_MOC_LIB}) +ADD_DEPENDENCIES(trotl_test4 revisiontag) QT4_WRAP_CPP(TROTL_TEST5_MOC_SOURCES "trotl_test5.h") ADD_EXECUTABLE(trotl_test5 ${GUI_TYPE} @@ -747,6 +751,7 @@ ${TROTL_TEST5_MOC_SOURCES} ) TARGET_LINK_LIBRARIES(trotl_test5 ${TORA_LIBS} ${TORA_MOC_LIB}) +ADD_DEPENDENCIES(trotl_test5 revisiontag) # Install IF (WIN32) Modified: branches/tora-trotl/src/tologger.h =================================================================== --- branches/tora-trotl/src/tologger.h 2012-05-29 21:10:20 UTC (rev 4324) +++ branches/tora-trotl/src/tologger.h 2012-05-29 21:11:38 UTC (rev 4325) @@ -19,11 +19,22 @@ #include <QString> #include <boost/iostreams/device/null.hpp> #include <boost/iostreams/stream.hpp> + using namespace boost; using namespace boost::iostreams; #define TLOG(lognumber, decorator, where) get_log(lognumber).ts<decorator>( where) +#define DISABLE_LOG(lognumber) \ + template<> \ + inline thread_safe_log templ_get_log_ownthread(int_to_type<lognumber>*) \ + { \ + static s_null_sink nsink; \ + static std::ostream out(&nsink); \ + static internal_thread_safe_log_ownthread log( out ); \ + return thread_safe_log( log); \ + }; + typedef Tdecorator< TSLOG_TYPELIST_6(dashDecorator<4>, tidDecorator<DEFAULT_THREAD_MANAGER>, @@ -72,49 +83,15 @@ return thread_safe_log( log); } -// generic debug <0> - debugging(enabled) -/* -template<> -inline thread_safe_log templ_get_log_ownthread(int_to_type<0>*) -{ - static s_null_sink nsink; - static std::ostream out(&nsink); - static internal_thread_safe_log_ownthread log( out ); - return thread_safe_log( log); -} -*/ -// exceptions debug<1> - debugging(disabled) -template<> -inline thread_safe_log templ_get_log_ownthread(int_to_type<1>*) -{ - static s_null_sink nsink; - static std::ostream out(&nsink); - static internal_thread_safe_log_ownthread log( out ); - return thread_safe_log( log); -} +DISABLE_LOG(0); // generic debug <0> +DISABLE_LOG(1); // exceptions debug<1> +DISABLE_LOG(2); +DISABLE_LOG(3); // tonoblockquery<3> - debugging(disabled) +DISABLE_LOG(4); // tonoblockquery<4> - data read(disabled) -// tonoblockquery<3> - debugging(disabled) -template<> -inline thread_safe_log templ_get_log_ownthread(int_to_type<3>*) -{ - static s_null_sink nsink; - static std::ostream out(&nsink); - static internal_thread_safe_log_ownthread log( out ); - return thread_safe_log( log); -} -// tonoblockquery<4> - data read(disabled) -template<> -inline thread_safe_log templ_get_log_ownthread(int_to_type<4>*) -{ - static s_null_sink nsink; - static std::ostream out(&nsink); - static internal_thread_safe_log_ownthread log( out ); - return thread_safe_log( log); -} - -/* +/* use this if you want output into the file thread_safe_log templ_get_log_ownthread<1>( int_to_type< 1> * = NULL ) { static std::ofstream out( get_out_name< idxLog>( false).c_str() ); @@ -132,6 +109,11 @@ case 2: return templ_get_log_ownthread< 2>(NULL); // qDebug log case 3: return templ_get_log_ownthread< 3>(NULL); // tonoblockquery log case 4: return templ_get_log_ownthread< 4>(NULL); // data read log + case 5: return templ_get_log_ownthread< 5>(NULL); // not used yet + case 6: return templ_get_log_ownthread< 6>(NULL); // not used yet + case 7: return templ_get_log_ownthread< 7>(NULL); // not used yet + case 8: return templ_get_log_ownthread< 8>(NULL); // not used yet + case 9: return templ_get_log_ownthread< 9>(NULL); // not used yet default: assert( false); return templ_get_log_ownthread< 0>(NULL); Modified: branches/tora-trotl/src/toresultmodel.cpp =================================================================== --- branches/tora-trotl/src/toresultmodel.cpp 2012-05-29 21:10:20 UTC (rev 4324) +++ branches/tora-trotl/src/toresultmodel.cpp 2012-05-29 21:11:38 UTC (rev 4325) @@ -60,7 +60,8 @@ First = true; Editable = edit; ReadAll = false; - + SortedOnColumn = -1; + MaxRead = MaxNumber = toConfigurationSingle::Instance().maxNumber(); CurrRowKey = 1; @@ -104,7 +105,8 @@ First = true; Editable = false; ReadAll = false; - + SortedOnColumn = -1; + CurrRowKey = 1; Query = 0; Modified: branches/tora-trotl/src/toresulttableview.cpp =================================================================== --- branches/tora-trotl/src/toresulttableview.cpp 2012-05-29 21:10:20 UTC (rev 4324) +++ branches/tora-trotl/src/toresulttableview.cpp 2012-05-29 21:11:38 UTC (rev 4325) @@ -119,6 +119,7 @@ Editable = editable; ReadAll = false; Filter = 0; + VisibleColumns = 0; ReadableColumns = readable; NumberColumn = numberColumn; ColumnsResized = false; @@ -342,7 +343,7 @@ void toResultTableView::resizeEvent(QResizeEvent *event) { - if(VisibleColumns == 1 && ReadableColumns) + if(ReadableColumns && VisibleColumns == 1) setColumnWidth(1, viewport()->width()); QTableView::resizeEvent(event); } @@ -389,7 +390,7 @@ if (toConfigurationSingle::Instance().multiLineResults()) resizeRowsToContents(); - if (VisibleColumns == 1 && ReadableColumns) + if (ReadableColumns && VisibleColumns == 1) setColumnWidth(1, viewport()->width()); } Modified: branches/tora-trotl/src/trotl_test5.cpp =================================================================== --- branches/tora-trotl/src/trotl_test5.cpp 2012-05-29 21:10:20 UTC (rev 4324) +++ branches/tora-trotl/src/trotl_test5.cpp 2012-05-29 21:11:38 UTC (rev 4325) @@ -84,7 +84,7 @@ m_describeAction = new QAction("&Describe", this); - createDocklets(); // Must be called after Wokspace is initialized + //createDocklets(); // Must be called after Wokspace is initialized this->setCentralWidget(splitter); statusbar = new QStatusBar(this); @@ -93,7 +93,7 @@ show(); - createDockbars(); + //createDockbars(); oraCon = new toConnection( QString("Oracle"), @@ -112,9 +112,9 @@ i != ToolsRegistrySing::Instance().end(); ++i) { - if(i.value()->name() == "SQL Editor") + //if(i.value()->name() == "SQL Editor") //if(i.value()->name() == "Security Manager") - //if(i.value()->name() == "Schema Browser") + if(i.value()->name() == "Schema Browser") { i.value()->customSetup(); i.value()->createWindow(); @@ -128,6 +128,7 @@ foreach(toDocklet *let, toDocklet::docklets()) addDockWidget(Qt::LeftDockWidgetArea, let); } + void TrotlTest5Window::moveDocklet(toDocklet *let, Qt::DockWidgetArea area) { if(area == Qt::RightDockWidgetArea) @@ -142,12 +143,14 @@ leftDockbar->addDocklet(let); } } + toDockbar* TrotlTest5Window::dockbar(toDocklet *let) { if(rightDockbar->contains(let)) return rightDockbar; return leftDockbar; } + void TrotlTest5Window::createDockbars() { leftDockbar = new toDockbar(Qt::LeftToolBarArea, @@ -181,6 +184,15 @@ rightDockbar->restoreState(toConfigurationSingle::Instance().rightDockbarState()); } +void TrotlTest5Window::showBusy() { + qApp->setOverrideCursor(Qt::WaitCursor); +} + + +void TrotlTest5Window::removeBusy() { + qApp->restoreOverrideCursor(); +} + int main(int argc, char **argv) { int p = 0; Modified: branches/tora-trotl/src/trotl_test5.h =================================================================== --- branches/tora-trotl/src/trotl_test5.h 2012-05-29 21:10:20 UTC (rev 4324) +++ branches/tora-trotl/src/trotl_test5.h 2012-05-29 21:11:38 UTC (rev 4325) @@ -125,6 +125,24 @@ toEditWidget* editWidget() { return NULL; }; void createDefault(void) {}; + +public slots: + /** + * Show a busy cursor or other indicators. Must be called from the + * main thread. + * + * class toBusy calls this method. + * + */ + void showBusy(void); + + /** + * Remove busy cursor or other indicators. Must be called from the + * main thread. + * + * class toBusy calls this method. + */ + void removeBusy(void); }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-01 17:06:48
|
Revision: 4330 http://tora.svn.sourceforge.net/tora/?rev=4330&view=rev Author: ibre5041 Date: 2012-06-01 17:06:42 +0000 (Fri, 01 Jun 2012) Log Message: ----------- sync with trunk, plus status message logging Modified Paths: -------------- branches/tora-trotl/src/CMakeLists.txt branches/tora-trotl/src/tologger.h branches/tora-trotl/src/trotl_test5.cpp branches/tora-trotl/src/trotl_test5.h Modified: branches/tora-trotl/src/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/CMakeLists.txt 2012-05-30 14:36:14 UTC (rev 4329) +++ branches/tora-trotl/src/CMakeLists.txt 2012-06-01 17:06:42 UTC (rev 4330) @@ -587,7 +587,7 @@ IF(WIN32) - IF (MSVC) + IF (MSVC AND NOT WANT_DEBUG) # this is a must to switch off subsystem:console (console window poping up) # WinMain wrapper from QT_QTMAIN_LIBRARY is used and liner must be modified LINK_LIBRARIES(${QT_QTMAIN_LIBRARY}) @@ -597,7 +597,7 @@ # ELSE (WANT_DEBUG) # SET (CMAKE_EXE_LINKER_FLAGS "/NODEFAULTLIB:msvcrt.lib ${CMAKE_EXE_LINKER_FLAGS}") # ENDIF (WANT_DEBUG) - ENDIF (MSVC) + ENDIF () ENDIF(WIN32) #Set up libraries to link with all found packages Modified: branches/tora-trotl/src/tologger.h =================================================================== --- branches/tora-trotl/src/tologger.h 2012-05-30 14:36:14 UTC (rev 4329) +++ branches/tora-trotl/src/tologger.h 2012-06-01 17:06:42 UTC (rev 4330) @@ -88,7 +88,7 @@ DISABLE_LOG(1); // exceptions debug<1> DISABLE_LOG(2); DISABLE_LOG(3); // tonoblockquery<3> - debugging(disabled) -DISABLE_LOG(4); // tonoblockquery<4> - data read(disabled) +//DISABLE_LOG(4); // tonoblockquery<4> - data read(disabled) /* use this if you want output into the file @@ -166,15 +166,10 @@ #endif - -// TODO add some comment on this MSVC inline std::ostream& operator<<( std::ostream & stream, const QString & str) -{ // TODO review this - QByteArray b( str.toAscii()); - const char *c = b.constData(); - stream << c; +{ + stream << qPrintable(str); return stream; } - #endif Modified: branches/tora-trotl/src/trotl_test5.cpp =================================================================== --- branches/tora-trotl/src/trotl_test5.cpp 2012-05-30 14:36:14 UTC (rev 4329) +++ branches/tora-trotl/src/trotl_test5.cpp 2012-06-01 17:06:42 UTC (rev 4330) @@ -297,3 +297,9 @@ } return 1; } + +void TrotlTest5Window::showMessage(QString const &message,bool,bool) +{ + if( !message.isEmpty()) + TLOG(5,toDecorator,__HERE__) << message << std::endl; +} Modified: branches/tora-trotl/src/trotl_test5.h =================================================================== --- branches/tora-trotl/src/trotl_test5.h 2012-05-30 14:36:14 UTC (rev 4329) +++ branches/tora-trotl/src/trotl_test5.h 2012-06-01 17:06:42 UTC (rev 4330) @@ -73,8 +73,7 @@ void setCoordinates(int, int) {}; void setNeedCommit(toConnection&, bool) {}; void setupChart(toLineChart*) {}; - void showMessage(const QString&, bool, bool) {}; - void showMessageImpl(const QString&, bool, bool) {}; + void showMessage(const QString&, bool, bool); void toolWidgetRemoved(toToolWidget*) {}; void windowActivated(QMdiSubWindow*) {}; void workspaceCloseWindow(int) {}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-01 17:08:06
|
Revision: 4331 http://tora.svn.sourceforge.net/tora/?rev=4331&view=rev Author: ibre5041 Date: 2012-06-01 17:07:59 +0000 (Fri, 01 Jun 2012) Log Message: ----------- use cache when changing the schema Modified Paths: -------------- branches/tora-trotl/src/tobrowser.cpp branches/tora-trotl/src/tobrowser.h Modified: branches/tora-trotl/src/tobrowser.cpp =================================================================== --- branches/tora-trotl/src/tobrowser.cpp 2012-06-01 17:06:42 UTC (rev 4330) +++ branches/tora-trotl/src/tobrowser.cpp 2012-06-01 17:07:59 UTC (rev 4331) @@ -1306,7 +1306,7 @@ this, SLOT(mainTab_currentChanged(int))); } -void toBrowser::mainTab_currentChanged(int /*ix*/, bool force_requery) +void toBrowser::mainTab_currentChanged(int /*ix*/, Caching caching) // caching = USE_CACHE is the default { if (Schema->selected().isEmpty()) return; @@ -1322,7 +1322,7 @@ if (m_objectsMap.contains(ix)) { - if (force_requery) + if (caching == NO_USE_CACHE) m_objectsMap[ix]->forceRequery(); m_objectsMap[ix]->changeParams(schema(), Filter ? Filter->wildCard() : "%"); changeItem(); @@ -1412,23 +1412,28 @@ #endif } -void toBrowser::changeSchema(int) -{ - refresh(); -} - toBrowser::~toBrowser() { if (Filter) delete Filter; } +void toBrowser::changeSchema(int) +{ + try + { + Schema->refresh(); + mainTab_currentChanged(m_mainTab->currentIndex(), USE_CACHE); // just a test do now requery the DB // true); + } + TOCATCH +} + void toBrowser::refresh(void) { try { Schema->refresh(); - mainTab_currentChanged(m_mainTab->currentIndex(), true); + mainTab_currentChanged(m_mainTab->currentIndex(), NO_USE_CACHE); // just a test do now requery the DB // true); } TOCATCH } Modified: branches/tora-trotl/src/tobrowser.h =================================================================== --- branches/tora-trotl/src/tobrowser.h 2012-06-01 17:06:42 UTC (rev 4330) +++ branches/tora-trotl/src/tobrowser.h 2012-06-01 17:07:59 UTC (rev 4331) @@ -114,6 +114,11 @@ { Q_OBJECT; + enum Caching { + USE_CACHE = 0, + NO_USE_CACHE + }; + toResultCombo *Schema; QTabWidget *m_mainTab; QMenu *ToolMenu; @@ -262,9 +267,9 @@ private slots: /** Handle main tabwidget and its tabs switch * @param int Tab which has been activated - * @param force_requery Do not try using the cache but query the database instead + * @param Caching caching Do(not) try using the cache but query the database instead */ - void mainTab_currentChanged(int, bool force_requery = false); + void mainTab_currentChanged(int, Caching caching = USE_CACHE); protected: virtual void closeEvent(QCloseEvent *); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-05 15:38:52
|
Revision: 4334 http://tora.svn.sourceforge.net/tora/?rev=4334&view=rev Author: ibre5041 Date: 2012-06-05 15:38:46 +0000 (Tue, 05 Jun 2012) Log Message: ----------- more experiments, dot is not called anymore Modified Paths: -------------- branches/tora-trotl/src/docklets/toastwalk.cpp branches/tora-trotl/src/docklets/toquerymodel.cpp branches/tora-trotl/src/ermodel/dotgraph.cpp branches/tora-trotl/src/ermodel/dotgraph.h Modified: branches/tora-trotl/src/docklets/toastwalk.cpp =================================================================== --- branches/tora-trotl/src/docklets/toastwalk.cpp 2012-06-04 17:24:57 UTC (rev 4333) +++ branches/tora-trotl/src/docklets/toastwalk.cpp 2012-06-05 15:38:46 UTC (rev 4334) @@ -208,7 +208,7 @@ } ta["name"] = tt->toStringRecursive(false); - ta["label"] = tt->toStringRecursive(false); + ta["label"] = QString("ROOT") + GLUE + tableName; //tt->toStringRecursive(false); ta["fontsize"] = "10"; ta["comment"]= tt->toStringRecursive(false); ta["id"]= QString("ROOT") + GLUE + tableName; @@ -401,5 +401,5 @@ } // case S_WHERE } // switch getTokenType } // for each node - target->update(); + //target->update(); }; Modified: branches/tora-trotl/src/docklets/toquerymodel.cpp =================================================================== --- branches/tora-trotl/src/docklets/toquerymodel.cpp 2012-06-04 17:24:57 UTC (rev 4333) +++ branches/tora-trotl/src/docklets/toquerymodel.cpp 2012-06-05 15:38:46 UTC (rev 4334) @@ -187,14 +187,14 @@ TLOG(0,toDecorator,__HERE__) << "Parsing ok:" << std::endl << stat->root()->toStringRecursive().toStdString() << std::endl; - //delete(m_widget); - //m_widget = new KGraphViewer::DotGraphView( NULL /*actionCollection()*/, this); - m_widget->initEmpty(); - //m_widget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); - //setFocusProxy(m_widget); // TODO ?? What is this?? - //setWidget(m_widget); // TODO ?? What is this?? - toASTWalk(stat.get(), m_widget->graph()); + //m_widget->initEmpty(); + DotGraph newGraph("dot"); + //toASTWalk(stat.get(), m_widget->graph()); + toASTWalk(stat.get(), &newGraph); + m_widget->graph()->updateWithGraph(newGraph); + //m_widget->graph()->layoutCommand(newGraph.layoutCommand()); + m_widget->graph()->update(); } catch ( SQLParser::ParseException const &e) { Modified: branches/tora-trotl/src/ermodel/dotgraph.cpp =================================================================== --- branches/tora-trotl/src/ermodel/dotgraph.cpp 2012-06-04 17:24:57 UTC (rev 4333) +++ branches/tora-trotl/src/ermodel/dotgraph.cpp 2012-06-05 15:38:46 UTC (rev 4334) @@ -62,6 +62,20 @@ setId("unnamed"); } +DotGraph::DotGraph(const QString& command) : + GraphElement(), + m_dotFileName(""), + m_width(0.0), m_height(0.0),m_scale(1.0), + m_directed(true),m_strict(false), + m_layoutCommand(command), + m_readWrite(false), + m_dot(0), + m_phase(Initial), + m_useLibrary(true) +{ + setId("unnamed"); +} + DotGraph::DotGraph(const QString& command, const QString& fileName) : GraphElement(), m_dotFileName(fileName),m_width(0.0), m_height(0.0),m_scale(1.0), @@ -499,6 +513,9 @@ m_scale=newGraph.scale(); m_directed=newGraph.directed(); m_strict=newGraph.strict(); + if( m_layoutCommand.isEmpty()) + m_layoutCommand = newGraph.layoutCommand(); + computeCells(); foreach (GraphSubgraph* nsg, newGraph.subgraphs()) { Modified: branches/tora-trotl/src/ermodel/dotgraph.h =================================================================== --- branches/tora-trotl/src/ermodel/dotgraph.h 2012-06-04 17:24:57 UTC (rev 4333) +++ branches/tora-trotl/src/ermodel/dotgraph.h 2012-06-05 15:38:46 UTC (rev 4334) @@ -49,6 +49,7 @@ enum ParsePhase {Initial, Final}; DotGraph(); + DotGraph(const QString& command); DotGraph(const QString& command, const QString& fileName); virtual ~DotGraph(); @@ -86,7 +87,7 @@ inline double hdvcf() const {return m_hdvcf;} inline void layoutCommand(const QString& command) {m_layoutCommand = command;} - inline const QString& layoutCommand() {return m_layoutCommand;} + inline const QString& layoutCommand() const {return m_layoutCommand;} inline void dotFileName(const QString& fileName) {m_dotFileName = fileName;} inline const QString& dotFileName() const {return m_dotFileName;} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-05 21:20:34
|
Revision: 4335 http://tora.svn.sourceforge.net/tora/?rev=4335&view=rev Author: ibre5041 Date: 2012-06-05 21:20:24 +0000 (Tue, 05 Jun 2012) Log Message: ----------- query model hover Modified Paths: -------------- branches/tora-trotl/src/CMakeLists.txt branches/tora-trotl/src/docklets/toastwalk.cpp branches/tora-trotl/src/docklets/toquerymodel.cpp branches/tora-trotl/src/docklets/toquerymodel.h branches/tora-trotl/src/tocachenew.h branches/tora-trotl/src/tologger.h branches/tora-trotl/src/tooracleconnection_trotl.cpp Modified: branches/tora-trotl/src/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/CMakeLists.txt 2012-06-05 15:38:46 UTC (rev 4334) +++ branches/tora-trotl/src/CMakeLists.txt 2012-06-05 21:20:24 UTC (rev 4335) @@ -720,27 +720,27 @@ # #SET_TARGET_PROPERTIES(trotl_test2 PROPERTIES COMPILE_FLAGS "-DTROTL_DLL") # TARGET_LINK_LIBRARIES(trotl_test2 ${TORA_LIBS} ${TORA_MOC_LIB}) -QT4_WRAP_CPP(TROTL_TEST3_MOC_SOURCES "trotl_test3.h") -ADD_EXECUTABLE(trotl_test3 ${GUI_TYPE} - trotl_test3.cpp - ${TORA_SOURCES} - ${TORA_RCC_SRCS} - ${APPLE_BUNDLE_SOURCES} - ${TROTL_TEST3_MOC_SOURCES} -) -TARGET_LINK_LIBRARIES(trotl_test3 ${TORA_LIBS} ${TORA_MOC_LIB}) -ADD_DEPENDENCIES(trotl_test3 revisiontag) +# QT4_WRAP_CPP(TROTL_TEST3_MOC_SOURCES "trotl_test3.h") +# ADD_EXECUTABLE(trotl_test3 ${GUI_TYPE} +# trotl_test3.cpp +# ${TORA_SOURCES} +# ${TORA_RCC_SRCS} +# ${APPLE_BUNDLE_SOURCES} +# ${TROTL_TEST3_MOC_SOURCES} +# ) +# TARGET_LINK_LIBRARIES(trotl_test3 ${TORA_LIBS} ${TORA_MOC_LIB}) +# ADD_DEPENDENCIES(trotl_test3 revisiontag) -QT4_WRAP_CPP(TROTL_TEST4_MOC_SOURCES "trotl_test4.h") -ADD_EXECUTABLE(trotl_test4 ${GUI_TYPE} - trotl_test4.cpp - ${TORA_SOURCES} - ${TORA_RCC_SRCS} - ${APPLE_BUNDLE_SOURCES} - ${TROTL_TEST4_MOC_SOURCES} -) -TARGET_LINK_LIBRARIES(trotl_test4 ${TORA_LIBS} ${TORA_MOC_LIB}) -ADD_DEPENDENCIES(trotl_test4 revisiontag) +# QT4_WRAP_CPP(TROTL_TEST4_MOC_SOURCES "trotl_test4.h") +# ADD_EXECUTABLE(trotl_test4 ${GUI_TYPE} +# trotl_test4.cpp +# ${TORA_SOURCES} +# ${TORA_RCC_SRCS} +# ${APPLE_BUNDLE_SOURCES} +# ${TROTL_TEST4_MOC_SOURCES} +# ) +# TARGET_LINK_LIBRARIES(trotl_test4 ${TORA_LIBS} ${TORA_MOC_LIB}) +# ADD_DEPENDENCIES(trotl_test4 revisiontag) QT4_WRAP_CPP(TROTL_TEST5_MOC_SOURCES "trotl_test5.h") ADD_EXECUTABLE(trotl_test5 ${GUI_TYPE} Modified: branches/tora-trotl/src/docklets/toastwalk.cpp =================================================================== --- branches/tora-trotl/src/docklets/toastwalk.cpp 2012-06-05 15:38:46 UTC (rev 4334) +++ branches/tora-trotl/src/docklets/toastwalk.cpp 2012-06-05 21:20:24 UTC (rev 4335) @@ -208,7 +208,7 @@ } ta["name"] = tt->toStringRecursive(false); - ta["label"] = QString("ROOT") + GLUE + tableName; //tt->toStringRecursive(false); + ta["label"] = tt->toStringRecursive(false); ta["fontsize"] = "10"; ta["comment"]= tt->toStringRecursive(false); ta["id"]= QString("ROOT") + GLUE + tableName; Modified: branches/tora-trotl/src/docklets/toquerymodel.cpp =================================================================== --- branches/tora-trotl/src/docklets/toquerymodel.cpp 2012-06-05 15:38:46 UTC (rev 4334) +++ branches/tora-trotl/src/docklets/toquerymodel.cpp 2012-06-05 21:20:24 UTC (rev 4335) @@ -101,10 +101,10 @@ // SIGNAL( newEdgeFinished(const QString&, const QString&, const QMap<QString, QString>&) ), // this, // SIGNAL( newEdgeFinished(const QString&, const QString&, const QMap<QString, QString>&) ) ); - // connect( m_widget, SIGNAL( hoverEnter(const QString&)) , - // this, SIGNAL( hoverEnter(const QString&) ) ); - // connect( m_widget, SIGNAL( hoverLeave(const QString&)) , - // this, SIGNAL( hoverLeave(const QString&)) ); + connect( m_widget, SIGNAL( hoverEnter(const QString&)) , + this, SLOT( hoverEnter(const QString&) ) ); + connect( m_widget, SIGNAL( hoverLeave(const QString&)) , + this, SLOT( hoverLeave(const QString&)) ); ///m_widget->loadLibrary(QString("/tmp/example1.dot")); setFocusProxy(m_widget); // TODO ?? What is this?? @@ -242,3 +242,13 @@ m_widget->graph()->update(); } + +void toQueryModel::hoverEnter(const QString& what) +{ + TLOG(5,toDecorator,__HERE__) << "--" << what << std::endl; +} + +void toQueryModel::hoverLeave(const QString& what) +{ + TLOG(5,toDecorator,__HERE__) << "--" << what << std::endl; +} Modified: branches/tora-trotl/src/docklets/toquerymodel.h =================================================================== --- branches/tora-trotl/src/docklets/toquerymodel.h 2012-06-05 15:38:46 UTC (rev 4334) +++ branches/tora-trotl/src/docklets/toquerymodel.h 2012-06-05 21:20:24 UTC (rev 4335) @@ -97,6 +97,8 @@ virtual void timerEvent(QTimerEvent *e); public slots: void describeSlot(void); + void hoverEnter(const QString&); + void hoverLeave(const QString&); }; Modified: branches/tora-trotl/src/tocachenew.h =================================================================== --- branches/tora-trotl/src/tocachenew.h 2012-06-05 15:38:46 UTC (rev 4334) +++ branches/tora-trotl/src/tocachenew.h 2012-06-05 21:20:24 UTC (rev 4335) @@ -54,7 +54,7 @@ TRIGGER, DATABASE, // used by MySQL ANY, // used for querying purposes only - TORA_SCHEMA_LIST, // courious object type - used internaly by TORA, if present browser knows that that schma was read from DB + TORA_SCHEMA_LIST, // courious object type - used internaly by TORA, if present browser knows that that schema was read from DB //TORA_USER_LIST, // courious object type - used internaly by TORA purpose unknown so far. USER, OTHER @@ -108,6 +108,9 @@ */ virtual ~CacheEntry() {}; + /** Fetch additional information from the DB */ + virtual void describe() {}; + bool operator < (const CacheEntry &) const; bool operator == (const CacheEntry &) const; }; // struct CacheEntry Modified: branches/tora-trotl/src/tologger.h =================================================================== --- branches/tora-trotl/src/tologger.h 2012-06-05 15:38:46 UTC (rev 4334) +++ branches/tora-trotl/src/tologger.h 2012-06-05 21:20:24 UTC (rev 4335) @@ -88,7 +88,7 @@ DISABLE_LOG(1); // exceptions debug<1> DISABLE_LOG(2); DISABLE_LOG(3); // tonoblockquery<3> - debugging(disabled) -//DISABLE_LOG(4); // tonoblockquery<4> - data read(disabled) +DISABLE_LOG(4); // tonoblockquery<4> - data read(disabled) /* use this if you want output into the file Modified: branches/tora-trotl/src/tooracleconnection_trotl.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection_trotl.cpp 2012-06-05 15:38:46 UTC (rev 4334) +++ branches/tora-trotl/src/tooracleconnection_trotl.cpp 2012-06-05 21:20:24 UTC (rev 4335) @@ -1015,6 +1015,7 @@ toQuery objects(connection(), toQuery::Long, toSQL::sql("toOracleConnection:ListObjectsInDatabase", connection()), par); while (!objects.eof()) { +#warning "check connection's parent Abort flag" QString owner = objects.readValue(); QString name = objects.readValue(); QString type = objects.readValue(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-05 23:46:06
|
Revision: 4336 http://tora.svn.sourceforge.net/tora/?rev=4336&view=rev Author: ibre5041 Date: 2012-06-05 23:45:57 +0000 (Tue, 05 Jun 2012) Log Message: ----------- new Cache read/write Modified Paths: -------------- branches/tora-trotl/src/tocachenew.cpp branches/tora-trotl/src/tocachenew.h Modified: branches/tora-trotl/src/tocachenew.cpp =================================================================== --- branches/tora-trotl/src/tocachenew.cpp 2012-06-05 21:20:24 UTC (rev 4335) +++ branches/tora-trotl/src/tocachenew.cpp 2012-06-05 23:45:57 UTC (rev 4336) @@ -1,13 +1,61 @@ +/* BEGIN_COMMON_COPYRIGHT_HEADER + * + * TOra - An Oracle Toolkit for DBA's and developers + * + * Shared/mixed copyright is held throughout files in this product + * + * Portions Copyright (C) 2000-2001 Underscore AB + * Portions Copyright (C) 2003-2005 Quest Software, Inc. + * Portions Copyright (C) 2004-2009 Numerous Other Contributors + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; only version 2 of + * the License is valid for this program. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * As a special exception, you have permission to link this program + * with the Oracle Client libraries and distribute executables, as long + * as you follow the requirements of the GNU GPL in regard to all of the + * software in the executable aside from Oracle client libraries. + * + * Specifically you are not permitted to link this program with the + * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. + * And you are not permitted to distribute binaries compiled against + * these libraries. + * + * You may link this product with any GPL'd Qt library. + * + * All trademarks belong to their respective owners. + * + * END_COMMON_COPYRIGHT_HEADER */ + #include "tocachenew.h" #include "toconfiguration.h" +#include "toraversion.h" + #include "utils.h" #include <QtDebug> #include <QDir> #include <QDateTime> #include <QTextStream> #include <QProgressDialog> +#include <QDataStream> //#include <boost/preprocessor/iteration/detail/local.hpp> +// Forward declarations +// Allow cache entries to be serialized / de-serialized +QDataStream& operator<< (QDataStream& stream, const toCacheNew::CacheEntry& e); +QDataStream& operator>> (QDataStream& stream, toCacheNew::CacheEntry& e); + toCacheNew::toCacheNew( QString const &description) : ConnectionDescription(description) , refCount(1) // we assume that we were created from 1st toConnection @@ -297,6 +345,163 @@ readObjects(t); } +QString toCacheNew::cacheDir() +{ + QString home(QDir::homePath()); + QString dirname(toConfigurationSingle::Instance().cacheDir()); + + if (dirname.isEmpty()) + { +#ifdef Q_OS_WIN32 + if (getenv("TEMP")) + dirname = QString(getenv("TEMP")); + else +#endif + dirname = QString(home); + dirname += "/.tora_cache"; + } + return dirname; +} // cacheDir + +QString toCacheNew::cacheFile() +{ + QString ret (ConnectionDescription.trimmed()); + // using instantclient connectionstrins can result in file name like this: + // isepl_global_stage@//oraclexe11:1521/xe + // which is invalid. Just remove "/" or replace it with something safer. + ret = ret.replace("/", "__"); + + return cacheDir() + "/" + ret + ".new"; +} // cacheFile + +void toCacheNew::writeDiskCache() +{ + QString text; + qint64 objCounter = 0; + qint64 synCounter = 0; + + if (!toConfigurationSingle::Instance().cacheDisk()) + return; + + QString filename(cacheFile()); + QString dirname(cacheDir()); + QDir dir; + dir.setPath(dirname); + + if (!dir.exists(dirname)) + dir.mkdir(dirname); + + QString version = QString::fromLatin1(TORAVERSION); + + QFile file(filename); +#warning "throw something here" + if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate)) + return; + + { + toSharedLocker lock(cacheLock); + + QDataStream out(&file); + out << version; // Tora version + out << (quint8)state; // cache state + out << ownersRead; + out << usersRead; + out << ConnectionDescription; + + out << (quint32) entryMap.size(); + out << (quint32) synonymMap.size(); + out << (quint32) columnCache.size(); + out << (quint32) ownersMap.size(); + out << (quint32) usersMap.size(); + + QList<CacheEntry const*> vEntryMap = entryMap.values(); + Q_FOREACH(CacheEntry const*e, vEntryMap) + { + out << (*e); + } + + // TODO this can be avoided + QList<CacheEntry const*> vSynonymMap = synonymMap.values(); + Q_FOREACH(CacheEntry const*e, vSynonymMap) + { + out << (*e); + } + + QList<CacheEntry const*> vColumnCache = columnCache.values(); + Q_FOREACH(CacheEntry const*e, vColumnCache) + { + out << (*e); + } + + QList<CacheEntry const*> vOwnersMap = ownersMap.values(); + Q_FOREACH(CacheEntry const*e, vOwnersMap) + { + out << (*e); + } + + QList<CacheEntry const*> vUsersMap = usersMap.values(); + Q_FOREACH(CacheEntry const*e, vUsersMap) + { + out << (*e); + } + + } +} + +bool toCacheNew::loadDiskCache() +{ + if (!toConfigurationSingle::Instance().cacheDisk()) + return false; + + QString filename(cacheFile()); + QString dirname(cacheDir()); + QDir dir; + dir.setPath(dirname); + + if (!dir.exists(dirname)) + dir.mkdir(dirname); + + QString version = QString::fromLatin1(TORAVERSION); + + QFileInfo fileInfo(filename); + QDateTime today; + if(!fileInfo.isReadable()) + return false; + + if (fileInfo.lastModified().addDays(toConfigurationSingle::Instance().cacheTimeout()) < today) + return false; + +#warning "throw something here plus clearCache" + { + toExclusiveLocker lock(cacheLock); + QFile file(filename); + file.open(QIODevice::ReadOnly); + QDataStream in(&file); + + quint8 s; + + in >> version; // Tora version + in >> s; state = (CacheState)s; // cache state + in >> ownersRead; + in >> usersRead; + in >> ConnectionDescription; + + quint32 entryMapSize, synonymMapSize, columnCacheSize, ownersMapSize, usersMapSize; + in >> entryMapSize; + in >> synonymMapSize; + in >> columnCacheSize; + in >> ownersMapSize; + in >> usersMapSize; + + for(int i = 0; i < entryMapSize; i++) + { + CacheEntry e; + in >> e; + } + } + return true; +} + /** * private functions */ @@ -321,25 +526,6 @@ usersMap.clear(); }; -QString toCacheNew::cacheDir() -{ - QString home(QDir::homePath()); - QString dirname(toConfigurationSingle::Instance().cacheDir()); - - if (dirname.isEmpty()) - { -#ifdef Q_OS_WIN32 - if (getenv("TEMP")) - dirname = QString(getenv("TEMP")); - else -#endif - dirname = QString(home); - dirname += "/.tora_cache"; - } - return dirname; -} // cacheDir - - /*static*/ toCacheNew::CacheEntryType toCacheNew::cacheEntryType(QString const& objType) { if( objType == "TABLE") @@ -438,6 +624,23 @@ return false; }; +QDataStream& operator<< (QDataStream& stream, const toCacheNew::CacheEntry& e) +{ + stream << e.name << (quint32)e.type << e.comment << e.timestamp << e.details; + return stream; +} + +QDataStream& operator>> (QDataStream& stream, toCacheNew::CacheEntry& e) +{ + quint8 type; + + stream >> e.name >> type >> e.comment >> e.timestamp >> e.details; + + e.type = (toCacheNew::CacheEntryType) type; + e.described = false; + return stream; +} + bool toCacheNew::CacheEntry::operator == (const toCacheNew::CacheEntry &other) const { return type == other.type && name == other.name; Modified: branches/tora-trotl/src/tocachenew.h =================================================================== --- branches/tora-trotl/src/tocachenew.h 2012-06-05 21:20:24 UTC (rev 4335) +++ branches/tora-trotl/src/tocachenew.h 2012-06-05 23:45:57 UTC (rev 4336) @@ -27,6 +27,8 @@ class toGlobalSetting; +class QDataStream; + class toCacheNew //: public QObject { friend class toConnection; @@ -40,7 +42,7 @@ /** Nested class type */ - enum CacheEntryType + enum CacheEntryType : quint8 { TABLE, VIEW, @@ -113,6 +115,7 @@ bool operator < (const CacheEntry &) const; bool operator == (const CacheEntry &) const; + }; // struct CacheEntry /** This structure is used to describe the resultset of a query. @@ -141,7 +144,7 @@ /** Objects state - updated by background threads */ - enum CacheState + enum CacheState : quint8 { NOT_STARTED = 0, READING_FROM_DISK, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-06 16:34:57
|
Revision: 4338 http://tora.svn.sourceforge.net/tora/?rev=4338&view=rev Author: ibre5041 Date: 2012-06-06 16:34:50 +0000 (Wed, 06 Jun 2012) Log Message: ----------- read/write disk cache Modified Paths: -------------- branches/tora-trotl/src/tocachenew.cpp branches/tora-trotl/src/tocachenew.h branches/tora-trotl/src/toconnection.cpp branches/tora-trotl/src/toglobalsetting.cpp branches/tora-trotl/src/tooracleconnection_trotl.cpp Modified: branches/tora-trotl/src/tocachenew.cpp =================================================================== --- branches/tora-trotl/src/tocachenew.cpp 2012-06-06 15:16:30 UTC (rev 4337) +++ branches/tora-trotl/src/tocachenew.cpp 2012-06-06 16:34:50 UTC (rev 4338) @@ -41,6 +41,7 @@ #include "tocachenew.h" #include "toconfiguration.h" #include "toraversion.h" +#include "tologger.h" #include "utils.h" #include <QtDebug> @@ -335,17 +336,16 @@ return ; } - ///TODO /** delete cache file to force reload */ - //QString filename(cacheFile()); - //if (QFile::exists(filename)) - // QFile::remove(filename); + QFileInfo filename(cacheFile()); + if (filename.isFile()) + QFile::remove(filename.absoluteFilePath()); readObjects(t); } -QString toCacheNew::cacheDir() +QDir toCacheNew::cacheDir() { QString home(QDir::homePath()); QString dirname(toConfigurationSingle::Instance().cacheDir()); @@ -363,15 +363,20 @@ return dirname; } // cacheDir -QString toCacheNew::cacheFile() +QFileInfo toCacheNew::cacheFile() { QString ret (ConnectionDescription.trimmed()); // using instantclient connectionstrins can result in file name like this: // isepl_global_stage@//oraclexe11:1521/xe // which is invalid. Just remove "/" or replace it with something safer. - ret = ret.replace("/", "__"); + ret = ret.replace("/", "_"); + ret = ret.replace(":", "~"); + ret += ".bin"; - return cacheDir() + "/" + ret + ".new"; + QFileInfo i(cacheDir(), ret); + TLOG(8, toNoDecorator, __HERE__) << i.canonicalFilePath() << std::endl; + TLOG(8, toNoDecorator, __HERE__) << i.absoluteFilePath() << std::endl; + return QFileInfo(cacheDir(), ret); } // cacheFile void toCacheNew::writeDiskCache() @@ -383,18 +388,16 @@ if (!toConfigurationSingle::Instance().cacheDisk()) return; - QString filename(cacheFile()); - QString dirname(cacheDir()); - QDir dir; - dir.setPath(dirname); + QFileInfo fileInfo(cacheFile()); + QDir dir(cacheDir()); - if (!dir.exists(dirname)) - dir.mkdir(dirname); + if (!dir.exists()) + dir.mkdir(dir.absolutePath()); QString version = QString::fromLatin1(TORAVERSION); - QFile file(filename); -#warning "throw something here" + QFile file(fileInfo.absoluteFilePath()); +//TODO #warn "throw something here" if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate)) return; @@ -408,6 +411,9 @@ out << usersRead; out << ConnectionDescription; + // TODO Write a gap here. + // then write the whole cache, rewind, + out << (quint32) entryMap.size(); out << (quint32) synonymMap.size(); out << (quint32) columnCache.size(); @@ -445,6 +451,8 @@ out << (*e); } + file.flush(); + file.close(); } } @@ -453,31 +461,28 @@ if (!toConfigurationSingle::Instance().cacheDisk()) return false; - QString filename(cacheFile()); - QString dirname(cacheDir()); - QDir dir; - dir.setPath(dirname); + QFileInfo fileInfo(cacheFile()); + QDir dir(cacheDir()); - if (!dir.exists(dirname)) - dir.mkdir(dirname); + if (!dir.exists()) + dir.mkdir(dir.absolutePath()); QString version = QString::fromLatin1(TORAVERSION); + QDateTime today; - QFileInfo fileInfo(filename); - QDateTime today; if(!fileInfo.isReadable()) return false; if (fileInfo.lastModified().addDays(toConfigurationSingle::Instance().cacheTimeout()) < today) return false; -#warning "throw something here plus clearCache" +//#warn TODO "throw something here plus clearCache" + quint32 entryMapSize, synonymMapSize, columnCacheSize, ownersMapSize, usersMapSize; + QFile file(fileInfo.absoluteFilePath()); + file.open(QIODevice::ReadOnly); + QDataStream in(&file); { toExclusiveLocker lock(cacheLock); - QFile file(filename); - file.open(QIODevice::ReadOnly); - QDataStream in(&file); - quint8 s; in >> version; // Tora version @@ -486,19 +491,18 @@ in >> usersRead; in >> ConnectionDescription; - quint32 entryMapSize, synonymMapSize, columnCacheSize, ownersMapSize, usersMapSize; in >> entryMapSize; in >> synonymMapSize; in >> columnCacheSize; in >> ownersMapSize; in >> usersMapSize; - - for(int i = 0; i < entryMapSize; i++) - { - CacheEntry e; - in >> e; - } } + for(int i = 0; i < entryMapSize; i++) + { + CacheEntry e; + in >> e; + addEntry(cloneCacheEntry(e)); + } return true; } @@ -554,44 +558,87 @@ return OTHER; } +/*static*/ QString toCacheNew::cacheEntryTypeToString(toCacheNew::CacheEntryType objType) +{ + switch(objType) + { + case TABLE: + return "TABLE"; + case VIEW: + return "VIEW"; + case SYNONYM: + return "SYNONYM"; + case PROCEDURE: + return "PROCEDURE"; + case FUNCTION: + return "FUNCTION"; + case PACKAGE: + return "PACKAGE"; + case PACKAGE_BODY: + return "PACKAGE BODY"; + case INDEX: + return "INDEX"; + case SEQUENCE: + return "SEQUENCE"; + case TRIGGER: + return "TRIGGER"; + case DATABASE: + return "DATABASE"; + default: + //return NULL; + throw QString("toCacheNew: Unknown object type %1").arg((quint32)objType); + } +} + bool toCacheNew::cacheRefreshRunning() const { toSharedLocker lock(cacheLock); return state != NOT_STARTED && state != DONE && state != FAILED; } -toCacheNew::CacheEntry* toCacheNew::createCacheEntry(const QString &objOwner, const QString &objName, const QString &objType, const QString &comment) +toCacheNew::CacheEntry* toCacheNew::createCacheEntry(const QString &objOwner, const QString &objName, CacheEntryType objType, const QString &comment) { - switch(cacheEntryType(objType)) + switch(objType) { case TABLE: - return new toCacheEntryTable(objOwner, objName, objType, comment); + return new toCacheEntryTable(objOwner, objName, comment); case VIEW: - return new toCacheEntryView(objOwner, objName, objType, comment); + return new toCacheEntryView(objOwner, objName, comment); case SYNONYM: - return new toCacheEntrySynonym(objOwner, objName, objType, comment); + return new toCacheEntrySynonym(objOwner, objName, comment); case PROCEDURE: - return new toCacheEntryProcedure(objOwner, objName, objType, comment); + return new toCacheEntryProcedure(objOwner, objName, comment); case FUNCTION: - return new toCacheEntryFunction(objOwner, objName, objType, comment); + return new toCacheEntryFunction(objOwner, objName, comment); case PACKAGE: - return new toCacheEntryPackage(objOwner, objName, objType, comment); + return new toCacheEntryPackage(objOwner, objName, comment); case PACKAGE_BODY: - return new toCacheEntryPackageBody(objOwner, objName, objType, comment); + return new toCacheEntryPackageBody(objOwner, objName, comment); case INDEX: - return new toCacheEntryIndex(objOwner, objName, objType, comment); + return new toCacheEntryIndex(objOwner, objName, comment); case SEQUENCE: - return new toCacheEntrySequence(objOwner, objName, objType, comment); + return new toCacheEntrySequence(objOwner, objName, comment); case TRIGGER: - return new toCacheEntryTrigger(objOwner, objName, objType, comment); + return new toCacheEntryTrigger(objOwner, objName, comment); case DATABASE: - return new toCacheEntryDatabase(objOwner, objName, objType, comment); + return new toCacheEntryDatabase(objOwner, objName, comment); default: - return NULL; - ///throw QString("toCacheNew: Unknown object type %1").arg(objType); + ///return NULL; + throw QString("toCacheNew: Unknown object type %1").arg((quint32)objType); } +} + +toCacheNew::CacheEntry* toCacheNew::createCacheEntry(const QString &objOwner, const QString &objName, const QString &objTypeStr, const QString &comment) +{ + CacheEntryType objType = cacheEntryType(objTypeStr); + return createCacheEntry(objOwner, objName, objType, comment); }; +toCacheNew::CacheEntry* toCacheNew::cloneCacheEntry(CacheEntry const& other) +{ + return createCacheEntry(other.name.first, other.name.second, other.type, other.comment); +} + toCacheNew::CacheEntry::CacheEntry(const QString &owner, const QString &objName, const QString &objType, const QString &objComment) : name(ObjectRef(owner,objName)) , type(cacheEntryType(objType)) @@ -608,9 +655,11 @@ : name(ObjectRef(owner,objName)) , type(objType) , comment(objComment) + , timestamp(QDate::currentDate()) + , described(false) { if( type == OTHER) - throw QString("toCacheNew: Unknown object type %1").arg(objType); + throw QString("toCacheNew: Unknown object type %1").arg((unsigned)objType); }; bool toCacheNew::CacheEntry::operator < (const toCacheNew::CacheEntry &other) const @@ -646,48 +695,48 @@ return type == other.type && name == other.name; }; -toCacheEntryTable::toCacheEntryTable(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCacheNew::CacheEntry(owner, name, type, comment) +toCacheEntryTable::toCacheEntryTable(const QString &owner, const QString &name, const QString &comment) + : toCacheNew::CacheEntry(owner, name, toCacheNew::TABLE, comment) {}; -toCacheEntryView::toCacheEntryView(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCacheNew::CacheEntry(owner, name, type, comment) +toCacheEntryView::toCacheEntryView(const QString &owner, const QString &name, const QString &comment) + : toCacheNew::CacheEntry(owner, name, toCacheNew::VIEW, comment) {}; -toCacheEntrySynonym::toCacheEntrySynonym(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCacheNew::CacheEntry(owner, name, type, comment) +toCacheEntrySynonym::toCacheEntrySynonym(const QString &owner, const QString &name, const QString &comment) + : toCacheNew::CacheEntry(owner, name, toCacheNew::SYNONYM, comment) {}; -toCacheEntryProcedure::toCacheEntryProcedure(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCacheNew::CacheEntry(owner, name, type, comment) +toCacheEntryProcedure::toCacheEntryProcedure(const QString &owner, const QString &name, const QString &comment) + : toCacheNew::CacheEntry(owner, name, toCacheNew::PROCEDURE, comment) {}; -toCacheEntryFunction::toCacheEntryFunction(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCacheNew::CacheEntry(owner, name, type, comment) +toCacheEntryFunction::toCacheEntryFunction(const QString &owner, const QString &name, const QString &comment) + : toCacheNew::CacheEntry(owner, name, toCacheNew::FUNCTION, comment) {}; -toCacheEntryPackage::toCacheEntryPackage(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCacheNew::CacheEntry(owner, name, type, comment) +toCacheEntryPackage::toCacheEntryPackage(const QString &owner, const QString &name, const QString &comment) + : toCacheNew::CacheEntry(owner, name, toCacheNew::PACKAGE, comment) {}; -toCacheEntryPackageBody::toCacheEntryPackageBody(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCacheNew::CacheEntry(owner, name, type, comment) +toCacheEntryPackageBody::toCacheEntryPackageBody(const QString &owner, const QString &name, const QString &comment) + : toCacheNew::CacheEntry(owner, name, toCacheNew::PACKAGE_BODY, comment) {}; -toCacheEntryIndex::toCacheEntryIndex(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCacheNew::CacheEntry(owner, name, type, comment) +toCacheEntryIndex::toCacheEntryIndex(const QString &owner, const QString &name, const QString &comment) + : toCacheNew::CacheEntry(owner, name, toCacheNew::INDEX, comment) {}; -toCacheEntrySequence::toCacheEntrySequence(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCacheNew::CacheEntry(owner, name, type, comment) +toCacheEntrySequence::toCacheEntrySequence(const QString &owner, const QString &name, const QString &comment) + : toCacheNew::CacheEntry(owner, name, toCacheNew::SEQUENCE, comment) {}; -toCacheEntryTrigger::toCacheEntryTrigger(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCacheNew::CacheEntry(owner, name, type, comment) +toCacheEntryTrigger::toCacheEntryTrigger(const QString &owner, const QString &name, const QString &comment) + : toCacheNew::CacheEntry(owner, name, toCacheNew::TRIGGER, comment) {}; -toCacheEntryDatabase::toCacheEntryDatabase(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCacheNew::CacheEntry(owner, name, type, comment) +toCacheEntryDatabase::toCacheEntryDatabase(const QString &owner, const QString &name, const QString &comment) + : toCacheNew::CacheEntry(owner, name, toCacheNew::DATABASE, comment) {}; toCacheEntryUser::toCacheEntryUser(const QString &schema) Modified: branches/tora-trotl/src/tocachenew.h =================================================================== --- branches/tora-trotl/src/tocachenew.h 2012-06-06 15:16:30 UTC (rev 4337) +++ branches/tora-trotl/src/tocachenew.h 2012-06-06 16:34:50 UTC (rev 4338) @@ -28,6 +28,8 @@ class toGlobalSetting; class QDataStream; +class QFileInfo; +class QDir; class toCacheNew //: public QObject { @@ -167,6 +169,8 @@ /** simple cacheEntry factory */ static CacheEntry* createCacheEntry(const QString &owner, const QString &name, const QString &type, const QString &comment); + static CacheEntry* createCacheEntry(const QString &owner, const QString &name, CacheEntryType type, const QString &comment); + static CacheEntry* cloneCacheEntry(CacheEntry const& other); /** add/update new entry into cache */ void addEntry(CacheEntry* e); @@ -228,12 +232,12 @@ /** Return the file used to store cache contents for this connection. * @return A string representing a full path and filename of cache file */ - QString cacheFile(); + QFileInfo cacheFile(); /** Return the directory storing files (caches) of all connections. * @return A string representing a full path to cache store directory */ - static QString cacheDir(); + static QDir cacheDir(); /** Load cache information for current connection from a file on disk * @return True if cache was loaded @@ -250,6 +254,9 @@ /** translate object type name QString("TABLE") => CacheEntryType::TABLE */ static CacheEntryType cacheEntryType(QString const& objTypeName); + /** translate object type CacheEntryType::TABLE => QString("TABLE") */ + static QString cacheEntryTypeToString(CacheEntryType objType); + /** Non-blocking version of cacheAvailable, used by toMain to update toBackgroundLabel */ bool cacheRefreshRunning() const; @@ -283,7 +290,7 @@ class toCacheEntryTable :public toCacheNew::CacheEntry { public: - toCacheEntryTable(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryTable(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -291,7 +298,7 @@ class toCacheEntryView :public toCacheNew::CacheEntry { public: - toCacheEntryView(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryView(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -299,7 +306,7 @@ class toCacheEntrySynonym :public toCacheNew::CacheEntry { public: - toCacheEntrySynonym(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntrySynonym(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -307,7 +314,7 @@ class toCacheEntryProcedure:public toCacheNew::CacheEntry { public: - toCacheEntryProcedure(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryProcedure(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -315,7 +322,7 @@ class toCacheEntryFunction:public toCacheNew::CacheEntry { public: - toCacheEntryFunction(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryFunction(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -323,7 +330,7 @@ class toCacheEntryPackage:public toCacheNew::CacheEntry { public: - toCacheEntryPackage(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryPackage(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -331,7 +338,7 @@ class toCacheEntryPackageBody:public toCacheNew::CacheEntry { public: - toCacheEntryPackageBody(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryPackageBody(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -339,7 +346,7 @@ class toCacheEntryIndex:public toCacheNew::CacheEntry { public: - toCacheEntryIndex(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryIndex(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -347,7 +354,7 @@ class toCacheEntrySequence:public toCacheNew::CacheEntry { public: - toCacheEntrySequence(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntrySequence(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -355,7 +362,7 @@ class toCacheEntryTrigger:public toCacheNew::CacheEntry { public: - toCacheEntryTrigger(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryTrigger(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -363,7 +370,7 @@ class toCacheEntryDatabase:public toCacheNew::CacheEntry { public: - toCacheEntryDatabase(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryDatabase(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; Modified: branches/tora-trotl/src/toconnection.cpp =================================================================== --- branches/tora-trotl/src/toconnection.cpp 2012-06-06 15:16:30 UTC (rev 4337) +++ branches/tora-trotl/src/toconnection.cpp 2012-06-06 16:34:50 UTC (rev 4338) @@ -321,18 +321,6 @@ toBusy busy; Abort = true; - //unsigned cacheRefCnt; - //{ - // toLocker clock(Cache->cacheLock); - // cacheRefCnt = --Cache->refCount; - //} - //if(cacheRefCnt == 0) - //{ - // this->Cache->writeDiskCache(); - // // this will wait for cacheObjects thread to finish in toCache::~toCache - // delete this->Cache; - //} - unsigned cacheNewRefCnt; { toExclusiveLocker clock(CacheNew->cacheLock); @@ -340,7 +328,7 @@ } if(cacheNewRefCnt == 0) { - ////TODO this->CacheNew->writeDiskCache(); + this->CacheNew->writeDiskCache(); // this holds cache's shared lock // this will wait for cacheObjects thread to finish in toCache::~toCache delete this->CacheNew; } @@ -780,8 +768,18 @@ { /* Increase the semaphore to "unlock" parent thread, it's waiting for our start */ Connection->CacheNew->ReadingThreadSemaphore.up(); - Connection->CacheNew->setCacheState(toCacheNew::READING_FROM_DB); + Connection->CacheNew->setCacheState(toCacheNew::READING_FROM_DISK); + bool diskloaded = Connection->CacheNew->loadDiskCache(); + if (diskloaded) + { + // TODO: Check if really whole cache was loaded. + // the file image could contain only some schemas or part of the schema + Connection->CacheNew->setCacheState(toCacheNew::DONE); + return; + } + + Connection->CacheNew->setCacheState(toCacheNew::READING_FROM_DB); QList<toCacheNew::CacheEntry*> objs = Connection->Connection->objectNamesNew(); if (!Connection->Abort) { Modified: branches/tora-trotl/src/toglobalsetting.cpp =================================================================== --- branches/tora-trotl/src/toglobalsetting.cpp 2012-06-06 15:16:30 UTC (rev 4337) +++ branches/tora-trotl/src/toglobalsetting.cpp 2012-06-06 16:34:50 UTC (rev 4338) @@ -204,7 +204,7 @@ /** disk caching options */ - CacheDirectory->setText(toCacheNew::cacheDir()); + CacheDirectory->setText(toCacheNew::cacheDir().absolutePath()); DiskCaching->setChecked(toConfigurationSingle::Instance().cacheDisk()); CustomSQL->setText(toConfigurationSingle::Instance().sqlFile()); Modified: branches/tora-trotl/src/tooracleconnection_trotl.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection_trotl.cpp 2012-06-06 15:16:30 UTC (rev 4337) +++ branches/tora-trotl/src/tooracleconnection_trotl.cpp 2012-06-06 16:34:50 UTC (rev 4338) @@ -1015,7 +1015,7 @@ toQuery objects(connection(), toQuery::Long, toSQL::sql("toOracleConnection:ListObjectsInDatabase", connection()), par); while (!objects.eof()) { -#warning "check connection's parent Abort flag" +// TODO #warning "check connection's parent Abort flag" QString owner = objects.readValue(); QString name = objects.readValue(); QString type = objects.readValue(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-07 08:35:23
|
Revision: 4340 http://tora.svn.sourceforge.net/tora/?rev=4340&view=rev Author: ibre5041 Date: 2012-06-07 08:35:12 +0000 (Thu, 07 Jun 2012) Log Message: ----------- caching Modified Paths: -------------- branches/tora-trotl/src/CMakeLists.txt branches/tora-trotl/src/tocachenew.cpp branches/tora-trotl/src/tocachenew.h branches/tora-trotl/src/toresultcombo.cpp Modified: branches/tora-trotl/src/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/CMakeLists.txt 2012-06-07 08:23:27 UTC (rev 4339) +++ branches/tora-trotl/src/CMakeLists.txt 2012-06-07 08:35:12 UTC (rev 4340) @@ -115,6 +115,7 @@ toconnection.h toquery.h #tocache.h + tocachenew.h toconnectionimport.h toconnectionmodel.h toconnectionpool.h Modified: branches/tora-trotl/src/tocachenew.cpp =================================================================== --- branches/tora-trotl/src/tocachenew.cpp 2012-06-07 08:23:27 UTC (rev 4339) +++ branches/tora-trotl/src/tocachenew.cpp 2012-06-07 08:35:12 UTC (rev 4340) @@ -58,7 +58,8 @@ QDataStream& operator>> (QDataStream& stream, toCacheNew::CacheEntry& e); toCacheNew::toCacheNew( QString const &description) - : ConnectionDescription(description) + : QObject(NULL) + , ConnectionDescription(description) , refCount(1) // we assume that we were created from 1st toConnection , state(NOT_STARTED) , ownersRead(false) @@ -108,6 +109,7 @@ if( !usersMap.contains(schema)) { usersMap.insert(schema, new toCacheEntryUser(schema)); + emit userListRefreshed(); } if( !ownersMap.contains(e->name.first)) @@ -373,9 +375,6 @@ ret = ret.replace(":", "~"); ret += ".bin"; - QFileInfo i(cacheDir(), ret); - TLOG(8, toNoDecorator, __HERE__) << i.canonicalFilePath() << std::endl; - TLOG(8, toNoDecorator, __HERE__) << i.absoluteFilePath() << std::endl; return QFileInfo(cacheDir(), ret); } // cacheFile @@ -476,7 +475,9 @@ if (fileInfo.lastModified().addDays(toConfigurationSingle::Instance().cacheTimeout()) < today) return false; -//#warn TODO "throw something here plus clearCache" + clearCache(); + +//#warn TODO "throw something here quint32 entryMapSize, synonymMapSize, columnCacheSize, ownersMapSize, usersMapSize; QFile file(fileInfo.absoluteFilePath()); file.open(QIODevice::ReadOnly); @@ -499,10 +500,42 @@ } for(int i = 0; i < entryMapSize; i++) { - CacheEntry e; + CacheEntry e, *clone; in >> e; - addEntry(cloneCacheEntry(e)); + clone = cloneCacheEntry(e); + if( clone != NULL) + addEntry(cloneCacheEntry(e)); } + + // TODO this can be avoided (probably) + for(int i = 0; i < synonymMapSize; i++) + { + CacheEntry e, *clone; + in >> e; + } + for(int i = 0; i < columnCacheSize; i++) + { + CacheEntry e, *clone; + in >> e; + } + for(int i = 0; i < ownersMapSize; i++) + { + CacheEntry e, *clone; + in >> e; + clone = cloneCacheEntry(e); + if( clone != NULL) + addEntry(cloneCacheEntry(e)); + } + for(int i = 0; i < usersMapSize; i++) + { + CacheEntry e, *clone; + in >> e; + clone = cloneCacheEntry(e); + if( clone != NULL) + addEntry(cloneCacheEntry(e)); + } + + file.close(); return true; } @@ -623,8 +656,8 @@ case DATABASE: return new toCacheEntryDatabase(objOwner, objName, comment); default: - ///return NULL; - throw QString("toCacheNew: Unknown object type %1").arg((quint32)objType); + return NULL; // Do ignore some object types, like DBLINK or CLUSTER for example + ///throw QString("toCacheNew: Unknown object type %1").arg((quint32)objType); } } Modified: branches/tora-trotl/src/tocachenew.h =================================================================== --- branches/tora-trotl/src/tocachenew.h 2012-06-07 08:23:27 UTC (rev 4339) +++ branches/tora-trotl/src/tocachenew.h 2012-06-07 08:35:12 UTC (rev 4340) @@ -31,8 +31,10 @@ class QFileInfo; class QDir; -class toCacheNew //: public QObject +class toCacheNew : public QObject { + Q_OBJECT; + friend class toConnection; friend class toGlobalSetting; public: @@ -46,7 +48,7 @@ */ enum CacheEntryType : quint8 { - TABLE, + TABLE = 1, VIEW, SYNONYM, PROCEDURE, @@ -279,7 +281,9 @@ /** Multiple connections can point onto same toCache instance, the last connection should delete me. */ - QAtomicInt refCount; + QAtomicInt refCount; +signals: + void userListRefreshed(void); }; // toCacheNew /** A short representation of list<toCacheNew::ColumnDescription> Modified: branches/tora-trotl/src/toresultcombo.cpp =================================================================== --- branches/tora-trotl/src/toresultcombo.cpp 2012-06-07 08:23:27 UTC (rev 4339) +++ branches/tora-trotl/src/toresultcombo.cpp 2012-06-07 08:35:12 UTC (rev 4340) @@ -56,6 +56,8 @@ this, SLOT(changeSelected(void))); setSizeAdjustPolicy(QComboBox::AdjustToContents); queryingUserlist = false; + + connect(connection().CacheNew, SIGNAL(userListRefreshed()), this, SLOT(usersFromCache())); } toResultCombo::~toResultCombo() @@ -90,20 +92,25 @@ } else { - QStringList users = connection().CacheNew->userList(toCacheNew::USERS); - for (QStringList::iterator i = users.begin(); i != users.end(); i++) - { - QString t = (*i); - addItem(t); - if (t == Selected) - setCurrentIndex(count() - 1); - } - queryDone(); + usersFromCache(); } } TOCATCH } +void toResultCombo::usersFromCache(void) +{ + QStringList users = connection().CacheNew->userList(toCacheNew::USERS); + for (QStringList::iterator i = users.begin(); i != users.end(); i++) + { + QString t = (*i); + addItem(t); + if (t == Selected) + setCurrentIndex(count() - 1); + } + queryDone(); +} + void toResultCombo::changeSelected(void) { Selected = currentText(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-07 22:53:28
|
Revision: 4342 http://tora.svn.sourceforge.net/tora/?rev=4342&view=rev Author: ibre5041 Date: 2012-06-07 22:53:21 +0000 (Thu, 07 Jun 2012) Log Message: ----------- uninitialized memory access fix - still does not resolve deadlock Modified Paths: -------------- branches/tora-trotl/src/todebug.cpp branches/tora-trotl/src/toresultcombo.h Modified: branches/tora-trotl/src/todebug.cpp =================================================================== --- branches/tora-trotl/src/todebug.cpp 2012-06-07 10:53:29 UTC (rev 4341) +++ branches/tora-trotl/src/todebug.cpp 2012-06-07 22:53:21 UTC (rev 4342) @@ -2189,8 +2189,9 @@ } toDebug::toDebug(QWidget *main, toConnection &connection) - : toToolWidget(DebugTool, "debugger.html", main, connection, "toDebug"), - TargetThread() + : toToolWidget(DebugTool, "debugger.html", main, connection, "toDebug") + , TargetThread() + , DebuggerStarted(false) { debugSession = new toQuery(connection); Modified: branches/tora-trotl/src/toresultcombo.h =================================================================== --- branches/tora-trotl/src/toresultcombo.h 2012-06-07 10:53:29 UTC (rev 4341) +++ branches/tora-trotl/src/toresultcombo.h 2012-06-07 22:53:21 UTC (rev 4342) @@ -200,6 +200,8 @@ { toResult::changeParams(Param1, Param2, Param3); } + + void usersFromCache(void); private slots: void poll(void); void queryDone(void); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-08 13:47:10
|
Revision: 4344 http://tora.svn.sourceforge.net/tora/?rev=4344&view=rev Author: ibre5041 Date: 2012-06-08 13:46:59 +0000 (Fri, 08 Jun 2012) Log Message: ----------- Do use toResultSchema for the user list in all the tools - also fixes deadlock in toDebug Modified Paths: -------------- branches/tora-trotl/src/toanalyze.cpp branches/tora-trotl/src/toawr.cpp branches/tora-trotl/src/tobrowser.cpp branches/tora-trotl/src/tobrowser.h branches/tora-trotl/src/tobrowsertable.cpp branches/tora-trotl/src/tobrowsertableui.ui branches/tora-trotl/src/todebug.cpp branches/tora-trotl/src/todebug.h branches/tora-trotl/src/tologger.h branches/tora-trotl/src/toplsqleditor.cpp branches/tora-trotl/src/toplsqleditor.h branches/tora-trotl/src/toquery.cpp branches/tora-trotl/src/toraversion.h branches/tora-trotl/src/toresultcombo.cpp branches/tora-trotl/src/toresultcombo.h branches/tora-trotl/src/toresultplan.cpp branches/tora-trotl/src/toresultschema.cpp branches/tora-trotl/src/toresultschema.h branches/tora-trotl/src/tosession.cpp branches/tora-trotl/src/tosession.h branches/tora-trotl/src/tosgatrace.cpp branches/tora-trotl/src/tosgatrace.h branches/tora-trotl/src/totableselect.cpp branches/tora-trotl/src/totableselect.h branches/tora-trotl/src/tounittest.cpp branches/tora-trotl/src/toworksheet.cpp Modified: branches/tora-trotl/src/toanalyze.cpp =================================================================== --- branches/tora-trotl/src/toanalyze.cpp 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/toanalyze.cpp 2012-06-08 13:46:59 UTC (rev 4344) @@ -47,7 +47,7 @@ #include "toconnection.h" #include "tomain.h" #include "tomemoeditor.h" -#include "toresultcombo.h" +#include "toresultschema.h" #include "toresulttableview.h" #include "toresultplan.h" #include "tosql.h" @@ -239,15 +239,11 @@ toolbar->addWidget(Analyzed); } - Schema = new toResultCombo(toolbar, TO_TOOLBAR_WIDGET_NAME); + Schema = new toResultSchema(toolbar, TO_TOOLBAR_WIDGET_NAME); Schema->setSelected(tr("All")); Schema->additionalItem(tr("All")); toolbar->addWidget(Schema); - try - { - Schema->query(toSQL::sql(toSQL::TOSQL_USERLIST)); - } - TOCATCH; + Schema->refresh(); if (toIsOracle(connection)) { Modified: branches/tora-trotl/src/toawr.cpp =================================================================== --- branches/tora-trotl/src/toawr.cpp 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/toawr.cpp 2012-06-08 13:46:59 UTC (rev 4344) @@ -270,6 +270,7 @@ toolbar->addWidget(new QLabel("Inst:", toolbar)); dbid = new toResultCombo(toolbar, "AWR toolbar"); + dbid->setSQL(toSQL::sql("toAWR:DBInstances", connection())); fsnap = new toResultCombo(toolbar, "AWR toolbar"); fsnap->setSelectionPolicy(toResultCombo::LastButOne); tsnap = new toResultCombo(toolbar, "AWR toolbar"); tsnap->setSelectionPolicy(toResultCombo::Last); @@ -289,7 +290,7 @@ try { - dbid->query(toSQL::sql("toAWR:DBInstances", connection())); + dbid->refresh(); } TOCATCH; Modified: branches/tora-trotl/src/tobrowser.cpp =================================================================== --- branches/tora-trotl/src/tobrowser.cpp 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/tobrowser.cpp 2012-06-08 13:46:59 UTC (rev 4344) @@ -907,7 +907,7 @@ strech->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum)); - Schema = new toResultSchema(connection, toolbar, TO_TOOLBAR_WIDGET_NAME); + Schema = new toResultSchema(toolbar, TO_TOOLBAR_WIDGET_NAME); connect(Schema, SIGNAL(activated(int)), this, SLOT(changeSchema(int))); toolbar->addWidget(Schema); @@ -1441,7 +1441,7 @@ void toBrowser::changeConnection(void) { m_mainTab->blockSignals(true); - Schema->query(toSQL::sql(toSQL::TOSQL_USERLIST)); + Schema->refresh(); if ( ! connection().schema().isEmpty() ) { Modified: branches/tora-trotl/src/tobrowser.h =================================================================== --- branches/tora-trotl/src/tobrowser.h 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/tobrowser.h 2012-06-08 13:46:59 UTC (rev 4344) @@ -57,7 +57,7 @@ class QToolBar; class toBrowserFilter; class toResult; -class toResultCombo; +class toResultSchema; class toResultData; class toResultData; class toResultFilter; @@ -119,7 +119,7 @@ NO_USE_CACHE }; - toResultCombo *Schema; + toResultSchema *Schema; QTabWidget *m_mainTab; QMenu *ToolMenu; Modified: branches/tora-trotl/src/tobrowsertable.cpp =================================================================== --- branches/tora-trotl/src/tobrowsertable.cpp 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/tobrowsertable.cpp 2012-06-08 13:46:59 UTC (rev 4344) @@ -48,7 +48,7 @@ #include "toextract.h" #include "tohighlightedtext.h" #include "tomemoeditor.h" -#include "toresultcombo.h" +#include "toresultcombousers.h" #include "tosql.h" #include <qapplication.h> @@ -207,7 +207,8 @@ Table = cnct->quote(table); QString tablespace; - Schema->query(toSQL::sql(toSQL::TOSQL_USERLIST)); + //Schema->query(toSQL::sql(toSQL::TOSQL_USERLIST)); + Schema->refresh(); Schema->setSelected(Owner); if (!Table.isEmpty()) Modified: branches/tora-trotl/src/tobrowsertableui.ui =================================================================== --- branches/tora-trotl/src/tobrowsertableui.ui 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/tobrowsertableui.ui 2012-06-08 13:46:59 UTC (rev 4344) @@ -40,7 +40,7 @@ </widget> </item> <item> - <widget class="toResultCombo" name="Schema" native="true"/> + <widget class="toResultSchema" name="Schema" native="true"/> </item> <item> <widget class="QLabel" name="NameLabel"> @@ -277,9 +277,9 @@ <layoutdefault spacing="6" margin="11"/> <customwidgets> <customwidget> - <class>toResultCombo</class> + <class>toResultSchema</class> <extends>QWidget</extends> - <header>toresultcombo.h</header> + <header>toresultschema.h</header> </customwidget> <customwidget> <class>toHighlightedText</class> @@ -295,7 +295,7 @@ <tabstop>ShowSql</tabstop> </tabstops> <includes> - <include location="local">toresultcombo.h</include> + <include location="local">toresultschema.h</include> <include location="local">tohighlightedtext.h</include> <include location="local">tohighlightedtext.h</include> <include location="local">tohighlightedtext.h</include> Modified: branches/tora-trotl/src/todebug.cpp =================================================================== --- branches/tora-trotl/src/todebug.cpp 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/todebug.cpp 2012-06-08 13:46:59 UTC (rev 4344) @@ -53,6 +53,7 @@ #include "tooutput.h" #include "toparamget.h" #include "toresultview.h" +#include "toresultschema.h" #include "tosql.h" #include "toquery.h" #include "tosqlparse.h" @@ -63,7 +64,6 @@ #include <stack> #include <qcheckbox.h> -#include <qcombobox.h> #include <qlabel.h> #include <qregexp.h> #include <qsizepolicy.h> @@ -866,7 +866,7 @@ QString toDebug::currentSchema(void) { - return Schema->currentText(); + return Schema->selected(); } toTreeWidgetItem *toDebug::contents(void) @@ -2115,7 +2115,8 @@ // When stopping target session we have to cancel corresponding query rather // than sending a ABORT_EXECUTION signal (which apparently kills whole target // session - TargetQuery->cancel(); + if( TargetQuery) + TargetQuery->cancel(); debugSession->execute(SQLDetach); reason = TO_REASON_KNL_EXIT; } // if stopon != TO_ABORT_EXECUTION @@ -2190,8 +2191,9 @@ toDebug::toDebug(QWidget *main, toConnection &connection) : toToolWidget(DebugTool, "debugger.html", main, connection, "toDebug") - , TargetThread() - , DebuggerStarted(false) + , TargetThread() + , TargetQuery(NULL) + , DebuggerStarted(false) { debugSession = new toQuery(connection); @@ -2204,13 +2206,12 @@ toolbar->addSeparator(); - Schema = new QComboBox(toolbar); - Schema->setObjectName(TO_TOOLBAR_WIDGET_NAME); - toolbar->addWidget(Schema); + Schema = new toResultSchema(toolbar, TO_TOOLBAR_WIDGET_NAME); connect(Schema, SIGNAL(activated(int)), this, SLOT(changeSchema(int))); + toolbar->addWidget(Schema); toolbar->addSeparator(); @@ -2668,7 +2669,12 @@ void toDebug::changeSchema(int) { - refresh(); + try + { + Schema->update(); + CodeModel->refresh(connection(), Schema->selected()); + } + TOCATCH } static toSQL SQLListObjects("toDebug:ListObjects", @@ -2681,33 +2687,13 @@ void toDebug::refresh(void) { + // qDebug() << "toDebug::refresh 1"; try { - QString selected = Schema->currentText(); - QString currentSchema; - if (selected.isEmpty()) - { - selected = connection().user().toUpper(); - Schema->clear(); - toQList users = toQuery::readQuery(connection(), - toSQL::string(toSQL::TOSQL_USERLIST, connection())); - for (toQList::iterator i = users.begin(); i != users.end(); i++) - Schema->addItem(*i); - } - if (!selected.isEmpty()) - { - for (int i = 0; i < Schema->count(); i++) - { - if (Schema->itemText(i) == selected) - { - Schema->setCurrentIndex(i); - break; - } - } - - CodeModel->refresh(connection(), selected); - } + Schema->refresh(); + QString selected = Schema->selected(); + CodeModel->refresh(connection(), selected); } TOCATCH // qDebug() << "toDebug::refresh 2"; @@ -2865,9 +2851,9 @@ return; ctype = ctype.toUpper(); - viewSource(Schema->currentText(), item->display(), ctype, 0); + viewSource(Schema->selected(), item->display(), ctype, 0); if (ctype == "PACKAGE" || ctype == "TYPE") - viewSource(Schema->currentText(), item->display(), ctype + " BODY", 0); + viewSource(Schema->selected(), item->display(), ctype + " BODY", 0); } #ifdef AUTOEXPAND else if (item && !item->parent()) @@ -2997,15 +2983,9 @@ editor->getCursorPosition(&row, &col); if (editor->compile()) { - if (editor == currentEditor() && - lastSchema != currentEditor()->schema()) + if (editor == currentEditor() && lastSchema != currentEditor()->schema()) { - for (int i = 0; i < Schema->count(); i++) - if (Schema->itemText(i) == lastSchema) - { - Schema->setCurrentIndex(i); - break; - } + Schema->update(lastSchema); } if (editor->hasErrors()) Editors->setTabIcon(Editors->indexOf(editor), @@ -3084,8 +3064,8 @@ // signal removed with qscintilla port. // connect(text, SIGNAL(insertedLines(int, int)), // this, SLOT(reorderContent(int, int))); - if (!Schema->currentText().isEmpty()) - text->setSchema(Schema->currentText()); + if (!Schema->selected().isEmpty()) + text->setSchema(Schema->selected()); else text->setSchema(connection().user().toUpper()); Editors->addTab(text, tr("Unknown")); @@ -3338,7 +3318,7 @@ num.setNum(i); editor->exportData(data, prefix + ":Editor:" + num); } - data[prefix + ":Schema"] = Schema->currentText(); + data[prefix + ":Schema"] = Schema->selected(); int id = 1; for (toTreeWidgetItem *item = Breakpoints->firstChild(); item; item = item->nextSibling()) @@ -3382,15 +3362,8 @@ void toDebug::importData(std::map<QString, QString> &data, const QString &prefix) { QString str = data[prefix + ":Schema"]; - { - for (int i = 0; i < Schema->count(); i++) - if (Schema->itemText(i) == str) - { - Schema->setCurrentIndex(i); - changeSchema(i); - break; - } - } + Schema->update(str); + changeSchema(-1); // NOTE: int argument -1 is required for a slot, but it is not used anyway int count = data[prefix + ":Editors"].toInt(); for (int j = 0; j < count; j++) Modified: branches/tora-trotl/src/todebug.h =================================================================== --- branches/tora-trotl/src/todebug.h 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/todebug.h 2012-06-08 13:46:59 UTC (rev 4344) @@ -109,6 +109,7 @@ class toOutput; class toTreeWidget; class toTreeWidgetItem; +class toResultSchema; class toDebug : public toToolWidget { @@ -139,7 +140,7 @@ void getErrorText(int code, int type, QString &ret); #endif - QComboBox *Schema; + toResultSchema *Schema; QAction *refreshAct; QAction *newSheetAct; QAction *scanSourceAct; Modified: branches/tora-trotl/src/tologger.h =================================================================== --- branches/tora-trotl/src/tologger.h 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/tologger.h 2012-06-08 13:46:59 UTC (rev 4344) @@ -89,8 +89,9 @@ DISABLE_LOG(2); DISABLE_LOG(3); // tonoblockquery<3> - debugging(disabled) DISABLE_LOG(4); // tonoblockquery<4> - data read(disabled) +DISABLE_LOG(5); // tonoblockquery<5> +DISABLE_LOG(6); // tonoblockquery<6> - /* use this if you want output into the file thread_safe_log templ_get_log_ownthread<1>( int_to_type< 1> * = NULL ) { Modified: branches/tora-trotl/src/toplsqleditor.cpp =================================================================== --- branches/tora-trotl/src/toplsqleditor.cpp 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/toplsqleditor.cpp 2012-06-08 13:46:59 UTC (rev 4344) @@ -63,6 +63,7 @@ #include "toplsqltext.h" #include "tocodemodel.h" #include "todescribe.h" +#include "toresultschema.h" #include "icons/close.xpm" #include "icons/compile.xpm" @@ -130,7 +131,7 @@ QString toPLSQLEditor::currentSchema(void) { - return Schema->currentText(); + return Schema->selected(); } bool toPLSQLEditor::viewSource(const QString &schema, const QString &name, const QString &type, @@ -203,8 +204,7 @@ toolbar->addSeparator(); - Schema = new QComboBox(toolbar); - Schema->setObjectName("PLSQLEditorSchemaCombo"); + Schema = new toResultSchema(toolbar, "PLSQLEditorSchemaCombo"); toolbar->addWidget(Schema); connect(Schema, SIGNAL(activated(int)), @@ -236,7 +236,7 @@ Objects = new QTreeView(splitter); CodeModel = new toCodeModel(Objects); Objects->setModel(CodeModel); - QString selected = Schema->currentText(); + QString selected = Schema->selected(); if (!selected.isEmpty()) CodeModel->refresh(connection, selected); // even better (?) for reopening the tabs @@ -396,34 +396,10 @@ void toPLSQLEditor::refresh(void) { QApplication::setOverrideCursor(Qt::WaitCursor); - try - { - QString selected = Schema->currentText(); - QString currentSchema; - if (selected.isEmpty()) - { - selected = connection().user().toUpper(); - Schema->clear(); - toQList users = toQuery::readQuery(connection(), - toSQL::string(toSQL::TOSQL_USERLIST, connection())); - for (toQList::iterator i = users.begin(); i != users.end(); i++) - Schema->addItem(*i); - } - if (!selected.isEmpty()) - { - for (int i = 0; i < Schema->count(); i++) - { - if (Schema->itemText(i) == selected) - { - Schema->setCurrentIndex(i); - break; - } - } + Schema->refresh(); + QString selected = Schema->selected(); - CodeModel->refresh(connection(), selected); - } - } - TOCATCH; + CodeModel->refresh(connection(), selected); QApplication::restoreOverrideCursor(); } @@ -492,10 +468,10 @@ return; ctype = ctype.toUpper(); - viewSource(Schema->currentText(), item->display(), ctype, 0); + viewSource(Schema->selected(), item->display(), ctype, 0); if (ctype == "PACKAGE" || - (ctype == "TYPE" && hasCode(Schema->currentText(), ctype + " BODY", item->display()))) - viewSource(Schema->currentText(), item->display(), ctype + " BODY", 0); + (ctype == "TYPE" && hasCode(Schema->selected(), ctype + " BODY", item->display()))) + viewSource(Schema->selected(), item->display(), ctype + " BODY", 0); } #ifdef AUTOEXPAND else if (item && !item->parent()) @@ -537,8 +513,8 @@ void toPLSQLEditor::newSheet(void) { toPLSQLWidget *text = new toPLSQLWidget(Editors); - if (!Schema->currentText().isEmpty()) - text->editor()->setSchema(Schema->currentText()); + if (!Schema->selected().isEmpty()) + text->editor()->setSchema(Schema->selected()); else text->editor()->setSchema(connection().user().toUpper()); Editors->addTab(text, tr("Unknown")); @@ -636,7 +612,7 @@ toHighlightedText * marked = currentEditor()->editor(); marked->tableAtCursor(owner, table); if (owner.isNull()) - owner = Schema->currentText(); + owner = Schema->selected(); toDescribe * d = new toDescribe(this); d->changeParams(owner, table); } Modified: branches/tora-trotl/src/toplsqleditor.h =================================================================== --- branches/tora-trotl/src/toplsqleditor.h 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/toplsqleditor.h 2012-06-08 13:46:59 UTC (rev 4344) @@ -56,6 +56,7 @@ class toTreeWidget; class toTreeWidgetItem; class toPLSQLText; +class toResultSchema; /*! \brief Advanced PL/SQL Editor. It's based on Debugger code. But it can compile PL/SQL unit in all cases. @@ -73,7 +74,7 @@ // Toolbar void createActions(void); - QComboBox *Schema; + toResultSchema *Schema; QAction *refreshAct; QAction *describeAct; QAction *newSheetAct; Modified: branches/tora-trotl/src/toquery.cpp =================================================================== --- branches/tora-trotl/src/toquery.cpp 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/toquery.cpp 2012-06-08 13:46:59 UTC (rev 4344) @@ -313,14 +313,14 @@ queryMode mode, const QString &sql, const toQList ¶ms) - : Connection(QPointer<toConnection>(&conn)), + : Connection(QPointer<toConnection>(&conn)), // note to myself: this is dangerous. QPointer is guared by mutex, this can block the main thread. (toConnection::toConnection) Params(params), SQL(sql) { Mode = mode; showBusy = true; - ConnectionSub = conn.pooledConnection(); + ConnectionSub = conn.pooledConnection(); // PoolPtr sub(ConnectionPool); toBusy busy; try Modified: branches/tora-trotl/src/toraversion.h =================================================================== --- branches/tora-trotl/src/toraversion.h 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/toraversion.h 2012-06-08 13:46:59 UTC (rev 4344) @@ -1,53 +1,53 @@ -/* BEGIN_COMMON_COPYRIGHT_HEADER - * - * TOra - An Oracle Toolkit for DBA's and developers - * - * Shared/mixed copyright is held throughout files in this product - * - * Portions Copyright (C) 2000-2001 Underscore AB - * Portions Copyright (C) 2003-2005 Quest Software, Inc. - * Portions Copyright (C) 2004-2009 Numerous Other Contributors - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; only version 2 of - * the License is valid for this program. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * As a special exception, you have permission to link this program - * with the Oracle Client libraries and distribute executables, as long - * as you follow the requirements of the GNU GPL in regard to all of the - * software in the executable aside from Oracle client libraries. - * - * Specifically you are not permitted to link this program with the - * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. - * And you are not permitted to distribute binaries compiled against - * these libraries. - * - * You may link this product with any GPL'd Qt library. - * - * All trademarks belong to their respective owners. - * - * END_COMMON_COPYRIGHT_HEADER */ - -#ifndef TOVERSION -#include "toversion.h" -#endif - -#if defined(HAVE_SVNREVISION_H) && !defined(SVNREVISION) -#include "svnrevision.h" -#endif - -#if defined(SVNREVISION) -#define TORAVERSION TOVERSION "." "(" SVNREVISION "svn)" -#else -#define TORAVERSION TOVERSION -#endif +/* BEGIN_COMMON_COPYRIGHT_HEADER + * + * TOra - An Oracle Toolkit for DBA's and developers + * + * Shared/mixed copyright is held throughout files in this product + * + * Portions Copyright (C) 2000-2001 Underscore AB + * Portions Copyright (C) 2003-2005 Quest Software, Inc. + * Portions Copyright (C) 2004-2009 Numerous Other Contributors + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; only version 2 of + * the License is valid for this program. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * As a special exception, you have permission to link this program + * with the Oracle Client libraries and distribute executables, as long + * as you follow the requirements of the GNU GPL in regard to all of the + * software in the executable aside from Oracle client libraries. + * + * Specifically you are not permitted to link this program with the + * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. + * And you are not permitted to distribute binaries compiled against + * these libraries. + * + * You may link this product with any GPL'd Qt library. + * + * All trademarks belong to their respective owners. + * + * END_COMMON_COPYRIGHT_HEADER */ + +#ifndef TOVERSION +#include "toversion.h" +#endif + +#if defined(HAVE_SVNREVISION_H) && !defined(SVNREVISION) +#include "svnrevision.h" +#endif + +#if defined(SVNREVISION) +#define TORAVERSION TOVERSION "." "(" SVNREVISION "svn)" +#else +#define TORAVERSION TOVERSION +#endif Modified: branches/tora-trotl/src/toresultcombo.cpp =================================================================== --- branches/tora-trotl/src/toresultcombo.cpp 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/toresultcombo.cpp 2012-06-08 13:46:59 UTC (rev 4344) @@ -48,6 +48,8 @@ #include "tosql.h" #include "totool.h" +#include "toresultschema.h" + toResultCombo::toResultCombo(QWidget *parent, const char *name) : QComboBox(parent), Query(0), SelectionPolicy(None) { @@ -55,7 +57,7 @@ connect(this, SIGNAL(activated(int)), this, SLOT(changeSelected(void))); setSizeAdjustPolicy(QComboBox::AdjustToContents); - queryingUserlist = false; + //queryingUserlist = false; connect(connection().CacheNew, SIGNAL(userListRefreshed()), this, SLOT(usersFromCache())); } @@ -79,10 +81,22 @@ if (Additional[i] == Selected) setCurrentIndex(i); + // NOTE: delete this block. It is just a runtime check. + // It should find all the instances of toResultCombo who use q TOSQL_USERLIST. + // All those should be migrated into toResultSchema + toResultSchema* d = dynamic_cast<toResultSchema*>(this); + if ( d == NULL) + { + if (sql == toSQL::string(toSQL::TOSQL_USERLIST, connection())) + { + throw QString::fromLatin1("Illegal usage"); + } + } + if (sql != toSQL::string(toSQL::TOSQL_USERLIST, connection()) || !connection().CacheNew->userListExists(toCacheNew::USERS)) { - queryingUserlist = true; + //queryingUserlist = true; userList.clear(); Query = new toEventQuery(connection(), toQuery::Background, sql, param); connect(Query, SIGNAL(dataAvailable()), this, SLOT(poll())); @@ -92,12 +106,13 @@ } else { - usersFromCache(); + usersFromCache(); } } TOCATCH } +// NOTE: this is nonsense too. This should be moved into toResultSchema void toResultCombo::usersFromCache(void) { QStringList users = connection().CacheNew->userList(toCacheNew::USERS); @@ -135,10 +150,10 @@ l.append(v); } addItem(t, QVariant(l)); - if (queryingUserlist) - { - userList.append(new toCacheEntryUser(t)); - } + // if (queryingUserlist) + // { + //userList.append(new toCacheEntryUser(t)); + // } if (t == Selected) setCurrentIndex(count() - 1); } @@ -174,11 +189,16 @@ updateGeometry(); // If we were querying user list - save it to cache - if (queryingUserlist) - { - connection().CacheNew->updateUserList(userList, toCacheNew::USERS); - userList.clear(); - } + // if (queryingUserlist) + // { + //connection().CacheNew->updateUserList(userList, toCacheNew::USERS); + //userList.clear(); + // } emit done(); } // queryDone + +void toResultCombo::refresh(void) +{ + toResult::refresh(); +} Modified: branches/tora-trotl/src/toresultcombo.h =================================================================== --- branches/tora-trotl/src/toresultcombo.h 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/toresultcombo.h 2012-06-08 13:46:59 UTC (rev 4344) @@ -58,7 +58,6 @@ /** This widget displays the result of a query where each field is added as an item * to a combobox. */ - class toResultCombo : public QComboBox, public toResult { Q_OBJECT @@ -67,7 +66,7 @@ QString Selected; QStringList Additional; - bool queryingUserlist; + //bool queryingUserlist; QList<toCacheNew::CacheEntry*> userList; public: @@ -86,7 +85,7 @@ toResultCombo(QWidget *parent, const char *name = NULL); /** Destruct object */ - ~toResultCombo(); + virtual ~toResultCombo(); /** Reimplemented for internal reasons. */ @@ -131,7 +130,7 @@ } // Why are these needed? -#if 1 +#if 0 /** Set the SQL statement of this list * @param sql String containing statement. */ @@ -178,10 +177,8 @@ public slots: /** Reimplemented for internal reasons. */ - virtual void refresh(void) - { - toResult::refresh(); - } + virtual void refresh(void); + /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1) Modified: branches/tora-trotl/src/toresultplan.cpp =================================================================== --- branches/tora-trotl/src/toresultplan.cpp 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/toresultplan.cpp 2012-06-08 13:46:59 UTC (rev 4344) @@ -359,10 +359,11 @@ TopItem->setToolTip(1, queryText); CursorChildSel = new toResultCombo(this, "toResultPlan"); + CursorChildSel->setSQL(toSQL::string(SQLVSQLChildSel, conn).arg(Ident)); CursorChildSel->setSelectionPolicy(toResultCombo::First); try { - CursorChildSel->query(toSQL::string(SQLVSQLChildSel, conn).arg(Ident)); + CursorChildSel->refresh(); } TOCATCH; setItemWidget(TopItem, 3, CursorChildSel); Modified: branches/tora-trotl/src/toresultschema.cpp =================================================================== --- branches/tora-trotl/src/toresultschema.cpp 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/toresultschema.cpp 2012-06-08 13:46:59 UTC (rev 4344) @@ -39,20 +39,20 @@ * * END_COMMON_COPYRIGHT_HEADER */ +#include "toresultschema.h" #include "utils.h" -#include "toresultschema.h" #include "toconnection.h" +#include "tologger.h" #include <QSettings> - -toResultSchema::toResultSchema(toConnection &conn, - QWidget *parent, +toResultSchema::toResultSchema(QWidget *parent, const char *name) : toResultCombo(parent, name) { setSQL(toSQL::sql(toSQL::TOSQL_USERLIST)); + toConnection &conn = toCurrentConnection(parent); ConnectionKey = conn.provider() + "-" + conn.host() + "-" + @@ -96,7 +96,6 @@ update(toResultCombo::currentText()); } - void toResultSchema::update(const QString &schema) { if(schema.isEmpty()) return; @@ -133,8 +132,18 @@ TOCATCH; } - void toResultSchema::updateLastSchema(const QString &schema) { QSettings s; s.setValue("schema/" + ConnectionKey, schema); } + +void toResultSchema::refresh(void) +{ + try { + toResultCombo::refresh(); + } + catch (...) + { + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; + } +} Modified: branches/tora-trotl/src/toresultschema.h =================================================================== --- branches/tora-trotl/src/toresultschema.h 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/toresultschema.h 2012-06-08 13:46:59 UTC (rev 4344) @@ -42,13 +42,10 @@ #ifndef TORESULTSCHEMA_H #define TORESULTSCHEMA_H - - #include "toresultcombo.h" class toConnection; - /** * This widget displays a list of schemas * @@ -66,11 +63,13 @@ * * @param parent Parent widget. * @param name Name of widget. + * + * NOTE: this widget does not eneed any reference to toConnection, + * whenever queriyng it finds toCurrentConnection */ - toResultSchema(toConnection &conn, - QWidget *parent, - const char *name = NULL); - + toResultSchema(QWidget *parent, const char *name = NULL); + + virtual ~toResultSchema() {}; private slots: // stores last schema selected in qsettings @@ -90,6 +89,11 @@ * */ void update(void); + + virtual void refresh(void); + +private: + void init(toConnection &conn); }; #endif Modified: branches/tora-trotl/src/tosession.cpp =================================================================== --- branches/tora-trotl/src/tosession.cpp 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/tosession.cpp 2012-06-08 13:46:59 UTC (rev 4344) @@ -46,7 +46,7 @@ #include "toconnection.h" #include "tomain.h" #include "toresultbar.h" -#include "toresultcombo.h" +#include "toresultschema.h" #include "toresultlock.h" #include "toresultlong.h" #include "toresultstats.h" @@ -392,13 +392,13 @@ { toolbar->addSeparator(); - Select = new toResultCombo(toolbar, TO_TOOLBAR_WIDGET_NAME); + Select = new toResultSchema(toolbar, TO_TOOLBAR_WIDGET_NAME); Select->setSelected(tr("Only active users")); Select->additionalItem(tr("Only active users")); Select->additionalItem(tr("All")); Select->additionalItem(tr("No background")); Select->additionalItem(tr("No system")); - Select->query(toSQL::sql(toSQL::TOSQL_USERLIST)); + Select->refresh(); toolbar->addWidget(Select); connect(Select, SIGNAL(activated(int)), this, SLOT(refresh())); Modified: branches/tora-trotl/src/tosession.h =================================================================== --- branches/tora-trotl/src/tosession.h 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/tosession.h 2012-06-08 13:46:59 UTC (rev 4344) @@ -58,7 +58,7 @@ class toConnection; class toMain; class toResultBar; -class toResultCombo; +class toResultSchema; class toResultLock; class toResultStats; class toResultTableView; @@ -80,7 +80,7 @@ QWidget *CurrentTab; - toResultCombo *Select; + toResultSchema *Select; toSGAStatement *CurrentStatement; toSGAStatement *PreviousStatement; Modified: branches/tora-trotl/src/tosgatrace.cpp =================================================================== --- branches/tora-trotl/src/tosgatrace.cpp 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/tosgatrace.cpp 2012-06-08 13:46:59 UTC (rev 4344) @@ -43,7 +43,7 @@ #include "toconf.h" #include "toconnection.h" #include "tomain.h" -#include "toresultcombo.h" +#include "toresultschema.h" #include "toresulttableview.h" #include "toresultresources.h" #include "toresultview.h" @@ -53,7 +53,6 @@ #include "totool.h" #include <qcheckbox.h> -#include <qcombobox.h> #include <QGroupBox> #include <qlabel.h> #include <qmenubar.h> @@ -167,10 +166,10 @@ QLabel * labSchema = new QLabel(tr("Schema") + " ", toolbar); toolbar->addWidget(labSchema); - Schema = new toResultCombo(toolbar); + Schema = new toResultSchema(toolbar); Schema->additionalItem(tr("Any")); Schema->setSelected(connection.user().toUpper()); - Schema->query(toSQL::sql(toSQL::TOSQL_USERLIST)); + Schema->refresh(); toolbar->addWidget(Schema); connect(Schema, SIGNAL(activated(const QString &)), this, SLOT(changeSchema(const QString &))); Modified: branches/tora-trotl/src/tosgatrace.h =================================================================== --- branches/tora-trotl/src/tosgatrace.h 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/tosgatrace.h 2012-06-08 13:46:59 UTC (rev 4344) @@ -54,7 +54,7 @@ class QTabWidget; class toConnection; class toMain; -class toResultCombo; +class toResultSchema; class toResultTableView; class toSGAStatement; class toTool; @@ -67,7 +67,7 @@ QTabWidget *ResultTab; QAction *FetchAct; - toResultCombo *Schema; + toResultSchema *Schema; QComboBox *Type; QComboBox *Refresh; QComboBox *Limit; Modified: branches/tora-trotl/src/totableselect.cpp =================================================================== --- branches/tora-trotl/src/totableselect.cpp 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/totableselect.cpp 2012-06-08 13:46:59 UTC (rev 4344) @@ -42,7 +42,7 @@ #include "tologger.h" #include "toconnection.h" -#include "toresultcombo.h" +#include "toresultschema.h" #include "totableselect.h" #include <qlabel.h> @@ -69,7 +69,7 @@ label->show(); vbox->addWidget(label); - Schema = new toResultCombo(this); + Schema = new toResultSchema(this); Schema->show(); Schema->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); vbox->addWidget(Schema); @@ -84,7 +84,7 @@ vbox->addWidget(Table); Schema->additionalItem(mysql ? tr("Select database") : tr("Select schema")); - Schema->query(toSQL::sql(toSQL::TOSQL_USERLIST)); + Schema->refresh(); Table->additionalItem(tr("Select table")); // petr vanek 03/01/07 bug #1180847 Error when creating referential constraint Table->setSQL(toSQL::sql("toBrowser:ListTableNames")); @@ -98,9 +98,10 @@ toTableSelect::toTableSelect(QWidget *parent, const char *name) : QGroupBox(parent) + , Schema(NULL) + , Table(NULL) { setObjectName(name); - Schema = Table = NULL; QTimer::singleShot(0, this, SLOT(setup())); } Modified: branches/tora-trotl/src/totableselect.h =================================================================== --- branches/tora-trotl/src/totableselect.h 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/totableselect.h 2012-06-08 13:46:59 UTC (rev 4344) @@ -7,13 +7,14 @@ #include <QGroupBox> class toConnection; +class toResultSchema; class toResultCombo; class toTableSelect : public QGroupBox { Q_OBJECT - toResultCombo *Schema; + toResultSchema *Schema; toResultCombo *Table; QString SelectedTable; Modified: branches/tora-trotl/src/tounittest.cpp =================================================================== --- branches/tora-trotl/src/tounittest.cpp 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/tounittest.cpp 2012-06-08 13:46:59 UTC (rev 4344) @@ -154,8 +154,7 @@ QLabel * labSchema = new QLabel(tr("Schema") + " ", toolbar); toolbar->addWidget(labSchema); - Schema = new toResultSchema(connection, toolbar, - "UTresultSchema"); + Schema = new toResultSchema(toolbar, "UTresultSchema"); try { Schema->refresh(); Modified: branches/tora-trotl/src/toworksheet.cpp =================================================================== --- branches/tora-trotl/src/toworksheet.cpp 2012-06-07 22:57:24 UTC (rev 4343) +++ branches/tora-trotl/src/toworksheet.cpp 2012-06-08 13:46:59 UTC (rev 4344) @@ -395,16 +395,9 @@ Started->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum)); - Schema = new toResultSchema(connection(), workToolbar); + Schema = new toResultSchema(workToolbar); workToolbar->addWidget(Schema); - try - { - Schema->refresh(); - } - catch (...) - { - TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; - } + Schema->refresh(); connect(Schema, SIGNAL(currentIndexChanged(const QString &)), Schema, @@ -2311,7 +2304,7 @@ void toWorksheet::changeConnection(void) { - Schema->query(toSQL::sql(toSQL::TOSQL_USERLIST)); + Schema->refresh(); if (toIsMySQL(connection())) Schema->setSelected(connection().database()); else if (toIsOracle(connection()) || toIsSapDB(connection())) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |