Advertisement
Guest User

Untitled

a guest
May 2nd, 2016
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 51.49 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Data.SQLite;
  7. using System.IO;
  8. using System.Data;
  9.  
  10. namespace Server_v2
  11. {
  12.     class DataBase
  13.     {
  14.         SQLiteConnection SQLconnection;
  15.         private SQLiteCommand SQLcommand;
  16.  
  17.         const int MAX_NUMBER_OF_VERSIONS = 3;
  18.  
  19.         //lock per rendere la classe thread safe messa nei metodi che eseguono le query
  20.         public static object lockDB = new object();
  21.  
  22.         #region CONSTRUCTOR
  23.  
  24.         /// <summary>
  25.         /// Costruttore Database:
  26.         /// Crea tabelle se non è mai stato creato un DB.
  27.         /// TESTATO!
  28.         /// </summary>
  29.         public DataBase()
  30.         {
  31.             if (!File.Exists(".\\Database.db"))
  32.             {
  33.                 SQLconnection = new SQLiteConnection("Data Source=Database.db;Version=3;New=True;Compress=True;");
  34.  
  35.                 string createUser_query = "CREATE TABLE USER(Username TEXT PRIMARY KEY," +
  36.                                                             "Password TEXT," +
  37.                                                             "Sale TEXT," +
  38.                                                             "ClientPath TEXT, " +
  39.                                                             "ServerPath TEXT);";
  40.  
  41.                 string createFolder_query = "CREATE TABLE FOLDER(FolderPath TEXT," +
  42.                                                                 "User TEXT," +
  43.                                                                 "ParentPath TEXT," +
  44.                                                                 "TimestampFolder DATETIME DEFAULT CURRENT_TIMESTAMP," +
  45.                                                                 "TimestampParent DATETIME," +
  46.                                                                 "Present TEXT DEFAULT 'True'," +
  47.  
  48.                                                                 "PRIMARY KEY(FolderPath,User,TimestampFolder), " +
  49.                                                                 "FOREIGN KEY(User) REFERENCES USER (Username) ON DELETE CASCADE ON UPDATE CASCADE, " +
  50.                                                                 "FOREIGN KEY(ParentPath, User, TimestampParent) " +
  51.                                                                 "REFERENCES FOLDER(FolderPath, User, TimestampFolder) ON DELETE CASCADE ON UPDATE CASCADE);";
  52.  
  53.                 string createFile_query = "CREATE TABLE FILE(Filename TEXT," +
  54.                                                             "User TEXT," +
  55.                                                             "Folder TEXT," +
  56.                                                             "Checksum TEXT," +
  57.                                                             "TimestampFile DATETIME DEFAULT CURRENT_TIMESTAMP," +
  58.                                                             "TimestampFolder DATETIME," +
  59.                                                             "Present TEXT DEFAULT 'True'," +
  60.  
  61.                                                             "PRIMARY KEY(Filename, User, Folder, Checksum, TimestampFile)," +
  62.                                                             "FOREIGN KEY(Folder, User, TimestampFolder) " +
  63.                                                             "REFERENCES FOLDER(FolderPath, User, TimestampFolder) ON DELETE CASCADE ON UPDATE CASCADE);";
  64.  
  65.                 string createLoggedIn_query = "CREATE TABLE LOGGED_IN(Username TEXT," +
  66.                                                                      "IPAddress TEXT," +
  67.                                                                      "PRIMARY KEY(Username)," +
  68.                                                                      "FOREIGN KEY(Username) " +
  69.                                                                      "REFERENCES USER(Username) ON DELETE CASCADE ON UPDATE CASCADE);";
  70.                 try
  71.                 {
  72.                     ExecuteQuery(createUser_query);
  73.                     Console.WriteLine("USER Table created");
  74.                     ExecuteQuery(createFolder_query);
  75.                     Console.WriteLine("FOLDER Table created");
  76.                     ExecuteQuery(createFile_query);
  77.                     Console.WriteLine("FILE Table created");
  78.                     ExecuteQuery(createLoggedIn_query);
  79.                     Console.WriteLine("LOGGED_IN Table created");
  80.                 }
  81.                 catch (Exception e)
  82.                 {
  83.                     Console.WriteLine("Database not created. Exception:");
  84.                     Console.WriteLine(e.Message);
  85.                     File.Delete(".\\Database.db");
  86.                 }
  87.             }
  88.         }
  89.  
  90.         #endregion
  91.  
  92.         #region ADD METHODS
  93.  
  94.         /// <summary>
  95.         /// Aggiungi un utente alla tabella USER e la cartella da monitorare alla tabella FOLDER.
  96.         /// Se esiste ritorna false senza inserirlo, se non esiste lo crea.
  97.         ///
  98.         /// NOTA: Il folder da monitorare che viene inserito nella tabella FOLDER ha come parent
  99.         /// una cartella fittizia "." che ha come data di creazione la mia data di nascita.
  100.         /// Fatto con una transazione che permette di mantenere le proprietà ACID.
  101.         ///
  102.         /// ATTENZIONE: Non permettere all'utente di registrarsi con il carattere "'".
  103.         ///
  104.         /// TESTATO!
  105.         /// </summary>
  106.         /// <param name="user">Utente da inserire</param>
  107.        /*
  108.         public bool AddUser(UserClass user)
  109.         {
  110.             try
  111.             {
  112.                 if (!Exists(user))
  113.                 {
  114.                     string insert_query = "BEGIN TRANSACTION; " +
  115.                                           // Insert di un utente
  116.                                           "INSERT INTO USER (Username,Password,Sale,ClientPath,ServerPath)" +
  117.                                           "VALUES ('" + user.Username + "'," +
  118.                                                   "'" + user.Password + "'," +
  119.                                                   "'" + user.Sale + "'," +
  120.                                                   "'" + user.ClientPath + "'," +
  121.                                                   "'" + user.ServerPath + "');" +
  122.                                           // Insert della cartella da monitorare nella tabella FOLDER
  123.                                           "INSERT INTO FOLDER (FolderPath,User,ParentPath,TimestampParent,Present)" +
  124.                                           "VALUES ('" + user.ClientPath + "'," +
  125.                                                   "'" + user.Username + "'," +
  126.                                                   "'NULL'," +
  127.                                                   "'" + DateTime.MinValue.ToString("yyyy-MM-dd HH:mm:ss") + "'," +
  128.                                                   "'" + true.ToString() + "');" +
  129.                                           "END TRANSACTION;";
  130.                     ExecuteQuery(insert_query);
  131.                     return true;
  132.                 }
  133.             }
  134.             catch (Exception e)
  135.             {
  136.                 Console.WriteLine(e.Message);
  137.             }
  138.  
  139.             return false;
  140.         }
  141.         */
  142.         public bool AddUser(UserClass user)
  143.         {
  144.             try
  145.             {
  146.                 if (!Exists(user))
  147.                 {
  148.                     SQLiteCommand command = new SQLiteCommand(null, null);
  149.  
  150.                     command.CommandText = @"BEGIN TRANSACTION; " +
  151.                                           // Insert di un utente
  152.                                           "INSERT INTO USER (Username, Password, Sale, ClientPath, ServerPath)" +
  153.                                           "VALUES (@uname, @upsw, @usal, @uCpath, @uSPath);" +
  154.                                           // Insert della cartella da monitorare nella tabella FOLDER
  155.                                           @"INSERT INTO FOLDER (FolderPath, User, ParentPath, TimestampParent, Present)" +
  156.                                           "VALUES (@uCpath, @uname, @pp, @date, @bool);" +
  157.                                           " END TRANSACTION;";
  158.  
  159.                     SQLiteParameter unameParam = new SQLiteParameter("@uname", DbType.String);
  160.                     SQLiteParameter upswParam = new SQLiteParameter("@upsw", DbType.String);
  161.                     SQLiteParameter usalParam = new SQLiteParameter("@usal", DbType.String);
  162.                     SQLiteParameter uCpathParam = new SQLiteParameter("@uCpath", DbType.String);
  163.                     SQLiteParameter uSpathParam = new SQLiteParameter("@uSpath", DbType.String);
  164.                     SQLiteParameter ppParam = new SQLiteParameter("@pp", DbType.String);
  165.                     SQLiteParameter dateParam = new SQLiteParameter("@date", SqlDbType.DateTime);
  166.                     SQLiteParameter boolParam = new SQLiteParameter("@bool", DbType.String);
  167.  
  168.                     unameParam.Value = user.Username;
  169.                     upswParam.Value = user.Password;
  170.                     usalParam.Value = user.Sale;
  171.                     uCpathParam.Value = user.ClientPath;
  172.                     uSpathParam.Value = user.ServerPath;
  173.                     ppParam.Value = "NULL";
  174.                     dateParam.Value = DateTime.MinValue.ToString("yyyy-MM-dd HH:mm:ss");
  175.                     boolParam.Value = true.ToString();
  176.  
  177.                     command.Parameters.Add(unameParam);
  178.                     command.Parameters.Add(upswParam);
  179.                     command.Parameters.Add(usalParam);
  180.                     command.Parameters.Add(uCpathParam);
  181.                     command.Parameters.Add(uSpathParam);
  182.                     command.Parameters.Add(ppParam);
  183.                     command.Parameters.Add(dateParam);
  184.                     command.Parameters.Add(boolParam);
  185.  
  186. //                    command.Prepare();
  187.                     ExecuteQuery2(command);
  188.                     return true;
  189.                 }
  190.             }
  191.             catch (Exception e)
  192.             {
  193.                 Console.WriteLine(e.Message);
  194.             }
  195.  
  196.             return false;
  197.         }
  198.  
  199.         /// <summary>
  200.         /// Aggiunge una cartella alla tabela FOLDER.
  201.         /// L'oggetto FolderClass deve avere definito:
  202.         /// - FolderPath
  203.         /// - User
  204.         /// TESTATO!
  205.         /// </summary>
  206.         /// <param name="folder">Cartella da aggiungere</param>
  207.         public bool AddFolder(FolderClass folder)
  208.         {
  209.             string parentPath;
  210.             DateTime timestampParent;
  211.  
  212.             if (Exists(folder)) return false;
  213.  
  214.             //Creo la cartella padre
  215.             folder.Parent = new FolderClass();
  216.             folder.Parent.Present = true;
  217.             folder.Parent.User = folder.User;
  218.             folder.Parent.FolderPath = Path.GetDirectoryName(folder.FolderPath);
  219.             parentPath = folder.Parent.FolderPath;
  220.             timestampParent = getTimestampFolder(folder.Parent);
  221.  
  222.             string insert_query = "INSERT INTO FOLDER (FolderPath,User,ParentPath,TimestampParent,Present)" +
  223.                                   "VALUES ('" + folder.FolderPath + "'," +
  224.                                           "'" + folder.User.Username + "'," +
  225.                                           "'" + parentPath + "'," +
  226.                                           "'" + timestampParent.ToString("yyyy-MM-dd HH:mm:ss") + "'," +
  227.                                           "'" + true.ToString() + "')";
  228.             try
  229.             {
  230.                 ExecuteQuery(insert_query);
  231.             }
  232.             catch (Exception)
  233.             {
  234.                 Console.WriteLine("Error");
  235.             }
  236.  
  237.             return true;
  238.         }
  239.  
  240.         /// <summary>
  241.         /// Aggiunge un file alla tabella FILE.
  242.         /// Devono essere definiti:
  243.         /// - Filename
  244.         /// - User
  245.         /// - Folder
  246.         /// - Checksum
  247.         /// A sua volta l'oggetto folder vede avere definito:
  248.         /// - FolderPath
  249.         /// - User
  250.         ///  
  251.         /// NOTA: Controllare la presenza della cartella che contiene il file.
  252.         ///
  253.         /// TESTATO!
  254.         /// </summary>
  255.         /// <param name="file"></param>
  256.         public string AddFile(FileClass file)
  257.         {
  258.             //Se aggiungo un file la cartella deve essere presente. Esiste una sola cartella presente
  259.             //con queste caratteristiche.
  260.             int n = 0;
  261.             file.Folder.Present = true;
  262.             DateTime timestampFolder = getTimestampFolder(file.Folder);
  263.  
  264.             //ritorno un checksum se si elimina un file
  265.             string checksum = null;
  266.  
  267.             if (this.Exists(file, file.Folder))
  268.             {
  269.                 setFilePresent(file);
  270.                 return null;
  271.             }
  272.  
  273.             //Conto il numero di versioni del file
  274.             string select_query = "SELECT COUNT(*) " +
  275.                                   "FROM FILE " +
  276.                                   "WHERE Filename = '" + file.Filename + "' AND " +
  277.                                         "User = '" + file.User.Username + "' AND " +
  278.                                         "Folder = '" + file.Folder.FolderPath + "' AND " +
  279.                                         "TimestampFolder = '" + timestampFolder.ToString("yyyy-MM-dd HH:mm:ss") + "';";
  280.             lock (lockDB)
  281.             {
  282.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  283.                 while (r.Read())
  284.                     n = r.GetInt16(0);
  285.                 CloseConnection();
  286.             }
  287.  
  288.             if (n >= MAX_NUMBER_OF_VERSIONS)
  289.             {
  290.                 //Se raggiungo il numero massimo di versioni
  291.  
  292.                 //Identifico il file con timestamp più vecchio
  293.  
  294.                 checksum = getOldestChecksum(file);
  295.  
  296.                 string insert_delete_query =
  297.                                       "BEGIN TRANSACTION;" +
  298.                                       //Cancello il file più vecchio
  299.                                       "DELETE FROM FILE WHERE Filename = '" + file.Filename + "' AND " +
  300.                                                              "User = '" + file.User.Username + "' AND " +
  301.                                                              "Folder = '" + file.Folder.FolderPath + "' AND " +
  302.                                                              "Checksum = '" + checksum + "'; " +
  303.                                       //Inserisco il nuovo file
  304.                                       "INSERT INTO FILE (Filename,User,Folder,Checksum,TimestampFolder)" +
  305.                                       "VALUES ('" + file.Filename + "'," +
  306.                                               "'" + file.User.Username + "'," +
  307.                                               "'" + file.Folder.FolderPath + "'," +
  308.                                               "'" + file.Checksum + "'," +
  309.                                               "'" + timestampFolder.ToString("yyyy-MM-dd HH:mm:ss") + "');" +
  310.                                       "END TRANSACTION;";
  311.                 ExecuteQuery(insert_delete_query);
  312.  
  313.                 //se ho un file con questo checksum che punta a cartelle presenti diversa da quella di questo file
  314.                 //non devo eliminare questo file e ripongo il checksum a null
  315.  
  316.                 select_query = "SELECT COUNT(*) " +
  317.                                "FROM FILE " +
  318.                                "WHERE Checksum = '" + file.Checksum + "' AND " +
  319.                                      "User = '" + file.User.Username + "' AND " +
  320.                                      "Folder <> '" + file.Folder.FolderPath + "';";
  321.  
  322.                 lock (lockDB)
  323.                 {
  324.                     SQLiteDataReader r = ExecuteQuerySelect(select_query);
  325.                     while (r.Read())
  326.                         n = r.GetInt16(0);
  327.                     CloseConnection();
  328.                 }
  329.  
  330.                 if (n != 0)
  331.                     checksum = null;
  332.             }
  333.             else
  334.             {
  335.                 string insert_query = "INSERT INTO FILE (Filename,User,Folder,Checksum,TimestampFolder)" +
  336.                                       "VALUES ('" + file.Filename + "'," +
  337.                                               "'" + file.User.Username + "'," +
  338.                                               "'" + file.Folder.FolderPath + "'," +
  339.                                               "'" + file.Checksum + "'," +
  340.                                               "'" + timestampFolder.ToString("yyyy-MM-dd HH:mm:ss") + "');";
  341.  
  342.                 ExecuteQuery(insert_query);
  343.             }
  344.  
  345.  
  346.             return checksum;
  347.         }
  348.  
  349.         public void setFilePresent(FileClass file)
  350.         {
  351.             string update_query = "UPDATE FILE " +
  352.                                   "SET Present = '" + true.ToString() + "', TimestampFile = '" + DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss") + "' " +
  353.                                   "WHERE Filename = '" + file.Filename + "' AND " +
  354.                                         "Folder = '" + file.Folder.FolderPath + "' AND " +
  355.                                         "Present = '" + false.ToString() + "' AND " +
  356.                                         "User = '" + file.User.Username + "' AND " +
  357.                                         "Checksum = '" + file.Checksum + "';";
  358.             ExecuteQueryFK(update_query);
  359.         }
  360.  
  361.         /// <summary>
  362.         /// Aggiunge un utente alla tabella degli utenti connessi.
  363.         /// Devono essere definiti nell'oggetto UserClass:
  364.         /// - Username
  365.         /// - Ip
  366.         /// </summary>
  367.         /// <param name="user"></param>
  368.         public void LoggedIn(UserClass user)
  369.         {
  370.             string insert_query = "INSERT INTO LOGGED_IN (Username, IPAddress)" +
  371.                                   "VALUES ('" + user.Username + "'," +
  372.                                           "'" + user.Ip + "');";
  373.             ExecuteQuery(insert_query);
  374.         }
  375.  
  376.         #endregion
  377.  
  378.         #region GET METHODS
  379.  
  380.         public bool IsFile(string path, UserClass user)
  381.         {
  382.             if (IsFolder(path, user)) return false;
  383.  
  384.             int n = 0;
  385.             string select_query = "SELECT COUNT(*) " +
  386.                                   "FROM FILE " +
  387.                                   "WHERE Filename = '" + Path.GetFileName(path) + "' AND " +
  388.                                         "Folder = '" + Path.GetDirectoryName(path) + "' AND " +
  389.                                         "Present = '" + true.ToString() + "' AND " +
  390.                                         "User = '" + user.Username + "';";
  391.             lock (lockDB)
  392.             {
  393.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  394.                 while (r.Read())
  395.                     n = r.GetInt16(0);
  396.                 CloseConnection();
  397.             }
  398.  
  399.             if (n == 0) return false;
  400.  
  401.             return true;
  402.         }
  403.  
  404.         public bool IsFolder(string path, UserClass user)
  405.         {
  406.             int n = 0;
  407.             string select_query = "SELECT COUNT(*) " +
  408.                                   "FROM FOLDER " +
  409.                                   "WHERE FolderPath = '" + path + "' AND " +
  410.                                         "User = '" + user.Username + "' AND " +
  411.                                         "Present = '" + true.ToString() + "';";
  412.  
  413.             lock (lockDB)
  414.             {
  415.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  416.                 while (r.Read())
  417.                     n = r.GetInt16(0);
  418.                 CloseConnection();
  419.             }
  420.  
  421.             if (n == 0) return false;
  422.  
  423.             return true;
  424.         }
  425.  
  426.         /// <summary>
  427.         /// Ottiene il timestamp della cartella richiesta. L'oggetto FolderCLass deve avere
  428.         /// definiti:
  429.         /// - FolderPath
  430.         /// - Present
  431.         /// - User
  432.         ///
  433.         /// TESTATO!
  434.         /// </summary>
  435.         /// <param name="folder">Cartella richiesta</param>
  436.         /// <returns></returns>
  437.         private DateTime getTimestampFolder(FolderClass folder)
  438.         {
  439.             DateTime dateTime = new DateTime();
  440.             string select_query = "SELECT TimestampFolder " +
  441.                                   "FROM Folder " +
  442.                                   "WHERE FolderPath = '" + folder.FolderPath + "' " +
  443.                                         "AND Present = '" + folder.Present.ToString() + "' " +
  444.                                         "AND User = '" + folder.User.Username + "' ";
  445.             lock (lockDB)
  446.             {
  447.                 SetConnection();
  448.  
  449.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  450.                 while (r.Read())
  451.                     dateTime = (DateTime)r["TimestampFolder"];
  452.  
  453.                 CloseConnection();
  454.             }
  455.  
  456.             return dateTime;
  457.         }
  458.  
  459.         /// <summary>
  460.         /// Ottiene il timestamp del file. L'oggetto file deve avere definito:
  461.         /// - Filename
  462.         /// - Checksum
  463.         /// - Username
  464.         /// </summary>
  465.         /// <param name="file"></param>
  466.         /// <returns></returns>
  467.         private DateTime getTimestampFile(FileClass file)
  468.         {
  469.             DateTime dateTime = new DateTime();
  470.             string select_query = "SELECT TimestampFile " +
  471.                                   "FROM FILE " +
  472.                                   "WHERE Filename = '" + file.Filename + "' " +
  473.                                         "AND Checksum = '" + file.Checksum + "' " +
  474.                                         "AND User = '" + file.User.Username + "' ";
  475.             lock (lockDB)
  476.             {
  477.                 SetConnection();
  478.  
  479.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  480.                 while (r.Read())
  481.                     dateTime = (DateTime)r["TimestampFile"];
  482.  
  483.                 CloseConnection();
  484.             }
  485.  
  486.             return dateTime;
  487.         }
  488.  
  489.         /// <summary>
  490.         /// Ritorna il checksum con timestamp più vecchio.
  491.         /// Il file passato deve avere definito:
  492.         /// - Filename
  493.         /// - User
  494.         /// - Folder
  495.         /// </summary>
  496.         /// <param name="file"></param>
  497.         /// <returns></returns>
  498.         private string getOldestChecksum(FileClass file)
  499.         {
  500.             string checksum = null;
  501.             string select_query = "SELECT Checksum  " +
  502.                                   "FROM FILE " +
  503.                                   "WHERE Filename = '" + file.Filename + "' AND " +
  504.                                         "User = '" + file.User.Username + "' AND " +
  505.                                         "Folder = '" + file.Folder.FolderPath + "' AND " +
  506.                                         "TimestampFile IN (SELECT min(TimestampFile)" +
  507.                                                           "FROM FILE " +
  508.                                                           "WHERE Filename = '" + file.Filename + "' AND " +
  509.                                                                 "User = '" + file.User.Username + "' AND " +
  510.                                                                 "Folder = '" + file.Folder.FolderPath + "');";
  511.  
  512.             lock (lockDB)
  513.             {
  514.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  515.                 while (r.Read())
  516.                     checksum = (string)r["Checksum"];
  517.                 CloseConnection();
  518.             }
  519.             return checksum;
  520.         }
  521.  
  522.         /// <summary>
  523.         /// Ritorna la password dell'utente. Prima di chiamare questa funzione verificare che l'utente esista!
  524.         /// </summary>
  525.         /// <param name="user"></param>
  526.         /// <returns></returns>
  527.         public string getPassword(UserClass user)
  528.         {
  529.             string select_query = "SELECT Password " +
  530.                                   "FROM USER " +
  531.                                   "WHERE Username = '" + user.Username + "'";
  532.             string psw = null;
  533.  
  534.             try
  535.             {
  536.                 lock (lockDB)
  537.                 {
  538.                     SQLiteDataReader r = ExecuteQuerySelect(select_query);
  539.                     while (r.Read())
  540.                         psw = (string)r["Password"];
  541.                     CloseConnection();
  542.                 }
  543.             }
  544.             catch (Exception e)
  545.             {
  546.                 Console.WriteLine(e.Message);
  547.             }
  548.             return psw;
  549.         }
  550.  
  551.         /// <summary>
  552.         /// Ritorna il Sale di un utente.
  553.         /// </summary>
  554.         /// <param name="user"></param>
  555.         /// <returns></returns>
  556.         public string getSale(UserClass user)
  557.         {
  558.             string select_query = "SELECT Sale " +
  559.                                   "FROM USER " +
  560.                                   "WHERE Username = '" + user.Username + "'";
  561.             string sale = null;
  562.             try
  563.             {
  564.                 lock (lockDB)
  565.                 {
  566.                     SQLiteDataReader r = ExecuteQuerySelect(select_query);
  567.                     while (r.Read())
  568.                         sale = (string)r["Sale"];
  569.                     CloseConnection();
  570.                 }
  571.             }
  572.             catch (Exception e)
  573.             {
  574.                 Console.WriteLine(e.Message);
  575.             }
  576.             return sale;
  577.         }
  578.  
  579.         /// <summary>
  580.         /// Ritorna il path dell'utente della cartella sincronizzata.
  581.         /// </summary>
  582.         /// <param name="user"></param>
  583.         /// <returns></returns>
  584.         public string getClientPath(UserClass user)
  585.         {
  586.             string select_query = "SELECT ClientPath " +
  587.                                   "FROM USER " +
  588.                                   "WHERE Username = '" + user.Username + "'";
  589.             string path = null;
  590.             lock (lockDB)
  591.             {
  592.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  593.                 while (r.Read())
  594.                     path = (string)r["ClientPath"];
  595.                 CloseConnection();
  596.             }
  597.             return path;
  598.         }
  599.  
  600.         public FolderClass getFolder(string folderpath, UserClass user)
  601.         {
  602.             FolderClass folder = new FolderClass();
  603.             string select_query = "SELECT FolderPath, Present " +
  604.                                   "FROM FOLDER " +
  605.                                   "WHERE FolderPath = '" + folderpath + "' " +
  606.                                         "AND Present = '" + true.ToString() + "' " +
  607.                                         "AND User = '" + user.Username + "' ";
  608.             lock (lockDB)
  609.             {
  610.                 SetConnection();
  611.  
  612.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  613.                 while (r.Read())
  614.                 {
  615.                     folder.FolderPath = (string)r["FolderPath"];
  616.                     folder.Present = true;
  617.                     folder.User = user;
  618.                 }
  619.                 CloseConnection();
  620.             }
  621.  
  622.             return folder;
  623.         }
  624.  
  625.         public List<FileClass> getFilePresent(UserClass user)
  626.         {
  627.             List<FileClass> files = new List<FileClass>();
  628.             string select_query = "SELECT Filename, Folder, Checksum " +
  629.                                   "FROM FILE " +
  630.                                   "WHERE User = '" + user.Username + "' AND " +
  631.                                         "Present = '" + true.ToString() + "'; ";
  632.             lock (lockDB)
  633.             {
  634.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  635.                 while (r.Read())
  636.                 {
  637.                     FileClass file = new FileClass();
  638.                     file.Filename = (string)r["Filename"];
  639.                     file.Checksum = (string)r["Checksum"];
  640.                     file.User = user;
  641.                     file.Folder.FolderPath = (string)r["Folder"];
  642.                     file.Folder.Present = true;
  643.                     file.Folder.User = user;
  644.                     files.Add(file);
  645.                 }
  646.                 CloseConnection();
  647.             }
  648.             return files;
  649.         }
  650.  
  651.         public List<FolderClass> getFolderPresent(UserClass user)
  652.         {
  653.             List<FolderClass> folders = new List<FolderClass>();
  654.             string select_query = "SELECT FolderPath, ParentPath " +
  655.                                   "FROM FOLDER F, USER U  " +
  656.                                   "WHERE F.User = U.Username AND F.FolderPath <> U.ClientPath AND " +
  657.                                         "F.User = '" + user.Username + "' AND " +
  658.                                         "F.Present = '" + true.ToString() + "'; ";
  659.             lock (lockDB)
  660.             {
  661.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  662.                 while (r.Read())
  663.                 {
  664.                     FolderClass folder = new FolderClass();
  665.                     folder.FolderPath = (string)r["FolderPath"];
  666.                     folder.Parent.FolderPath = (string)r["ParentPath"];
  667.                     folder.Parent.User = user;
  668.                     folder.Present = true;
  669.                     folder.User = user;
  670.                     folders.Add(folder);
  671.                 }
  672.                 CloseConnection();
  673.             }
  674.             return folders;
  675.         }
  676.  
  677.         public List<FileClass> getAllFiles(UserClass user)
  678.         {
  679.             List<FileClass> allFilesVersions = new List<FileClass>();
  680.  
  681.             string select_query = "SELECT Filename, Folder, Checksum, TimestampFile  " +
  682.                                   "FROM FILE " +
  683.                                   "WHERE User = '" + user.Username + "'; ";
  684.             lock (lockDB)
  685.             {
  686.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  687.                 while (r.Read())
  688.                 {
  689.                     FileClass file = new FileClass();
  690.                     file.Filename = (string)r["Filename"];
  691.                     file.Checksum = (string)r["Checksum"];
  692.                     file.Timestamp = r["TimestampFile"].ToString();
  693.                     file.User = user;
  694.                     file.Folder.FolderPath = (string)r["Folder"];
  695.                     file.Folder.Present = true;
  696.                     file.Folder.User = user;
  697.                     allFilesVersions.Add(file);
  698.                 }
  699.                 CloseConnection();
  700.             }
  701.             return allFilesVersions;
  702.         }
  703.  
  704.         #endregion
  705.  
  706.         #region DELETE
  707.  
  708.         /// <summary>
  709.         /// Cancella il file più vecchio. Non vi è la necessità di eliminare un file specifico
  710.         /// </summary>
  711.         /// <param name="file"></param>
  712.         private void deleteOldestFile(FileClass file)
  713.         {
  714.             DateTime dt = DateTime.MinValue;
  715.             string select_query = "SELECT min(Timestamp) " +
  716.                                   "FROM FILE " +
  717.                                   "WHERE Filename = '" + file.Filename + "' AND " +
  718.                                         "User = '" + file.User.Username + "' AND " +
  719.                                         "Folder = '" + file.Folder.FolderPath + "'";
  720.             lock (lockDB)
  721.             {
  722.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  723.                 while (r.Read())
  724.                     dt = r.GetDateTime(0);
  725.                 CloseConnection();
  726.             }
  727.             if (dt != DateTime.MinValue)
  728.             {
  729.                 string delete_query = "DELETE FROM FILE WHERE Filename = '" + file.Filename + "' AND " +
  730.                                                              "User = '" + file.User.Username + "' AND " +
  731.                                                              "Folder = '" + file.Folder.FolderPath + "' AND " +
  732.                                                              "TimestampFile = '" + dt.ToString("yyyy-MM-dd HH:mm:ss") + "'";
  733.                 ExecuteQuery(delete_query);
  734.             }
  735.         }
  736.  
  737.         /// <summary>
  738.         /// Mette come assenti la cartella eliminata e tutte le sue sotto cartelle e i suoi file.
  739.         /// </summary>
  740.         /// <param name="folder"></param>
  741.         public void setFolderAbsent(FolderClass folder)
  742.         {
  743.             string update_query = "BEGIN TRANSACTION;" +
  744.  
  745.                                   "UPDATE FOLDER " +
  746.                                   "SET Present = '" + false.ToString() + "' " +
  747.                                   "WHERE FolderPath LIKE '" + folder.FolderPath + "%' AND " +
  748.                                         "User = '" + folder.User.Username + "' AND " +
  749.                                         "Present = '" + true.ToString() + "';" +
  750.  
  751.                                   "UPDATE FILE " +
  752.                                   "SET Present = '" + false.ToString() + "' " +
  753.                                   "WHERE Folder LIKE '" + folder.FolderPath + "%' AND " +
  754.                                         "User = '" + folder.User.Username + "' AND " +
  755.                                         "Present = '" + true.ToString() + "';" +
  756.  
  757.                                   "END TRANSACTION;";
  758.             ExecuteQueryFK(update_query);
  759.         }
  760.  
  761.         /// <summary>
  762.         /// Mette come assenti i file eliminati.
  763.         /// Deve essere definito il folderPath del folder del file.
  764.         /// </summary>
  765.         /// <param name="file"></param>
  766.         public void setFileAbsent(FileClass file)
  767.         {
  768.             string update_query = "UPDATE FILE " +
  769.                                   "SET Present = '" + false.ToString() + "' " +
  770.                                   "WHERE Filename = '" + file.Filename + "' AND " +
  771.                                         "Folder = '" + file.Folder.FolderPath + "' AND " +
  772.                                         "Present = '" + true.ToString() + "' AND " +
  773.                                         "User = '" + file.User.Username + "';";
  774.             ExecuteQueryFK(update_query);
  775.         }
  776.  
  777.         /// <summary>
  778.         /// Elimina un utente nella tabella USER.
  779.         /// L'oggetto user deve avere definito:
  780.         /// - Username
  781.         /// </summary>
  782.         /// <param name="user"></param>
  783.         public void deleteUser(UserClass user)
  784.         {
  785.             string delete_query = "DELETE FROM USER WHERE Username = '" + user.Username + "'";
  786.  
  787.             ExecuteQueryFK(delete_query);
  788.         }
  789.  
  790.         /// <summary>
  791.         /// Cancella tutti i file e le cartelle presenti nelle due liste
  792.         /// </summary>
  793.         /// <param name="listFiles"></param>
  794.         /// <param name="listFolders"></param>
  795.         public void realigns(List<FileClass> listFiles, List<FolderClass> listFolders)
  796.         {
  797.             string update_query = "BEGIN TRANSACTION; ";
  798.             foreach (FileClass file in listFiles)
  799.             {
  800.                 update_query = update_query +
  801.                               "UPDATE FILE " +
  802.                               "SET Present = '" + false.ToString() + "' " +
  803.                               "WHERE Filename = '" + file.Filename + "' AND " +
  804.                                     "Folder = '" + file.Folder.FolderPath + "' AND " +
  805.                                     "Present = '" + true.ToString() + "' AND " +
  806.                                     "User = '" + file.User.Username + "'; ";
  807.             }
  808.             foreach (FolderClass folder in listFolders)
  809.             {
  810.                 update_query = update_query +
  811.  
  812.                               "UPDATE FOLDER " +
  813.                               "SET Present = '" + false.ToString() + "' " +
  814.                               "WHERE FolderPath LIKE '" + folder.FolderPath + "%' AND " +
  815.                                     "User = '" + folder.User.Username + "' AND " +
  816.                                     "Present = '" + true.ToString() + "'; " +
  817.  
  818.                               "UPDATE FILE " +
  819.                               "SET Present = '" + false.ToString() + "' " +
  820.                               "WHERE Folder LIKE '" + folder.FolderPath + "%' AND " +
  821.                                     "User = '" + folder.User.Username + "' AND " +
  822.                                     "Present = '" + true.ToString() + "'; ";
  823.             }
  824.  
  825.             update_query = update_query + " END TRANSACTION; ";
  826.  
  827.             ExecuteQueryFK(update_query);
  828.         }
  829.  
  830.         /// <summary>
  831.         /// Elimina un utente dallla tabella LOGGED_IN
  832.         /// Deve essere definito nell'oggetto UserClass Username.
  833.         /// </summary>
  834.         /// <param name="user"></param>
  835.         public void LogOff(UserClass user)
  836.         {
  837.             string delete_query = "DELETE FROM LOGGED_IN WHERE Username = '" + user.Username + "'";
  838.  
  839.             ExecuteQueryFK(delete_query);
  840.         }
  841.  
  842.         #endregion
  843.  
  844.         #region RENAME
  845.  
  846.         /// <summary>
  847.         /// Vengono rinominati tutti i file con lo stesso nome contenuti nella stessa cartella.
  848.         /// Non viene considerato il checksum in quanto si vuole mantenere allineati i nomi di tutte
  849.         /// le versioni precedenti del file.
  850.         /// </summary>
  851.         /// <param name="file"></param>
  852.         /// <param name="newFileName"></param>
  853.         public void RenameFile(FileClass file, string newFileName)
  854.         {
  855.             string update_query = "UPDATE FILE " +
  856.                                   "SET Filename = '" + newFileName + "'" +
  857.                                   "WHERE Filename = '" + file.Filename + "' AND " +
  858.                                         "User = '" + file.User.Username + "' AND " +
  859.                                         "Folder = '" + file.Folder.FolderPath + "';";
  860.             ExecuteQueryFK(update_query);
  861.         }
  862.  
  863.         public void RenameFolder(FolderClass folder, string newFolderPath)
  864.         {
  865.             string[] oldfolders;
  866.             string[] newfolders;
  867.             List<string> folderPaths = new List<string>();
  868.  
  869.             string select_query = "SELECT FolderPath " +
  870.                                   "FROM FOLDER " +
  871.                                   "WHERE FolderPath LIKE '" + folder.FolderPath + "%' AND " +
  872.                                         "User = '" + folder.User.Username + "';";
  873.  
  874.             lock (lockDB)
  875.             {
  876.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  877.  
  878.                 while (r.Read())
  879.                     folderPaths.Add((string)r["FolderPath"]);
  880.  
  881.                 CloseConnection();
  882.             }
  883.  
  884.             string update_query = "BEGIN TRANSACTION; ";
  885.  
  886.             update_query = update_query +
  887.                            " UPDATE FOLDER " +
  888.                            "SET FolderPath = '" + newFolderPath + "' " +
  889.                            "WHERE FolderPath = '" + folder.FolderPath + "' AND " +
  890.                                  "User = '" + folder.User.Username + "' AND " +
  891.                                  "ParentPath = '" + Path.GetDirectoryName(Sanitizer.sanitize(newFolderPath)) + "' AND " +
  892.                                  "Present = '" + true.ToString() + "'; ";
  893.  
  894.             foreach (string oldPath in folderPaths)
  895.             {
  896.                 oldfolders = oldPath.Split('\\');
  897.                 newfolders = newFolderPath.Split('\\');
  898.  
  899.                 oldfolders[newfolders.Length - 1] = newfolders[newfolders.Length - 1];
  900.  
  901.                 string newPath = oldfolders[0];
  902.                 for (int i = 1; i < oldfolders.Length; i++)
  903.                     newPath = newPath + "\\" + oldfolders[i];
  904.  
  905.                 update_query = update_query +
  906.                                " UPDATE FOLDER " +
  907.                                "SET FolderPath = '" + newPath + "' " +
  908.                                "WHERE FolderPath = '" + oldPath + "' AND " +
  909.                                      "User = '" + folder.User.Username + "'; ";
  910.             }
  911.  
  912.             update_query = update_query + " END TRANSACTION;";
  913.  
  914.             ExecuteQueryFK(update_query);
  915.  
  916.         }
  917.  
  918.         #endregion
  919.  
  920.         #region PRINT METHODS
  921.  
  922.         /// <summary>
  923.         /// Stampa la tabella USER.
  924.         /// TESTATO!
  925.         /// </summary>
  926.         public void printUsers()
  927.         {
  928.             string query = "SELECT * FROM USER ORDER BY Username";
  929.             lock (lockDB)
  930.             {
  931.                 SQLiteDataReader r = ExecuteQuerySelect(query);
  932.                 Console.WriteLine("\nUSER Table:");
  933.                 int i = 0;
  934.                 while (r.Read())
  935.                 {
  936.                     Console.WriteLine("\nUsername:\t" + (string)r["Username"]);
  937.                     Console.WriteLine("Password:\t" + (string)r["Password"]);
  938.                     Console.WriteLine("Sale:\t\t" + (string)r["Sale"]);
  939.                     Console.WriteLine("Client Path:\t" + (string)r["ClientPath"]);
  940.                     Console.WriteLine("Server Path:\t" + (string)r["ServerPath"] + "\n");
  941.                     i++;
  942.                 }
  943.                 if (i == 0)
  944.                     Console.WriteLine("Tabella vuota.");
  945.                 CloseConnection();
  946.             }
  947.         }
  948.  
  949.         /// <summary>
  950.         /// Stampa la tabella FOLDER.
  951.         /// TESTATO!
  952.         /// </summary>
  953.         public void printFolders()
  954.         {
  955.             string query = "SELECT * FROM FOLDER ORDER BY User";
  956.             lock (lockDB)
  957.             {
  958.                 SQLiteDataReader r = ExecuteQuerySelect(query);
  959.                 Console.WriteLine("\nFOLDER Table:");
  960.                 int i = 0;
  961.                 while (r.Read())
  962.                 {
  963.                     Console.WriteLine("\nFolder Path:\t\t" + (string)r["FolderPath"]);
  964.                     Console.WriteLine("User:\t\t\t" + (string)r["User"]);
  965.                     Console.WriteLine("Parent Path:\t\t" + (string)r["ParentPath"]);
  966.                     Console.WriteLine("Timestamp Folder:\t" + r["TimestampFolder"].ToString());
  967.                     Console.WriteLine("Timestamp Parent:\t" + r["TimestampParent"].ToString());
  968.                     Console.WriteLine("Present:\t\t\t" + r["Present"].ToString() + "\n");
  969.                     i++;
  970.                 }
  971.                 if (i == 0)
  972.                     Console.WriteLine("Tabella vuota.");
  973.                 CloseConnection();
  974.             }
  975.         }
  976.  
  977.         /// <summary>
  978.         /// Stampa la tabella FILE.
  979.         /// TESTATO!
  980.         /// </summary>
  981.         public void printFiles()
  982.         {
  983.             string query = "SELECT * FROM FILE ORDER BY User,Filename";
  984.             lock (lockDB)
  985.             {
  986.                 SQLiteDataReader r = ExecuteQuerySelect(query);
  987.                 Console.WriteLine("\nFILE Table:");
  988.                 int i = 0;
  989.                 while (r.Read())
  990.                 {
  991.                     Console.WriteLine("\nFile Name:\t\t" + (string)r["Filename"]);
  992.                     Console.WriteLine("User:\t\t\t" + (string)r["User"]);
  993.                     Console.WriteLine("Checksum:\t\t" + r["Checksum"].ToString());
  994.                     Console.WriteLine("Folder:\t\t\t" + (string)r["Folder"]);
  995.                     Console.WriteLine("Timestamp File:\t\t" + r["TimestampFile"].ToString());
  996.                     Console.WriteLine("Timestamp Folder:\t" + r["TimestampFolder"].ToString());
  997.                     Console.WriteLine("Present:\t\t\t" + r["Present"].ToString() + "\n");
  998.                     i++;
  999.                 }
  1000.                 if (i == 0)
  1001.                     Console.WriteLine("Tabella vuota.");
  1002.                 CloseConnection();
  1003.             }
  1004.         }
  1005.  
  1006.         #endregion
  1007.  
  1008.         #region SEARCH METHODS
  1009.  
  1010.         /// <summary>
  1011.         /// Cerca tutti gli utenti.
  1012.         /// TESTATO
  1013.         /// </summary>
  1014.         /// <returns></returns>
  1015.         private List<string> SearchUsers()
  1016.         {
  1017.             List<string> res = new List<string>();
  1018.             try
  1019.             {
  1020.                 lock (lockDB)
  1021.                 {
  1022.                     SetConnection();
  1023.                     string select_query = "SELECT Username " +
  1024.                                           "FROM USER";
  1025.                     SQLiteDataReader r = ExecuteQuerySelect(select_query);
  1026.                     while (r.Read())
  1027.                         res.Add((string)r["Username"]);
  1028.                     CloseConnection();
  1029.                 }
  1030.             }
  1031.             catch (Exception e)
  1032.             {
  1033.                 Console.WriteLine(e.Message);
  1034.             }
  1035.             return res;
  1036.         }
  1037.  
  1038.         /// <summary>
  1039.         /// Cerca tutti i file di un utente e ritorna la lista con i checksum dei file
  1040.         /// </summary>
  1041.         /// <param name="user"></param>
  1042.         /// <returns></returns>
  1043.         private List<string> SearchUserAllFiles(UserClass user)
  1044.         {
  1045.             List<string> res = new List<string>();
  1046.  
  1047.             lock (lockDB)
  1048.             {
  1049.                 string select_query = "SELECT Checksum " +
  1050.                                       "FROM FILE " +
  1051.                                       "WHERE User = '" + user.Username + "';";
  1052.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  1053.                 while (r.Read())
  1054.                     res.Add((string)r["Checksum"]);
  1055.                 CloseConnection();
  1056.             }
  1057.  
  1058.             return res;
  1059.         }
  1060.  
  1061.         /// <summary>
  1062.         /// Cerca tutti i file di un utente specifico nella cartella folder
  1063.         /// TESTATO
  1064.         /// </summary>
  1065.         /// <param name="utente"></param>
  1066.         /// <returns></returns>
  1067.         public List<string> SearchUserFilesInFolder(UserClass user, FolderClass folder)
  1068.         {
  1069.             List<string> res = new List<string>();
  1070.  
  1071.             lock (lockDB)
  1072.             {
  1073.                 string select_query = "SELECT Checksum " +
  1074.                                       "FROM FILE " +
  1075.                                       "WHERE User = '" + user.Username + "' AND " +
  1076.                                             "Folder = '" + folder.FolderPath + "';";
  1077.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  1078.                 while (r.Read())
  1079.                     res.Add((string)r["Checksum"]);
  1080.                 CloseConnection();
  1081.             }
  1082.  
  1083.             return res;
  1084.         }
  1085.  
  1086.         public List<string> SearchUserPresentFolders(UserClass user)
  1087.         {
  1088.             List<string> res = new List<string>();
  1089.  
  1090.             lock (lockDB)
  1091.             {
  1092.                 string select_query = "SELECT FolderPath " +
  1093.                                       "FROM FOLDER " +
  1094.                                       "WHERE User = '" + user.Username + "' AND " +
  1095.                                             "Present = '" + true.ToString() + "';";
  1096.                 SQLiteDataReader r = ExecuteQuerySelect(select_query);
  1097.                 while (r.Read())
  1098.                     res.Add((string)r["FolderPath"]);
  1099.                 CloseConnection();
  1100.             }
  1101.  
  1102.             return res;
  1103.         }
  1104.  
  1105.         /// <summary>
  1106.         /// Controlla se un file esiste (true) o meno (false).
  1107.         /// TESTATO!
  1108.         /// </summary>
  1109.         /// <param name="path"></param>
  1110.         /// <param name="utente"></param>
  1111.         /// <returns></returns>
  1112.         public bool Exists(FileClass file)
  1113.         {
  1114.             List<string> ris = SearchUserAllFiles(file.User);
  1115.             return ris.Contains(file.Checksum);
  1116.         }
  1117.  
  1118.         /// <summary>
  1119.         /// Controlla se un fil esiste
  1120.         /// </summary>
  1121.         /// <param name="file"></param>
  1122.         /// <returns></returns>
  1123.         public bool Exists(FileClass file, FolderClass folder)
  1124.         {
  1125.             List<string> ris = SearchUserFilesInFolder(file.User, folder);
  1126.             return ris.Contains(file.Checksum);
  1127.         }
  1128.  
  1129.         /// <summary>
  1130.         /// Se l'utente esiste ritorna true altrimenti ritorna false.
  1131.         /// TESTATO!
  1132.         /// </summary>
  1133.         /// <param name="user"></param>
  1134.         /// <returns></returns>
  1135.         public bool Exists(UserClass user)
  1136.         {
  1137.             List<string> users = SearchUsers();
  1138.             return users.Contains(user.Username);
  1139.         }
  1140.  
  1141.         /// <summary>
  1142.         /// Se il la cartella esiste ritorna true altrimenti ritorna false.
  1143.         /// L'oggetto folder deve avere definito:
  1144.         /// - FolderPath
  1145.         /// - User
  1146.         /// </summary>
  1147.         /// <param name="folder"></param>
  1148.         /// <returns></returns>
  1149.         public bool Exists(FolderClass folder)
  1150.         {
  1151.             List<string> folders = SearchUserPresentFolders(folder.User);
  1152.             return folders.Contains(folder.FolderPath);
  1153.         }
  1154.  
  1155.         #endregion
  1156.  
  1157.         #region QUERYEXECUTOR
  1158.  
  1159.         private void SetConnection()
  1160.         {
  1161.             //In caso di mancanza viene creato il file .db. File compresso.
  1162.             SQLconnection = new SQLiteConnection("Data Source=Database.db;Version=3;New=False;Compress=True;");
  1163.         }
  1164.  
  1165.         private void CloseConnection()
  1166.         {
  1167.             try
  1168.             {
  1169.                 SQLconnection.Close();
  1170.             }
  1171.             catch (Exception e)
  1172.             {
  1173.                 Console.WriteLine(e.Message);
  1174.             }
  1175.         }
  1176.  
  1177.         /// <summary>
  1178.         /// Esegue una Query diversa dalla select al database. La query in SQL è specificata
  1179.         /// nella stringa query.
  1180.         /// Se si esegue una delete o un update, non viene eseguita una DELETE CASCADE: per eliminare
  1181.         /// o aggiornare in cascata utilizzare la funzione ExecuteQueryCascade().
  1182.         /// Metodo thread safe.
  1183.         /// </summary>
  1184.         /// <param name="query">Query da eseguire come stringa</param>
  1185.         private void ExecuteQuery(string query)
  1186.         {
  1187.             lock (lockDB)
  1188.             {
  1189.                 SetConnection();
  1190.                 SQLconnection.Open();
  1191.                 SQLcommand = SQLconnection.CreateCommand();
  1192.                 SQLcommand.CommandText = query;
  1193.                 SQLcommand.ExecuteNonQuery();
  1194.                 SQLconnection.Close();
  1195.             }
  1196.         }
  1197.  
  1198.         private void ExecuteQuery2(SQLiteCommand query)
  1199.         {
  1200.             lock (lockDB)
  1201.             {
  1202.                
  1203.                 SetConnection();
  1204.                 SQLconnection.Open();
  1205.                 SQLiteCommand x = new SQLiteCommand(null, SQLconnection);
  1206.                 x.CommandText = query.CommandText;
  1207.                 foreach (var aa in query.Parameters) {
  1208.                     x.Parameters.Add(aa);
  1209.                 }
  1210.                 x.Prepare();
  1211.                 x.ExecuteNonQuery();
  1212.                 SQLconnection.Close();
  1213.             }
  1214.         }
  1215.  
  1216.         /// <summary>
  1217.         /// Esegue una query abilitando la cancellazione o l'update in cascata
  1218.         /// </summary>
  1219.         /// <param name="query"></param>
  1220.         private void ExecuteQueryFK(string query)
  1221.         {
  1222.             lock (lockDB)
  1223.             {
  1224.                 SetConnection();
  1225.                 SQLconnection.Open();
  1226.                 SQLcommand = SQLconnection.CreateCommand();
  1227.                 SQLcommand.CommandText = "PRAGMA foreign_keys = ON";
  1228.                 SQLcommand.ExecuteNonQuery();
  1229.                 SQLcommand.CommandText = query;
  1230.                 SQLcommand.ExecuteNonQuery();
  1231.                 SQLconnection.Close();
  1232.             }
  1233.         }
  1234.  
  1235.         /// <summary>
  1236.         /// Esegue la query SELECT e ritorna il risultato.
  1237.         /// La query SELECT in SQL è specificata nella stringa query.
  1238.         /// Il metodo non è thread safe. Racchiuderlo in un lock.
  1239.         /// </summary>
  1240.         /// <param name="query">Query da eseguire come stringa</param>
  1241.         /// <returns></returns>
  1242.         private SQLiteDataReader ExecuteQuerySelect(string query)
  1243.         {
  1244.             SetConnection();
  1245.             SQLconnection.Open();
  1246.             SQLcommand = SQLconnection.CreateCommand();
  1247.             SQLcommand.CommandText = query;
  1248.             SQLiteDataReader r = SQLcommand.ExecuteReader();
  1249.             return r;
  1250.         }
  1251.  
  1252.         #endregion
  1253.     }
  1254. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement