亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? btreemultifieldindex.cs

?? Perst開源實時數據庫
?? CS
?? 第 1 頁 / 共 2 頁
字號:
namespace Perst.Impl
{
    using System;
#if USE_GENERICS
    using System.Collections.Generic;
#endif
    using System.Collections;
    using System.Reflection;
    using System.Diagnostics;
    using Perst;
	
#if USE_GENERICS
    class BtreeMultiFieldIndex<V>:Btree<object[],V>, MultiFieldIndex<V> where V:class,IPersistent
#else
    class BtreeMultiFieldIndex:Btree, MultiFieldIndex
#endif
    {
        internal String className;
        internal String[] fieldNames;
        internal ClassDescriptor.FieldType[] types;
        [NonSerialized()]
        Type cls;
        [NonSerialized()]
        MemberInfo[] mbr;
 
        internal BtreeMultiFieldIndex()
        {
        }

        private void locateFields() 
        {
            mbr = new MemberInfo[fieldNames.Length];
            for (int i = 0; i < fieldNames.Length; i++) 
            {
                Type compType;
                mbr[i] = ClassDescriptor.lookupComponent(cls, fieldNames[i], out compType);
                if (mbr[i] == null) 
                { 
                    throw new StorageError(StorageError.ErrorCode.INDEXED_FIELD_NOT_FOUND, className + "." + fieldNames[i]);
                }
            }
        }

        public Type IndexedClass 
        {
            get 
            { 
                return cls;
            }
        }

        public MemberInfo KeyField 
        {
            get 
            { 
                return mbr[0];
            }
        }

        public MemberInfo[] KeyFields 
        {
            get 
            { 
                return mbr;
            }
        }

        public override ClassDescriptor.FieldType[] FieldTypes 
        {
            get
            { 
                return types;
            }
        }

        public override void OnLoad()
        {
            cls = ClassDescriptor.lookup(Storage, className);
#if USE_GENERICS
            if (cls != typeof(V)) 
            {
                throw new StorageError(StorageError.ErrorCode.INCOMPATIBLE_VALUE_TYPE, cls);
            }
#endif
            locateFields();
        }
		
#if USE_GENERICS
        internal BtreeMultiFieldIndex(string[] fieldNames, bool unique) 
        :  this(typeof(V),  fieldNames, unique)
        {
        }
#endif

        internal BtreeMultiFieldIndex(Type cls, string[] fieldNames, bool unique) 
        {
            init(cls, null, fieldNames, unique, 0);
        }

        public override void init(Type cls, ClassDescriptor.FieldType[] mfTypes, string[] fieldNames, bool unique, long autoincCount) 
        {
            this.cls = cls;
            this.unique = unique;
            this.fieldNames = fieldNames;
            this.className = ClassDescriptor.getTypeName(cls);
            locateFields();
            type = ClassDescriptor.FieldType.tpArrayOfByte;        
            types = new ClassDescriptor.FieldType[fieldNames.Length];
            for (int i = 0; i < types.Length; i++) 
            {
                Type mbrType = mbr[i] is FieldInfo ? ((FieldInfo)mbr[i]).FieldType : ((PropertyInfo)mbr[i]).PropertyType;
                types[i] = checkType(mbrType);
            }
        }

        public override int compareByteArrays(byte[] key, byte[] item, int offs, int lengtn) 
        { 
            int o1 = 0;
            int o2 = offs;
            byte[] a1 = key;
            byte[] a2 = item;
            for (int i = 0; i < types.Length && o1 < key.Length; i++) 
            {
                int diff = 0;
                switch (types[i]) 
                { 
                    case ClassDescriptor.FieldType.tpBoolean:
                    case ClassDescriptor.FieldType.tpByte:
                        diff = a1[o1++] - a2[o2++];
                        break;
                    case ClassDescriptor.FieldType.tpSByte:
                        diff = (sbyte)a1[o1++] - (sbyte)a2[o2++];
                        break;
                    case ClassDescriptor.FieldType.tpShort:
                        diff = Bytes.unpack2(a1, o1) - Bytes.unpack2(a2, o2);
                        o1 += 2;
                        o2 += 2;
                        break;
                    case ClassDescriptor.FieldType.tpUShort:
                        diff = (ushort)Bytes.unpack2(a1, o1) - (ushort)Bytes.unpack2(a2, o2);
                        o1 += 2;
                        o2 += 2;
                        break;
                    case ClassDescriptor.FieldType.tpChar:
                        diff = (char)Bytes.unpack2(a1, o1) - (char)Bytes.unpack2(a2, o2);
                        o1 += 2;
                        o2 += 2;
                        break;
                    case ClassDescriptor.FieldType.tpInt:
                    {
                        int i1 = Bytes.unpack4(a1, o1);
                        int i2 = Bytes.unpack4(a2, o2);
                        diff = i1 < i2 ? -1 : i1 == i2 ? 0 : 1;
                        o1 += 4;
                        o2 += 4;
                        break;
                    }
                    case ClassDescriptor.FieldType.tpUInt:
                    case ClassDescriptor.FieldType.tpEnum:
                    case ClassDescriptor.FieldType.tpObject:
                    case ClassDescriptor.FieldType.tpOid:
                    {
                        uint u1 = (uint)Bytes.unpack4(a1, o1);
                        uint u2 = (uint)Bytes.unpack4(a2, o2);
                        diff = u1 < u2 ? -1 : u1 == u2 ? 0 : 1;
                        o1 += 4;
                        o2 += 4;
                        break;
                    }
                    case ClassDescriptor.FieldType.tpLong:
                    {
                        long l1 = Bytes.unpack8(a1, o1);
                        long l2 = Bytes.unpack8(a2, o2);
                        diff = l1 < l2 ? -1 : l1 == l2 ? 0 : 1;
                        o1 += 8;
                        o2 += 8;
                        break;
                    }
                    case ClassDescriptor.FieldType.tpULong:
                    case ClassDescriptor.FieldType.tpDate:
                    {
                        ulong l1 = (ulong)Bytes.unpack8(a1, o1);
                        ulong l2 = (ulong)Bytes.unpack8(a2, o2);
                        diff = l1 < l2 ? -1 : l1 == l2 ? 0 : 1;
                        o1 += 8;
                        o2 += 8;
                        break;
                    }
                    
                    case ClassDescriptor.FieldType.tpFloat:
                    {
                        float f1 = Bytes.unpackF4(a1, o1);
                        float f2 = Bytes.unpackF4(a2, o2);
                        diff = f1 < f2 ? -1 : f1 == f2 ? 0 : 1;
                        o1 += 4;
                        o2 += 4;
                        break;
                    }
                    case ClassDescriptor.FieldType.tpDouble:
                    {
                        double d1 = Bytes.unpackF8(a1, o1);
                        double d2 = Bytes.unpackF8(a2, o2);
                        diff = d1 < d2 ? -1 : d1 == d2 ? 0 : 1;
                        o1 += 8;
                        o2 += 8;
                        break;
                    }

                    case ClassDescriptor.FieldType.tpDecimal:
                    {
                        decimal d1 = Bytes.unpackDecimal(a1, o1);
                        decimal d2 = Bytes.unpackDecimal(a2, o2);
                        diff = d1.CompareTo(d2);
                        o1 += 16;
                        o2 += 16;
                        break;
                    }
 
                    case ClassDescriptor.FieldType.tpGuid:
                    {
                        Guid g1 = Bytes.unpackGuid(a1, o1);
                        Guid g2 = Bytes.unpackGuid(a2, o2);
                        diff = g1.CompareTo(g2);
                        o1 += 16;
                        o2 += 16;
                        break;
                    }

                    case ClassDescriptor.FieldType.tpString:
                    {
                        int len1 = Bytes.unpack4(a1, o1);
                        int len2 = Bytes.unpack4(a2, o2);
                        o1 += 4;
                        o2 += 4;
                        int len = len1 < len2 ? len1 : len2;
                        while (--len >= 0) 
                        { 
                            diff = (char)Bytes.unpack2(a1, o1) - (char)Bytes.unpack2(a2, o2);
                            if (diff != 0) 
                            { 
                                return diff;
                            }
                            o1 += 2;
                            o2 += 2;
                        }
                        diff = len1 - len2;
                        break;
                    }
                    case ClassDescriptor.FieldType.tpArrayOfByte:
                    {
                        int len1 = Bytes.unpack4(a1, o1);
                        int len2 = Bytes.unpack4(a2, o2);
                        o1 += 4;
                        o2 += 4;
                        int len = len1 < len2 ? len1 : len2;
                        while (--len >= 0) 
                        { 
                            diff = a1[o1++] - a2[o2++];
                            if (diff != 0) 
                            { 
                                return diff;
                            }
                        }
                        diff = len1 - len2;
                        break;
                    }
                    default:
                        Debug.Assert(false, "Invalid type");
                        break;
                }
                if (diff != 0) 
                { 
                    return diff;
                }
            }
            return 0;
        }

        protected override object unpackByteArrayKey(Page pg, int pos) 
        {
            int offs = BtreePage.firstKeyOffs + BtreePage.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);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区不卡免费| 国产精品色哟哟| 一本到高清视频免费精品| 久久精品国产精品亚洲精品| 亚洲欧美电影一区二区| 国产喷白浆一区二区三区| 日韩视频在线一区二区| 91黄色在线观看| 成人免费不卡视频| 国产精品一二一区| 狠狠色丁香久久婷婷综合_中 | 国产91富婆露脸刺激对白| 亚洲人成7777| 久久婷婷一区二区三区| 色丁香久综合在线久综合在线观看| 久久99久久久久久久久久久| 视频一区中文字幕国产| 亚洲制服欧美中文字幕中文字幕| 自拍av一区二区三区| 自拍av一区二区三区| 国产精品久久久久四虎| 国产精品剧情在线亚洲| 亚洲国产精品激情在线观看| 国产视频在线观看一区二区三区| 国产午夜精品理论片a级大结局| 欧美精品一区二| 国产日韩影视精品| 亚洲精品一线二线三线| 2021中文字幕一区亚洲| 国产亚洲精品资源在线26u| 伊人色综合久久天天| 亚洲色图第一区| 亚洲精品视频一区| 五月天精品一区二区三区| 偷拍亚洲欧洲综合| 精彩视频一区二区三区| 国产一区二区三区电影在线观看| 懂色一区二区三区免费观看| 91在线观看污| 在线观看91av| 国产喂奶挤奶一区二区三区| 中文字幕欧美激情一区| 一区二区三区中文字幕精品精品| 亚洲一区二区精品视频| 秋霞成人午夜伦在线观看| 激情欧美一区二区三区在线观看| 国产精品99久久久久久久vr| 国产91丝袜在线播放九色| 色综合久久中文综合久久牛| 欧美亚洲一区二区在线| 欧美色图天堂网| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 日韩激情在线观看| 国产精品一品视频| 欧美精品第1页| 中文字幕av在线一区二区三区| 一区二区三区丝袜| 美女免费视频一区| 99国产精品国产精品毛片| 欧美一区二区三区免费视频 | 国产一区二区三区观看| 精品视频资源站| 国产精品国产三级国产| 五月婷婷久久丁香| 成人黄页在线观看| 在线综合+亚洲+欧美中文字幕| 久久毛片高清国产| 日本三级亚洲精品| 一本高清dvd不卡在线观看| 精品粉嫩超白一线天av| 国产精品久99| 国模套图日韩精品一区二区| 在线观看三级视频欧美| www成人在线观看| 日韩在线播放一区二区| 色综合久久久久久久| 国产女人水真多18毛片18精品视频| 亚洲福利一区二区| 91美女在线视频| 欧美激情中文字幕一区二区| 精品综合久久久久久8888| 欧美亚洲动漫另类| 一区二区三区高清不卡| 波多野结衣视频一区| 久久精品视频网| 九一九一国产精品| 日韩久久免费av| 日韩电影一区二区三区| 欧美日韩国产首页在线观看| 亚洲欧美日韩人成在线播放| 成人sese在线| ●精品国产综合乱码久久久久| 国产乱一区二区| 国产午夜精品福利| 国产成人午夜精品5599| 久久精品夜色噜噜亚洲aⅴ| 免费av成人在线| 久久久久久免费| 久久99国产精品成人| 精品精品欲导航| 久88久久88久久久| 久久青草欧美一区二区三区| 久久精品国产99久久6| 日韩欧美国产综合| 国产老肥熟一区二区三区| 久久久精品国产99久久精品芒果 | 9191久久久久久久久久久| 亚洲乱码国产乱码精品精可以看 | 久久草av在线| 久久这里只精品最新地址| 国产成人免费xxxxxxxx| 国产精品美女久久久久久久久久久| 成+人+亚洲+综合天堂| 亚洲女子a中天字幕| 欧美性三三影院| 久久99国产精品久久99果冻传媒| 26uuu欧美日本| 色婷婷久久久久swag精品| 午夜精品一区二区三区电影天堂 | 久久国产精品72免费观看| 欧美成人三级在线| 国产69精品久久久久毛片| 亚洲视频免费看| 欧美性猛片aaaaaaa做受| 国产成人欧美日韩在线电影| 亚洲特级片在线| 欧美福利一区二区| 国产成人自拍在线| 亚洲一区中文日韩| 欧美xingq一区二区| 国产精品一区二区三区四区| 亚洲欧美日韩中文播放| 日韩女优毛片在线| 91丨porny丨蝌蚪视频| 毛片av中文字幕一区二区| 国产精品国产三级国产a| 日韩你懂的在线观看| 不卡免费追剧大全电视剧网站| 日本午夜精品视频在线观看| 中文字幕一区二区三区蜜月| 欧美一级片在线看| 一本到不卡免费一区二区| 久久66热偷产精品| 日韩在线观看一区二区| 中文字幕一区二区三区精华液| 日韩精品中文字幕在线一区| 色88888久久久久久影院按摩 | 日韩高清在线不卡| 综合久久综合久久| 2021国产精品久久精品| 欧美色网一区二区| 一本一本久久a久久精品综合麻豆| 美女国产一区二区三区| 香蕉久久一区二区不卡无毒影院| 国产精品视频在线看| 91视频com| 国产又粗又猛又爽又黄91精品| 成人欧美一区二区三区小说 | 一本大道av一区二区在线播放| 美美哒免费高清在线观看视频一区二区| 日韩女优制服丝袜电影| 欧美日韩一区二区三区四区五区| 成人avav影音| 久久福利资源站| 另类小说图片综合网| 亚洲午夜免费视频| 亚洲自拍偷拍九九九| 亚洲美女视频在线观看| 久久久久99精品国产片| 国产性色一区二区| 久久久久久久久久久久久久久99| 日韩一区二区三区视频在线| 欧美另类久久久品| 欧美一级精品大片| 日韩欧美一级在线播放| 欧美成va人片在线观看| 日韩一区二区免费高清| 欧美成人乱码一区二区三区| 欧美一区二区成人6969| 欧美一级久久久| 精品国产91乱码一区二区三区| 日韩亚洲欧美一区| 精品动漫一区二区三区在线观看 | 国产精品福利av | 日韩不卡免费视频| 久久97超碰色| 99精品国产99久久久久久白柏| 欧美午夜理伦三级在线观看| 日韩欧美国产综合一区| 亚洲欧美综合网| 蜜臀久久99精品久久久久宅男| 国产精品1区2区| 欧美日韩精品久久久| 久久久影院官网| 亚洲成人在线网站| 成人午夜电影久久影院| 欧美久久久久久久久久| 亚洲欧洲日产国产综合网| 捆绑紧缚一区二区三区视频 | 亚洲午夜av在线|