예제 #1
0
        /// <summary>
        /// Metodo che si connette al DB e popola una lista con tutti i file che fanno parte di una versione
        /// </summary>
        /// <param name="v">Versione da ripristinare</param>
        /// <returns>Lista di coppie ID FileAttr</returns>
        private List <dictElement <int, FileAttr> > getFilesOfVersion(Version v)
        {
            List <dictElement <int, FileAttr> > l = new List <dictElement <int, FileAttr> >();

            try
            {
                using (SQLiteConnection db = new SQLiteConnection("Data Source=" + nomeDb + ";Version=3;"))
                {
                    try
                    {
                        db.Open();
                        String sql;

                        if (v.isDirectory)
                        {
                            sql = "SELECT id, name, checksum, size, directory FROM files f WHERE name LIKE @Path AND deleted='FALSE' AND version=(SELECT MIN(version) FROM files f2 WHERE f2.name=f.name AND syncData <= @Data1) AND name IN (SELECT name from files WHERE syncData <= @Data1)";
                        }
                        else
                        {
                            sql = "SELECT id, name, checksum, size, directory FROM files WHERE name LIKE @Path AND syncData=@Data1";
                        }

                        using (SQLiteCommand com = new SQLiteCommand(sql, db))
                        {
                            com.Prepare();
                            com.Parameters.AddWithValue("@Path", v.path + "%");
                            com.Parameters.AddWithValue("@Data1", v.date);
                            SQLiteDataReader reader = com.ExecuteReader();
                            while (reader.Read() && !_shouldStop)
                            {
                                FileAttr f = new FileAttr(reader.GetString(1), reader.GetString(4), reader.GetString(2), reader.GetInt64(3));
                                dictElement <int, FileAttr> el = new dictElement <int, FileAttr>(reader.GetInt32(0), f);
                                l.Add(el);
                            }
                            reader.Close();
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("(" + thID + ") _ERRORE: impossibile generare elenco file per l'utente {0} e path {2} ({1}) ", settings.user, e.Message, v.path);
                        return(null);
                    }
                    finally
                    {
                        if (db != null && db.State == System.Data.ConnectionState.Open)
                        {
                            db.Close();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("(" + thID + ") _ERRORE: impossibile generare elenco versioni per l'utente {0} e path {2} ({1}) ", settings.user, e.Message, v.path);
                return(null);
            }

            return(l);
        }
예제 #2
0
        /// <summary>
        /// Metodo che si occupa di Settare come Eliminato un file nel DB dell'utente
        /// </summary>
        /// <param name="f">File da Eliminare</param>
        /// <param name="db">Connessione APERTA al DB dell'utente</param>
        /// <param name="tr">Transazione all'interno della quale eseguire i comandi</param>
        /// <returns>True se Record salvato correttamente</returns>
        private bool delFile(FileAttr f, SQLiteConnection db, SQLiteTransaction tr)
        {
            if (f == null)
            {
                return(false);
            }
            int thID = Thread.CurrentThread.ManagedThreadId;

            try
            {
                String updQ = "UPDATE files SET version = version +1 WHERE name=@name";
                using (SQLiteCommand updC = new SQLiteCommand(updQ, db, tr))
                {
                    updC.Prepare();
                    updC.Parameters.AddWithValue("@name", f.path);
                    if (updC.ExecuteNonQuery() < 1)
                    {
                        Console.WriteLine("(" + thID + ")_ERRORE: impossibile modificare la versione file nel DB dell'utente : " + settings.user);
                        return(false);
                    }
                }

                String sqlN = "INSERT INTO files(name, directory, size, checksum, syncData, version, deleted) VALUES(@name, @dir, @size, @checksum, @syncData, @version, 'TRUE')";
                /*Aggiungo nuovo Record*/
                using (SQLiteCommand c = new SQLiteCommand(sqlN, db, tr))
                {
                    c.Prepare();
                    c.Parameters.AddWithValue("@name", f.path);
                    c.Parameters.AddWithValue("@dir", f.directory);
                    c.Parameters.AddWithValue("@size", f.size);
                    c.Parameters.AddWithValue("@checksum", f.checksum);
                    c.Parameters.AddWithValue("@syncData", DateTimeSQLite(time));
                    c.Parameters.AddWithValue("@version", 0);
                    if (c.ExecuteNonQuery() != 1)
                    {
                        Console.WriteLine("(" + thID + ")_ERRORE: impossibile aggiungere record al DB dell'utente : " + settings.user);
                        return(false);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("(" + thID + ")_ERRORE: Impossibile sincronizzare il file {0} dell'utente {1}\n\t({2})", f.path, settings.user, e.Message);
                return(false);
            }

            return(true);
        }
예제 #3
0
        /// <summary>
        /// Funzione Statica per la deserializzazione di un oggetto FileAttr da uno Stream
        /// </summary>
        /// <param name="stream">Stream da cui deserializzare</param>
        /// <returns></returns>
        public static FileAttr deserializeFrom(Stream stream)
        {
            XmlSerializer ser = new XmlSerializer(typeof(FileAttr));
            FileAttr      f   = null;

            try
            {
                f = (FileAttr)ser.Deserialize(stream);
            }
            catch (Exception)
            {
                return(null);
            }

            return(f);
        }
예제 #4
0
        /// <summary>
        /// Metodo che crea il Dictionary a partire dai file memorizzati nel DB, preleva solo i record con versione 0 e non cancellati.
        /// </summary>
        /// <returns>Il Dictionary se possibile, altrimenti null</returns>
        private ConcurrentDictionary <String, FileAttr> getFileList()
        {
            ConcurrentDictionary <String, FileAttr> dic = new ConcurrentDictionary <String, FileAttr>();
            SQLiteConnection db = null;

            try
            {
                db = new SQLiteConnection("Data Source=" + nomeDb + ";Version=3;");
                String sql = "SELECT name, size, checksum, directory FROM files WHERE version=0 AND deleted='FALSE'";
                db.Open();
                SQLiteCommand    cmd = new SQLiteCommand(sql, db);
                SQLiteDataReader r   = cmd.ExecuteReader();

                while (r.Read() && !_shouldStop)
                {
                    FileAttr fa = new FileAttr(r.GetString(0), r.GetString(3), r.GetString(2), r.GetInt32(1));
                    if (!dic.TryAdd(fa.path, fa))
                    {
                        Console.WriteLine("ERRORE " + fa.path);
                        return(null);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return(null);
            }
            finally
            {
                if (db != null && db.State == System.Data.ConnectionState.Open)
                {
                    db.Close();
                }
            }

            return(dic);
        }
예제 #5
0
        /// <summary>
        /// Metodo che Si occupa di ricevere effettivamente il file dallo stream indicato
        /// </summary>
        /// <param name="id">ID univoco del file</param>
        /// <param name="f">Attributi del file da ricevere</param>
        /// <returns>True se Ricevuto Correttamente</returns>
        private bool recvFileByte(int id, FileAttr f)
        {
            String nomeFile = settings.user + @"\" + id + ".bck";

            if (f == null)
            {
                return(false);
            }
            Stream file = File.Open(nomeFile, FileMode.Create);
            int    tot = 0, rec = 0;
            long   diff;

            Byte[] bu = new Byte[1024];

            try
            {
                int i = 0;
                while (tot != f.size && !_shouldStop)
                {
                    try
                    {
                        if ((diff = f.size - tot) < 1024)
                        {
                            rec = stream.Read(bu, 0, (int)diff);
                        }
                        else
                        {
                            rec = stream.Read(bu, 0, 1024);
                        }
                        if (rec <= 0)
                        {
                            return(false);
                        }
                        tot += rec;
                        file.Write(bu, 0, rec);
                    }
                    catch
                    {
                        if (!client.Connected)
                        {
                            return(false);
                        }
                        i++;
                        if (i >= 20)
                        {
                            return(false);
                        }
                    }
                }
            }
            catch
            {
                return(false);
            }
            finally
            {
                file.Close();
            }

            if (_shouldStop && f.size != tot)
            {
                return(false);
            }

            return(true);
        }
예제 #6
0
        /// <summary>
        /// Metodo che si occupa di Aggiungere un file al DB dell'utente
        /// </summary>
        /// <param name="f">Attributi del file da aggiungere</param>
        /// <param name="db">Connessione APERTA al DB dell'utente</param>
        /// <param name="upd">True se un Aggiornamento</param>
        /// <param name="tr">Transazione sulla quale vengono eseguiti i comandi</param>
        /// <returns>True se file Salvato Correttamente</returns>
        private bool syncNewFile(FileAttr f, SQLiteConnection db, Boolean upd, SQLiteTransaction tr)
        {
            if (f == null)
            {
                return(false);
            }

            String sql = "INSERT INTO files(name, directory, size, checksum, syncData, version, deleted) VALUES(@name, @dir, @size, @checksum, @syncData, @version, 'FALSE')";

            /*Inizio Transazione per salvataggio File*/
            try
            {
                /*Se Aggiornamento Incremento ID dei File*/
                if (upd)
                {
                    bool   ctrlExist = false;
                    String ctrlEx    = "SELECT * FROM files WHERE name=@name";
                    using (SQLiteCommand ctrl = new SQLiteCommand(ctrlEx, db, tr))
                    {
                        ctrl.Prepare();
                        ctrl.Parameters.AddWithValue("@name", f.path);
                        SQLiteDataReader r = ctrl.ExecuteReader();
                        if (r.HasRows)
                        {
                            ctrlExist = true;
                        }
                    }

                    if (ctrlExist)
                    {
                        String updQ = "UPDATE files SET version = version +1 WHERE name=@name";
                        using (SQLiteCommand updC = new SQLiteCommand(updQ, db, tr))
                        {
                            updC.Prepare();
                            updC.Parameters.AddWithValue("@name", f.path);
                            if (updC.ExecuteNonQuery() < 1)
                            {
                                Console.WriteLine("(" + thID + ")_ERRORE: impossibile modificare la versione file nel DB dell'utente : " + settings.user);
                                return(false);
                            }
                        }
                    }
                }

                /*Aggiungo nuovo Record e Salvo nuovo File*/
                using (SQLiteCommand c = new SQLiteCommand(sql, db, tr))
                {
                    c.Prepare();
                    c.Parameters.AddWithValue("@name", f.path);
                    c.Parameters.AddWithValue("@dir", f.directory);
                    c.Parameters.AddWithValue("@size", f.size);
                    c.Parameters.AddWithValue("@checksum", f.checksum);
                    c.Parameters.AddWithValue("@syncData", DateTimeSQLite(time));
                    c.Parameters.AddWithValue("@version", 0);
                    if (c.ExecuteNonQuery() != 1)
                    {
                        Console.WriteLine("(" + thID + ")_ERRORE: impossibile aggiungere record al DB dell'utente : " + settings.user);
                        return(false);
                    }
                }

                /*Ricavo l'id del nuovo File*/
                int id = 0;
                using (SQLiteCommand c = new SQLiteCommand("SELECT * FROM files", db, tr))
                {
                    SQLiteDataReader r = c.ExecuteReader();
                    if (r.HasRows)
                    {
                        using (SQLiteCommand cmd = new SQLiteCommand("SELECT MAX(id) AS max FROM files", db, tr))
                        {
                            r = cmd.ExecuteReader();
                            r.Read();
                            id = r.GetInt32(0);
                        }
                    }
                }

                /*Ricevo File*/
                if (!recvFileByte(id, f))
                {
                    Console.WriteLine("(" + thID + ")_ERRORE: impossibile ricevere il contenuto del file dell'utente : " + settings.user);
                    return(false);
                }
            }
            catch (Exception e)
            {
                if (tr != null)
                {
                    tr.Rollback();
                }
                Console.WriteLine("(" + thID + ")_ERRORE: Impossibile sincronizzare il file {0} dell'utente {1}\n\t({2})", f.path, settings.user, e.Message);
                return(false);
            }

            return(true);
        }