@ -1,7 +1,6 @@
using System ;
using System.Collections.Generic ;
using System.IO ;
using System.Linq ;
using Emby.Server.Implementations.Data ;
using Jellyfin.Data.Entities ;
using Jellyfin.Server.Implementations ;
@ -64,10 +63,11 @@ namespace Jellyfin.Server.Migrations.Routines
ConnectionFlags . ReadOnly ,
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." ) ;
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.
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 . 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 ) )
{
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 ( ) ,
LogSeverity = severity
@ -107,8 +125,8 @@ namespace Jellyfin.Server.Migrations.Routines
newEntry . ItemId = entry [ 5 ] . ToString ( ) ;
}
return newEntry ;
} ) ;
newEntries . Add ( newEntry ) ;
}
dbContext . ActivityLogs . AddRange ( newEntries ) ;
dbContext . SaveChanges ( ) ;