Beispiel #1
0
        public static IEnumerable ReadSizedBlocks(SqlFileInfo fileInfo, SqlInt64 offset, SqlByte sizing, [DefaultValue("NULL")] SqlInt32 maxCount)
        {
            if (fileInfo.IsNull || sizing.IsNull)
            {
                yield break;
            }

            var sizeEncoding = (SizeEncoding)sizing.Value;

            if (sizeEncoding == SizeEncoding.NO)
            {
                yield break;
            }

            using (var fs = fileInfo.FileInfo.OpenRead())
            {
                if (!offset.IsNull)
                {
                    fs.Position = offset.Value;
                }
                var position = fs.Position;
                foreach (var block in fs.ReadCollection(s => s.TryReadBytes(sizeEncoding), maxCount.IsNull ? int.MaxValue : maxCount.Value))
                {
                    yield return(Tuple.Create(position, block));

                    position = fs.Position;
                }
            }
        }
Beispiel #2
0
        public static IEnumerable ReadLinesByCpName(SqlFileInfo fileInfo, SqlInt64 offset, SqlString searchTerminator, SqlString delimiter, [DefaultValue("''")] SqlString newTerminator,
                                                    [DefaultValue("NULL")] SqlInt32 maxCount, SqlBoolean detectEncoding, [SqlFacet(MaxSize = 128)] SqlString cpName)
        {
            if (fileInfo.IsNull || searchTerminator.IsNull)
            {
                yield break;
            }

            var fileEncoding    = cpName.IsNull ? SqlRuntime.FileEncoding : Encoding.GetEncoding(cpName.Value);
            var terminatorsList = searchTerminator.IsNull || delimiter.Value.Length == 0 ? new[] { searchTerminator.Value } : searchTerminator.Value.Split(new[] { delimiter.Value }, StringSplitOptions.RemoveEmptyEntries);

            using (var fs = fileInfo.FileInfo.OpenRead())
            {
                if (detectEncoding.IsTrue)
                {
                    var preamble = EncodingPreamble.Detect(fs.ReadAt(0L, s => s.ReadBytesMost(1, 4)) ?? new byte[0]);
                    if (preamble != null)
                    {
                        fileEncoding = Encoding.GetEncoding(preamble.CodePage);
                    }
                }
                if (!offset.IsNull)
                {
                    fs.Position = offset.Value;
                }
                var position = fs.Position;
                foreach (var line in fs.ReadLines(fileEncoding, terminatorsList, newTerminator.IsNull ? null : newTerminator.Value, maxCount.IsNull ? int.MaxValue : maxCount.Value))
                {
                    yield return(Tuple.Create(position, line));

                    position = fs.Position;
                }
            }
        }
Beispiel #3
0
        public static IEnumerable ReadTerminatedBlocks(SqlFileInfo fileInfo, SqlInt64 offset, SqlBytes searchTerminator, [DefaultValue("1")] SqlBoolean omitTerminator, [DefaultValue("NULL")] SqlInt32 maxCount)
        {
            if (fileInfo.IsNull || searchTerminator.IsNull)
            {
                yield break;
            }

            var terminator = searchTerminator.Value;

            using (var fs = fileInfo.FileInfo.OpenRead())
            {
                if (!offset.IsNull)
                {
                    fs.Position = offset.Value;
                }
                var position = fs.Position;
                foreach (var block in fs.ReadCollection(s => s.TryReadBytes(terminator, omitTerminator.IsTrue), maxCount.IsNull ? int.MaxValue : maxCount.Value))
                {
                    yield return(Tuple.Create(position, block));

                    position = fs.Position;
                }
            }
        }