📄 commondataprovider.cs
字号:
//------------------------------------------------------------------------------
// <copyright company="Telligent Systems">
// Copyright (c) Telligent Systems Corporation. All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Data;
using System.Diagnostics;
using System.Web.Mail;
using System.Xml;
using CommunityServer.Configuration;
using Microsoft.ScalableHosting.Profile;
using Microsoft.ScalableHosting.Security;
namespace CommunityServer.Components {
/// <summary>
/// The DataProvider class contains a single method, Instance(), which returns an instance of the
/// user-specified data provider class.
/// </summary>
/// <remarks> The data provider class must inherit the CommonDataProvider
/// interface.</remarks>
public abstract class CommonDataProvider {
public static readonly string CommonDataProviderName = "CommonDataProvider";
#region Instance
private static CommonDataProvider _defaultInstance = null;
static CommonDataProvider()
{
CreateDefaultCommonProvider();
}
/// <summary>
/// Returns an instance of the user-specified data provider class.
/// </summary>
/// <returns>An instance of the user-specified data provider class. This class must inherit the
/// CommonDataProvider interface.</returns>
public static CommonDataProvider Instance() {
return _defaultInstance;
}
public static CommonDataProvider Instance (Provider dataProvider)
{
CommonDataProvider fdp = CSCache.Get(dataProvider.Name) as CommonDataProvider;
if(fdp == null)
{
fdp = DataProviders.Invoke(dataProvider) as CommonDataProvider;
CSCache.Max(dataProvider.Name,fdp);
}
return fdp;
}
/// <summary>
/// Creates the Default CommonDataProvider
/// </summary>
private static void CreateDefaultCommonProvider()
{
// Get the names of the providers
//
CSConfiguration config = CSConfiguration.GetConfig();
// Read the configuration specific information
// for this provider
//
Provider sqlForumsProvider = (Provider) config.Providers[CommonDataProviderName];
// Read the connection string for this provider
//
_defaultInstance = DataProviders.CreateInstance(sqlForumsProvider) as CommonDataProvider;
}
#endregion
#region Site Settings
public abstract void CalculateSiteStatistics(int settingsID, int updateWindow);
public abstract SiteStatistics LoadSiteStatistics(int settingsID);
public abstract SiteSettings LoadSiteSettings(string application);
public abstract ArrayList LoadAllSiteSettings ();
public abstract void SaveSiteSettings(SiteSettings siteSettings);
public abstract Hashtable GetSiteUrls();
public static SiteSettings PopulateSiteSettingsFromIDataReader(IDataReader dr)
{
SiteSettings settings = null;
try {
settings = Serializer.ConvertToObject(dr["SettingsXML"] as string,typeof(SiteSettings)) as SiteSettings;
//When new sites/communities are created, it is very likely they will not have any XML history.
//Serializer.ConvertToObject will return null if no XML is present.
if(settings == null)
settings = new SiteSettings();
} catch (Exception exception) {
if (exception.InnerException is XmlException) {
Debug.WriteLine("Critical Error: SiteSettings serialized XML is invalid");
CSException csException = new CSException(CSExceptionType.SiteSettingsInvalidXML);
throw csException;
} else {
throw exception;
}
}
// read addition data
settings.SettingsID = (int) dr["SettingsID"];
settings.SiteDomain = dr["SiteUrl"] as string;
settings.ForumsDisabled = (bool)dr["Disabled"];
settings.SiteKey = (Guid)dr["SettingsKey"];
settings.ApplicationName = dr["ApplicationName"] as string;
return settings;
}
#endregion
#region Post
public abstract bool IsThreadTracked(int threadID, int userID);
public abstract void AddPostAttachment(Post post, PostAttachment attachment);
public abstract void DeletePostAttachment(int postID);
public abstract PostAttachment GetPostAttachment (int postID);
public abstract void ReverseThreadTracking(int userID, int PostID);
public abstract EmailSubscriptionType GetSectionSubscriptionType(int SectionID, int UserID);
public abstract void SetSectionSubscriptionType(int SectionID, int UserID, EmailSubscriptionType subType);
public abstract void RemoveThreadTracking(int SectionID, int UserID);
#endregion
#region Ratings
public abstract void ThreadRate (int threadID, int userID, int rating);
public abstract ArrayList ThreadRatings (int threadID);
#endregion
#region Referrals
public abstract void SaveReferralList(ArrayList referrals);
public abstract ReferralSet GetReferrals(Referral r, int pageSize, int pageIndex);
#endregion
public abstract void SaveViewList(Hashtable views);
#region Messages
public abstract ArrayList GetMessages(int messageID);
public abstract void CreateUpdateDeleteMessage(Message message, DataProviderAction action);
#endregion
#region Emails
public abstract Hashtable GetEmailsTrackingThread(int postID);
public abstract Hashtable GetEmailsTrackingSectionByPostID(int postID);
public abstract void EmailEnqueue (MailMessage email);
public abstract void EmailDelete (Guid emailID);
public abstract void EmailFailure (ArrayList list, int failureInterval, int maxNumberOfTries);
public abstract ArrayList EmailDequeue (int settingsID);
// *********************************************************************
//
// PopulateEmailFromIDataReader
//
/// <summary>
/// This private method accepts a datareader and attempts to create and
/// populate a EmailTempalte class instance which is returned to the caller.
/// </summary>
//
// ********************************************************************/
public static EmailTemplate PopulateEmailFromIDataReader(IDataReader reader) {
EmailTemplate email = new EmailTemplate();
email.EmailID = (Guid) reader["EmailID"];
email.Priority = (MailPriority) (int) reader["emailPriority"];
email.BodyFormat = (MailFormat) (int) reader["emailBodyFormat"];
email.Subject = (string) reader["emailSubject"];
email.To = (string) reader["emailTo"];
email.From = (string) reader["emailFrom"];
email.Body = (string) reader["emailBody"];
email.NumberOfTries = (int) reader["numberOfTries"];
if (reader["emailCc"] != DBNull.Value)
email.Cc = (string) reader["emailCc"];
if (reader["emailBcc"] != DBNull.Value)
email.Bcc = (string) reader["emailBcc"];
return email;
}
#endregion
#region Sections
public abstract int CreateUpdateDeleteSection(Section section, DataProviderAction action);
public abstract void ChangeSectionSortOrder(int forumID, bool moveUp);
public abstract HybridDictionary GetSectionsRead(int userID);
#endregion
#region Permissions
public abstract void CreateUpdateDeletePermission(PermissionBase p, DataProviderAction action);
public static void PopulatePermissionFromIDataReader( PermissionBase p, IDataReader reader) {
p.Name = (string) reader["RoleName"];
p.RoleID = (Guid) reader["RoleID"];
p.SectionID = (int) reader["SectionID"];
p.Implied = (bool)reader["Implied"];
p.AllowMask = (Permission) (long)reader["AllowMask"];
p.DenyMask = (Permission) (long)reader["DenyMask"];
}
#endregion
#region Groups
public abstract int CreateUpdateDeleteGroup(Group group, DataProviderAction action);
public abstract void ChangeGroupSortOrder(int forumGroupID, bool moveUp);
public abstract Hashtable GetGroups(ApplicationType appType, bool requireModeration);
public static Group PopulateForumGroupFromIDataReader(IDataReader dr) {
Group forumGroup = new Group();
forumGroup.GroupID = (int) dr["GroupID"];
forumGroup.Name = (string) dr["Name"];
forumGroup.NewsgroupName = (string) dr["NewsgroupName"];
forumGroup.SortOrder = Convert.ToInt32(dr["SortOrder"]);
forumGroup.ApplicationType = (ApplicationType) (Int16) dr["ApplicationType"];
return forumGroup;
}
#endregion
#region User
public abstract User GetAnonymousUser( int settingsID );
public abstract Avatar GetUserAvatar (int userID);
// 增加IP纪录和根据昵称取用户资料的方法
public abstract User GetUser(int userID, string username, string nickname, bool isOnline, bool isEditable, string lastAction, string ipAddress);
public abstract User CreateUpdateDeleteUser(User user, DataProviderAction action, out CreateUserStatus status);
public abstract int UpdateAnonymousUsers(Hashtable anonymousUserList, int settingsID);
public abstract int GetUserIDByEmail(string emailAddress);
public abstract int GetUserIDByAppUserToken(string appUserToken);
public abstract Hashtable WhoIsOnline(int pastMinutes);
public abstract void UserChangePasswordAnswer(int userID, string newQuestion, string newAnswer);
public abstract void ToggleOptions(string username, bool hideReadThreads, ViewOptions viewOptions);
public abstract UserSet GetUsers(int pageIndex, int pageSize, SortUsersBy sortBy, SortOrder sortOrder, string usernameFilter, bool includeEmailInFilter, UserAccountStatus accountStatus, bool returnRecordCount, bool includeHiddenUsers, bool returnModerationCounters);
public abstract void ToggleUserForceLogin(User user);
public abstract bool UpgradePassword(string username, string password);
public abstract bool ValidateUserPasswordAnswer(object UserId, string answer);
#endregion
#region Search
//public abstract SearchResultSet GetSearchResults(int pageIndex, int pageSize, int userID, string[] forumsToSearch, string[] usersToSearch, string[] andTerms, string[] orTerms);
public abstract Hashtable GetSearchIgnoreWords(int settingsID);
public abstract void CreateDeleteSearchIgnoreWords (ArrayList words, DataProviderAction action);
public abstract void InsertIntoSearchBarrel (Hashtable words, Post post, int settingsID);
public abstract PostSet SearchReindexPosts (int setsize, int settingsID);
#endregion
#region Roles
public abstract Hashtable GetRoles(int userID);
public abstract UserSet UsersInRole(int pageIndex, int pageSize, SortUsersBy sortBy, SortOrder sortOrder, Guid roleID, UserAccountStatus accountStatus, bool returnRecordCount);
public abstract Role GetRole(Guid roleID, string RoleName);
// public abstract void AddUserToRole(int userID, Guid roleID);s
// public abstract void RemoveUserFromRole(int userID, Guid roleID);
public abstract void AddForumToRole(int forumID, Guid roleID);
public abstract void RemoveForumFromRole(int forumID, Guid roleID);
public abstract Guid CreateUpdateDeleteRole(Role role, string applicationName, DataProviderAction action);
#endregion
#region Vote
public abstract void Vote(int postID, int userID, string selection);
public abstract PollSummary GetPoll(PollSummary summary);
#endregion
#region Exceptions and Tracing
public abstract void LogException (CSException exception, int SettingsID);
public void LogException(CSException exception)
{
LogException(exception,CSContext.Current.SiteSettings.SettingsID);
}
public abstract ArrayList GetExceptions (int exceptionType, int minFrequency);
public abstract void DeleteExceptions( int settingsID, ArrayList deleteList );
public static CSException PopulateForumExceptionFromIDataReader (IDataReader reader) {
CSException exception = new CSException( (CSExceptionType) (int) reader["Category"], (string) reader["ExceptionMessage"]);
exception.LoggedStackTrace = (string) reader["Exception"];
exception.IPAddress = (string) reader["IPAddress"];
exception.UserAgent = (string) reader["UserAgent"];
exception.HttpReferrer = (string) reader["HttpReferrer"];
exception.HttpVerb = (string) reader["HttpVerb"];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -