/*************************** MAIN ******************************/ static void Main(string[] args) { Tree alberonostro; try { if (args.Length == 0) { Console.WriteLine("- ENGINE modalità manuale attivata -" + Environment.NewLine); Console.WriteLine("Inserire nome Database: "); string DB = Console.ReadLine(); //Settaggio connessione a database SqlConnection myconn = new SqlConnection(string.Format("Persist Security Info=False;Integrated Security=true;Initial Catalog={0};server=(local)", DB)); SqlCommand cmd = null; //comando di select SqlDataReader myReader = null; //Tentativo di connessione al database myconn.Open(); //connessione stabilita //numero alberi in DB int numeroAlberi = 0; cmd = new SqlCommand("SELECT Nome FROM Albero", myconn); //COMANDO SQL //settaggio un datareader sul comando appena eseguito myReader = cmd.ExecuteReader(); //Lettura dati dal database while (myReader.Read()) { numeroAlberi++; } // Chiusura DataReader myReader.Close(); //stampa alberi in DB cmd = new SqlCommand("SELECT Nome FROM Albero", myconn); //COMANDO SQL //settaggio datareader sul comando appena eseguito myReader = cmd.ExecuteReader(); int[] index = new int[numeroAlberi]; string[] trees = new string[numeroAlberi]; int count = 0; //Lettura dati dal database while (myReader.Read()) { index[count] = count; trees[count] = myReader.GetString(0); Console.WriteLine((count++) + "-) " + myReader.GetString(0)); } //Chiusura DataReader myReader.Close(); Console.WriteLine(Environment.NewLine + "Inserire index albero: "); int scelta = int.Parse(Console.ReadLine()); string nalbero = trees[scelta]; Console.WriteLine("Albero '{0}' selezionato", nalbero); int numVertex = 0; //contatore per il numero di vertici SqlConnection conn = new SqlConnection(string.Format("Persist Security Info=False;Integrated Security=true;Initial Catalog={0};server=(local)", DB)); string s = string.Format("SELECT * FROM Albero, Vertex WHERE Albero.Nome='{0}' AND Vertex.IdAlbero=Albero.Id ", nalbero); conn.Open(); SqlCommand msc = new SqlCommand(s, conn); SqlDataReader msdr = msc.ExecuteReader(); while (msdr.Read()) { numVertex++; //contatore numero vertici } msdr.Close(); conn.Close(); Console.WriteLine(Environment.NewLine + "Inserire START Vertex: " + Environment.NewLine + "Default: 0"); int start = Int32.Parse(Console.ReadLine()); Console.WriteLine("Inserire END Vertex: " + Environment.NewLine + "Default END: {0}", (numVertex-1)); int end = Int32.Parse(Console.ReadLine()); //Controllo RANGE if(!(start >= 0 && start< end && start < numVertex)) { //Range startVertex sbagliato! Console.WriteLine("Sono stati inseriti parametri non corretti"); System.Threading.Thread.Sleep(5000); return; } if (!(end > 0 && end > start && end < numVertex)) { //Range endVertex sbagliato! Console.WriteLine("Sono stati inseriti parametri non corretti"); System.Threading.Thread.Sleep(5000); return; } //Verifica andata a buon fine, dati OK Console.WriteLine(Environment.NewLine + "Parametri Inseriti dall'utente: " + Environment.NewLine + "Database scelto: " + DB + Environment.NewLine + "Nome albero: " + nalbero + Environment.NewLine + "Vertice START: " + start + Environment.NewLine + "Vertice END: " + end); //creazione istanza albero tramite riceviDB() alberonostro = riceviDB(nalbero, DB); string nStart = alberonostro.albero[start].getNome(); string nEnd = alberonostro.albero[end].getNome(); long[] res = alberonostro.EsecuzioneCalcolo(nStart, nEnd); long resVertex = res[1]; long resEdge = res[0]; Console.WriteLine(Environment.NewLine + "La somma sui Vertex è: {0}" + Environment.NewLine + "la somma sugli Edge è: {1}", resVertex, resEdge); Console.WriteLine(Environment.NewLine + "Premere [INVIO] per uscire"); Console.ReadLine(); return; } if (!(args[0].Equals("GUI"))) { Console.WriteLine("ERRORE GENERALE: CHIAMATA ENGINE CON PARAMETRO NON ESATTO", args[0]); System.Threading.Thread.Sleep(5000); return; } if (args[0].Equals("GUI")) Console.WriteLine("RILEVATA CHIAMATA DA GUI. Modalità automatica attivata"); //Se chiamato da GUI continuo altrimenti no alberonostro = new Tree(); //albero sul quale eseguire il calcolo //Creazione pipe che si aspetta dati dalla GUI NamedPipeServerStream Pipe1 = new NamedPipeServerStream("Pipe1"); Console.WriteLine("Attendendo connessione con GUI..."); //aspetto che la GUI si connetta alla pipe Pipe1.WaitForConnection(); Console.WriteLine("Connessione con la GUI stabilita"); //ricezione messaggio messaggio ricevuto = new messaggio(); //Classe che conterrà Albero, vertice START e vertice END e il futuro risultato var f = new System.Xml.Serialization.XmlSerializer(typeof(messaggio)); ricevuto = (messaggio)f.Deserialize(Pipe1); //chiusura pipe ricezione dalla GUI Pipe1.Close(); alberonostro = ricevuto.Albero; string strv = alberonostro.albero[ricevuto.startVertex].getNome(); string endv = alberonostro.albero[ricevuto.endVertex].getNome(); //calcoli su Albero long[] risultati = alberonostro.EsecuzioneCalcolo(strv, endv); //l'array risultati conterrà la somma su attr1Int e attr2Int, prendendo il relativo nome (con la funzione getNome()) dalla posizione nell'array di Vertex identificato dall'indice (startVertex o endVertex) string msg = string.Format("La somma sui Vertici è: {0}" + Environment.NewLine + "La somma sugli Edge è: {1}", risultati[1], risultati[0]); //risultato (Conteggio su Vertici, conteggio su Archi) da mandare //invio messaggio tramite pipe NamedPipeClientStream Pipe2 = new NamedPipeClientStream("Pipe2"); //creazione pipe che invia dati alla GUI Thread.Sleep(1000); Pipe2.Connect(); //creazione classe messaggio che conterrà il risultato da mandare messaggio invio = new messaggio(); invio.Risposta = msg; f.Serialize(Pipe2, invio); //invio dati alla GUI //chiusura pipe invio e uscita Pipe2.Close(); } catch (Exception ex) { //Eccezioni if (args.Length == 0) //stampa eccezione a video { Console.WriteLine("ERROR: " + ex.Message); System.Threading.Thread.Sleep(5000); return; } //se Engine chiamato dalla GUI invia l'eccezione ad essa var f = new System.Xml.Serialization.XmlSerializer(typeof(messaggio)); string msg = "ERROR IN ENGINE: " + ex.Message; //invio messaggio errore tramite pipe NamedPipeClientStream Pipe2 = new NamedPipeClientStream("Pipe2"); //creazione pipe che invia dati alla GUI Thread.Sleep(1000); Pipe2.Connect(); //creazione casse messaggio che conterrà il risultato da mandare messaggio invio = new messaggio(); invio.Risposta = msg; f.Serialize(Pipe2, invio); //invio i dati alla GUI //chiusura pipe invio e uscita Pipe2.Close(); } }
public static Tree riceviDB(string scelta, string DB) { Tree albero = new Tree(); //albero vuoto da riempire //Settaggio connessione a database per ripescaggio dati SqlConnection myconn = new SqlConnection(string.Format("Persist Security Info=False;Integrated Security=true;Initial Catalog={0};server=(local)", DB)); SqlCommand cmd = null; SqlDataReader myReader = null; //Tentativo di connessione al database myconn.Open(); //connessione stabilita // //ripescaggio nome_albero e tipo // cmd = new SqlCommand(string.Format("SELECT * FROM Albero WHERE Nome='{0}'", scelta), myconn); //COMANDO SQL //settaggio un datareader sul comando appena eseguito myReader = cmd.ExecuteReader(); //Lettura dati dal database if (myReader.Read()) //una sola volta { albero.name = myReader.GetString(1); albero.type = myReader.GetString(2); albero.splitSize = myReader.GetInt32(3); albero.depth = myReader.GetInt32(4); } // Chiude il DataReader myReader.Close(); // //lettura di numNodi // long numVertex = 0; cmd = new SqlCommand(string.Format("SELECT * FROM Albero, Vertex WHERE Albero.Nome='{0}' AND Vertex.IdAlbero=Albero.Id ", scelta), myconn); //COMANDO SQL myReader = cmd.ExecuteReader(); //Lettura dati dal database per scoprire lunghezza albero while (myReader.Read()) { numVertex++; //se leggo righe significa che ho vertici } //ho scoperto il numero di vertici //creo l'albero di lunghezza giusta albero.albero = new Vertex[numVertex]; albero.numNodi = numVertex; // Chiude il DataReader myReader.Close(); // //lettura dei vertex // cmd = new SqlCommand(string.Format("SELECT Vertex.Name FROM Albero, Vertex WHERE Albero.Nome='{0}' AND Vertex.IdAlbero=Albero.Id ", scelta), myconn); //COMANDO SQL myReader = cmd.ExecuteReader(); int count = 0; //Lettura dati dal database while (myReader.Read()) { albero.addVertex(new Vertex(count, count), count); albero.albero[count].nome = myReader.GetString(0); count++; } // Chiude il DataReader myReader.Close(); // //lettura degli Edge // cmd = new SqlCommand(string.Format("SELECT Edge.Valore FROM Albero, Edge WHERE Albero.Nome='{0}' AND Edge.IdAlbero=Albero.Id ", scelta), myconn); //COMANDO SQL myReader = cmd.ExecuteReader(); count = 0; //Lettura dati dal database while (myReader.Read()) { albero.albero[count].arcoentrante.val = myReader.GetInt32(0); count++; } // Chiude il DataReader myReader.Close(); // //Riempimento attributi di Vertex // cmd = new SqlCommand(string.Format("SELECT AttrDef.Name, Value FROM AttrDef, VertexAttrUsage, Vertex WHERE AttrDef.NomeAlbero='{0}' AND AttrDef.AttrDefUid=VertexAttrUsage.AttrDefUid AND Vertex.VertexUid=VertexAttrUsage.ObjectVUid", scelta), myconn); //COMANDO SQL myReader = cmd.ExecuteReader(); //Qui si prendono i dati giusti dal DB count = 0; long contatore = numVertex; //Lettura dati dal database while (myReader.Read()) { if ((myReader.GetString(0)).Equals("B")) { if (count == albero.albero.Length) count--; //corregge l'errore di importazione dell'ultima riga dal DB, che genera l'eccezione IndexOutOfBound nell'array di Vertex albero.albero[count].B = myReader.GetString(1); } if ((myReader.GetString(0)).Equals("C")) { if (count == albero.albero.Length) count--; albero.albero[count].C = myReader.GetString(1); } if ((myReader.GetString(0)).Equals("D")) { if (count == albero.albero.Length) count--; albero.albero[count].D = myReader.GetString(1); } if ((myReader.GetString(0)).Equals("E")) { if (count == albero.albero.Length) count--; albero.albero[count].E = myReader.GetString(1); } if ((myReader.GetString(0)).Equals("attr1Int")) { albero.albero[count].attr1Int = long.Parse(myReader.GetString(1)); contatore--; count++; } } //Lettura completata // Chiude il DataReader myReader.Close(); // //Riempimento attributi di Edge // cmd = new SqlCommand(string.Format("SELECT AttrDef.Name, Value FROM AttrDef, EdgeAttrUsage, Edge WHERE AttrDef.NomeAlbero='{0}' AND AttrDef.AttrDefUid=EdgeAttrUsage.AttrDefUid AND Edge.EdgeUid=EdgeAttrUsage.ObjectEUid", scelta), myconn); //COMANDO SQL myReader = cmd.ExecuteReader(); count = 0; contatore = numVertex; //Lettura dati dal database while (myReader.Read()) { if ((myReader.GetString(0)).Equals("G")) { if (count == albero.albero.Length) count--; albero.albero[count].arcoentrante.G = myReader.GetString(1); } if ((myReader.GetString(0)).Equals("H")) { if (count == albero.albero.Length) count--; albero.albero[count].arcoentrante.H = myReader.GetString(1); } if ((myReader.GetString(0)).Equals("I")) { if (count == albero.albero.Length) count--; albero.albero[count].arcoentrante.I = myReader.GetString(1); } if ((myReader.GetString(0)).Equals("L")) { if (count == albero.albero.Length) count--; albero.albero[count].arcoentrante.L = myReader.GetString(1); } if ((myReader.GetString(0)).Equals("attr2Int")) { albero.albero[count].arcoentrante.attr2Int = long.Parse(myReader.GetString(1)); count++; contatore--; } } //Lettura completata // Chiude il DataReader myReader.Close(); //L'albero è stato ricreato // Chiusura connessione database myconn.Close(); //ritorno albero ricreato return albero; }
/*************************** MAIN ******************************/ static void Main(string[] args) { Tree alberonostro = new Tree("Maestro", "A", 2, 3); //albero esempio alberonostro.creaAlbero(); }