Esempio n. 1
0
        public void ReadAll(bool ReadRemoved = false)
        {
            allRecords = new List <T>();
            OpenMainRead();
            BaseClass trash = (BaseClass)Activator.CreateInstance(typeof(T));
            int       line  = Convert.ToInt32(mainFile.Length) / trash.RowSize();

            for (int id = 0; id < line; id++)
            {
                Tuple <BaseClass, Dictionary <PropertyInfo, int> > fillingLog;
                fillingLog = FileOps.ReadSingleRecord(mainFile, id + 1, typeof(T));
                BaseClass rec = fillingLog.Item1;
                if (ReadRemoved || !rec.removed)
                {
                    allRecords.Add((T)rec);
                    foreach (KeyValuePair <PropertyInfo, int> kp in fillingLog.Item2) //OTOReq'ler
                    {
                        object dbset = ctx.GetDBSetByType(kp.Key.PropertyType);
                        if (kp.Value == -1) //null, okumaya çalışma!
                        {
                            continue;
                        }
                        Tuple <object, PropertyInfo, int> RecordToBeFilled = new Tuple <object, PropertyInfo, int>(fillingLog.Item1, kp.Key, kp.Value);

                        object[] parameters = { new OTOReq(fillingLog.Item1, kp.Key, kp.Value) };
                        dbset.GetType().GetMethod("AddOTOReq").Invoke(dbset, parameters);
                    }
                    foreach (PropertyInfo OTM in trash.OTM_One())
                    {
                        if (OTM.GetValue(fillingLog.Item1) == null)
                        {
                            OTM.SetValue(OTM.GetValue(fillingLog.Item1), Activator.CreateInstance(OTM.PropertyType));
                        }
                        object   dbset      = ctx.GetDBSetByType(OTM.PropertyType.GetGenericArguments()[0]);
                        object[] parameters = { new Tuple <object, PropertyInfo>(fillingLog.Item1, OTM) };
                        dbset.GetType().GetMethod("AddOTMReq").Invoke(dbset, parameters);
                    }

                    //MTM
                    ReadMTM(fillingLog.Item1);
                }
            }
            mainFile.Close();
        }
Esempio n. 2
0
        /// <summary>
        /// Reads the middle table of many-to-many relationship. Bad performance currently, because it reads the
        /// middle file everytime a record is read.
        /// </summary>
        /// <param name="rec"></param>
        public void ReadMTM(BaseClass rec)
        {
            foreach (MTMRelationInfo mtmInfo in rec.MTMInfoList())
            {
                String        filepath  = Path.Combine(ctx.DatabaseFolder, mtmInfo.tableName) + ".dat"; //mtm middle tablo yolu
                Stream        mtmStream = File.OpenRead(filepath);
                int           line      = Convert.ToInt32(mtmStream.Length / (sizeof(int) * 3));
                List <MTMRec> mtmRecs   = new List <MTMRec>(); //middle tablo kayıtları
                for (int i = 0; i < line; i++)
                {
                    Tuple <DKDB.BaseClass, Dictionary <PropertyInfo, int> > fillingLog;

                    fillingLog = FileOps.ReadSingleRecord(mtmStream, i + 1, typeof(MTMRec));
                    mtmRecs.Add((MTMRec)fillingLog.Item1);
                }
                mtmStream.Close();
                int    my_id_column = WhoAmI(mtmInfo.tableName); //MTMRec içinde id1 mi benim sütunum yoksa id2 mi? ctx'teki sıraya göre kontrol edilir
                MTMReq mtmReq       = new MTMReq(rec, mtmInfo.OwnMTMProp);

                foreach (MTMRec mtmRec in mtmRecs) //her bir middle tablo kaydı için:
                {
                    if (my_id_column == 1 && mtmRec.id_1 == rec.id)
                    {
                        mtmReq.AddOppId(mtmRec.id_2);//opposite id
                    }
                    else if (my_id_column == 2 && mtmRec.id_2 == rec.id)
                    {
                        mtmReq.AddOppId(mtmRec.id_1);//opposite id
                    }
                }

                KeyValuePair <string, Tuple <Type, Type> > kp = BaseClass.AllMTMRelations.FirstOrDefault(r => r.Key == mtmInfo.tableName);
                object   opposite_dbset = ctx.GetDBSetByType(my_id_column == 1 ? kp.Value.Item2 : kp.Value.Item1);
                object[] parameters     = new object[1];

                parameters[0] = mtmReq; //list of ids of the records that we want to read from opposite db
                PropertyInfo  fi      = opposite_dbset.GetType().GetProperty("MTMReqList");
                List <MTMReq> rtbfMTM = fi.GetValue(opposite_dbset) as List <MTMReq>;
                rtbfMTM.GetType().GetMethod("Add").Invoke(rtbfMTM, parameters);
            }
        }