Exemple #1
0
        public User CreateTimetable(string name)
        {
            var record = new TimetableRecord
            {
                // Name = name,
                CreationDate = DateTime.Now,
                UserRecord   = UserRecord
            };

            // Добавить ассоциации
            UserRecord.TimetableRecord.Add(record);

            Manager.Container.TimetableRecordSet.Add(record);

            return(this);
        }
Exemple #2
0
    public void addPair(Pair pair, bool saveState = true)
    {
        /*WeekTimetable week;
         * var p_weekType = WeekTimetable.GetIso8601WeekNumber (pair.day.Date) % 2 == 0 ? WeekType.Even : WeekType.Odd;
         * week = currentWeek.weekType == p_weekType ? currentWeek : nextWeek;
         *
         */

        using (var db = new SQLiteConnection(db_path)) {
            var pr = new TimetableRecord();
            pr.weekType  = WeekTimetable.GetIso8601WeekNumber(pair.day.Date) % 2 == 0?WeekType.Even:WeekType.Odd;
            pr.day       = pair.day.DayOfWeek;
            pr.startTime = pair.startTime;
            pr.endTime   = pair.endTime;
            pr.name      = pair.name;
            pr.lecturer  = pair.lecturer;
            pr.location  = pair.location;
            pr.room      = pair.room;


            pr.edited       = pair.edited?1:0;
            pr.deleted      = pair.deleted?1:0;
            pr.initial_hash = pair.initial_hash;
            pr.hash         = pair.hash;

            Debug.LogWarning("ADDING PAIR: " + pair.name + " DELETED: " + pr.deleted);

            db.Insert(pr);

            db.Close();

            // NEW PAIR IN DB NOW

            restoreTimetableFromDatabase();

            if (saveState)
            {
                saveCurrentState();
            }
        }
    }
Exemple #3
0
 internal Timetable(DatabaseManager man, TimetableRecord timetableRecord) :
     base(man)
 {
     TimetableRecord = timetableRecord;
 }
Exemple #4
0
    private bool saveTimetableToDatabase(WeekTimetable w1, WeekTimetable w2, bool preserveEdits = false)
    {
        bool anyChanges = false;

//		var start_t = Time.realtimeSinceStartup;
        if (!preserveEdits)
        {
            anyChanges = true;
            // simply remove all pairs from db and add provided
            clearDb();

            using (var db = new SQLiteConnection(db_path)) {
                foreach (var w in new List <WeekTimetable>()
                {
                    w1, w2
                })
                {
                    Debug.LogWarning("Saving week of type " + w.weekType);
                    foreach (var d in w.days)
                    {
                        foreach (var p in d.pairs)
                        {
                            var pair = new TimetableRecord();
                            pair.weekType  = w.weekType;
                            pair.day       = d.day.DayOfWeek;
                            pair.startTime = p.startTime;
                            pair.endTime   = p.endTime;
                            pair.name      = p.name;
                            pair.lecturer  = p.lecturer;
                            pair.location  = p.location;
                            pair.room      = p.room;

                            pair.edited       = p.edited ? 1 : 0;
                            pair.deleted      = p.deleted ? 1 : 0;
                            pair.initial_hash = p.initial_hash;
                            pair.hash         = p.hash;

                            db.Insert(pair);
                        }
                    }
                }

                db.Close();

                //Debug.LogWarning ("Timetable saved to database ("+(Time.renderedFrameCount-start_t)+"s)");
            }
        }
        else
        {
            // foreach exisiting pair check for similar (with hash) in new pairs
            // if found - dont add new pair
            // if not found remove (real remove) existing pair
            // Then add other new pairs

            var old_weeks = new List <WeekTimetable>()
            {
                currentWeek, nextWeek
            };
            var new_weeks = new List <WeekTimetable>()
            {
                w1, w2
            };

            // create one list with all existing pairs
            var exisitingPairs = new List <Pair>();
            foreach (var ex_w in old_weeks)
            {
                foreach (var d in ex_w.days)
                {
                    foreach (var p in d.pairs)
                    {
                        exisitingPairs.Add(p);
                    }
                }
            }

            // create another list with all new pairs
            var newPairs = new List <Pair>();
            foreach (var new_w in new_weeks)
            {
                foreach (var d in new_w.days)
                {
                    foreach (var new_p in d.pairs)
                    {
                        newPairs.Add(new_p);
                    }
                }
            }


            // v1.3 hash migration
            if (exisitingPairs.Where(x => x.hash == null).Count() > 0)
            {
                // needs migration
                //Debug.LogError ("Needs v1.3 pair migration");

                for (int i = 0; i < 2; i++)
                {
                    var old_w = old_weeks [i]; var new_w = new_weeks [i];

                    var old_w_pairs = new List <Pair>();
                    foreach (var d in old_w.days)
                    {
                        foreach (var p in d.pairs)
                        {
                            old_w_pairs.Add(p);
                        }
                    }

                    var new_w_pairs = new List <Pair>();
                    foreach (var d in new_w.days)
                    {
                        foreach (var new_p in d.pairs)
                        {
                            new_w_pairs.Add(new_p);
                        }
                    }


                    foreach (var ex_p in old_w_pairs)
                    {
                        if (ex_p.hash == null)
                        {
                            //Debug.LogError ("Found null hash");
                            // pair needs migration
                            if (ex_p.edited)
                            {
                                // than needs more work:
                                // if its the only pair on this week with such hash
                                if (old_w_pairs.Where(x => x.initial_hash == ex_p.initial_hash).Count() == 1)
                                {
                                    // try to find in new pairs pair with same initial_hash
                                    var new_pairs_with_same_initial_hash = new_w_pairs.Where(
                                        x => ex_p.initial_hash == x.initial_hash
                                        ).ToList();
                                    if (new_pairs_with_same_initial_hash.Count > 0)
                                    {
                                        //Debug.LogWarning ("Found similar pair in new data for migration");
                                        // than take this new pair and calculate old pair's hash using it
                                        var new_pair = new_pairs_with_same_initial_hash [0];
                                        ex_p.hash = new_pair.hash;
                                    }
                                    else
                                    {
                                        //Debug.LogError ("Cant find similar (initila_hash) pair in new data");
                                        // in this case cant restore
                                        // than replace it with new pairs on update
                                    }
                                }
                                else
                                {
                                    //Debug.LogError ("Pair is not single on this week");
                                    // cant restore - replace on update
                                }
                            }
                            else
                            {
                                // just calculate new hash
                                if (ex_p.deleted)
                                {
                                    //Debug.LogWarning ("Set new hash for deleted pair");
                                }
                                ex_p.hash = TimetableParser.GetPairMD5(ex_p.day.DayOfWeek, ex_p.time, ex_p.name, ex_p.location, ex_p.lecturer, old_w.weekType);
                            }
                        }
                        else
                        {
                            //Debug.LogError ("HASH IS NOT NULL!");
                        }
                    }
                }
            }



            // foreach existing pair check if it stays or not
            foreach (var ex_p in exisitingPairs)
            {
                if (ex_p.hash == null)
                {
                    Debug.LogError("Exisiting pair hash is null!");
                }
                if (newPairs.FindAll(x => x.hash == ex_p.hash).Count == 0)
                {
                    // no such pair in new data - delete it from our local data
                    removePair(ex_p, immediateSaveToDB: false);
                    anyChanges = true;
                }
                else
                {
                    // found such pair in new data
                    // remove it from list of new data
                    newPairs.RemoveAll(x => x.hash == ex_p.hash);
                }
            }

            // save our removals to DB
            saveTimetableToDatabase(currentWeek, nextWeek);

            // add rest of new data
            foreach (var new_p in newPairs)
            {
                addPair(new_p, saveState: false);                 // adds directly to db
                anyChanges = true;
            }

            // done saving new data
        }

        return(anyChanges);
    }