using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlServerCe; using System.IO; using Foo.DataAccessLayer.DataTypes; namespace Foo.DataAccessLayer { public class dArtifacts { /// /// Checks to see if this artifact is already in the system. The Location is the UniqueID /// so no other artifact may exist that has the exact same location /// /// Artifact To Check (Location Needed Only) /// true if found, false otherwise public bool DoesArtifactExistInSystem(ArtifactItem artifactItem) { // Check Artifact Integrity if ((artifactItem == null) || !artifactItem.IsLocationValid) return false; object obj = null; lock (this) { string sql = "SELECT [UID] FROM Artifacts WHERE [Location] = @location"; SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); } return (obj != null); } /// /// Searches all Artifact's Names & Notes for the specified SearchQuery using SQL's Like stmt /// /// string to use in 'Like' (Must be less than 75 Characters) /// Specify Sort Order /// returns ArtifactItem[] of all found artifacts public ArtifactItem[] SearchArtifactsInTheSystem(string SearchQuery, SortOrderForArtifacts SortOrder) { if (!String.IsNullOrEmpty(SearchQuery) && (SearchQuery.Length <= 75)) { lock (this) { DataSet dataset = SearchArtifactsInTheSystemIntoDataSet(SearchQuery, SortOrder); if (!DataTypeValidation.IsEmptyDataSet(dataset)) { int nRows = dataset.Tables[0].Rows.Count; ArtifactItem[] resultArtifacts = new ArtifactItem[nRows]; for (int i = 0; i < nRows; ++i) { DataRow datarow = dataset.Tables[0].Rows[i]; resultArtifacts[i] = new ArtifactItem(); // Add Artifact Fields resultArtifacts[i].Name = datarow["Name"].ToString(); resultArtifacts[i].SetType(datarow["Type"].ToString()); resultArtifacts[i].Location = datarow["Location"].ToString(); resultArtifacts[i].Note = datarow["Note"].ToString(); resultArtifacts[i].SnapshotFile = datarow["SnapShotFile"].ToString(); if (!String.IsNullOrEmpty(datarow["LastAccessed"].ToString())) resultArtifacts[i].SetLastAccessed(DateTime.Parse(datarow["LastAccessed"].ToString())); if (!String.IsNullOrEmpty(datarow["AccessCounter"].ToString())) resultArtifacts[i].AccessCounter = int.Parse(datarow["AccessCounter"].ToString()); } return resultArtifacts; } } } // return Blank Item return DataTypeHelpers.EmptyArtifactItemGroup(); } /// /// Searches all Artifact's Names & Notes for the specified SearchQuery using SQL's Like stmt /// /// string to use in 'Like' (Must be less than 75 Characters) /// Specify Sort Order /// returns DataSet of all found artifacts public DataSet SearchArtifactsInTheSystemIntoDataSet(string SearchQuery, SortOrderForArtifacts SortOrder) { if (!String.IsNullOrEmpty(SearchQuery) && (SearchQuery.Length <= 75)) { lock (this) { string sql = "SELECT [Name],[Type],[Location],[Note],[SnapShotFile],[LastAccessed],[AccessCounter] FROM Artifacts"; sql = sql + String.Format(" WHERE [Name] LIKE '%{0}%' OR [Note] LIKE '%{0}%' OR [Location] LIKE '%{0}%'", SearchQuery); sql = SortOrderSQLHelpers.SortOrderForArtifactsHelper(sql, SortOrder); DataSet dataset = DB.RunSQLTextFillDataSet(sql); return dataset; } } return new DataSet(); // empty dataset } /// /// Returns an ArtifactItem[] of all Artifacts in the System (WorkspaceLinkProperties won't be filled in) /// /// Specify Sort Order /// returns ArtifactItem[] of all artifacts public ArtifactItem[] GetAllArtifactsInTheSystem(SortOrderForArtifacts SortOrder) { lock (this) { DataSet dataset = GetAllArtifactsInTheSystemIntoDataSet(SortOrder); if (!DataTypeValidation.IsEmptyDataSet(dataset)) { int nRows = dataset.Tables[0].Rows.Count; ArtifactItem[] resultArtifacts = new ArtifactItem[nRows]; for (int i = 0; i < nRows; ++i) { DataRow datarow = dataset.Tables[0].Rows[i]; resultArtifacts[i] = new ArtifactItem(); // Add Artifact Fields resultArtifacts[i].Name = datarow["Name"].ToString(); resultArtifacts[i].Type = (ArtifactTypes) Enum.Parse(typeof(ArtifactTypes), datarow["Type"].ToString(), true); resultArtifacts[i].Location = datarow["Location"].ToString(); resultArtifacts[i].Note = datarow["Note"].ToString(); resultArtifacts[i].SnapshotFile = datarow["SnapShotFile"].ToString(); if (!String.IsNullOrEmpty(datarow["LastAccessed"].ToString())) resultArtifacts[i].SetLastAccessed(DateTime.Parse(datarow["LastAccessed"].ToString())); if (!String.IsNullOrEmpty(datarow["AccessCounter"].ToString())) resultArtifacts[i].AccessCounter = int.Parse(datarow["AccessCounter"].ToString()); } return resultArtifacts; } } // return Blank Item return DataTypeHelpers.EmptyArtifactItemGroup(); } /// /// Returns a DataSet of All Artifacts in the System (WorkspaceLinkProperties won't be filled in) /// /// Specify Sort Order /// returns DataSet of all artifacts public DataSet GetAllArtifactsInTheSystemIntoDataSet(SortOrderForArtifacts SortOrder) { lock (this) { string sql = "SELECT [Name],[Type],[Location],[Note],[SnapShotFile],[LastAccessed],[AccessCounter] FROM Artifacts"; sql = SortOrderSQLHelpers.SortOrderForArtifactsHelper(sql, SortOrder); DataSet dataset = DB.RunSQLTextFillDataSet(sql); return dataset; } } /// /// Increments the access counter and sets LastAccessed for the /// specified artifact. Call this whenever you have launched an Artifact. /// /// Artifact To Check (Location Needed Only) /// true if successful set the internal counters, false otherwise public bool ArtifactWasLaunched(ArtifactItem artifactItem) { // Check Artifact Validity if ((artifactItem == null) || !artifactItem.IsLocationValid) return false; lock (this) { // existence check if (!DoesArtifactExistInSystem(artifactItem)) return false; // First Step - is to get the AccessCounter already in the db string sql = "SELECT [AccessCounter] FROM Artifacts WHERE [Location]=@location"; SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; int accesscount = 1; object obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); if (obj != null) { accesscount = int.Parse(obj.ToString()); accesscount = accesscount + 1; // increment by 1 } // Second Step - is to set the access counter and today's date for the artifact string sql2 = "UPDATE Artifacts SET [LastAccessed]=@lastaccessed,[AccessCounter]=@accesscounter WHERE [Location]=@location"; SqlCeParameter[] sqlparams2 = new SqlCeParameter[] { new SqlCeParameter("@lastaccessed", DateTime.Now), new SqlCeParameter("@accesscounter", accesscount), new SqlCeParameter("@location", artifactItem.Location), }; int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql2, sqlparams2); return (nResult == 1); } } /// /// Check to see if the artifact is part of the workspace /// /// WorskpaceName to check the Artifact against /// Artifact To Check (Location Needed Only) /// true, if part of the specified workspace, false otherwise public bool IsArtifactPartOfWorkspace(string WorkspaceName, ArtifactItem artifactItem) { // Check Artifact & Workspace Validity if ((artifactItem == null) || !artifactItem.IsLocationValid || !DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) return false; object obj = null; lock (this) { // Check to make sure that this is a valid WorkspaceName if (!Data.Workspace.DoesWorkspaceNameExist(WorkspaceName)) return false; // First Step - Get the UID of the Artifact to look up in the Links table string sql = "SELECT [UID] FROM Artifacts WHERE [Location] = @location"; SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); if (obj != null) { int uid = int.Parse(obj.ToString()); // Second Step - Lookup if there is any item in the Links table that matches the uid and workspace name string sql2 = "SELECT [UID] FROM WorkspaceLinks WHERE [AID] = @aid AND [WorkspaceName] = @workspacename"; SqlCeParameter[] sqlparams2 = new SqlCeParameter[] { new SqlCeParameter("@aid", uid), new SqlCeParameter("@workspacename", WorkspaceName), }; obj = DB.RunSQLCommandTextExecuteScalar(sql2, sqlparams2); return (obj != null); } } return false; } /// /// Uses The workspace stored in the State Table and determines if the Artifact is part of that Workspace /// /// Artifact To Check (Location Needed Only) /// true, if part of the current workspace in the state table, false otherwise public bool IsArtifactPartOfCurrentWorkspaceState(ArtifactItem artifactItem) { // Check validity of the Artifact if ((artifactItem == null) || !artifactItem.IsLocationValid) return false; lock(this) { string CurrentWorkspace = Data.State.GetCurrentWorkspaceName(); if (!String.IsNullOrEmpty(CurrentWorkspace)) { return IsArtifactPartOfWorkspace(CurrentWorkspace, artifactItem); } } return false; } /// /// Use this when you have an Artifact that doesn't have any WorkspaceLink Properties and you /// want to fill the Artifact's WorkspaceLink properties with the first artifact that matches the /// specified workspace sort order /// /// artifactItem without WorkspaceLink Properties (Location Needed Only) /// SortOrder of workspace to use when filling the first found artifact that matches /// an artifact item with workspaceLink properties filled out if successfull public ArtifactItem GetWorkspaceLinkPropertiesForArtifact(ArtifactItem artifactItem, SortOrderForWorkspaces sortOrder) { // ensure artifact integrity if ((artifactItem == null) || !(artifactItem.IsLocationValid)) return artifactItem; // nothing filled out lock (this) { // First Step - Get the UID of the artifact string sql = "SELECT [UID] FROM Artifacts WHERE [Location] = @location"; SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; object obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); if (obj != null) { int aid = int.Parse(obj.ToString()); // Second Step - is to get the WorkspaceLink that matches the artifact by the sort order string sql2 = "SELECT [WorkspaceLinks].[WindowTop], [WorkspaceLinks].[WindowLeft],[WorkspaceLinks].[WindowHeight], [WorkspaceLinks].[WindowWidth]"; sql2 = sql2 + " FROM [WorkspaceLinks] , [Workspaces] WHERE [WorkspaceLinks].[WorkspaceName] = [Workspaces].[Name] AND [WorkspaceLinks].[AID]=@aid"; // Add WorkspacesSortOrder sql2 = SortOrderSQLHelpers.SortOrderForWorkspacesHelper(sql2, sortOrder); SqlCeParameter[] sqlparams2 = new SqlCeParameter[] { new SqlCeParameter("@aid", aid) }; DataSet dataset = DB.RunSQLTextFillDataSet(sql2, sqlparams2); if (!DataTypeValidation.IsEmptyDataSet(dataset)) { // Just get the first item DataRow datarow = dataset.Tables[0].Rows[0]; // Clone the original artifact ArtifactItem resultArtifact = (ArtifactItem) artifactItem.Clone(); // Add Artifact Fields resultArtifact.WindowTop = int.Parse(datarow["WindowTop"].ToString()); resultArtifact.WindowLeft = int.Parse(datarow["WindowLeft"].ToString()); resultArtifact.WindowHeight = int.Parse(datarow["WindowHeight"].ToString()); resultArtifact.WindowWidth = int.Parse(datarow["WindowWidth"].ToString()); return resultArtifact; } } } // nothing filled out return artifactItem; } /// /// Retrieve all Artifacts associated with the specified Workspace (uses links table to determine which artifacts) /// /// The WorkspaceName for which to get all Artifacts /// Specify Sort Order /// Group of Artifact Items, Could be Empty, use DataTypeValidator to check for Empty ArtifactGroup public ArtifactItem[] GetAllArtifactsForWorkspace(string WorkspaceName, SortOrderForArtifacts SortBy) { // Ensure Workspace Name Integrity if (!DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) return DataTypeHelpers.EmptyArtifactItemGroup(); // return Blank Item lock (this) { // Check to make sure that this is a valid WorkspaceName (in DB) if (!Data.Workspace.DoesWorkspaceNameExist(WorkspaceName)) return DataTypeHelpers.EmptyArtifactItemGroup(); // return Blank Item // First Step - Use a Join to get all the matching artifacts string sql = "SELECT [Artifacts].[Name], [Artifacts].[Type], [Artifacts].[Location], [Artifacts].[Note], [Artifacts].[SnapShotFile], [Artifacts].[LastAccessed], [Artifacts].[AccessCounter], [WorkspaceLinks].[WindowTop], "; sql = sql + "[WorkspaceLinks].[WindowLeft], [WorkspaceLinks].[WindowHeight], [WorkspaceLinks].[WindowWidth], [WorkspaceLinks].[WorkspaceName] "; sql = sql + "FROM [WorkspaceLinks] , [Artifacts] "; sql = sql + "WHERE [WorkspaceLinks].[AID] = [Artifacts].[UID] AND [WorkspaceLinks].[WorkspaceName] = @workspacename "; // Add ArtifactsSortOrder sql = SortOrderSQLHelpers.SortOrderForArtifactsHelper(sql, SortBy); SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@workspacename", WorkspaceName) }; DataSet dataset = DB.RunSQLTextFillDataSet(sql, sqlparams); if (!DataTypeValidation.IsEmptyDataSet(dataset)) { int nRows = dataset.Tables[0].Rows.Count; ArtifactItem[] resultArtifacts = new ArtifactItem[nRows]; for (int i = 0; i < nRows; ++i) { DataRow datarow = dataset.Tables[0].Rows[i]; resultArtifacts[i] = new ArtifactItem(); // Add Artifact Fields resultArtifacts[i].Name = datarow["Name"].ToString(); resultArtifacts[i].Type = (ArtifactTypes)Enum.Parse(typeof(ArtifactTypes), datarow["Type"].ToString(), true); resultArtifacts[i].Location = datarow["Location"].ToString(); resultArtifacts[i].Note = datarow["Note"].ToString(); resultArtifacts[i].SnapshotFile = datarow["SnapShotFile"].ToString(); if(!String.IsNullOrEmpty(datarow["LastAccessed"].ToString())) resultArtifacts[i].SetLastAccessed(DateTime.Parse(datarow["LastAccessed"].ToString())); if (!String.IsNullOrEmpty(datarow["AccessCounter"].ToString())) resultArtifacts[i].AccessCounter = int.Parse(datarow["AccessCounter"].ToString()); resultArtifacts[i].WindowTop = int.Parse(datarow["WindowTop"].ToString()); resultArtifacts[i].WindowLeft = int.Parse(datarow["WindowLeft"].ToString()); resultArtifacts[i].WindowHeight = int.Parse(datarow["WindowHeight"].ToString()); resultArtifacts[i].WindowWidth = int.Parse(datarow["WindowWidth"].ToString()); } return resultArtifacts; } } // return Blank Item return DataTypeHelpers.EmptyArtifactItemGroup(); } /// /// Get's the artifact link count for the passed in workspace /// /// The WorkspaceName for which to get all Artifact Links /// 0 or positive number for the number of records, -1 if error occurs public int GetArtifactLinkCountForWorkspace(string WorkspaceName) { // Ensure Workspace Name Integrity if (!DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) return -1; // return error lock (this) { // Check to make sure that this is a valid WorkspaceName (in DB) if (!Data.Workspace.DoesWorkspaceNameExist(WorkspaceName)) return -1; // return Blank Item // First Step - Get the count of all artifacts for this workspace string sql = "SELECT COUNT([WorkspaceLinks].[AID]) FROM [WorkspaceLinks] WHERE [WorkspaceLinks].[WorkspaceName] = @workspacename"; SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@workspacename", WorkspaceName) }; object obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); if (obj != null) { int i = int.Parse(obj.ToString()); return i; } } return -1; // return error } /// /// Get's the unique artifact link count for the passed in workspace (this means only artifact links /// that are unique to this workspace) /// /// The WorkspaceName for which to get all unique Artifact Links /// 0 or positive number for the number of records, -1 if error occurs public int GetUniqureArtifactsCountForWorkspace(string WorkspaceName) { // Ensure Workspace Name Integrity if (!DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) return -1; // return Blank Item lock (this) { // Check to make sure that this is a valid WorkspaceName (in DB) if (!Data.Workspace.DoesWorkspaceNameExist(WorkspaceName)) return -1; // return Blank Item // First Step - We need all the links that are part of the workspace in the links table string sql2 = "SELECT [AID] FROM WorkspaceLinks WHERE [WorkspaceName]=@workspacename"; SqlCeParameter[] sqlparams2 = new SqlCeParameter[] { new SqlCeParameter("@workspacename", WorkspaceName) }; DataSet dataset = DB.RunSQLTextFillDataSet(sql2, sqlparams2); List workspaceLinksListAIDs = new List(); if (!DataTypeValidation.IsEmptyDataSet(dataset)) { foreach (DataRow row in dataset.Tables[0].Rows) workspaceLinksListAIDs.Add(int.Parse(row[0].ToString())); } // Second Step - We now should check which AIDs are not referenced anywhere else, those AIDS are // counted as being unique to this workspace string sql4 = "SELECT [UID] FROM WorkspaceLinks WHERE [AID]=@aid AND [WorkspaceName]<>@workspacename"; List workspaceLinksListAIDsWithoutReferences = new List(); foreach (int aid in workspaceLinksListAIDs) { SqlCeParameter[] sqlparams4 = new SqlCeParameter[] { new SqlCeParameter("@aid", aid), new SqlCeParameter("@workspacename", WorkspaceName) }; object obj = DB.RunSQLCommandTextExecuteScalar(sql4, sqlparams4); if (obj == null) // this aid has no references workspaceLinksListAIDsWithoutReferences.Add(aid); } return workspaceLinksListAIDsWithoutReferences.Count; } } /// /// Adds an Artifact to a Workspace (shouldn't already be in that workspace) /// If the artifact already exists and the only thing being done is that the artifact is /// being added to a new workspace (a link will be created) /// /// WorkspaceName to insert Artifact into /// the Artifact to Add (Must be complete - pass All Validations) /// true if successful, false otherwise public bool AddArtifactToWorkspace(string WorkspaceName, ArtifactItem artifactItem) { // ensure artifact and workspace integrity if ((artifactItem == null) || !(artifactItem.IsValid) || !(artifactItem.IsLocationValid) || !(artifactItem.IsValidFileIntegrity) || !(artifactItem.AreWorkspaceLinkPropertiesValid) || !DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) return false; lock (this) { // Check to make sure that this is a valid WorkspaceName if (!Data.Workspace.DoesWorkspaceNameExist(WorkspaceName)) return false; //// // Do a little more Integrity Checking, to know where we are at //// bool bExists = DoesArtifactExistInSystem(artifactItem); bool bAlreadyInWorkspace = false; if(bExists) bAlreadyInWorkspace = IsArtifactPartOfWorkspace(WorkspaceName, artifactItem); // If we already have it in this workspace, just modify the // Artifact's Properties & Workspace Properties if (bAlreadyInWorkspace) return ModifyExistingArtifactProperties(artifactItem, WorkspaceName); // * also modify workspacelink properties * // if it exists, but is not part of this workspace, then we should create a link for the artifact and // update any of the artifact's properties if (bExists && !bAlreadyInWorkspace) { // First Step - Get the UID of the artifact string sql = "SELECT [UID] FROM Artifacts WHERE [Location] = @location"; SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; object obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); if (obj != null) { int aid = int.Parse(obj.ToString()); int uid = 0; // Second Step - Is to get the Max UID for the Links table to Insert to string sql2 = "SELECT MAX (UID) FROM WorkspaceLinks"; object obj2 = DB.RunSQLCommandTextExecuteScalar(sql2); if (obj2 != null) { uid = int.Parse(obj2.ToString()); uid = uid + 1; // incr. by one } // Third Step - Create a new Entry for this workspace in the Links Table string sql3 = "INSERT INTO WorkspaceLinks ([UID],[AID],[WorkspaceName],[WindowTop],[WindowLeft],[WindowHeight],[WindowWidth])"; sql3 = sql3 + " VALUES (@uid,@aid,@workspacename,@windowtop,@windowleft,@windowheight,@windowwidth)"; SqlCeParameter[] sqlparams3 = new SqlCeParameter[] { new SqlCeParameter("@uid", uid), new SqlCeParameter("@aid", aid), new SqlCeParameter("@workspacename", WorkspaceName), new SqlCeParameter("@windowtop", artifactItem.WindowTop), new SqlCeParameter("@windowleft", artifactItem.WindowLeft), new SqlCeParameter("@windowheight", artifactItem.WindowHeight), new SqlCeParameter("@windowwidth", artifactItem.WindowWidth), }; int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql3, sqlparams3); if (nResult != 1) return false; // Now we can just Modify the Artifact's Properties, in case they changed return ModifyExistingArtifactProperties(artifactItem); // no need to modify workspace properties here - only modify artifact } } else { // First Step - Is to get the Max UID for the Artifact table to Insert to int uid = 0; string sql = "SELECT MAX (UID) FROM Artifacts"; object obj = DB.RunSQLCommandTextExecuteScalar(sql); if (obj != null) { uid = int.Parse(obj.ToString()); uid = uid + 1; // incr. by one } // Second Step - Is to Actually Insert the new Artifact into the Artifact Table string sql3 = "INSERT INTO Artifacts ([UID],[Name],[Type],[Location],[Note],[SnapShotFile],[LastAccessed],[AccessCounter]) "; sql3 = sql3 + "VALUES (@uid,@name,@type,@location,@note,@snapshotfile,@accessed,@counter)"; SqlCeParameter[] sqlparams3 = new SqlCeParameter[] { new SqlCeParameter("@uid", uid), new SqlCeParameter("@name", artifactItem.Name), new SqlCeParameter("@type", artifactItem.Type.ToString()), new SqlCeParameter("@location", artifactItem.Location), new SqlCeParameter("@note", artifactItem.Note), new SqlCeParameter("@snapshotfile", artifactItem.SnapshotFile), new SqlCeParameter("@accessed", DateTime.Now), new SqlCeParameter("@counter", "0"), }; int nResult = 0; nResult = DB.RunSQLCommandTextExecuteNonQuery(sql3, sqlparams3); if (nResult != 1) return false; // Third Step - Get the highest UID for the Link table int aid = uid; // save the uid of the artifact as the aid uid = 0; string sql4 = "SELECT MAX (UID) FROM WorkspaceLinks"; object obj4 = DB.RunSQLCommandTextExecuteScalar(sql4); if (obj != null) { uid = int.Parse(obj4.ToString()); uid = uid + 1; // incr. by one } // Fourth Step - Is to Now Insert the Link to the Workspace into the Links Table string sql5 = "INSERT INTO WorkspaceLinks ([UID],[AID],[WorkspaceName],[WindowTop],[WindowLeft],[WindowHeight],[WindowWidth]) VALUES (@uid,@aid,@workspacename,@windowtop,@windowleft,@windowheight,@windowwidth)"; SqlCeParameter[] sqlparams5 = new SqlCeParameter[] { new SqlCeParameter("@uid", uid), new SqlCeParameter("@aid", aid), new SqlCeParameter("@workspacename", WorkspaceName), new SqlCeParameter("@windowtop", artifactItem.WindowTop), new SqlCeParameter("@windowleft", artifactItem.WindowLeft), new SqlCeParameter("@windowheight", artifactItem.WindowHeight), new SqlCeParameter("@windowwidth", artifactItem.WindowWidth), }; nResult = DB.RunSQLCommandTextExecuteNonQuery(sql5, sqlparams5); if (nResult != 1) return false; else return true; } } return false; } /// /// Deletes Artifact from the workspace (if no more references exists), /// will delete the artifact entirely (in best scenario only a link will be deleted) /// /// WorkspaceName to Delete Artifact From /// Artifact To Delete (Location Needed Only) /// true if successful, false otherwise public bool DeleteArtifact(string WorkspaceName, ArtifactItem artifactItem) { // ensure artifact and workspace integrity if ((artifactItem == null) || !(artifactItem.IsLocationValid) || !DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) return false; lock (this) { // Check to make sure that this is a valid Artifact if (!DoesArtifactExistInSystem(artifactItem)) return false; // Check to make sure that this is a valid WorkspaceName if (!Data.Workspace.DoesWorkspaceNameExist(WorkspaceName)) return false; // First Step - Is to get the UID of the Artifact string sql1 = "SELECT [UID] FROM Artifacts WHERE [Location]=@location"; SqlCeParameter[] sqlparams1 = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; object obj = DB.RunSQLCommandTextExecuteScalar(sql1, sqlparams1); if (obj != null) { int uid = int.Parse(obj.ToString()); // Second Step - Is to Delete the Link in the Link Table string sql2 = "DELETE FROM WorkspaceLinks WHERE [WorkspaceName]=@workspacename AND [AID]=@aid"; SqlCeParameter[] sqlparams2 = new SqlCeParameter[] { new SqlCeParameter("@workspacename", WorkspaceName) , new SqlCeParameter("@aid", uid) }; // We hope there at least one link in the links table (but we don't verify) DB.RunSQLCommandTextExecuteNonQuery(sql2, sqlparams2); // Third Step - Next is to see if there are any other Links Left with this AID string sql3 = "SELECT [UID] FROM WorkspaceLinks WHERE [AID]=@aid"; SqlCeParameter[] sqlparams3 = new SqlCeParameter[] { new SqlCeParameter("@aid", uid) }; object obj3 = DB.RunSQLCommandTextExecuteScalar(sql3, sqlparams3); if (obj3 == null) { // Fourth Step - Only if there are no other more links, Delete the Actually Artifact from the // Artifact Table string sql4 = "DELETE From Artifacts WHERE [UID]=@uid"; SqlCeParameter[] sqlparams4 = new SqlCeParameter[] { new SqlCeParameter("@uid", uid) }; int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql4, sqlparams4); if (nResult != 1) return false; else return true; } } } return false; } /// /// Forces Deletion of the Artifact and all Links / References in the System /// /// Artifact To Delete (Location Needed Only) /// true if successful, false otherwise public bool DeleteArtifact(ArtifactItem artifactItem) { // ensure artifact integrity if ((artifactItem == null) || !(artifactItem.IsLocationValid)) return false; lock (this) { // Check to make sure that this is a valid Artifact if (!DoesArtifactExistInSystem(artifactItem)) return false; // First Step - Is to get the UID of the Artifact string sql1 = "SELECT [UID] FROM Artifacts WHERE [Location]=@location"; SqlCeParameter[] sqlparams1 = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; object obj = DB.RunSQLCommandTextExecuteScalar(sql1, sqlparams1); if (obj != null) { int uid = int.Parse(obj.ToString()); // Second Step - Is to Delete all the Links refering to the Artifact in the Links Table string sql2 = "DELETE FROM WorkspaceLinks WHERE [AID]=@aid"; SqlCeParameter[] sqlparams2 = new SqlCeParameter[] { new SqlCeParameter("@aid", uid) }; DB.RunSQLCommandTextExecuteNonQuery(sql2, sqlparams2); // Third Step - Delete the Artifact from the Artifact Table string sql3 = "DELETE From Artifacts WHERE [UID]=@uid"; SqlCeParameter[] sqlparams3 = new SqlCeParameter[] { new SqlCeParameter("@uid", uid) }; int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql3, sqlparams3); if (nResult != 1) return false; else return true; } } return false; } /// /// Modify Properties of an Artifact. Artifact's Location is the Unique Key, /// it must already exist in the system for this update to work. /// (this will only update Artifact Properties Not WorkspaceLink Properties) /// /// the Artifact to Modify (Must be complete - pass All Validations) /// true if successful, false otherwise public bool ModifyExistingArtifactProperties(ArtifactItem artifactItem) { // ensure artifact integrity if ((artifactItem == null) || !(artifactItem.IsValid) || !(artifactItem.IsLocationValid) || !(artifactItem.IsValidFileIntegrity)) return false; object obj = null; lock (this) { // ensure existence if (!DoesArtifactExistInSystem(artifactItem)) return false; // First Step - Get the UID of the Artifact so that we can update it string sql = "SELECT [UID] FROM Artifacts WHERE [Location] = @location"; SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); if (obj != null) { int uid = int.Parse(obj.ToString()); // Second Step - Is to Create the Update Statement to update the Artifact string sql2 = "UPDATE Artifacts SET [Name]=@name,[Type]=@type,[Location]=@location,[Note]=@note,[SnapShotFile]=@snapshotfile, [LastAccessed]=@accessed, [AccessCounter]=@counter "; sql2 = sql2 + "WHERE [UID]=@uid"; SqlCeParameter[] sqlparams2 = new SqlCeParameter[] { new SqlCeParameter("@uid", uid), new SqlCeParameter("@name", artifactItem.Name), new SqlCeParameter("@type", artifactItem.Type.ToString()), new SqlCeParameter("@location", artifactItem.Location), new SqlCeParameter("@note", artifactItem.Note), new SqlCeParameter("@snapshotfile", artifactItem.SnapshotFile), new SqlCeParameter("@accessed", artifactItem.LastAccessed), new SqlCeParameter("@counter", artifactItem.AccessCounter), }; int nResult = 0; nResult = DB.RunSQLCommandTextExecuteNonQuery(sql2, sqlparams2); if (nResult != 1) return false; else return true; } } return false; } /// /// Modify Properties of an Artifact and the properties of a workspaceLink. /// Artifact's Location is the Unique Key, it must already exist in the system. /// /// the Artifact to Modify (Must be complete - pass All Validations) /// the workspaceName whose Link properties to modify /// true if successful, false otherwise public bool ModifyExistingArtifactProperties(ArtifactItem artifactItem, string WorkspaceName) { // ensure artifact and workspace integrity if ((artifactItem == null) || !(artifactItem.IsValid) || !(artifactItem.IsLocationValid) || !(artifactItem.IsValidFileIntegrity) || !(artifactItem.AreWorkspaceLinkPropertiesValid) || !DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) return false; lock (this) { // First Step - modify the Artifact's Properties *if fails, return* if (!ModifyExistingArtifactProperties(artifactItem)) return false; // Now Check Validity of the Workspace Properties before continuing if (!artifactItem.AreWorkspaceLinkPropertiesValid) return false; // Ensure existence of WorkspaceName if (!Data.Workspace.DoesWorkspaceNameExist(WorkspaceName)) return false; // Second Step - get the AID for the Artifact string sql = "SELECT [UID] FROM Artifacts WHERE [Location] = @location"; SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; object obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); if (obj != null) { int uid = int.Parse(obj.ToString()); // Third Step - Is to Update the Workspace Link Properties string sql2 = "UPDATE WorkspaceLinks SET [WindowTop]=@windowtop,[WindowLeft]=@windowleft,[WindowHeight]=@windowheight,[WindowWidth]=@windowwidth "; sql2 = sql2 + "WHERE [AID]=@uid AND [WorkspaceName] = @workspacename"; SqlCeParameter[] sqlparams2 = new SqlCeParameter[] { new SqlCeParameter("@windowtop", artifactItem.WindowTop), new SqlCeParameter("@windowleft", artifactItem.WindowLeft), new SqlCeParameter("@windowheight", artifactItem.WindowHeight), new SqlCeParameter("@windowwidth", artifactItem.WindowWidth), new SqlCeParameter("@uid", uid), new SqlCeParameter("@workspacename", WorkspaceName), }; int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql2, sqlparams2); if (nResult != 1) return false; else return true; } } return false; } } }