예제 #1
0
 public override V[] ToArray()
 {
     V[] arr = (V[])Array.CreateInstance(cls, nElems);
     if (root != 0)
     {
         OldBtreePage.traverseForward((DatabaseImpl)Database, root, type, height, arr, 0);
     }
     return(arr);
 }
예제 #2
0
        internal void getByteArray(Page pg, int i)
        {
            int len  = OldBtreePage.getKeyStrSize(pg, i);
            int offs = OldBtreePage.firstKeyOffs + OldBtreePage.getKeyStrOffs(pg, i);

            byte[] bval = new byte[len];
            Array.Copy(pg.data, offs, bval, 0, len);
            key = new Key(bval);
        }
예제 #3
0
        public override V[] Get(Key from, Key till)
        {
            ArrayList list = new ArrayList();

            if (root != 0)
            {
                OldBtreePage.find((DatabaseImpl)Database, root, checkKey(from), checkKey(till), this, height, list);
            }
            return((V[])list.ToArray(cls));
        }
예제 #4
0
        internal void getStr(Page pg, int i)
        {
            int len  = OldBtreePage.getKeyStrSize(pg, i);
            int offs = OldBtreePage.firstKeyOffs + OldBtreePage.getKeyStrOffs(pg, i);

            char[] sval = new char[len];
            for (int j = 0; j < len; j++)
            {
                sval[j] = (char)Bytes.unpack2(pg.data, offs);
                offs   += 2;
            }
            key = new Key(sval);
        }
        protected override object unpackByteArrayKey(Page pg, int pos)
        {
            int offs = OldBtreePage.firstKeyOffs + OldBtreePage.getKeyStrOffs(pg, pos);

            byte[]   data   = pg.data;
            Object[] values = new Object[types.Length];

            for (int i = 0; i < types.Length; i++)
            {
                Object v = null;
                switch (types[i])
                {
                case ClassDescriptor.FieldType.tpBoolean:
                    v = data[offs++] != 0;
                    break;

                case ClassDescriptor.FieldType.tpSByte:
                    v = (sbyte)data[offs++];
                    break;

                case ClassDescriptor.FieldType.tpByte:
                    v = data[offs++];
                    break;

                case ClassDescriptor.FieldType.tpShort:
                    v     = Bytes.unpack2(data, offs);
                    offs += 2;
                    break;

                case ClassDescriptor.FieldType.tpUShort:
                    v     = (ushort)Bytes.unpack2(data, offs);
                    offs += 2;
                    break;

                case ClassDescriptor.FieldType.tpChar:
                    v     = (char)Bytes.unpack2(data, offs);
                    offs += 2;
                    break;

                case ClassDescriptor.FieldType.tpInt:
                    v     = Bytes.unpack4(data, offs);
                    offs += 4;
                    break;

                case ClassDescriptor.FieldType.tpEnum:
                    v = Enum.ToObject(mbr[i] is FieldInfo ? ((FieldInfo)mbr[i]).FieldType : ((PropertyInfo)mbr[i]).PropertyType,
                                      Bytes.unpack4(data, offs));
                    offs += 4;
                    break;

                case ClassDescriptor.FieldType.tpUInt:
                    v     = (uint)Bytes.unpack4(data, offs);
                    offs += 4;
                    break;

                case ClassDescriptor.FieldType.tpOid:
                case ClassDescriptor.FieldType.tpObject:
                {
                    int oid = Bytes.unpack4(data, offs);
                    v     = oid == 0 ? null : ((DatabaseImpl)Database).lookupObject(oid, null);
                    offs += 4;
                    break;
                }

                case ClassDescriptor.FieldType.tpLong:
                    v     = Bytes.unpack8(data, offs);
                    offs += 8;
                    break;

                case ClassDescriptor.FieldType.tpDate:
                {
                    v     = new DateTime(Bytes.unpack8(data, offs));
                    offs += 8;
                    break;
                }

                case ClassDescriptor.FieldType.tpULong:
                    v     = (ulong)Bytes.unpack8(data, offs);
                    offs += 8;
                    break;

                case ClassDescriptor.FieldType.tpFloat:
                    v     = Bytes.unpackF4(data, offs);
                    offs += 4;
                    break;

                case ClassDescriptor.FieldType.tpDouble:
                    v     = Bytes.unpackF8(data, offs);
                    offs += 8;
                    break;

                case ClassDescriptor.FieldType.tpDecimal:
                    v     = Bytes.unpackDecimal(data, offs);
                    offs += 16;
                    break;

                case ClassDescriptor.FieldType.tpGuid:
                    v     = Bytes.unpackGuid(data, offs);
                    offs += 16;
                    break;

                case ClassDescriptor.FieldType.tpString:
                {
                    int len = Bytes.unpack4(data, offs);
                    offs += 4;
                    char[] sval = new char[len];
                    for (int j = 0; j < len; j++)
                    {
                        sval[j] = (char)Bytes.unpack2(pg.data, offs);
                        offs   += 2;
                    }
                    v = new String(sval);
                    break;
                }

                case ClassDescriptor.FieldType.tpArrayOfByte:
                {
                    int len = Bytes.unpack4(data, offs);
                    offs += 4;
                    byte[] val = new byte[len];
                    Array.Copy(pg.data, offs, val, 0, len);
                    offs += len;
                    v     = val;
                    break;
                }

                default:
                    Debug.Assert(false, "Invalid type");
                    break;
                }
                values[i] = v;
            }
            return(values);
        }