/// <summary> /// Funzione per registrare un nuovo utente. /// </summary> /// <param name="nome">Nome utente</param> /// <param name="password">Password per l'utente (cleartext)</param> /// <param name="path_monitorato">Path Locale dell'utente che verra monitorato</param> static public User RegistraUtente(string nome, string password) { if (!NomeUtenteValido(nome)) { throw new DatabaseException("Nome utente non va bene.", DatabaseErrorCode.FormatError); } if (!PasswordValida(password)) { throw new DatabaseException("Password non va bene.", DatabaseErrorCode.FormatError); } password = TrasformaPassword(password); //provo a mettere il nuovo utente: se ricevo un'eccezione particolare il nome utente e duplicato DB_Table db = new DB_Table(); string[][] parameters = new string[2][]; parameters[0] = new string[2] { "@nome", nome }; parameters[1] = new string[2] { "@password", password }; try{ db.ExecuteQuery(sql_insert_user, parameters); } catch (DatabaseException e) when(e.ErrorCode == DatabaseErrorCode.Constraint) { throw new DatabaseException("L'utente che si cerca di inserire esiste già.", DatabaseErrorCode.UserGiaEsistente); } return(new User(nome, password)); }
//Metodi Statici /// <summary> /// Distrugge gli snapshot di un file. /// </summary> /// <param name="nome_utente"></param> /// <param name="id_file"></param> static public void RimuoviSnapshotsDiFile(string nome_utente, int id_file) { DB_Table db = new DB_Table(); Log l = Log.getLog(); string sql = "SELECT nome_locale_s FROM snapshots WHERE id_file = @id_file;"; string[][] parameters = new string[1][]; string local_file = ""; string local_path = Properties.ApplicationSettings.Default.base_path + Path.DirectorySeparatorChar + "users_files" + Path.DirectorySeparatorChar + nome_utente; parameters[0] = new string[2] { "@id_file", id_file.ToString() }; db.ExecuteQuery(sql, parameters); foreach (int i in db.GetResults()) { local_file = (string)db.ResultGetValue("nome_locale_s"); try { File.Delete(local_path + Path.DirectorySeparatorChar + local_file); } catch (Exception e) { l.log("Errore nell'eliminare i file da disco. " + e.Message); throw; } } }
//Funzioni Statiche public static Snapshot creaNuovo(int id_file, DateTime timestamp = new DateTime(), int dim = 0, string sha_contenuto = "") { //Controllo che gli argomenti non abbiano caratteri strani Snapshot s = null; if (base_path == null) { base_path = Properties.ApplicationSettings.Default.base_path + Path.DirectorySeparatorChar + "users_files"; } // Genero un nome casuale per il file in locale e controllo che non esista string nome_locale; do { nome_locale = Path.GetRandomFileName(); } while (File.Exists(base_path + Path.DirectorySeparatorChar + nome_locale)); // Creo il file (vuoto) FileStream f = File.Create(base_path + Path.DirectorySeparatorChar + nome_locale); // Memorizzo i file nel db, ottengo l'id e ritorno il nuovo snapshot string[][] parameters = new string[5][]; parameters[0] = new string[2] { "@dim", dim.ToString() }; parameters[1] = new string[2] { "@t_modifica", timestamp.ToString("u") }; parameters[2] = new string[2] { "@sha_contenuto", sha_contenuto }; parameters[3] = new string[2] { "@nome_locale_s", nome_locale }; parameters[4] = new string[2] { "@id_file", id_file.ToString() }; DB_Table db = new DB_Table(); Log l = Log.getLog(); db.ExecuteQuery(sql_insert_data, parameters); long id = db.getLastInsertedId(); l.log("Id inserito: " + id); /* Per qualche motivo questa cosa lancia una nullReferenceException, come se s non venisse creato*/ s = new Snapshot(id_file, (int)id); s.cambioContenutoIniziato = true; s.__scrittura_contenuto = f; s.posizione_scrittura = 0; s.__sha_contenuto = sha_contenuto; //return new Snapshot(nome_utente,(int)id); return(s); }
public FileUtente nuovoFile(string nome_file, string path_relativo, DateTime t_creazione = new DateTime()) { //Se non c'è spazio, cerco un capro espiatorio da buttare per far posto a quello nuovo, //Altrimenti lancio un'eccezione string[][] parameters = new string[1][]; if (this.__list_ids_files.Count >= this.__max_file) { int id_da_sacrificare = -1; parameters[0] = new string[2] { "@nome_utente", __nome_utente }; this.ExecuteQuery(Properties.SQLquery.sqlCercaFileDaDistruggere, parameters); foreach (int i in this.GetResults()) { id_da_sacrificare = Int32.Parse(this.ResultGetValue("id").ToString()); break; } if (id_da_sacrificare >= 0) { for (int i = 0; i < this.Length; i++) { if (this[i].Id == id_da_sacrificare) { this[i].Distruggi(); } } } else { this.l.log("Non c'è più posto per l'utente " + __nome_utente, Level.INFO); throw new DatabaseException("Non è più possibile inserire nuovi file. Limite superato.", DatabaseErrorCode.LimiteFileSuperato); } } if (t_creazione == DateTime.MinValue) { t_creazione = DateTime.Now; } parameters = new string[4][]; parameters[0] = new string[2] { "@t_creazione", t_creazione.ToString("u") }; parameters[1] = new string[2] { "@path_relativo_c", path_relativo }; parameters[2] = new string[2] { "@nome_file_c", nome_file }; parameters[3] = new string[2] { "@nome_utente", this.__nome_utente }; DB_Table db = new DB_Table(); Log l = Log.getLog(); db.ExecuteQuery(Properties.SQLquery.sqlNuovoFile, parameters); long id = db.getLastInsertedId(); FileUtente file = new FileUtente(this.__nome_utente, (int)id); this.__list_ids_files.Add(file.Id); this.__file_list[this.__list_ids_files.Count - 1] = file; return(file); }