📄 dbhistorymanager.cs
字号:
if (flag)
{
File.Delete(text2);
}
}
}
catch
{
}
}
}
}
protected IList<TMessage> ParseMessage<TMessage>(SQLiteDataReader reader) where TMessage: IMessage
{
using (SQLiteDataReader reader2 = reader)
{
Dictionary<string, int> dictionary = new Dictionary<string, int>();
IList<TMessage> list = new List<TMessage>();
int num = 0;
while (reader.Read())
{
DateTime time = (DateTime) reader["Time"];
string text = reader["ID"] as string;
if (text != null)
{
TMessage local;
if (!dictionary.ContainsKey(text))
{
local = Activator.CreateInstance<TMessage>();
local.ID = reader["ID"] as string;
Player player = new Player(reader["SenderUri"].ToString(), reader["SenderName"].ToString(), (PlayerType) Enum.Parse(typeof(PlayerType), reader["SenderType"].ToString()));
local.Sender = player;
local.Body = reader["Body"] as string;
local.Type = (MessageType) Enum.Parse(typeof(MessageType), reader["MessageType"].ToString());
local.Time = time;
local.Extend = reader["Extend"] as string;
list.Insert(num, local);
dictionary.Add(text, num);
num++;
}
else
{
local = list.get_Item(dictionary.get_Item(text));
}
Player player2 = new Player(reader["ReceiverUri"] as string, reader["ReceiverName"] as string, (PlayerType) Enum.Parse(typeof(PlayerType), reader["ReceiverType"].ToString()), (MessageStatus) Enum.Parse(typeof(MessageStatus), reader["Status"].ToString()));
local.Receivers.Add(player2);
}
}
reader.Close();
return list;
}
}
private string ParseSearchString(string searchString)
{
string text = searchString;
text = text.Replace("/", "//").Replace("%", "/%").Replace("_", "/_");
return string.Format("%{0}%", text);
}
public bool SaveMessage(IMessage msg)
{
try
{
this._dbHelper.JoinTransaction();
if (this.ExistMessage(msg))
{
List<Player>.Enumerator enumerator = msg.Receivers.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
Player player = enumerator.get_Current();
if (this._dbHelper.ExecuteScalar("SELECT COUNT(*) FROM [Message] WHERE MessageID = @ID AND [ReceiverUri] = @ReveiverUri", new object[] { msg.ID, player.Uri }) == 0)
{
this.SavePlayer(player);
if (this._dbHelper.ExecuteNonQuery("INSERT INTO [Message] ([MessageID], [ReceiverUri], [ReceiverName], [Status]) VALUES (@MessageID, @ReceiverUri, @ReceiverName, @Status)", new object[] { msg.ID, player.Uri, player.Name, (int) player.Status }) != 1)
{
throw new Exception();
}
}
else if (this._dbHelper.ExecuteNonQuery("UPDATE [Message] SET [Status] = @Status WHERE [MessageID] = @MessageID AND [ReceiverUri] = @ReveiverUri", new object[] { (int) player.Status, msg.ID, player.Uri }) != 1)
{
throw new Exception();
}
}
}
finally
{
enumerator.Dispose();
}
}
else
{
this.SavePlayer(msg.Sender);
if (this._dbHelper.ExecuteNonQuery("INSERT INTO [MessageBody] ([ID], [SenderUri], [SenderName], [Body], [Extend], [MessageType], [Time]) VALUES (@ID, @SenderUri, @SenderName, @Body, @Extend, @MessageType, @Time)", new object[] { msg.ID, msg.Sender.Uri, msg.Sender.Name, msg.Body, msg.Extend, (int) msg.Type, msg.Time }) != 1)
{
throw new Exception();
}
List<Player>.Enumerator enumerator2 = msg.Receivers.GetEnumerator();
try
{
while (enumerator2.MoveNext())
{
Player player2 = enumerator2.get_Current();
this.SavePlayer(player2);
if (this._dbHelper.ExecuteNonQuery("INSERT INTO [Message] ([MessageID], [ReceiverUri], [ReceiverName], [Status]) VALUES (@MessageID, @ReceiverUri, @ReceiverName, @Status)", new object[] { msg.ID, player2.Uri, player2.Name, (int) player2.Status }) != 1)
{
throw new Exception();
}
}
}
finally
{
enumerator2.Dispose();
}
}
this._dbHelper.CommitTransaction();
return true;
}
catch
{
this._dbHelper.RollbackTransaction();
return false;
}
}
protected void SavePlayer(Player player)
{
if (!this.ExistPlayer(player))
{
if (this._dbHelper.ExecuteNonQuery("INSERT INTO [Player] ([Uri], [Name], [Type]) VALUES (@Uri, @Name, @Type)", new object[] { player.Uri, player.Name, (int) player.Type }) != 1)
{
throw new Exception();
}
}
else if (!string.IsNullOrEmpty(player.Name))
{
this._dbHelper.ExecuteNonQuery("UPDATE [Player] SET [Name] = @Name WHERE [Uri] = @Uri", new object[] { player.Name, player.Uri });
}
}
public IList<TMessage> SearchMessages<TMessage>(MessageType messageType, string searchString, int page, out int msgCount) where TMessage: IMessage
{
try
{
searchString = this.ParseSearchString(searchString);
msgCount = this._dbHelper.ExecuteScalar("SELECT COUNT(DISTINCT ID) AS MessageCount FROM [vMessage] WHERE ([MessageType] = [MessageType] & @Type) AND ([Body] LIKE @Search ESCAPE '/')", new object[] { (int) messageType, searchString });
page = this.GetCurrentPage(page, msgCount);
SQLiteDataReader reader = this._dbHelper.ExecuteReader("SELECT * FROM [vMessage] WHERE [ID] IN (SELECT [ID] FROM [vMessage] WHERE ([MessageType] = [MessageType] & @Type) AND ([Body] LIKE @Search ESCAPE '/') GROUP BY [ID] ORDER BY [Time] DESC LIMIT @Offset,@Count) ORDER BY [Time] DESC", new object[] { (int) messageType, searchString, page * this.MessagesPerPage, this.MessagesPerPage });
return this.ParseMessage<TMessage>(reader);
}
catch
{
msgCount = 0;
return null;
}
}
public IList<TMessage> SearchMessages<TMessage>(PlayerType playerType, string searchString, int page, out int msgCount) where TMessage: IMessage
{
try
{
searchString = this.ParseSearchString(searchString);
if (playerType == PlayerType.Group)
{
msgCount = this._dbHelper.ExecuteScalar("SELECT COUNT(DISTINCT ID) AS MessageCount FROM [vMessage] WHERE ([SenderType] = @Type OR [ReceiverType] = @Type) AND ([Body] LIKE @Search ESCAPE '/')", new object[] { (int) playerType, searchString });
page = this.GetCurrentPage(page, msgCount);
SQLiteDataReader reader = this._dbHelper.ExecuteReader("SELECT * FROM [vMessage] WHERE [ID] IN (SELECT [ID] FROM [vMessage] WHERE ([SenderType] = @Type OR [ReceiverType] = @Type) AND ([Body] LIKE @Search ESCAPE '/') GROUP BY [ID] ORDER BY [Time] DESC LIMIT @Offset,@Count) ORDER BY [Time] DESC", new object[] { (int) playerType, searchString, page * this.MessagesPerPage, this.MessagesPerPage });
return this.ParseMessage<TMessage>(reader);
}
msgCount = this._dbHelper.ExecuteScalar("SELECT COUNT(DISTINCT ID) AS MessageCount FROM [vMessage] WHERE ([SenderType] = @Type OR [ReceiverType] = @Type) AND ([SenderType] != @GroupType AND [ReceiverType] != @GroupType) AND ([Body] LIKE @Search ESCAPE '/')", new object[] { (int) playerType, 8, searchString });
page = this.GetCurrentPage(page, msgCount);
SQLiteDataReader reader2 = this._dbHelper.ExecuteReader("SELECT * FROM [vMessage] WHERE [ID] IN (SELECT [ID] FROM [vMessage] WHERE ([SenderType] = @Type OR [ReceiverType] = @Type) AND ([SenderType] != @GroupType AND [ReceiverType] != @GroupType) AND ([Body] LIKE @Search ESCAPE '/') GROUP BY [ID] ORDER BY [Time] DESC LIMIT @Offset,@Count) ORDER BY [Time] DESC", new object[] { (int) playerType, 8, searchString, page * this.MessagesPerPage, this.MessagesPerPage });
return this.ParseMessage<TMessage>(reader2);
}
catch
{
msgCount = 0;
return null;
}
}
public IList<TMessage> SearchMessages<TMessage>(string uri, string searchString, int page, out int msgCount) where TMessage: IMessage
{
try
{
searchString = this.ParseSearchString(searchString);
if (uri != this._currentPlayer.Uri)
{
msgCount = this._dbHelper.ExecuteScalar("SELECT COUNT(DISTINCT ID) AS MessageCount FROM [vMessage] WHERE ([SenderUri] = @Uri OR [ReceiverUri] = @Uri) AND ([Body] LIKE @Search ESCAPE '/')", new object[] { uri, searchString });
page = this.GetCurrentPage(page, msgCount);
SQLiteDataReader reader = this._dbHelper.ExecuteReader("SELECT * FROM [vMessage] WHERE [ID] IN (SELECT [ID] FROM [vMessage] WHERE ([SenderUri] = @Uri OR [ReceiverUri] = @Uri) AND ([Body] LIKE @Search ESCAPE '/') GROUP BY [ID] ORDER BY [Time] DESC LIMIT @Offset,@Count) ORDER BY [Time] DESC", new object[] { uri, searchString, 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 AND [ReceiverUri] = @Uri) AND ([Body] LIKE @Search ESCAPE '/')", new object[] { uri, searchString });
page = this.GetCurrentPage(page, msgCount);
SQLiteDataReader reader2 = this._dbHelper.ExecuteReader("SELECT * FROM [vMessage] WHERE [ID] IN (SELECT [ID] FROM [vMessage] WHERE ([SenderUri] = @Uri AND [ReceiverUri] = @Uri) AND ([Body] LIKE @Search ESCAPE '/') GROUP BY [ID] ORDER BY [Time] DESC LIMIT @Offset,@Count) ORDER BY [Time] DESC", new object[] { uri, searchString, page * this.MessagesPerPage, this.MessagesPerPage });
return this.ParseMessage<TMessage>(reader2);
}
catch
{
msgCount = 0;
return null;
}
}
public void UpdatePlayer(Player oldPlayer, Player newPlayer)
{
try
{
this._dbHelper.JoinTransaction();
this.SavePlayer(newPlayer);
this._dbHelper.ExecuteNonQuery("UPDATE [MessageBody] SET [SenderUri] = @Uri WHERE [SenderUri] = @OldUri", new object[] { newPlayer.Uri, oldPlayer.Uri });
this._dbHelper.ExecuteNonQuery("UPDATE [Message] SET [ReceiverUri] = @Uri WHERE [ReceiverUri] = @OldUri", new object[] { newPlayer.Uri, oldPlayer.Uri });
this.DeletePlayer(oldPlayer);
this._dbHelper.CommitTransaction();
}
catch
{
this._dbHelper.RollbackTransaction();
}
}
private DbHelper _dbHelper
{
get
{
return DbHelper.Instance;
}
}
public Player CurrentPlayer
{
get
{
return this._currentPlayer;
}
}
public User CurrentUser
{
get
{
return this._currentUser;
}
set
{
this._currentUser = value;
}
}
public int MessagesPerPage
{
get
{
return 30;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -