/// <summary>
        /// Removes the thread with the threadid specified from the queue it's in. A thread can be in a single queue, so we don't need the queueID.
        /// </summary>
        /// <param name="threadID">The thread ID.</param>
        /// <param name="transactionToUse">The transaction currently in progress. Can be null if no transaction is in progress.</param>
        public static void RemoveThreadFromQueue(int threadID, Transaction transactionToUse)
        {
            // delete the SupportQueueThread entity for this thread directly from the db, inside the transaction specified (if applicable)
            SupportQueueThreadCollection supportQueueThreads = new SupportQueueThreadCollection();

            if (transactionToUse != null)
            {
                // there's a transaction in progress, simply add it to the transaction
                transactionToUse.Add(supportQueueThreads);
            }

            // delete directly, using a filter on threadid
            supportQueueThreads.DeleteMulti((SupportQueueThreadFields.ThreadID == threadID));

            // don't commit the current transaction if specified, simply return to caller.
        }
Exemple #2
0
        /// <summary>
        /// Deletes the threads matching the passed in filter, inside the transaction specified.
        /// </summary>
        /// <param name="threadFilter">The thread filter.</param>
        /// <param name="trans">The transaction to use.</param>
        private static void DeleteThreads(PredicateExpression threadFilter, Transaction trans)
        {
            // we've to perform a set of actions in a given order to make sure we're not violating FK constraints in the DB.

            // delete messages in thread
            MessageManager.DeleteAllMessagesInThreads(threadFilter, trans);

            // delete bookmarks (if exists) of the threads to be deleted
            BookmarkCollection bookmarks = new BookmarkCollection();

            trans.Add(bookmarks);
            // use again a fieldcompareset predicate
            bookmarks.DeleteMulti(new FieldCompareSetPredicate(BookmarkFields.ThreadID, ThreadFields.ThreadID, SetOperator.In, threadFilter));

            // delete audit info related to this thread. Can't be done directly on the db due to the fact the entities are in a TargetPerEntity hierarchy, which
            // can't be deleted directly on the db, so we've to fetch the entities first.
            AuditDataThreadRelatedCollection threadAuditData = new AuditDataThreadRelatedCollection();

            trans.Add(threadAuditData);
            // use a fieldcompareset predicate filter, based on the threadFilter.
            threadAuditData.GetMulti(new FieldCompareSetPredicate(AuditDataThreadRelatedFields.ThreadID, ThreadFields.ThreadID, SetOperator.In, threadFilter));
            threadAuditData.DeleteMulti();

            // delete support queue thread entity for this thread (if any)
            SupportQueueThreadCollection supportQueueThreads = new SupportQueueThreadCollection();

            trans.Add(supportQueueThreads);
            // use again a fieldcompareset predicate
            supportQueueThreads.DeleteMulti(new FieldCompareSetPredicate(SupportQueueThreadFields.ThreadID, ThreadFields.ThreadID, SetOperator.In, threadFilter));

            // delete threadsubscription entities
            ThreadSubscriptionCollection threadSubscriptions = new ThreadSubscriptionCollection();

            trans.Add(threadSubscriptions);
            // use again a fieldcompareset predicate
            threadSubscriptions.DeleteMulti(new FieldCompareSetPredicate(ThreadSubscriptionFields.ThreadID, ThreadFields.ThreadID, SetOperator.In, threadFilter));

            // delete the threads
            ThreadCollection threads = new ThreadCollection();

            trans.Add(threads);
            // we already have the filter to use, namely the filter passed in.
            threads.DeleteMulti(threadFilter);

            // don't commit the transaction, that's up to the caller.
        }
        /// <summary>
        /// Deletes the support queue with the ID specified.
        /// </summary>
        /// <param name="queueID">The queue ID of the queue to delete.</param>
        /// <returns>true if succeeded, false otherwise</returns>
        /// <remarks>All threads in the queue are automatically de-queued and not in a queue anymore. The Default support queue
        /// for forums which have this queue as the default support queue is reset to null.</remarks>
        public static bool DeleteSupportQueue(int queueID)
        {
            // we'll do several actions in one atomic transaction, so start a transaction first.
            Transaction trans = new Transaction(IsolationLevel.ReadCommitted, "DeleteSupportQ");

            try
            {
                // first reset all the FKs in Forum to NULL if they point to this queue.
                ForumEntity forumUpdater = new ForumEntity();
                // set the field to NULL. This is a nullable field, so we can just set the field to 'null', thanks to nullable types.
                forumUpdater.DefaultSupportQueueID = null;
                // update the entities directly in the db, use a forum collection for that
                ForumCollection forums = new ForumCollection();
                trans.Add(forums);
                // specify a filter that only the forums which have this queue as the default queue are updated and have their FK field set to NULL.
                forums.UpdateMulti(forumUpdater, (ForumFields.DefaultSupportQueueID == queueID));

                // delete all SupportQueueThread entities which refer to this queue. This will make all threads which are in this queue become queue-less.
                SupportQueueThreadCollection supportQueueThreads = new SupportQueueThreadCollection();
                trans.Add(supportQueueThreads);
                // delete them directly from the db.
                supportQueueThreads.DeleteMulti((SupportQueueThreadFields.QueueID == queueID));

                // it's now time to delete the actual supportqueue entity.
                SupportQueueCollection supportQueues = new SupportQueueCollection();
                trans.Add(supportQueues);
                // delete it directly from the db.
                int numberOfQueuesDeleted = supportQueues.DeleteMulti((SupportQueueFields.QueueID == queueID));

                // done so commit the transaction.
                trans.Commit();
                return(numberOfQueuesDeleted > 0);
            }
            catch
            {
                // first roll back the transaction
                trans.Rollback();
                // then bubble up the exception
                throw;
            }
            finally
            {
                trans.Dispose();
            }
        }
        /// <summary>
        /// Removes the thread with the threadid specified from the queue it's in. A thread can be in a single queue, so we don't need the queueID.
        /// </summary>
        /// <param name="threadID">The thread ID.</param>
        /// <param name="transactionToUse">The transaction currently in progress. Can be null if no transaction is in progress.</param>
        public static void RemoveThreadFromQueue(int threadID, Transaction transactionToUse)
        {
            // delete the SupportQueueThread entity for this thread directly from the db, inside the transaction specified (if applicable)
            SupportQueueThreadCollection supportQueueThreads = new SupportQueueThreadCollection();
            if(transactionToUse != null)
            {
                // there's a transaction in progress, simply add it to the transaction
                transactionToUse.Add(supportQueueThreads);
            }

            // delete directly, using a filter on threadid
            supportQueueThreads.DeleteMulti((SupportQueueThreadFields.ThreadID == threadID));

            // don't commit the current transaction if specified, simply return to caller.
        }
        /// <summary>
        /// Deletes the support queue with the ID specified.
        /// </summary>
        /// <param name="queueID">The queue ID of the queue to delete.</param>
        /// <returns>true if succeeded, false otherwise</returns>
        /// <remarks>All threads in the queue are automatically de-queued and not in a queue anymore. The Default support queue
        /// for forums which have this queue as the default support queue is reset to null.</remarks>
        public static bool DeleteSupportQueue(int queueID)
        {
            // we'll do several actions in one atomic transaction, so start a transaction first.
            Transaction trans = new Transaction(IsolationLevel.ReadCommitted, "DeleteSupportQ");

            try
            {
                // first reset all the FKs in Forum to NULL if they point to this queue.
                ForumEntity forumUpdater = new ForumEntity();
                // set the field to NULL. This is a nullable field, so we can just set the field to 'null', thanks to nullable types.
                forumUpdater.DefaultSupportQueueID = null;
                // update the entities directly in the db, use a forum collection for that
                ForumCollection forums = new ForumCollection();
                trans.Add(forums);
                // specify a filter that only the forums which have this queue as the default queue are updated and have their FK field set to NULL.
                forums.UpdateMulti(forumUpdater, (ForumFields.DefaultSupportQueueID == queueID));

                // delete all SupportQueueThread entities which refer to this queue. This will make all threads which are in this queue become queue-less.
                SupportQueueThreadCollection supportQueueThreads = new SupportQueueThreadCollection();
                trans.Add(supportQueueThreads);
                // delete them directly from the db.
                supportQueueThreads.DeleteMulti((SupportQueueThreadFields.QueueID == queueID));

                // it's now time to delete the actual supportqueue entity.
                SupportQueueCollection supportQueues = new SupportQueueCollection();
                trans.Add(supportQueues);
                // delete it directly from the db.
                int numberOfQueuesDeleted = supportQueues.DeleteMulti((SupportQueueFields.QueueID == queueID));

                // done so commit the transaction.
                trans.Commit();
                return (numberOfQueuesDeleted > 0);
            }
            catch
            {
                // first roll back the transaction
                trans.Rollback();
                // then bubble up the exception
                throw;
            }
            finally
            {
                trans.Dispose();
            }
        }
Exemple #6
0
        /// <summary>
        /// Deletes the threads matching the passed in filter, inside the transaction specified.
        /// </summary>
        /// <param name="threadFilter">The thread filter.</param>
        /// <param name="trans">The transaction to use.</param>
        private static void DeleteThreads(PredicateExpression threadFilter, Transaction trans)
        {
            // we've to perform a set of actions in a given order to make sure we're not violating FK constraints in the DB.

            // delete messages in thread
            MessageManager.DeleteAllMessagesInThreads(threadFilter, trans);

            // delete bookmarks (if exists) of the threads to be deleted
            BookmarkCollection bookmarks = new BookmarkCollection();
            trans.Add(bookmarks);
            // use again a fieldcompareset predicate
            bookmarks.DeleteMulti(new FieldCompareSetPredicate(BookmarkFields.ThreadID, ThreadFields.ThreadID, SetOperator.In, threadFilter));

            // delete audit info related to this thread. Can't be done directly on the db due to the fact the entities are in a TargetPerEntity hierarchy, which
            // can't be deleted directly on the db, so we've to fetch the entities first.
            AuditDataThreadRelatedCollection threadAuditData = new AuditDataThreadRelatedCollection();
            trans.Add(threadAuditData);
            // use a fieldcompareset predicate filter, based on the threadFilter.
            threadAuditData.GetMulti(new FieldCompareSetPredicate(AuditDataThreadRelatedFields.ThreadID, ThreadFields.ThreadID, SetOperator.In, threadFilter));
            threadAuditData.DeleteMulti();

            // delete support queue thread entity for this thread (if any)
            SupportQueueThreadCollection supportQueueThreads = new SupportQueueThreadCollection();
            trans.Add(supportQueueThreads);
            // use again a fieldcompareset predicate
            supportQueueThreads.DeleteMulti(new FieldCompareSetPredicate(SupportQueueThreadFields.ThreadID, ThreadFields.ThreadID, SetOperator.In, threadFilter));

            // delete threadsubscription entities
            ThreadSubscriptionCollection threadSubscriptions = new ThreadSubscriptionCollection();
            trans.Add(threadSubscriptions);
            // use again a fieldcompareset predicate
            threadSubscriptions.DeleteMulti(new FieldCompareSetPredicate(ThreadSubscriptionFields.ThreadID, ThreadFields.ThreadID, SetOperator.In, threadFilter));

            // delete the threads
            ThreadCollection threads = new ThreadCollection();
            trans.Add(threads);
            // we already have the filter to use, namely the filter passed in.
            threads.DeleteMulti(threadFilter);

            // don't commit the transaction, that's up to the caller.
        }
Exemple #7
0
        /// <summary>
        /// Deletes the user with the ID passed in. Will reset all posts made by the user to the userid 0. 
        /// </summary>
        /// <param name="userID">The user ID.</param>
        /// <remarks>Can't delete user 0</remarks>
        /// <returns>true if succeeded, false otherwise</returns>
        public static bool DeleteUser(int userID)
        {
            if(userID == 0)
            {
                // can't delete the Anonymous coward user.
                return false;
            }

            UserEntity toDelete = UserGuiHelper.GetUser(userID);
            if(toDelete==null)
            {
                // user doesn't exist
                return false;
            }

            // all actions have to take place in a transaction.
            Transaction trans = new Transaction(IsolationLevel.ReadCommitted, "DeleteUser");

            try
            {
                // we'll first update all PostedByUserId fields of all messages which are posted by the user to delete.
                MessageEntity messageUpdater = new MessageEntity();
                messageUpdater.PostedByUserID = 0;	// reset to AC.
                MessageCollection messages = new MessageCollection();
                trans.Add(messages);	// add to the transaction
                // update all entities directly in the DB, which match the following filter and update them with the new values set in messageUpdater.
                messages.UpdateMulti(messageUpdater, (MessageFields.PostedByUserID == userID));

                // set the startuser of threads started by this user to 0
                ThreadEntity threadUpdater = new ThreadEntity();
                threadUpdater.StartedByUserID = 0;
                ThreadCollection threads = new ThreadCollection();
                trans.Add(threads);
                threads.UpdateMulti(threadUpdater, (ThreadFields.StartedByUserID == userID));

                // remove the user from the UserRoles set, as the user shouldn't be in any roles.
                RoleUserCollection roleUsersDeleter = new RoleUserCollection();
                trans.Add(roleUsersDeleter);
                // delete all entities directly from the DB which match the following filter.
                roleUsersDeleter.DeleteMulti(RoleUserFields.UserID == userID);

                // delete all bookmarks of user
                BookmarkCollection bookmarkDeleter = new BookmarkCollection();
                trans.Add(bookmarkDeleter);
                // delete all bookmarks for this user directly from the DB using the following filter.
                bookmarkDeleter.DeleteMulti(BookmarkFields.UserID == userID);

                // delete all audit data
                AuditDataCoreCollection auditDataDeleter = new AuditDataCoreCollection();
                // first fetch it, then delete all entities from the collection, as the audit data is in an inheritance hierarchy of TargetPerEntity which can't
                // be deleted directly from the db.
                trans.Add(auditDataDeleter);
                auditDataDeleter.GetMulti(AuditDataCoreFields.UserID == userID);
                auditDataDeleter.DeleteMulti();

                // set IP bans set by this user to userid 0
                IPBanEntity ipbanUpdater = new IPBanEntity();
                ipbanUpdater.IPBanSetByUserID = 0;
                IPBanCollection ipBans = new IPBanCollection();
                trans.Add(ipBans);
                ipBans.UpdateMulti(ipbanUpdater, (IPBanFields.IPBanSetByUserID == userID));

                // delete threadsubscriptions
                ThreadSubscriptionCollection threadSubscriptionsDeleter = new ThreadSubscriptionCollection();
                trans.Add(threadSubscriptionsDeleter);
                threadSubscriptionsDeleter.DeleteMulti(ThreadSubscriptionFields.UserID == userID);

                // remove supportqueuethread claims
                SupportQueueThreadCollection supportQueueThreads = new SupportQueueThreadCollection();
                trans.Add(supportQueueThreads);
                supportQueueThreads.DeleteMulti(SupportQueueThreadFields.ClaimedByUserID == userID);

                // set all placed in queue references to userid 0, so the threads stay in the queues.
                SupportQueueThreadEntity supportQueueThreadUpdater = new SupportQueueThreadEntity();
                supportQueueThreadUpdater.PlacedInQueueByUserID=0;
                supportQueueThreads.UpdateMulti(supportQueueThreadUpdater, (SupportQueueThreadFields.PlacedInQueueByUserID == userID));

                // now delete the actual user entity
                trans.Add(toDelete);
                toDelete.Delete();

                // all done
                trans.Commit();
                return true;
            }
            catch
            {
                trans.Rollback();
                throw;
            }
            finally
            {
                trans.Dispose();
            }
        }
Exemple #8
0
        /// <summary>
        /// Deletes the user with the ID passed in. Will reset all posts made by the user to the userid 0.
        /// </summary>
        /// <param name="userID">The user ID.</param>
        /// <remarks>Can't delete user 0</remarks>
        /// <returns>true if succeeded, false otherwise</returns>
        public static bool DeleteUser(int userID)
        {
            if (userID == 0)
            {
                // can't delete the Anonymous coward user.
                return(false);
            }

            UserEntity toDelete = UserGuiHelper.GetUser(userID);

            if (toDelete == null)
            {
                // user doesn't exist
                return(false);
            }

            // all actions have to take place in a transaction.
            Transaction trans = new Transaction(IsolationLevel.ReadCommitted, "DeleteUser");

            try
            {
                // we'll first update all PostedByUserId fields of all messages which are posted by the user to delete.
                MessageEntity messageUpdater = new MessageEntity();
                messageUpdater.PostedByUserID = 0;      // reset to AC.
                MessageCollection messages = new MessageCollection();
                trans.Add(messages);                    // add to the transaction
                // update all entities directly in the DB, which match the following filter and update them with the new values set in messageUpdater.
                messages.UpdateMulti(messageUpdater, (MessageFields.PostedByUserID == userID));

                // set the startuser of threads started by this user to 0
                ThreadEntity threadUpdater = new ThreadEntity();
                threadUpdater.StartedByUserID = 0;
                ThreadCollection threads = new ThreadCollection();
                trans.Add(threads);
                threads.UpdateMulti(threadUpdater, (ThreadFields.StartedByUserID == userID));

                // remove the user from the UserRoles set, as the user shouldn't be in any roles.
                RoleUserCollection roleUsersDeleter = new RoleUserCollection();
                trans.Add(roleUsersDeleter);
                // delete all entities directly from the DB which match the following filter.
                roleUsersDeleter.DeleteMulti(RoleUserFields.UserID == userID);

                // delete all bookmarks of user
                BookmarkCollection bookmarkDeleter = new BookmarkCollection();
                trans.Add(bookmarkDeleter);
                // delete all bookmarks for this user directly from the DB using the following filter.
                bookmarkDeleter.DeleteMulti(BookmarkFields.UserID == userID);

                // delete all audit data
                AuditDataCoreCollection auditDataDeleter = new AuditDataCoreCollection();
                // first fetch it, then delete all entities from the collection, as the audit data is in an inheritance hierarchy of TargetPerEntity which can't
                // be deleted directly from the db.
                trans.Add(auditDataDeleter);
                auditDataDeleter.GetMulti(AuditDataCoreFields.UserID == userID);
                auditDataDeleter.DeleteMulti();

                // set IP bans set by this user to userid 0
                IPBanEntity ipbanUpdater = new IPBanEntity();
                ipbanUpdater.IPBanSetByUserID = 0;
                IPBanCollection ipBans = new IPBanCollection();
                trans.Add(ipBans);
                ipBans.UpdateMulti(ipbanUpdater, (IPBanFields.IPBanSetByUserID == userID));

                // delete threadsubscriptions
                ThreadSubscriptionCollection threadSubscriptionsDeleter = new ThreadSubscriptionCollection();
                trans.Add(threadSubscriptionsDeleter);
                threadSubscriptionsDeleter.DeleteMulti(ThreadSubscriptionFields.UserID == userID);

                // remove supportqueuethread claims
                SupportQueueThreadCollection supportQueueThreads = new SupportQueueThreadCollection();
                trans.Add(supportQueueThreads);
                supportQueueThreads.DeleteMulti(SupportQueueThreadFields.ClaimedByUserID == userID);

                // set all placed in queue references to userid 0, so the threads stay in the queues.
                SupportQueueThreadEntity supportQueueThreadUpdater = new SupportQueueThreadEntity();
                supportQueueThreadUpdater.PlacedInQueueByUserID = 0;
                supportQueueThreads.UpdateMulti(supportQueueThreadUpdater, (SupportQueueThreadFields.PlacedInQueueByUserID == userID));

                // now delete the actual user entity
                trans.Add(toDelete);
                toDelete.Delete();

                // all done
                trans.Commit();
                return(true);
            }
            catch
            {
                trans.Rollback();
                throw;
            }
            finally
            {
                trans.Dispose();
            }
        }