using System; using System.Collections.Generic; using System.Text; using System.IO; using gudusoft.gsqlparser; using gudusoft.gsqlparser.Units; namespace gettable { class getTable { static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("{0} scriptfile", "gettable"); return; } TGSqlParser sqlparser = new TGSqlParser(TDbVendor.DbVOracle); sqlparser.Sqlfilename = args[0]; Console.WriteLine("Processing.."); int i2 = sqlparser.Parse(); if (i2 == 0) { TLzScriptExplorer se = new TLzScriptExplorer(); se.sqlstatements = sqlparser.SqlStatements; se.AnalyzeScript(); se.FlattenDBObjectList(); Console.WriteLine(se.GetDBObjectInfoIntoList()); } else Console.WriteLine(sqlparser.ErrorMessages); } } public class TLzScriptExplorer { public TLzStatementList sqlstatements; public TLzDBObjectList topleveldbobjectlist; public TLzDBObjectList serverlist, databaselist, schemalist, tablelist, indexlist, viewlist, functionlist, triggerlist, sequencelist, packagelist; TSourceToken CurrentDatabaseToken; public Boolean isSaveXML; public String XML; public TLzScriptExplorer() { sqlstatements = null; topleveldbobjectlist = new TLzDBObjectList(false); isSaveXML = true; XML = ""; CurrentDatabaseToken = null; serverlist = new TLzDBObjectList(false); databaselist = new TLzDBObjectList(false); schemalist = new TLzDBObjectList(false); tablelist = new TLzDBObjectList(false); indexlist = new TLzDBObjectList(false); viewlist = new TLzDBObjectList(false); functionlist = new TLzDBObjectList(false); triggerlist = new TLzDBObjectList(false); sequencelist = new TLzDBObjectList(false); packagelist = new TLzDBObjectList(false); } public void DoSortDBObjectList(TLzDBObjectList pList) { if (pList.Count() == 0) { return; } if (pList.Count() == 1) { if (pList[0].ObjectType == TDBObjType.ttObjTable) { DoSortDBObjectList(pList[0].ChildDBObjects); } return; } int j = 0; string str1, str2; if (pList[0].ObjectType != TDBObjType.ttObjField) { //sort by object prefix first for (int i = 0; i <= pList.Count() - 2; i++) { str1 = pList[i].ObjectPrefix; for (int k = i + 1; k <= pList.Count() - 1; k++) { str2 = pList[k].ObjectPrefix; if (str1.ToLower().CompareTo(str2.ToLower()) > 0) { TLzDBObject lcobj = pList[k]; pList[k] = pList[i]; pList[i] = lcobj; str1 = str2; } } } //sort of object in the same prefix j = 0; str1 = pList[0].ObjectPrefix; for (int i = 1; i <= pList.Count() - 1; i++) { str2 = pList[i].ObjectPrefix; if (str1.ToLower().CompareTo(str2.ToLower()) != 0) { SortObjectInSamePrefix(j, i - 1, pList); j = i; str1 = str2; } } } SortObjectInSamePrefix(j, pList.Count() - 1, pList); if (pList[0].ObjectType == TDBObjType.ttObjTable) { foreach (TLzDBObject tableobj in pList) { DoSortDBObjectList(tableobj.ChildDBObjects); } } } public void SortObjectInSamePrefix(int pstart, int pend, TLzDBObjectList plist) { string str1, str2; if (pend - pstart < 1) { return; } for (int i = pstart; i <= pend - 1; i++) { str1 = plist[i].ObjectName; for (int j = i + 1; j <= pend; j++) { str2 = plist[j].ObjectName; if (str1.ToLower().CompareTo(str2.ToLower()) > 0) { TLzDBObject lcobj = plist[j]; plist[j] = plist[i]; plist[i] = lcobj; str1 = str2; } } } } public void SortDBObjectList() { DoSortDBObjectList(serverlist); DoSortDBObjectList(databaselist); DoSortDBObjectList(schemalist); DoSortDBObjectList(tablelist); DoSortDBObjectList(functionlist); DoSortDBObjectList(triggerlist); DoSortDBObjectList(viewlist); DoSortDBObjectList(indexlist); DoSortDBObjectList(sequencelist); DoSortDBObjectList(packagelist); } public string getdbobjectstr(TLzDBObjectList plist) { StringBuilder st = new StringBuilder(); foreach (TLzDBObject obj in plist) { if (st.Length > 0) { st.Append(Environment.NewLine); } st.Append(obj.ObjectFullName); } return st.ToString(); } public string GetDBObjectInfoIntoList() { StringBuilder st = new StringBuilder(); st.Append("tables\n"); st.Append(getdbobjectstr(tablelist) + "\n"); st.Append("fields\n"); foreach (TLzDBObject tableobj in tablelist) { foreach (TLzDBObject fieldobj in tableobj.ChildDBObjects) { st.Append(tableobj.ObjectFullName + "." + fieldobj.ObjectName + "\n"); } } if (serverlist.Count() > 0) { st.Append("server\n"); st.Append(getdbobjectstr(serverlist) + "\n"); } if (databaselist.Count() > 0) { st.Append("database\n"); st.Append(getdbobjectstr(databaselist) + "\n"); } if (schemalist.Count() > 0) { st.Append("schema\n"); st.Append(getdbobjectstr(schemalist) + "\n"); } if (functionlist.Count() > 0) { st.Append("functions\n"); st.Append(getdbobjectstr(functionlist) + "\n"); } if (indexlist.Count() > 0) { st.Append("index\n"); st.Append(getdbobjectstr(indexlist) + "\n"); } if (viewlist.Count() > 0) { st.Append("view\n"); st.Append(getdbobjectstr(viewlist) + "\n"); } if (triggerlist.Count() > 0) { st.Append("triggers\n"); st.Append(getdbobjectstr(triggerlist) + "\n"); } if (sequencelist.Count() > 0) { st.Append("sequences\n"); st.Append(getdbobjectstr(sequencelist) + "\n"); } if (packagelist.Count() > 0) { st.Append("packages\n"); st.Append(getdbobjectstr(packagelist) + "\n"); } return st.ToString(); } public void FlattenDBObjectList() { serverlist.Clear(); databaselist.Clear(); schemalist.Clear(); tablelist.Clear(); indexlist.Clear(); viewlist.Clear(); functionlist.Clear(); triggerlist.Clear(); sequencelist.Clear(); packagelist.Clear(); foreach (TLzDBObject serverobj in topleveldbobjectlist) { if (serverobj.ObjectToken.TokenStatus != TTokenStatus.tsAddbyHand) { serverlist.Add(serverobj); } foreach (TLzDBObject databaseobj in serverobj.ChildDBObjects) { if (databaseobj.ObjectType != TDBObjType.ttobjDatabase) { continue; } if (databaseobj.ObjectToken.TokenStatus != TTokenStatus.tsAddbyHand) { databaselist.Add(databaseobj); } foreach (TLzDBObject schemaobj in databaseobj.ChildDBObjects) { if (schemaobj.ObjectType != TDBObjType.ttobjSchema) { continue; } if (schemaobj.ObjectToken.TokenStatus != TTokenStatus.tsAddbyHand) { schemalist.Add(schemaobj); } foreach (TLzDBObject dbobj in schemaobj.ChildDBObjects) { switch (dbobj.ObjectType) { case TDBObjType.ttObjTable: tablelist.Add(dbobj); break; case TDBObjType.ttObjView: viewlist.Add(dbobj); break; case TDBObjType.ttObjIndex: indexlist.Add(dbobj); break; case TDBObjType.ttObjFunction: functionlist.Add(dbobj); break; case TDBObjType.ttObjTrigger: triggerlist.Add(dbobj); break; case TDBObjType.ttobjSequence: sequencelist.Add(dbobj); break; case TDBObjType.ttobjPackage: packagelist.Add(dbobj); break; default: break; } } } } } SortDBObjectList(); } public TLzDBObject AddTokenToDBObjectList(TSourceToken pToken, TLzDBObjectList pList, TDBObjType pType) { TLzDBObject dbobj; dbobj = pList.FindDBObjectByNameAndType(pToken.AsText, pType); if (dbobj == null) { dbobj = new TLzDBObject(null); dbobj.ObjectType = pType; dbobj.ObjectToken = pToken; pList.Add(dbobj); if (pToken.TokenStatus != TTokenStatus.tsAddbyHand) { dbobj.TokensInScript.Add(pToken); pToken.TokenStatus = TTokenStatus.tsAddedInTokensInScript; } } else { if ((pToken.TokenStatus != TTokenStatus.tsAddbyHand) & (pToken.TokenStatus != TTokenStatus.tsAddedInTokensInScript)) { dbobj.TokensInScript.Add(pToken); pToken.TokenStatus = TTokenStatus.tsAddedInTokensInScript; } } return dbobj; } public TLzDBObject AddDatabaseTokenToServer(TSourceToken pToken) { TLzDBObject dbobj; if (pToken.ParentToken != null) { dbobj = AddTokenToDBObjectList(pToken.ParentToken, topleveldbobjectlist, TDBObjType.ttobjServer); } else { TSourceToken st = new TSourceToken(null); st.AsText = "defaultServer"; st.TokenStatus = TTokenStatus.tsAddbyHand; dbobj = AddTokenToDBObjectList(st, topleveldbobjectlist, TDBObjType.ttobjServer); } return AddTokenToDBObjectList(pToken, dbobj.ChildDBObjects, TDBObjType.ttobjDatabase); } public TLzDBObject AddSchemaTokenToDatabase(TSourceToken pToken) { TLzDBObject dbobj; if (pToken.ParentToken != null) { dbobj = AddDatabaseTokenToServer(pToken.ParentToken); } else { TSourceToken st = new TSourceToken(null); st.AsText = "defaulDatabase"; st.TokenStatus = TTokenStatus.tsAddbyHand; dbobj = AddDatabaseTokenToServer(st); } return AddTokenToDBObjectList(pToken, dbobj.ChildDBObjects, TDBObjType.ttobjSchema); } public void AddDBObjectTokenToSchema(TSourceTokenList pList, TDBObjType pType) { TLzDBObject dbobj, dbobj2; foreach (TSourceToken st in pList) { if (st.ParentToken != null) { dbobj = AddSchemaTokenToDatabase(st.ParentToken); } else { TSourceToken st2 = new TSourceToken(null); st2.AsText = "defaultSchema"; st2.TokenStatus = TTokenStatus.tsAddbyHand; if (CurrentDatabaseToken != null) { st2.ParentToken = CurrentDatabaseToken; } dbobj = AddSchemaTokenToDatabase(st2); } dbobj2 = AddTokenToDBObjectList(st, dbobj.ChildDBObjects, pType); if (pType == TDBObjType.ttObjTable) { //add ref table token to Tokens in script of this table db object foreach (TSourceToken st3 in st.RelatedTokens) { if ((st3.DBObjType == TDBObjType.ttObjTable) || (st3.DBObjType == TDBObjType.ttobjTableCTE)) { dbobj2.TokensInScript.Add(st3); } } AddFieldTokenToTable(st, dbobj2); } } } public void AddFieldTokenToTable(TSourceToken tabletoken, TLzDBObject tableobj) { foreach (TSourceToken st in tabletoken.RelatedTokens) { //get all ref table token if (st.DBObjType == TDBObjType.ttObjTable) { if (st.ChildToken != null) { //add field linked to this ref table to declare table object AddTokenToDBObjectList(st.ChildToken, tableobj.ChildDBObjects, TDBObjType.ttObjField); } } if (st.DBObjType == TDBObjType.ttobjTableCTE) { foreach (TSourceToken st2 in st.RelatedTokens) { if (st2.DBObjType == TDBObjType.ttObjField) { AddTokenToDBObjectList(st2, tableobj.ChildDBObjects, TDBObjType.ttObjField); } } } } if (tabletoken.RelatedToken != null) { //alias token of this table TSourceToken tablealiastoken = tabletoken.RelatedToken; foreach (TSourceToken st in tablealiastoken.RelatedTokens) { if (st.DBObjType == TDBObjType.ttObjTableAlias) { if (st.ChildToken != null) { AddTokenToDBObjectList(st.ChildToken, tableobj.ChildDBObjects, TDBObjType.ttObjField); } } } } foreach (TSourceToken st in tabletoken.RelatedTokens) { // get all field tokens link with table token (those token not linked by syntax like tablename.fieldname) // but like this : select f from t if (st.DBObjType == TDBObjType.ttObjField) { AddTokenToDBObjectList(st, tableobj.ChildDBObjects, TDBObjType.ttObjField); } } } public string TokensOfDBObject(TLzDBObject pObject) { StringBuilder sb = new StringBuilder(); sb.Append(string.Format("\n", pObject.TokensInScript.Count())); foreach (TSourceToken st in pObject.TokensInScript) { sb.Append(string.Format("\n", st.AsText, st.XPosition, st.YPosition - st.AsText.Length)); } sb.Append("\n"); return sb.ToString(); } void analyzeStatement(TCustomSqlStatement stmt) { if (stmt.SqlStatementType == TSqlStatementType.sstMssqlUse) { CurrentDatabaseToken = stmt.DatabaseTokens[0]; } if (stmt.SqlStatementType == TSqlStatementType.sstInsert) { Console.WriteLine("insert"); } //server foreach (TSourceToken servertoken in stmt.ServerTokens) { AddTokenToDBObjectList(servertoken, topleveldbobjectlist, TDBObjType.ttobjServer); } //database foreach (TSourceToken databasetoken in stmt.DatabaseTokens) { AddDatabaseTokenToServer(databasetoken); } //schema foreach (TSourceToken schematoken in stmt.SchemaTokens) { AddSchemaTokenToDatabase(schematoken); } //other db objects such as table,functions AddDBObjectTokenToSchema(stmt.TableTokens, TDBObjType.ttObjTable); AddDBObjectTokenToSchema(stmt.ViewTokens, TDBObjType.ttObjView); AddDBObjectTokenToSchema(stmt.IndexTokens, TDBObjType.ttObjIndex); AddDBObjectTokenToSchema(stmt.FunctionTokens, TDBObjType.ttObjFunction); AddDBObjectTokenToSchema(stmt.TriggerTokens, TDBObjType.ttObjTrigger); AddDBObjectTokenToSchema(stmt.SequenceTokens, TDBObjType.ttobjSequence); AddDBObjectTokenToSchema(stmt.PackageTokens, TDBObjType.ttobjPackage); for (int i = 0; i < stmt.ChildNodes.Count(); i++) { if (stmt.ChildNodes[i] is TCustomSqlStatement) { analyzeStatement((TCustomSqlStatement)stmt.ChildNodes[i]); } } } public void AnalyzeScript() { if (sqlstatements == null) { return; } foreach (TCustomSqlStatement sql in sqlstatements) { TCustomSqlStatement stmt; if (sql is TPlsqlStatement) { stmt = sql.Root as TCustomSqlStatement; } else { stmt = sql; } analyzeStatement(stmt); }//for statement if (!isSaveXML) { return; } XML = ""; StringBuilder sb = new StringBuilder(); foreach (TLzDBObject serverobj in topleveldbobjectlist) { sb.Append(string.Format("\n", serverobj.ObjectName)); if (serverobj.ObjectToken.TokenStatus != TTokenStatus.tsAddbyHand) { sb.Append(TokensOfDBObject(serverobj)); } foreach (TLzDBObject databaseobj in serverobj.ChildDBObjects) { sb.Append(string.Format("\n", databaseobj.ObjectName)); if (databaseobj.ObjectToken.TokenStatus != TTokenStatus.tsAddbyHand) { sb.Append(TokensOfDBObject(databaseobj)); } foreach (TLzDBObject schemaobj in databaseobj.ChildDBObjects) { sb.Append(string.Format("\n", schemaobj.ObjectName)); if (schemaobj.ObjectToken.TokenStatus != TTokenStatus.tsAddbyHand) { sb.Append(TokensOfDBObject(schemaobj)); } foreach (TLzDBObject dbobj in schemaobj.ChildDBObjects) { sb.Append(string.Format("\n", dbobj.ObjectName, dbobj.ObjectType.ToString())); if (dbobj.ObjectToken.TokenStatus != TTokenStatus.tsAddbyHand) { sb.Append(TokensOfDBObject(dbobj)); } if (dbobj.ObjectType == TDBObjType.ttObjTable) { foreach (TLzDBObject fieldobj in dbobj.ChildDBObjects) { sb.Append(string.Format("\n", fieldobj.ObjectName)); if (fieldobj.ObjectToken.TokenStatus != TTokenStatus.tsAddbyHand) { sb.Append(TokensOfDBObject(fieldobj)); } sb.Append("\n"); } } sb.Append("\n"); } sb.Append("\n"); } sb.Append("\n"); } sb.Append("\n"); } XML = XML + Environment.NewLine + sb.ToString() + ""; } } }