private void ImportConference(string confName) { using var Dbx = Sezam.Data.Store.GetNewContext(); using ConferenceVolume zbbConf = new ConferenceVolume(confName); try { if (Dbx .Conferences .Where(c => c.Name == zbbConf.NameOnly && c.VolumeNo == zbbConf.VolumeNumber) .Any()) { Console.WriteLine("Conf {0} is already imported.", confName); return; } Console.WriteLine("Importing {0}.{1}", ConfPath, confName); string confDir = Path.Combine(ConfPath, confName); zbbConf.Import(confDir); // Any missing users? var msgAuthors = zbbConf.Messages .Select(m => m.author) .Where(u => !string.IsNullOrWhiteSpace(u)) .Distinct(); var existingUsers = Dbx.Users.Select(u => u.Username); var usersToAdd = msgAuthors.Except(existingUsers) .Select(u => new Sezam.Data.EF.User() { Username = u }); if (usersToAdd.Any()) { Console.WriteLine("Adding users: {0}", string.Join(", ", usersToAdd.Select(u => u.Username))); Dbx.Users.AddRange(usersToAdd); Dbx.SaveChanges(); } var conf = new Sezam.Data.EF.Conference(); Dbx.Conferences.Add(conf); zbbConf.ToEFConf(conf); var userDict = Dbx.Users.Select(u => new { u.Username, u.Id }) .ToDictionary(u => u.Username, u => u.Id); foreach (var zbbMsg in zbbConf.Messages) { var efMsg = zbbMsg.EFConfMessage; if (userDict.ContainsKey(zbbMsg.author)) { efMsg.AuthorId = userDict[zbbMsg.author]; } else { Console.WriteLine("Unknown ConfMsg Author: {0}", zbbMsg.author); } } Console.Write("Saving..."); Dbx.SaveChanges(); Console.WriteLine("Finished importing {0}", confName); } catch (Exception e) { Console.WriteLine("Error importing conf"); Sezam.ErrorHandling.PrintException(e); } }
public static Sezam.Data.EF.Conference ToEFConf(this ZBB.ConferenceVolume zbbconf, Sezam.Data.EF.Conference conf = null) { if (conf == null) { conf = new Sezam.Data.EF.Conference(); } conf.Name = zbbconf.NameOnly; conf.VolumeNo = zbbconf.VolumeNumber; // Copy topics foreach (var zbbtopic in zbbconf.Topics.Where(t => t.Exists())) { var topic = zbbtopic.ToEFTopic(); topic.Conference = conf; conf.ConfTopics.Add(topic); } // Fix reference foreach (var zbbtopic in zbbconf.Topics.Where(t => t.Exists())) { var topic = zbbtopic.EFTopic; if (topic == null) { // topic deleted, empty } if (zbbtopic.RedirectTo > 0) { if (zbbtopic.RedirectTo <= ZBB.ConferenceVolume.MaxTopics) { topic.RedirectTo = zbbtopic.conf.Topics[zbbtopic.RedirectTo - 1].EFTopic; } else { Debug.WriteLine("Invalid RedirectTo {0}", zbbtopic.RedirectTo); } } } Debug.WriteLine("Reading messages..."); Sezam.Data.EF.ConfTopic unknownTopic = null; foreach (var zbbConfMsg in zbbconf.Messages) { var msg = zbbConfMsg.ToEFConfMessage(); if (msg.Topic == null || msg.MsgNo == 0) { if (unknownTopic == null) { unknownTopic = new Sezam.Data.EF.ConfTopic { Name = "unknown", TopicNo = ZBB.ConferenceVolume.MaxTopics + 1, Status = Sezam.Data.EF.ConfTopic.TopicStatus.Deleted | Sezam.Data.EF.ConfTopic.TopicStatus.Private }; conf.ConfTopics.Add(unknownTopic); } msg.Topic = unknownTopic; } msg.Topic.NextSequence++; msg.MsgNo = msg.Topic.NextSequence; msg.Topic.Messages.Add(msg); } conf.FromDate = zbbconf.GetOldestMessage()?.Time; conf.ToDate = zbbconf.GetNewestMessage()?.Time; if (zbbconf.Messages.Count == 0) { conf.Status |= Sezam.Data.EF.ConfStatus.Private; } if (zbbconf.IsAnonymousAllowed) { conf.Status |= Sezam.Data.EF.ConfStatus.AnonymousAllowed; } if (zbbconf.IsClosed) { conf.Status |= Sezam.Data.EF.ConfStatus.Closed; } if (zbbconf.IsPrivate) { conf.Status |= Sezam.Data.EF.ConfStatus.Private; } if (zbbconf.IsReadOnly) { conf.Status |= Sezam.Data.EF.ConfStatus.ReadOnly; } foreach (var t in conf.ConfTopics) { Console.WriteLine("Topic [{0,2}] {1}:{2} - {3}", t.TopicNo, conf.Name, t.Name, t.Messages.Count); } zbbconf.EFConference = conf; return(conf); }