Files
ntpa/MySql/Source/MySql.Web/PersonalizationProviderProcedures.cs
T
2016-03-16 20:08:36 +01:00

692 lines
31 KiB
C#

// Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
//
// MySQL Connector/NET is licensed under the terms of the GPLv2
// <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most
// MySQL Connectors. There are special exceptions to the terms and
// conditions of the GPLv2 as it is applied to this software, see the
// FLOSS License Exception
// <http://www.mysql.com/about/legal/licensing/foss-exception.html>.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 2 of the License.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
using System;
using System.Collections.Generic;
using System.Text;
using MySql.Data.MySqlClient;
namespace MySql.Web.Personalization
{
internal class PersonalizationProviderProcedures
{
/// <summary>
/// Retrieves profile data from my_aspnet_PersonalizationAllUsers or my_aspnet_PersonalizationPerUser meeting several input criteria.
/// </summary>
internal static int myaspnet_PersonalizationAdministration_FindState(bool allUsersScope, long applicationId, string applicationName, int pageIndex, int pageSize, string path, string userName,
DateTime inactiveSinceDate, MySQLPersonalizationConnectionHelper connection, ref MySqlCommand findStateCommand)
{
// create memory table to store results
var sql = "CREATE TEMPORARY TABLE IF NOT EXISTS pageIndexResults(" +
"IndexId int AUTO_INCREMENT NOT NULL PRIMARY KEY, " +
"ItemId int not null)";
if (!connection.Opened)
throw new Exception("Error: Connection should be open");
var cmd = new MySqlCommand(sql, connection.Connection);
cmd.ExecuteNonQuery();
//make sure table is empty
cmd.CommandText = "TRUNCATE TABLE pageIndexResults";
cmd.Connection = connection.Connection;
cmd.ExecuteNonQuery();
int pageLowerBound = pageSize * pageIndex;
int pageUpperBound = pageSize - 1 + pageLowerBound;
if (allUsersScope)
{
var query = "INSERT INTO pageIndexResults (ItemId) (" +
"SELECT myaspnet_Paths.PathId " +
"FROM myaspnet_Paths, " +
"((SELECT aspnet_Paths.PathId " +
"FROM myaspnet_PersonalizationAllUsers, aspnet_Paths " +
"WHERE myaspnet_Paths.ApplicationId = @ApplicationId " +
"AND aspnet_PersonalizationAllUsers.PathId = aspnet_Paths.PathId " +
"AND (@Path IS NULL OR aspnet_Paths.LoweredPath LIKE @Path) " +
") AS SharedDataPerPath " +
"FULL OUTER JOIN " +
"(SELECT DISTINCT aspnet_Paths.PathId " +
"FROM my_aspnet_personalizationperuser, my_aspnet_paths " +
"WHERE my_aspnet_paths.ApplicationId = @ApplicationId " +
"AND my_aspnet_personalizationperuser.PathId = aspnet_Paths.PathId " +
"AND (@Path IS NULL OR my_aspnet_paths.LoweredPath LIKE @Path) " +
") AS UserDataPerPath " +
"ON SharedDataPerPath.PathId = UserDataPerPath.PathId " +
") " +
"WHERE my_aspnet_Paths.PathId = SharedDataPerPath.PathId OR my_aspnet_Paths.PathId = UserDataPerPath.PathId " +
"ORDER BY my_aspnet_Paths.Path ASC)";
cmd.CommandText = query;
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@Path", path);
cmd.Connection = connection.Connection;
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT Count(PathId) FROM pageIndexResults";
cmd.Connection = connection.Connection;
int totalRecords = (int)cmd.ExecuteScalar();
query = "SELECT my_aspnet_Paths.Path, " +
"SharedDataPerPath.LastUpdatedDate, " +
"SharedDataPerPath.SharedDataLength, " +
"UserDataPerPath.UserDataLength, " +
"UserDataPerPath.UserCount " +
"FROM aspnet_Paths, " +
"((SELECT pageIndexResults.ItemId AS PathId, " +
"aspnet_PersonalizationAllUsers.LastUpdatedDate AS LastUpdatedDate, " +
"LENGTH(aspnet_PersonalizationAllUsers.PageSettings) AS SharedDataLength " +
"FROM my_aspnet_personalizationallusers, PageIndex " +
"WHERE my_aspnet_personalizationallusers.PathId = pageIndexResults.IndexId " +
"AND pageIndexResults.IndexId >= @PageLowerBound AND pageIndexResults.IndexId <= @PageUpperBound " +
") AS SharedDataPerPath " +
"FULL OUTER JOIN " +
"(SELECT pageIndexResults.ItemId AS PathId, " +
"SUM(LENGTH(my_aspnet_personalizationperuser.PageSettings)) AS UserDataLength, " +
"COUNT(*) AS UserCount " +
"FROM my_aspnet_personalizationperuser, pageIndexResults " +
"WHERE my_aspnet_personalizationperuser.PathId = pageIndexResults.IndexId " +
"AND pageIndexResults.IndexId >= @PageLowerBound AND pageIndexResults.IndexId <= @PageUpperBound " +
"GROUP BY pageIndexResults.IndexId " +
") AS UserDataPerPath " +
"ON SharedDataPerPath.PathId = UserDataPerPath.PathId " +
") " +
"WHERE aspnet_Paths.PathId = SharedDataPerPath.PathId OR aspnet_Paths.PathId = UserDataPerPath.PathId " +
"ORDER BY my_aspnet_Paths.Path ASC ";
findStateCommand.CommandText = query;
findStateCommand.Connection = connection.Connection;
findStateCommand.Parameters.AddWithValue("@PageLowerBound", pageLowerBound);
findStateCommand.Parameters.AddWithValue("@PageUpperBound", pageUpperBound);
return totalRecords;
}
else
{
var query = "INSERT INTO pageIndexResults (ItemId) (" +
"SELECT my_aspnet_personalizationperuser.Id " +
"FROM my_aspnet_personalizationperuser, my_aspnet_users, my_aspnet_paths " +
"WHERE my_aspnet_paths.ApplicationId = @ApplicationId " +
"AND my_aspnet_personalizationperuser.UserId = my_aspnet_Users.Id " +
"AND my_aspnet_personalizationperuser.PathId = my_aspnet_Paths.PathId " +
"AND (@Path IS NULL OR my_aspnet_paths.LoweredPath LIKE @Path) " +
"AND (@UserName IS NULL OR my_aspnet_users.name LIKE @UserName) " +
"AND (@InactiveSinceDate IS NULL OR my_aspnet_users.LastActivityDate <= @InactiveSinceDate) " +
"ORDER BY my_aspnet_paths.Path ASC, my_aspnet_users.name ASC )";
cmd.CommandText = query;
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@Path", path);
cmd.Parameters.AddWithValue("@UserName", userName);
cmd.Parameters.AddWithValue("@InactiveSinceDate", inactiveSinceDate);
cmd.Connection = connection.Connection;
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT Count(IndexId) FROM pageIndexResults";
cmd.Connection = connection.Connection;
var totalRecords = cmd.ExecuteScalar().ToString();
query = "SELECT my_aspnet_Paths.Path, my_aspnet_personalizationperuser.LastUpdatedDate, LENGTH(my_aspnet_personalizationperuser.PageSettings) as Size, my_aspnet_Users.Name, my_aspnet_Users.LastActivityDate " +
"FROM my_aspnet_personalizationperuser, my_aspnet_users, my_aspnet_paths, pageIndexResults " +
"WHERE my_aspnet_personalizationperuser.Id = PageIndexResults.IndexId " +
"AND my_aspnet_personalizationperuser.UserId = my_aspnet_users.Id " +
"AND my_aspnet_personalizationperuser.PathId = my_aspnet_paths.PathId " +
"AND pageIndexResults.ItemId >= @PageLowerBound AND PageIndexResults.ItemId <= @PageUpperBound " +
"ORDER BY my_aspnet_paths.Path ASC, my_aspnet_users.name ASC ";
findStateCommand.CommandText = query;
findStateCommand.Parameters.AddWithValue("@PageUpperBound", pageUpperBound);
findStateCommand.Parameters.AddWithValue("@PageLowerBound", pageLowerBound);
findStateCommand.Connection = connection.Connection;
return int.Parse(totalRecords);
}
}
internal static int myaspnet_PersonalizationAdministration_GetCountOfState(bool allUsersScope, string applicationName, long applicationId, string path, string userName, DateTime inactiveSinceDate, MySQLPersonalizationConnectionHelper connection)
{
if (applicationId <= 0)
return 0;
if (!connection.Opened)
throw new Exception("Error: Connection should be open");
if (allUsersScope)
{
MySqlCommand cmd = new MySqlCommand("Select count(*) from my_aspnet_personalizationallusers, my_aspnet_paths " +
"where my_aspnet_paths.applicationId = @ApplicationId and " +
"my_aspnet_personalizationallusers.pathid = my_aspnet_paths.pathid and " +
"(@Path is null or my_aspnet_paths.loweredpath like lower(@Path))", connection.Connection);
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@Path", path);
cmd.Connection = connection.Connection;
var count = cmd.ExecuteScalar().ToString();
return int.Parse(count);
}
else {
MySqlCommand cmd = new MySqlCommand("Select count(*) from my_aspnet_personalizationperuser as peruser, my_aspnet_users as users, "+
"my_aspnet_paths as paths " +
"where paths.applicationId = @ApplicationId and " +
"peruser.userid = users.id and " +
"peruser.pathId = paths.pathId and " +
"(@Path is null or paths.loweredpath like lower(@Path) and " +
"(@UserName is null or users.name like lower(@UserName))) and " +
"(@InactiveSinceDate is null or users.lastactivitydate <= @InactiveSinceDate) ", connection.Connection);
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@Path", path);
cmd.Parameters.AddWithValue("@UserName", userName);
cmd.Parameters.AddWithValue("@InactiveSinceDate", inactiveSinceDate);
cmd.Connection = connection.Connection;
var count = cmd.ExecuteScalar().ToString();
return int.Parse(count);
}
}
internal static Byte[] my_aspnet_PersonalizationPerUser_GetPageSettings(long applicationId, string path, string userName, DateTime currentTimeUtc, MySQLPersonalizationConnectionHelper connection)
{
if (applicationId <= 0)
return null;
if (!connection.Opened)
throw new Exception("Error: Connection should be open");
//get pathid
var cmd = new MySqlCommand("select pathId from my_aspnet_paths where applicationid = @ApplicationId and loweredpath = lower(@Path)", connection.Connection);
cmd.Connection = connection.Connection;
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@Path", path);
var pathId = (cmd.ExecuteScalar() ?? "").ToString();
if (string.IsNullOrEmpty(pathId))
return null;
cmd = new MySqlCommand("select Id from my_aspnet_users where applicationid = @ApplicationId and name = @UserName", connection.Connection);
cmd.Connection = connection.Connection;
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@UserName", userName);
var userId = (cmd.ExecuteScalar() ?? "").ToString();
userId = string.IsNullOrEmpty(userId) ? "0" : userId;
if (int.Parse(userId) == 0)
return null;
UpdateUserLastActiveDate(connection.Connection, int.Parse(userId), currentTimeUtc);
cmd = new MySqlCommand("select pagesettings from my_aspnet_personalizationperuser as peruser where peruser.pathid = @PathId and peruser.userid = @UserId");
cmd.Connection = connection.Connection;
cmd.Parameters.AddWithValue("@PathId", pathId);
cmd.Parameters.AddWithValue("@UserId", userId);
var reader = cmd.ExecuteReader();
byte[] settings = null;
while (reader.Read())
{
int size = (int)reader.GetBytes(0, 0, null, 0, 0);
settings = new byte[size];
reader.GetBytes(0, 0, settings, 0, size);
}
reader.Close();
return settings;
}
internal static byte[] my_aspnet_PersonalizationAllUsers_GetPageSettings(long applicationId, string path, MySQLPersonalizationConnectionHelper connection)
{
if (applicationId <= 0)
return null;
if (!connection.Opened)
throw new Exception("Error: Connection should be open");
var cmd = new MySqlCommand("Select pathid from my_aspnet_paths as paths where paths.applicationid = @ApplicationId and paths.loweredPath = lower(@Path)", connection.Connection);
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@Path", path);
var pathId = (string)cmd.ExecuteScalar();
if (!string.IsNullOrEmpty(pathId))
{
cmd.CommandText = "Select PageSettings from my_aspnet_personalizationallusers where pathId = @PathId";
cmd.Parameters.AddWithValue("@PathId", pathId);
cmd.Connection = connection.Connection;
var reader = cmd.ExecuteReader();
byte[] settings = null;
while (reader.Read())
{
int size = (int)reader.GetBytes(0, 0, null, 0, 0);
settings = new byte[size];
reader.GetBytes(0, 0, settings, 0, size);
}
reader.Close();
return settings;
}
return null;
}
internal static void my_aspnet_PersonalizationPerUser_ResetPageSettings(long applicationId, string userName, string path, DateTime currentTimeUtc, MySQLPersonalizationConnectionHelper connection)
{
if (applicationId <= 0)
return;
if (!connection.Opened)
throw new Exception("Error: Connection should be open");
var cmd = new MySqlCommand("Select pathid from my_aspnet_paths as paths where paths.applicationid = @ApplicationId and paths.loweredPath = lower(@Path)", connection.Connection);
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@Path", path);
var pathId = (string)cmd.ExecuteScalar();
if (!string.IsNullOrEmpty(pathId))
{
cmd = new MySqlCommand("select Id from my_aspnet_users where applicationid = @ApplicationId and name = @UserName", connection.Connection);
cmd.Connection = connection.Connection;
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@UserName", userName);
var userId = (int)cmd.ExecuteScalar();
if (userId != 0)
{
var rows = UpdateUserLastActiveDate(connection.Connection, userId, currentTimeUtc);
if (rows != 0)
{
cmd = new MySqlCommand("delete from my_aspnet_personalizationperuser WHERE pathId = @PathId AND userId = @UserId");
cmd.Connection = connection.Connection;
cmd.Parameters.AddWithValue("@PathId", pathId);
cmd.Parameters.AddWithValue("@UserId", userId);
cmd.ExecuteNonQuery();
}
}
}
}
internal static void my_aspnet_PersonalizationAllUsers_ResetPageSettings(long applicationId, string path, MySQLPersonalizationConnectionHelper connection)
{
if (applicationId <= 0)
return;
if (!connection.Opened)
throw new Exception("Error: Connection should be open");
var cmd = new MySqlCommand("Select pathid from my_aspnet_paths as paths where paths.applicationid = @ApplicationId and paths.loweredPath = lower(@Path)", connection.Connection);
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@Path", path);
var pathId = (cmd.ExecuteScalar() ?? "").ToString();
if (!string.IsNullOrEmpty(pathId))
{
cmd = new MySqlCommand("delete my_aspnet_personalizationallusers.* from my_aspnet_personalizationallusers WHERE pathId = @PathId");
cmd.Connection = connection.Connection;
cmd.Parameters.AddWithValue("@PathId", pathId);
cmd.ExecuteNonQuery();
}
}
private static int UpdateUserLastActiveDate(MySqlConnection cnn, int userId, DateTime currentTimeUtc)
{
MySqlTransaction trans;
trans = cnn.BeginTransaction();
try
{
var cmd = new MySqlCommand("update my_aspnet_users set lastactivitydate = @CurrentTimeUtc where id = @UserId");
cmd.Connection = cnn;
cmd.Transaction = trans;
cmd.Parameters.AddWithValue("@CurrentTimeUtc", currentTimeUtc);
cmd.Parameters.AddWithValue("@UserId", userId);
var rows = cmd.ExecuteNonQuery();
trans.Commit();
return rows;
}
catch
{
trans.Rollback();
throw;
}
}
internal static int my_aspnet_PersonalizationAdministration_ResetUserState(long applicationId, DateTime inactiveSinceDate,string[] usernames, string[] paths, MySQLPersonalizationConnectionHelper connection)
{
if (applicationId <= 0)
return 0;
if (!connection.Opened)
throw new Exception("Error: Connection should be open");
var rows = 0;
var cmd = new MySqlCommand();
if (usernames == null) usernames = new string[1] { "" };
if (paths == null ) paths = new string[1] { "" };
foreach (var username in usernames)
{
foreach (var path in paths)
{
var query = "DELETE peruser.* FROM (my_aspnet_personalizationperuser as peruser " +
"INNER JOIN my_aspnet_users as users ON " +
"peruser.userid = users.id) " +
"INNER JOIN my_aspnet_paths as paths ON " +
"paths.applicationId = @ApplicationId AND " +
"paths.pathid = peruser.pathid AND " +
"(@InactiveSinceDate is null OR users.lastactivitydate <= @InactiveSinceDate) ";
query = string.IsNullOrEmpty(username) ? query : query += " AND (@UserName is null OR users.name = @UserName) ";
query = string.IsNullOrEmpty(path) ? query : query += " AND (@Path is null OR paths.loweredpath = LOWER(@Path))";
cmd.CommandText = query;
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@InactiveSinceDate", inactiveSinceDate);
cmd.Parameters.AddWithValue("@Path", path);
cmd.Parameters.AddWithValue("@UserName", username);
cmd.Connection = connection.Connection;
rows += cmd.ExecuteNonQuery();
}
}
return rows;
}
internal static int my_aspnet_PersonalizationAdministration_DeleteAllState(long applicationId, bool allUsersScope, MySQLPersonalizationConnectionHelper connection)
{
if (applicationId <= 0)
return 0;
if (!connection.Opened)
throw new Exception("Error: Connection should be open");
var cmd = new MySqlCommand();
cmd.Connection = connection.Connection;
if (allUsersScope)
{
cmd.CommandText = "DELETE FROM my_aspnet_personalizationallusers " +
"WHERE PathId IN (SELECT Paths.PathId FROM my_aspnet_paths as paths " +
"WHERE paths.ApplicationId = @ApplicationId)";
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
}
else
{
cmd.CommandText = "DELETE FROM my_aspnet_personalizationperuser " +
"WHERE PathId IN (SELECT Paths.PathId FROM my_aspnet_paths as paths " +
"WHERE paths.ApplicationId = @ApplicationId)";
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
}
var rows = cmd.ExecuteNonQuery();
return rows;
}
internal static int my_aspnet_PersonalizationAdministration_ResetSharedState(long applicationId, string[] paths, MySQLPersonalizationConnectionHelper connection)
{
if (applicationId <= 0)
return 0;
if (!connection.Opened)
throw new Exception("Error: Connection should be open");
if (paths == null)
return 0;
var cmd = new MySqlCommand();
cmd.Connection = connection.Connection;
var rows = 0;
foreach (var path in paths)
{
cmd.CommandText = "DELETE my_aspnet_personalizationallusers.* FROM my_aspnet_personalizationallusers " +
"INNER JOIN my_aspnet_paths as paths ON " +
"((paths.ApplicationId = @ApplicationId AND " +
"my_aspnet_personalizationallusers.PathId = paths.PathId) AND " +
"paths.loweredpath = LOWER(@Path))";
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@Path", path);
rows += cmd.ExecuteNonQuery();
}
return rows;
}
internal static int my_aspnet_PersonalizationAdministration_DeleteAllState(bool allUsersScope, long applicationId, MySQLPersonalizationConnectionHelper connection)
{
if (applicationId <= 0)
return 0;
if (!connection.Opened)
throw new Exception("Error: Connection should be open");
var cmd = new MySqlCommand();
cmd.Connection = connection.Connection;
if (allUsersScope)
{
cmd.CommandText = "DELETE FROM my_aspnet_personalizationallusers " +
"WHERE PathId IN " +
"(SELECT paths.PathId FROM my_aspnet_paths as paths " +
"WHERE paths.ApplicationId = @ApplicationId)";
}
else
{
cmd.CommandText = "DELETE FROM my_aspnet_personalizationperuser " +
"WHERE PathId IN " +
"(SELECT Paths.PathId FROM my_aspnet_paths Paths " +
"WHERE Paths.ApplicationId = @ApplicationId)";
}
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
var rows = cmd.ExecuteNonQuery();
return rows;
}
/// <summary>
/// Saves per-user state for the specified page and the specified user in the my_aspnet_PersonalizationPerUser table.
/// </summary>
/// <returns></returns>
internal static int my_aspnet_PersonalizationPerUser_SetPageSettings(long applicationId, string userName, string path, byte[] settings, DateTime currentTimeUtc, MySQLPersonalizationConnectionHelper connection)
{
if (applicationId <= 0)
return 0;
if (!connection.Opened)
throw new Exception("Error: Connection should be open");
var cmd = new MySqlCommand();
cmd.Connection = connection.Connection;
cmd.CommandText = "SELECT PathId FROM my_aspnet_paths WHERE ApplicationId = @ApplicationId AND LoweredPath = LOWER(@Path)";
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@Path", path);
var pathId = (string)cmd.ExecuteScalar();
cmd.Parameters.Clear();
if (pathId == null)
{
// create path
MySqlTransaction trans;
trans = connection.Connection.BeginTransaction();
try
{
cmd.Transaction = trans;
cmd.CommandText = "INSERT INTO my_aspnet_paths (applicationId, pathId, path, loweredpath) values (@ApplicationId, @PathId, @Path, LOWER(@Path))";
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@PathId", pathId = Guid.NewGuid().ToString());
cmd.Parameters.AddWithValue("@Path", path);
cmd.ExecuteNonQuery();
trans.Commit();
}
catch
{
trans.Rollback();
throw;
}
}
cmd.Parameters.Clear();
cmd.CommandText = "SELECT id FROM my_aspnet_users WHERE ApplicationId = @ApplicationId AND name = LOWER(@UserName)";
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@UserName", userName);
var userId = (cmd.ExecuteScalar() ?? "").ToString();
userId = string.IsNullOrEmpty(userId) ? "0" : userId;
// create user
if (int.Parse(userId) == 0)
{
// create path
MySqlTransaction trans;
trans = connection.Connection.BeginTransaction();
try
{
cmd.Parameters.Clear();
cmd.Transaction = trans;
cmd.CommandText = "INSERT INTO my_aspnet_users (applicationId, name, isAnonymous, lastActivityDate) values (@ApplicationId, @UserName, false, @CurrentTimeUtc)";
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@UserName", userName);
cmd.Parameters.AddWithValue("@CurrentTimeUtc", DateTime.UtcNow);
cmd.ExecuteNonQuery();
trans.Commit();
}
catch
{
trans.Rollback();
throw;
}
cmd.Parameters.Clear();
cmd.CommandText = "SELECT Id from my_aspnet_users where applicationId = @ApplicationId and name = @UserName)";
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@UserName", userName);
userId = (string)cmd.ExecuteScalar();
}
var rows = UpdateUserLastActiveDate(connection.Connection, int.Parse(userId), DateTime.UtcNow);
if (rows == 0)
throw new Exception("User not found");
cmd.Parameters.Clear();
cmd.CommandText = "Select COUNT(*) from my_aspnet_personalizationperuser where userid = @UserId and pathId = @PathId";
cmd.Parameters.AddWithValue("@UserId", userId);
cmd.Parameters.AddWithValue("@PathId", pathId);
if ((long)cmd.ExecuteScalar() > 0)
{
cmd.Parameters.Clear();
cmd.CommandText = "UPDATE my_aspnet_personalizationperuser SET PageSettings = @PageSettings, LastUpdatedDate = @CurrentTimeUtc " +
"where userid = @UserId and pathId = @PathId";
cmd.Parameters.AddWithValue("@UserId", userId);
cmd.Parameters.AddWithValue("@PathId", pathId);
cmd.Parameters.AddWithValue("@PageSettings", settings);
cmd.Parameters.AddWithValue("@CurrentTimeUtc", DateTime.UtcNow);
cmd.ExecuteNonQuery();
}
else {
cmd.Parameters.Clear();
cmd.CommandText = "INSERT INTO my_aspnet_personalizationperuser(applicationId, pathId, userId, pageSettings, lastUpdatedDate) VALUES(@applicationId, @PathId, @userId, @PageSettings, @LastUpdatedDate)";
cmd.Parameters.AddWithValue("@applicationId", applicationId);
cmd.Parameters.AddWithValue("@UserId", userId);
cmd.Parameters.AddWithValue("@PathId", pathId);
cmd.Parameters.AddWithValue("@PageSettings", settings);
cmd.Parameters.AddWithValue("@LastUpdatedDate", DateTime.UtcNow);
rows = cmd.ExecuteNonQuery();
}
return rows;
}
/// <summary>
/// Saves shared state for the specified page in the aspnet_PersonalizationAllUsers table
/// </summary>
/// <returns></returns>
internal static int my_aspnet_PersonalizationAllUsers_SetPageSettings(long applicationId, string path, byte[] settings, DateTime currentTimeUtc, MySQLPersonalizationConnectionHelper connection)
{
if (applicationId <= 0)
return 0;
if (!connection.Opened)
throw new Exception("Error: Connection should be open");
var cmd = new MySqlCommand();
cmd.Connection = connection.Connection;
cmd.CommandText = "SELECT PathId FROM my_aspnet_paths WHERE ApplicationId = @ApplicationId AND LoweredPath = LOWER(@Path)";
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@Path", path);
var pathId = (string)cmd.ExecuteScalar();
cmd.Parameters.Clear();
if (pathId == null)
{
// create path
MySqlTransaction trans;
trans = connection.Connection.BeginTransaction();
try
{
cmd.Transaction = trans;
cmd.CommandText = "INSERT INTO my_aspnet_paths (applicationId, pathId, path, loweredpath) values (@ApplicationId, @PathId, @Path, LOWER(@Path))";
cmd.Parameters.AddWithValue("@ApplicationId", applicationId);
cmd.Parameters.AddWithValue("@PathId", pathId = Guid.NewGuid().ToString());
cmd.Parameters.AddWithValue("@Path", path);
cmd.ExecuteNonQuery();
trans.Commit();
}
catch
{
trans.Rollback();
throw;
}
}
cmd.CommandText = "INSERT INTO my_aspnet_personalizationallusers(PathId, PageSettings, LastUpdatedDate) VALUES (@PathId, @PageSettings, @CurrentTimeUtc)";
cmd.CommandText += " ON DUPLICATE KEY UPDATE PageSettings=Values(PageSettings), LastUpdatedDate=Values(LastUpdatedDate)";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@PageSettings", settings);
cmd.Parameters.AddWithValue("@PathId", pathId);
cmd.Parameters.AddWithValue("@CurrentTimeUtc", currentTimeUtc);
var rows = cmd.ExecuteNonQuery();
return rows;
}
}
}