/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }