Example #1
0
        void init()
        {
            var streamTable = metadata.getStream("#~") ?? metadata.getStream("#-");

            if (streamTable == null)
            {
                throw new ApplicationException("Could not find #~ stream");
            }

            seek(streamTable.Offset);
            reader.ReadUInt32();                // reserved
            reader.ReadUInt16();                // major + minor version
            heapOffsetSizes = reader.ReadByte();
            reader.ReadByte();                  // always 1
            ulong validMask = reader.ReadUInt64();

            reader.ReadUInt64();                // sorted

            var numRows = new uint[64];

            for (int i = 0; validMask != 0; i++, validMask >>= 1)
            {
                if ((validMask & 1) != 0)
                {
                    numRows[i] = reader.ReadUInt32();
                }
            }

            var  builder    = new MetadataTypeBuilder(heapOffsetSizes, numRows);
            uint fileOffset = (uint)reader.BaseStream.Position;

            for (int i = 0, j = 0; ; i++)
            {
                if (metadataVarType[i] == MVT.end)
                {
                    var mdType = builder.create();
                    mdType.rows        = numRows[j];
                    mdType.fileOffset  = fileOffset;
                    fileOffset        += mdType.rows * mdType.totalSize;
                    metadataTypes[j++] = mdType;
                }
                else if (metadataVarType[i] == MVT.stop)
                {
                    break;
                }
                else
                {
                    builder.field(metadataVarType[i]);
                }
            }
        }
Example #2
0
        void init()
        {
            var streamTable = metadata.getStream("#~") ?? metadata.getStream("#-");
            if (streamTable == null)
                throw new ApplicationException("Could not find #~ stream");

            seek(streamTable.Offset);
            reader.ReadUInt32();	// reserved
            reader.ReadUInt16();	// major + minor version
            heapOffsetSizes = reader.ReadByte();
            reader.ReadByte();		// always 1
            ulong validMask = reader.ReadUInt64();
            reader.ReadUInt64();	// sorted

            var numRows = new uint[64];
            for (int i = 0; validMask != 0; i++, validMask >>= 1) {
                if ((validMask & 1) != 0)
                    numRows[i] = reader.ReadUInt32();
            }

            var builder = new MetadataTypeBuilder(heapOffsetSizes, numRows);
            uint fileOffset = (uint)reader.BaseStream.Position;
            for (int i = 0, j = 0; ; i++) {
                if (metadataVarType[i] == MVT.end) {
                    var mdType = builder.create();
                    mdType.rows = numRows[j];
                    mdType.fileOffset = fileOffset;
                    fileOffset += mdType.rows * mdType.totalSize;
                    metadataTypes[j++] = mdType;
                }
                else if (metadataVarType[i] == MVT.stop)
                    break;
                else
                    builder.field(metadataVarType[i]);
            }
        }