Mercurial > pub > bltoolkit
comparison Source/Mapping/TextDataWriter.cs @ 0:f990fcb411a9
Копия текущей версии из github
| author | cin |
|---|---|
| date | Thu, 27 Mar 2014 21:46:09 +0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:f990fcb411a9 |
|---|---|
| 1 using System; | |
| 2 using System.IO; | |
| 3 using System.Text; | |
| 4 | |
| 5 using BLToolkit.Reflection; | |
| 6 | |
| 7 namespace BLToolkit.Mapping | |
| 8 { | |
| 9 public class TextDataWriter : ISupportMapping | |
| 10 { | |
| 11 #region Constructors | |
| 12 | |
| 13 public TextDataWriter(Stream stream, params string[] fieldNames) | |
| 14 : this(stream, Map.DefaultSchema, fieldNames) | |
| 15 { | |
| 16 } | |
| 17 | |
| 18 public TextDataWriter(Stream stream, Type type) | |
| 19 : this(stream, Map.DefaultSchema, Map.GetObjectMapper(type).FieldNames) | |
| 20 { | |
| 21 } | |
| 22 | |
| 23 public TextDataWriter(Stream stream, MappingSchema mappingSchema, params string[] fieldNames) | |
| 24 : this(new StreamWriter(stream), mappingSchema, fieldNames) | |
| 25 { | |
| 26 } | |
| 27 | |
| 28 public TextDataWriter(Stream stream, MappingSchema mappingSchema, Type type) | |
| 29 : this(stream, mappingSchema, mappingSchema.GetObjectMapper(type).FieldNames) | |
| 30 { | |
| 31 } | |
| 32 | |
| 33 public TextDataWriter(TextWriter writer, params string[] fieldNames) | |
| 34 : this(writer, Map.DefaultSchema, fieldNames) | |
| 35 { | |
| 36 } | |
| 37 | |
| 38 public TextDataWriter(TextWriter writer, Type type) | |
| 39 : this(writer, Map.DefaultSchema, Map.GetObjectMapper(type).FieldNames) | |
| 40 { | |
| 41 } | |
| 42 | |
| 43 public TextDataWriter(TextWriter writer, MappingSchema mappingSchema, params string[] fieldNames) | |
| 44 { | |
| 45 GC.SuppressFinalize(this); | |
| 46 | |
| 47 if (mappingSchema == null) throw new ArgumentNullException("mappingSchema"); | |
| 48 | |
| 49 _writer = writer; | |
| 50 _names = fieldNames; | |
| 51 | |
| 52 _values = new string[_names.Length]; | |
| 53 | |
| 54 WriteHeader(); | |
| 55 } | |
| 56 | |
| 57 public TextDataWriter(TextWriter writer, MappingSchema mappingSchema, Type type) | |
| 58 : this(writer, mappingSchema, mappingSchema.GetObjectMapper(type).FieldNames) | |
| 59 { | |
| 60 } | |
| 61 | |
| 62 #endregion | |
| 63 | |
| 64 #region Public Members | |
| 65 | |
| 66 public virtual void WriteEnd() | |
| 67 { | |
| 68 _writer.WriteLine("*-"); | |
| 69 _writer.Flush(); | |
| 70 } | |
| 71 | |
| 72 public virtual Type GetFieldType(int index) | |
| 73 { | |
| 74 return typeof(string); | |
| 75 } | |
| 76 | |
| 77 public virtual int GetOrdinal(string name) | |
| 78 { | |
| 79 for (int i = 0; i < _names.Length; i++) | |
| 80 if (_names[i] == name) | |
| 81 return i; | |
| 82 | |
| 83 return 0; | |
| 84 } | |
| 85 | |
| 86 public virtual void SetValue(int index, object value) | |
| 87 { | |
| 88 _values[index] = value == null? null: value.ToString(); | |
| 89 } | |
| 90 | |
| 91 public virtual void SetValue(string name, object value) | |
| 92 { | |
| 93 SetValue(GetOrdinal(name), value); | |
| 94 } | |
| 95 | |
| 96 #endregion | |
| 97 | |
| 98 #region Protected Members | |
| 99 | |
| 100 private readonly TextWriter _writer; | |
| 101 private readonly string[] _names; | |
| 102 private readonly string[] _values; | |
| 103 | |
| 104 private void WriteHeader() | |
| 105 { | |
| 106 _writer.Write("*"); | |
| 107 | |
| 108 foreach (string name in _names) | |
| 109 { | |
| 110 _writer.Write(':'); | |
| 111 _writer.Write(name); | |
| 112 } | |
| 113 | |
| 114 _writer.WriteLine(); | |
| 115 } | |
| 116 | |
| 117 private void WriteRecord() | |
| 118 { | |
| 119 _writer.Write("**"); | |
| 120 | |
| 121 char[] delimiters = new char[] { ',', ':', '|', '-', '_' }; | |
| 122 char delimiter = '\0'; | |
| 123 | |
| 124 foreach (char ch in delimiters) | |
| 125 { | |
| 126 bool found = false; | |
| 127 | |
| 128 foreach (string value in _values) | |
| 129 { | |
| 130 if (value != null && value.IndexOf(ch) >= 0) | |
| 131 { | |
| 132 found = true; | |
| 133 break; | |
| 134 } | |
| 135 } | |
| 136 | |
| 137 if (!found) | |
| 138 { | |
| 139 delimiter = ch; | |
| 140 break; | |
| 141 } | |
| 142 } | |
| 143 | |
| 144 if (delimiter == 0) | |
| 145 delimiter = delimiters[0]; | |
| 146 | |
| 147 char[] exChars = new char[] { delimiter, '\r', '\n', '\t', '\0' }; | |
| 148 | |
| 149 foreach (string value in _values) | |
| 150 { | |
| 151 _writer.Write(delimiter); | |
| 152 | |
| 153 if (value != null) | |
| 154 { | |
| 155 if (value.Length == 0) | |
| 156 _writer.Write('*'); | |
| 157 else | |
| 158 { | |
| 159 if (value.IndexOfAny(exChars) >= 0) | |
| 160 { | |
| 161 _writer.Write('+'); | |
| 162 _writer.Write(Convert.ToBase64String(Encoding.Unicode.GetBytes(value))); | |
| 163 } | |
| 164 else | |
| 165 { | |
| 166 if (value[0] == '*' || value[0] == '+') | |
| 167 _writer.Write('*'); | |
| 168 | |
| 169 _writer.Write(value); | |
| 170 } | |
| 171 } | |
| 172 } | |
| 173 } | |
| 174 | |
| 175 _writer.WriteLine(); | |
| 176 _writer.Flush(); | |
| 177 } | |
| 178 | |
| 179 #endregion | |
| 180 | |
| 181 #region ISupportMapping Members | |
| 182 | |
| 183 void ISupportMapping.BeginMapping(InitContext initContext) | |
| 184 { | |
| 185 } | |
| 186 | |
| 187 void ISupportMapping.EndMapping(InitContext initContext) | |
| 188 { | |
| 189 WriteRecord(); | |
| 190 } | |
| 191 | |
| 192 #endregion | |
| 193 } | |
| 194 } |
