コード例 #1
0
ファイル: DataStore.cs プロジェクト: hut104/ApsimX
        /// <summary>Remove all simulations from the database that don't exist in 'simulationsToKeep'</summary>
        /// <param name="simulationsToKeep">The simulations to keep.</param>
        public void RemoveUnwantedSimulations(Simulations simulationsToKeep)
        {
            Open(forWriting: true);

            string[] simulationNamesToKeep = simulationsToKeep.FindAllSimulationNames();

            // Make sure that the list of simulations in 'simulationsToKeep' are in the
            // Simulations table.
            string[] simulationNames = this.SimulationNames;
            foreach (string simulationNameToKeep in simulationNamesToKeep)
            {
                if (!StringUtilities.Contains(simulationNames, simulationNameToKeep))
                {
                    RunQueryWithNoReturnData("INSERT INTO [Simulations] (Name) VALUES ('" + simulationNameToKeep + "')");
                }
            }

            // Get a list of simulation IDs that we are to delete.
            List<int> idsToDelete = new List<int>();
            foreach (string simulationNameInDB in SimulationNames)
                if (!simulationNamesToKeep.Contains(simulationNameInDB))
                {
                    idsToDelete.Add(GetSimulationID(simulationNameInDB));
                }

            if (idsToDelete.Count == 0)
                return;

            // create an SQL WHERE clause with all IDs
            string idString = "";
            for (int i = 0; i < idsToDelete.Count; i++)
            {
                if (i > 0)
                    idString += " OR ";
                idString += "ID = " + idsToDelete[i].ToString();
            }

            RunQueryWithNoReturnData("DELETE FROM Simulations WHERE " + idString);

            idString = "";
            for (int i = 0; i < idsToDelete.Count; i++)
            {
                if (i > 0)
                    idString += " OR ";
                idString += "SimulationID = " + idsToDelete[i].ToString();
            }
            foreach (string tableName in TableNames)
            {
                // delete this simulation
                RunQueryWithNoReturnData("DELETE FROM " + tableName + " WHERE " + idString);
            }
        }
コード例 #2
0
ファイル: DataStore.cs プロジェクト: her123/ApsimX
        /// <summary>Remove all simulations from the database that don't exist in 'simulationsToKeep'</summary>
        /// <param name="simulationsToKeep">The simulations to keep.</param>
        /// <param name="simulationNamesToBeRun">The simulation names about to be run.</param>
        public void RemoveUnwantedSimulations(Simulations simulationsToKeep, List<string> simulationNamesToBeRun)
        {
            Open(forWriting: true);

            string[] simulationNamesToKeep = simulationsToKeep.FindAllSimulationNames();

            // Tell SQLite that we're beginning a transaction.
            Connection.ExecuteNonQuery("BEGIN");

            try
            {
                // Make sure that the list of simulations in 'simulationsToKeep' are in the
                // Simulations table.
                string[] simulationNames = this.SimulationNames;
                string sql = string.Empty;
                foreach (string simulationNameToKeep in simulationNamesToKeep)
                {
                    if (!StringUtilities.Contains(simulationNames, simulationNameToKeep))
                    {
                        if (sql != string.Empty)
                            sql += "),(";
                        sql += "'" + simulationNameToKeep + "'";
                    }
                }

                if (sql != string.Empty)
                    RunQueryWithNoReturnData("INSERT INTO [Simulations] (Name) VALUES (" + sql + ")");

                // Get a list of simulation IDs that we are to delete.
                List<int> idsToDelete = new List<int>();
                foreach (string simulationNameInDB in SimulationNames)
                    if (!simulationNamesToKeep.Contains(simulationNameInDB))
                    {
                        idsToDelete.Add(GetSimulationID(simulationNameInDB));
                    }

                // create an SQL WHERE clause with all IDs
                string idString = "";
                for (int i = 0; i < idsToDelete.Count; i++)
                {
                    if (i > 0)
                        idString += " OR ";
                    idString += "ID = " + idsToDelete[i].ToString();
                }

                if (idString != string.Empty)
                    RunQueryWithNoReturnData("DELETE FROM Simulations WHERE " + idString);

                // Now add to IDs to delete the simulations IDs of the simulations we are
                // about to run i.e. remove the rows that we are about to regenerate.
                idsToDelete.Clear();
                foreach (string simulationNameToBeRun in simulationNamesToBeRun)
                    idsToDelete.Add(GetSimulationID(simulationNameToBeRun));

                idString = "";
                for (int i = 0; i < idsToDelete.Count; i++)
                {
                    if (i > 0)
                        idString += " OR ";
                    idString += "SimulationID = " + idsToDelete[i].ToString();
                }

                foreach (string tableName in TableNames)
                {
                    // delete this simulation
                    RunQueryWithNoReturnData("DELETE FROM " + tableName + " WHERE " + idString);
                }
            }
            finally
            {
                // Tell SQLite that we're ending a transaction.
                Connection.ExecuteNonQuery("END");
            }
        }