Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
        }