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(); } }
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); // указывается нулевая таблица } } }