示例#1
0
        /*************************** 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();


            }

        }
示例#2
0
            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;

        }
示例#3
0
    /*************************** MAIN ******************************/

        static void Main(string[] args)
        {
            Tree alberonostro = new Tree("Maestro", "A", 2, 3);             //albero esempio
            alberonostro.creaAlbero();  
            
          }