Browse Source

Merge pull request #3222 from barronpm/activitylog-migration-fix

Fix Activity Log Migrations for Very Old Databases
dkanada 5 years ago
parent
commit
5cdf951643
1 changed files with 27 additions and 9 deletions
  1. 27 9
      Jellyfin.Server/Migrations/Routines/MigrateActivityLogDb.cs

+ 27 - 9
Jellyfin.Server/Migrations/Routines/MigrateActivityLogDb.cs

@@ -1,7 +1,6 @@
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.IO;
 using System.IO;
-using System.Linq;
 using Emby.Server.Implementations.Data;
 using Emby.Server.Implementations.Data;
 using Jellyfin.Data.Entities;
 using Jellyfin.Data.Entities;
 using Jellyfin.Server.Implementations;
 using Jellyfin.Server.Implementations;
@@ -64,10 +63,11 @@ namespace Jellyfin.Server.Migrations.Routines
                 ConnectionFlags.ReadOnly,
                 ConnectionFlags.ReadOnly,
                 null))
                 null))
             {
             {
+                using var userDbConnection = SQLite3.Open(Path.Combine(dataPath, "users.db"), ConnectionFlags.ReadOnly, null);
                 _logger.LogWarning("Migrating the activity database may take a while, do not stop Jellyfin.");
                 _logger.LogWarning("Migrating the activity database may take a while, do not stop Jellyfin.");
                 using var dbContext = _provider.CreateContext();
                 using var dbContext = _provider.CreateContext();
 
 
-                var queryResult = connection.Query("SELECT * FROM ActivityLog ORDER BY Id ASC");
+                var queryResult = connection.Query("SELECT * FROM ActivityLog ORDER BY Id");
 
 
                 // Make sure that the database is empty in case of failed migration due to power outages, etc.
                 // Make sure that the database is empty in case of failed migration due to power outages, etc.
                 dbContext.ActivityLogs.RemoveRange(dbContext.ActivityLogs);
                 dbContext.ActivityLogs.RemoveRange(dbContext.ActivityLogs);
@@ -76,17 +76,35 @@ namespace Jellyfin.Server.Migrations.Routines
                 dbContext.Database.ExecuteSqlRaw("UPDATE sqlite_sequence SET seq = 0 WHERE name = 'ActivityLog';");
                 dbContext.Database.ExecuteSqlRaw("UPDATE sqlite_sequence SET seq = 0 WHERE name = 'ActivityLog';");
                 dbContext.SaveChanges();
                 dbContext.SaveChanges();
 
 
-                var newEntries = queryResult.Select(entry =>
+                var newEntries = new List<ActivityLog>();
+
+                foreach (var entry in queryResult)
                 {
                 {
                     if (!logLevelDictionary.TryGetValue(entry[8].ToString(), out var severity))
                     if (!logLevelDictionary.TryGetValue(entry[8].ToString(), out var severity))
                     {
                     {
                         severity = LogLevel.Trace;
                         severity = LogLevel.Trace;
                     }
                     }
 
 
-                    var newEntry = new ActivityLog(
-                        entry[1].ToString(),
-                        entry[4].ToString(),
-                        entry[6].SQLiteType == SQLiteType.Null ? Guid.Empty : Guid.Parse(entry[6].ToString()))
+                    var guid = Guid.Empty;
+                    if (entry[6].SQLiteType != SQLiteType.Null && !Guid.TryParse(entry[6].ToString(), out guid))
+                    {
+                        // This is not a valid Guid, see if it is an internal ID from an old Emby schema
+                        _logger.LogWarning("Invalid Guid in UserId column: ", entry[6].ToString());
+
+                        using var statement = userDbConnection.PrepareStatement("SELECT guid FROM LocalUsersv2 WHERE Id=@Id");
+                        statement.TryBind("@Id", entry[6].ToString());
+
+                        foreach (var row in statement.Query())
+                        {
+                            if (row.Count > 0 && Guid.TryParse(row[0].ToString(), out guid))
+                            {
+                                // Successfully parsed a Guid from the user table.
+                                break;
+                            }
+                        }
+                    }
+
+                    var newEntry = new ActivityLog(entry[1].ToString(), entry[4].ToString(), guid)
                     {
                     {
                         DateCreated = entry[7].ReadDateTime(),
                         DateCreated = entry[7].ReadDateTime(),
                         LogSeverity = severity
                         LogSeverity = severity
@@ -107,8 +125,8 @@ namespace Jellyfin.Server.Migrations.Routines
                         newEntry.ItemId = entry[5].ToString();
                         newEntry.ItemId = entry[5].ToString();
                     }
                     }
 
 
-                    return newEntry;
-                });
+                    newEntries.Add(newEntry);
+                }
 
 
                 dbContext.ActivityLogs.AddRange(newEntries);
                 dbContext.ActivityLogs.AddRange(newEntries);
                 dbContext.SaveChanges();
                 dbContext.SaveChanges();