Beispiel #1
0
        private Ndx[] exindexes = null; // Дополнительные индексы для внешних ключей

        internal KVSequencePortion(Polar.PagedStreams.StreamStorage ss, PType tp_element, object[] stream_numbers)
        {
            //this.tp_element = tp_element;
            //PType tp_sequ = new PTypeSequence(
            //    tp_element
            //    );
            // Создадим базу данных, состоящую из последовательности и двух индексных массивов: массива ключей и массива офсетов

            Stream stream1 = ss[(int)stream_numbers[0]];

            keyvalue_seq = new UniversalSequence <int>(tp_element, stream1);

            Stream stream2 = ss[(int)stream_numbers[1]];

            keys = new UniversalSequence <int>(new PType(PTypeEnumeration.integer), stream2);
            Stream stream3 = ss[(int)stream_numbers[2]];

            offsets = new UniversalSequence <long>(new PType(PTypeEnumeration.longinteger), stream3);

            // Addition - обработка дополнительных индексов внешних ключей
            if (stream_numbers.Length > 3)
            {
                // По 2 на индекс
                int nadd_streams = stream_numbers.Length - 3;
                if (nadd_streams % 2 != 0)
                {
                    throw new Exception("Err: 22378829");
                }
                int nadditions = nadd_streams / 2;
                exindexes = new Ndx[nadditions];
                for (int i = 0; i < nadditions; i++)
                {
                    Stream stream4 = ss[(int)stream_numbers[i * 2 + 3]];
                    //UniversalSequence<int> exkey = new UniversalSequence<int>(new PType(PTypeEnumeration.integer), stream4);
                    //Stream stream5 = ss[(int)stream_numbers[i * 2 + 4]];
                    //UniversalSequence<int> prikey = new UniversalSequence<int>(new PType(PTypeEnumeration.integer), stream5);
                    //exindexes[i] = new Ndx() { exkeys = exkey, prikeys = prikey };
                    UniversalSequence <int> exprikeys = new UniversalSequence <int>(new PTypeRecord(
                                                                                        new NamedType("exkey", new PType(PTypeEnumeration.integer)),
                                                                                        new NamedType("prikey", new PType(PTypeEnumeration.integer))), stream4);
                    exindexes[i] = new Ndx()
                    {
                        exprikeys = exprikeys
                    };
                }
            }

            // Если базовая последовательность пустая - чистить все
            if (keyvalue_seq.Count() == 0)
            {
                Clear();
            }
        }
Beispiel #2
0
        public void CreateDatabase()
        {
            if (sstorage != null)
            {
                sstorage.Close();
            }
            //char last = path[path.Length - 1];
            //if (last != '/' && last != '\\') path = path + "/";
            string filename = path + "streamstorage.bin";
            bool   exists   = System.IO.File.Exists(filename);

            if (exists)
            {
                System.IO.File.Delete(filename);
            }
            sstorage = new Polar.PagedStreams.StreamStorage(filename);
            portions = new List <KVSequencePortion>();

            object[] parts = ((object[])(configuration[2]))
                             .Cast <object[]>()
                             .Where(sec => (int)sec[2] == nodecode)
                             .ToArray();
            sections = new List <Secrecord>();
            List <int[]> portion_streams_list = new List <int[]>();

            foreach (object[] part in parts)
            {
                int n1, n2, n3;
                sstorage.CreateStream(out n1);
                sstorage.CreateStream(out n2);
                sstorage.CreateStream(out n3);

                List <object> stream_numbers = new List <object>(new object[] { n1, n2, n3 });

                int   tab           = (int)part[0];
                int[] index_columns = tab2indxs(tab);

                foreach (int col in index_columns)
                {
                    int n4, n5;
                    sstorage.CreateStream(out n4);
                    sstorage.CreateStream(out n5);
                    stream_numbers.Add(n4);
                    stream_numbers.Add(n5);
                }

                portion_streams_list.Add(stream_numbers.Select(ob => (int)ob).ToArray());

                object[] por_numbers = stream_numbers.ToArray();
                //part[3] = por_numbers; // прямое размещение номеров в конфигураторе для мастера, но слэйвы должны эти конфигуратор вернуть
                PType tp_element  = tab2t(tab);
                var   portion     = new KVSequencePortion(sstorage, tp_element, por_numbers);
                int   ind_portion = portions.Count;
                portions.Add(portion);
                //TODO: portions.Add(new Tuple<int, int>((int)part[0], (int)part[1]), portion);
                sections.Add(new Secrecord()
                {
                    table = (int)part[0], section = (int)part[1], portion = ind_portion
                });
            }

            //// Создадим portion_streams и запомним
            //int[][] portion_streams = portion_streams_list.ToArray();
            //PaCell porstreamscell = new PaCell(new PTypeSequence(new PTypeSequence(new PType(PTypeEnumeration.integer))),
            //    path + "porstreams.pac", false);
            //porstreamscell.Clear();
            //porstreamscell.Fill(portion_streams.Select(arr => arr.Select(i => (object)i).ToArray()).ToArray());
            //porstreamscell.Close();

            // Послать команду другим узлам
            if (ismaster)
            {
                // Пригодится функция (t p n) => part в конфигураторе

                Func <int, int, int, object[]> tpn2part = (t, p, n) =>
                                                          ((object[])configuration[2])
                                                          .Cast <object[]>()
                                                          .First(sec => (int)sec[0] == t && (int)sec[1] == p && (int)sec[2] == n);
                // Здесь надо инициировать другие узлы...
                int nnodes = ((object[])configuration[1]).Count();
                for (int nd = 1; nd < nnodes; nd++)
                {
                    // Номер канала (в узле мастера) на единицу меньше номера узла
                    object[] prts = (object[])indicomm.Order(nd - 1, _createdatabase, 0, null); // указывается нулевая таблица
                }
            }
        }