📄 dbhistorymanager.cs
字号:
builder.AppendLine("Time DATETIME)");
builder.AppendLine("");
this._dbHelper.ExecuteNonQuery(builder.ToString(), null);
}
if (!objects.Contains("Message"))
{
builder = new StringBuilder();
builder.AppendLine("CREATE TABLE Message(");
builder.AppendLine("MessageID VARCHAR(64),");
builder.AppendLine("ReceiverUri VARCHAR(256),");
builder.AppendLine("ReceiverName VARCHAR(256),");
builder.AppendLine("Status INTEGER,");
builder.AppendLine("PRIMARY KEY (MessageID, ReceiverUri))");
builder.AppendLine("");
this._dbHelper.ExecuteNonQuery(builder.ToString(), null);
}
if (!objects.Contains("vMessage"))
{
builder = new StringBuilder();
builder.AppendLine("CREATE VIEW vMessage AS ");
builder.AppendLine("SELECT MessageBody.ID AS ID, MessageBody.SenderUri AS SenderUri , MessageBody.SenderName AS SenderName , Message.ReceiverUri AS ReceiverUri , Message.ReceiverName AS ReceiverName , MessageBody.Body AS Body , MessageBody.Extend AS Extend, ");
builder.AppendLine("MessageBody.MessageType AS MessageType , Message.Status AS Status , MessageBody.[Time] AS [Time] , P2.[Type] AS SenderType , P1.[Type] AS ReceiverType");
builder.AppendLine("FROM Message INNER JOIN ");
builder.AppendLine("MessageBody ON Message.MessageID = MessageBody.ID ");
builder.AppendLine("INNER JOIN Player P1 ON Message.ReceiverUri = P1.Uri ");
builder.AppendLine("INNER JOIN Player P2 ON MessageBody.SenderUri = P2.Uri ");
builder.AppendLine("");
this._dbHelper.ExecuteNonQuery(builder.ToString(), null);
}
if (!objects.Contains("vPlayerRef"))
{
builder = new StringBuilder();
builder.AppendLine("CREATE VIEW vPlayerRef AS ");
builder.AppendLine("SELECT COUNT(MessageBody.SenderUri) + COUNT(Message.ReceiverUri) AS RefCount, Player.Uri AS Uri ");
builder.AppendLine("FROM Player LEFT OUTER JOIN MessageBody ON Player.Uri = MessageBody.SenderUri LEFT OUTER JOIN Message ON Player.Uri = Message.ReceiverUri ");
builder.AppendLine("GROUP BY Player.Uri");
builder.AppendLine("");
this._dbHelper.ExecuteNonQuery(builder.ToString(), null);
}
Thread thread = new Thread(new ThreadStart(this.MigationMessageHistory));
thread.Priority = ThreadPriority.BelowNormal;
thread.Start();
}
public IList<TMessage> LoadMessages<TMessage>(MessageType type, MessageStatus status) where TMessage: IMessage
{
try
{
SQLiteDataReader reader = this._dbHelper.ExecuteReader("SELECT * FROM [vMessage] WHERE ([MessageType] = [MessageType] & @Type) AND ([Status] = @Status) ORDER BY [Time] DESC", new object[] { (int) type, (int) status });
return this.ParseMessage<TMessage>(reader);
}
catch
{
return null;
}
}
public IList<TMessage> LoadMessages<TMessage>(MessageType type, int page, out int msgCount) where TMessage: IMessage
{
try
{
msgCount = this._dbHelper.ExecuteScalar("SELECT COUNT(DISTINCT ID) AS MessageCount FROM [vMessage] WHERE [MessageType] = [MessageType] & @Type", new object[] { (int) type });
page = this.GetCurrentPage(page, msgCount);
SQLiteDataReader reader = this._dbHelper.ExecuteReader("SELECT * FROM [vMessage] WHERE [ID] IN (SELECT [ID] FROM [vMessage] WHERE [MessageType] = [MessageType] & @Type GROUP BY [ID] ORDER BY [Time] DESC LIMIT @Offset,@Count) ORDER BY [Time] DESC", new object[] { (int) type, page * this.MessagesPerPage, this.MessagesPerPage });
return this.ParseMessage<TMessage>(reader);
}
catch
{
msgCount = 0;
return null;
}
}
public IList<TMessage> LoadMessages<TMessage>(IMessage message, out Player selectPlayer, out int currentPage, out int msgCount) where TMessage: IMessage
{
currentPage = 0;
msgCount = 0;
selectPlayer = this._currentPlayer;
try
{
selectPlayer = message.Sender;
List<Player>.Enumerator enumerator = message.Receivers.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
Player player = enumerator.get_Current();
if (player.Type == PlayerType.Group)
{
selectPlayer = player;
goto Label_0074;
}
if (((selectPlayer.Type == PlayerType.User) && (player.Type != PlayerType.User)) && (player.Type != PlayerType.System))
{
selectPlayer = player;
}
}
}
finally
{
enumerator.Dispose();
}
Label_0074:;
int num = this._dbHelper.ExecuteScalar("SELECT COUNT(DISTINCT ID) AS MessageCount FROM [vMessage] WHERE ([SenderUri] = @Uri OR [ReceiverUri] = @Uri) AND [Time] > @Time", new object[] { selectPlayer.Uri, message.Time });
currentPage = num / this.MessagesPerPage;
return this.LoadMessages<TMessage>(selectPlayer, MessageType.All, currentPage, out msgCount);
}
catch
{
return null;
}
}
public IList<TMessage> LoadMessages<TMessage>(Player player, MessageType type, int page, out int msgCount) where TMessage: IMessage
{
try
{
if (player.Uri != this.CurrentPlayer.Uri)
{
if (player.Type == PlayerType.Group)
{
msgCount = this._dbHelper.ExecuteScalar("SELECT COUNT(DISTINCT ID) AS MessageCount FROM [vMessage] WHERE [ReceiverUri] = @Uri AND [ReceiverType] = @PlayerType AND [MessageType] = [MessageType] & @Type", new object[] { player.Uri, (int) player.Type, (int) type });
page = this.GetCurrentPage(page, msgCount);
SQLiteDataReader reader = this._dbHelper.ExecuteReader("SELECT * FROM [vMessage] WHERE [ID] IN (SELECT [ID] FROM [vMessage] WHERE [ReceiverUri] = @Uri AND [ReceiverType] = @PlayerType AND [MessageType] = [MessageType] & @Type GROUP BY [ID] ORDER BY [Time] DESC LIMIT @Offset,@Count) ORDER BY [Time] DESC", new object[] { player.Uri, (int) player.Type, (int) type, page * this.MessagesPerPage, this.MessagesPerPage });
return this.ParseMessage<TMessage>(reader);
}
msgCount = this._dbHelper.ExecuteScalar("SELECT COUNT(DISTINCT ID) AS MessageCount FROM [vMessage] WHERE ([SenderUri] = @Uri OR [ReceiverUri] = @Uri) AND [ReceiverType] <> @PlayerType AND [MessageType] = [MessageType] & @Type", new object[] { player.Uri, 8, (int) type });
page = this.GetCurrentPage(page, msgCount);
SQLiteDataReader reader2 = this._dbHelper.ExecuteReader("SELECT * FROM [vMessage] WHERE [ID] IN (SELECT [ID] FROM [vMessage] WHERE ([SenderUri] = @Uri OR [ReceiverUri] = @Uri) AND [ReceiverType] <> @PlayerType AND [MessageType] = [MessageType] & @Type GROUP BY [ID] ORDER BY [Time] DESC LIMIT @Offset,@Count) ORDER BY [Time] DESC", new object[] { player.Uri, 8, (int) type, page * this.MessagesPerPage, this.MessagesPerPage });
return this.ParseMessage<TMessage>(reader2);
}
msgCount = this._dbHelper.ExecuteScalar("SELECT COUNT(DISTINCT ID) AS MessageCount FROM [vMessage] WHERE ([SenderUri] = @Uri AND [ReceiverUri] = @Uri) AND [MessageType] = [MessageType] & @Type", new object[] { player.Uri, (int) type });
page = this.GetCurrentPage(page, msgCount);
SQLiteDataReader reader3 = this._dbHelper.ExecuteReader("SELECT * FROM [vMessage] WHERE [ID] IN (SELECT [ID] FROM [vMessage] WHERE ([SenderUri] = @Uri AND [ReceiverUri] = @Uri) AND [MessageType] = [MessageType] & @Type GROUP BY [ID] ORDER BY [Time] DESC LIMIT @Offset,@Count) ORDER BY [Time] DESC", new object[] { player.Uri, (int) type, page * this.MessagesPerPage, this.MessagesPerPage });
return this.ParseMessage<TMessage>(reader3);
}
catch
{
msgCount = 0;
return null;
}
}
public IList<Player> LoadPlayer()
{
IList<Player> list2;
try
{
using (SQLiteDataReader reader = this._dbHelper.ExecuteReader("SELECT * FROM [Player] WHERE (Uri IN (SELECT DISTINCT SenderUri FROM vMessage WHERE (ReceiverType <> 8))) OR (Uri IN (SELECT DISTINCT ReceiverUri FROM vMessage vMessage_1)) ORDER BY [Name]", null))
{
List<Player> list = new List<Player>();
while (reader.Read())
{
string uri = reader["Uri"].ToString();
string friendlyName = reader["Name"].ToString();
PlayerType type = (PlayerType) Enum.Parse(typeof(PlayerType), reader["Type"].ToString());
Player player = new Player(uri, friendlyName, type);
list.Add(player);
}
reader.Close();
list2 = list;
}
}
catch
{
list2 = null;
}
return list2;
}
public IList<TMessage> LoadRecentMessages<TMessage>(string uri, int count) where TMessage: IMessage
{
try
{
SQLiteDataReader reader = this._dbHelper.ExecuteReader("SELECT * FROM [vMessage] WHERE [ID] IN (SELECT [ID] FROM [vMessage] WHERE (([SenderUri] = @Uri AND [ReceiverUri] = @Me) OR ([SenderUri] = @Me AND [ReceiverUri] = @Uri)) AND ([MessageType] = [MessageType] & @Type) GROUP BY [ID] ORDER BY [Time] DESC LIMIT 0,@Count) ORDER BY [Time] DESC", new object[] { uri, this.CurrentPlayer.Uri, 15, count });
return this.ParseMessage<TMessage>(reader);
}
catch
{
return null;
}
}
private void MigationMessageHistory()
{
string path = this.CurrentUser.PersistentManager.BaseDirForHistory;
if (Directory.Exists(path))
{
foreach (string text2 in Directory.GetFiles(path))
{
bool flag = true;
FileInfo info = new FileInfo(text2);
string name = info.Name;
string sidOrMobileNo = string.Empty;
string uriString = string.Empty;
string friendlyName = string.Empty;
string mobileNoString = string.Empty;
try
{
int index = name.IndexOf("_");
if (index != -1)
{
sidOrMobileNo = name.Substring(index + 1);
}
else
{
sidOrMobileNo = name;
}
sidOrMobileNo = sidOrMobileNo.Substring(0, sidOrMobileNo.Length - 4);
if ((sidOrMobileNo != "10000") && (sidOrMobileNo != "1000"))
{
Contact contact = null;
try
{
contact = this.CurrentUser.ContactList.FindContact(true, sidOrMobileNo);
}
catch
{
}
if (contact == null)
{
this.CurrentUser.GetUri(sidOrMobileNo, out uriString, out mobileNoString);
friendlyName = sidOrMobileNo;
}
else
{
uriString = contact.Uri.Raw;
friendlyName = contact.DisplayName;
}
Player currentPlayer = null;
if (uriString == this.CurrentPlayer.Uri)
{
currentPlayer = this.CurrentPlayer;
}
else
{
currentPlayer = new Player(uriString, friendlyName, PlayerType.Contact);
}
XmlDocument document = new XmlDocument();
document.Load(text2);
foreach (XmlNode node in document.DocumentElement.ChildNodes)
{
InstantMessage msg = this.GetMessage(node, currentPlayer);
if (!this.SaveMessage(msg))
{
flag = false;
}
}
if (flag)
{
File.Delete(text2);
}
}
else
{
XmlDocument document2 = new XmlDocument();
document2.Load(text2);
foreach (XmlNode node2 in document2.DocumentElement.ChildNodes)
{
SystemMessage message = this.GetMessage(node2);
if (!this.SaveMessage(message))
{
flag = false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -