internal static int my_aspnet_PersonalizationPerUser_SetPageSettings()

in MySql.Web/src/PersonalizationProviderProcedures.cs [531:642]


    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, CultureInfo.InvariantCulture) == 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, CultureInfo.InvariantCulture), 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;
    }