@@ -14,70 +14,73 @@ public partial class MySqlConnectorDriver(Options options, Dictionary<string, Ta
14
14
{
15
15
protected override List < ColumnMapping > ColumnMappings { get ; } =
16
16
[
17
+ new ( "bool" ,
18
+ new Dictionary < string , DbTypeInfo >
19
+ {
20
+ { "tinyint" , new DbTypeInfo ( Length : 1 ) }
21
+ } , ordinal => $ "reader.GetBoolean({ ordinal } )") ,
22
+ new ( "short" ,
23
+ new Dictionary < string , DbTypeInfo >
24
+ {
25
+ { "tinyint" , new DbTypeInfo ( ) } ,
26
+ { "smallint" , new DbTypeInfo ( ) } ,
27
+ { "year" , new DbTypeInfo ( ) }
28
+ } , ordinal => $ "reader.GetInt16({ ordinal } )") ,
17
29
new ( "long" ,
18
- new Dictionary < string , string ? >
30
+ new Dictionary < string , DbTypeInfo >
19
31
{
20
- { "bigint" , null }
32
+ { "bigint" , new DbTypeInfo ( ) }
21
33
} , ordinal => $ "reader.GetInt64({ ordinal } )") ,
34
+ new ( "byte" ,
35
+ new Dictionary < string , DbTypeInfo >
36
+ {
37
+ { "bit" , new DbTypeInfo ( ) }
38
+ } , ordinal => $ "reader.GetFieldValue<byte>({ ordinal } )") ,
22
39
new ( "byte[]" ,
23
- new Dictionary < string , string ? >
40
+ new Dictionary < string , DbTypeInfo >
24
41
{
25
- { "binary" , null } ,
26
- { "blob" , null } ,
27
- { "longblob" , null } ,
28
- { "mediumblob" , null } ,
29
- { "tinyblob" , null } ,
30
- { "varbinary" , null }
42
+ { "binary" , new DbTypeInfo ( ) } ,
43
+ { "blob" , new DbTypeInfo ( ) } ,
44
+ { "longblob" , new DbTypeInfo ( ) } ,
45
+ { "mediumblob" , new DbTypeInfo ( ) } ,
46
+ { "tinyblob" , new DbTypeInfo ( ) } ,
47
+ { "varbinary" , new DbTypeInfo ( ) }
31
48
} , ordinal => $ "reader.GetFieldValue<byte[]>({ ordinal } )") ,
32
49
new ( "string" ,
33
- new Dictionary < string , string ? >
50
+ new Dictionary < string , DbTypeInfo >
34
51
{
35
- { "char" , null } ,
36
- { "decimal" , null } ,
37
- { "longtext" , null } ,
38
- { "mediumtext" , null } ,
39
- { "text" , null } ,
40
- { "time" , null } ,
41
- { "tinytext" , null } ,
42
- { "varchar" , null } ,
43
- { "var_string" , null } ,
44
- { "json" , null }
52
+ { "char" , new DbTypeInfo ( ) } ,
53
+ { "decimal" , new DbTypeInfo ( ) } ,
54
+ { "longtext" , new DbTypeInfo ( ) } ,
55
+ { "mediumtext" , new DbTypeInfo ( ) } ,
56
+ { "text" , new DbTypeInfo ( ) } ,
57
+ { "time" , new DbTypeInfo ( ) } ,
58
+ { "tinytext" , new DbTypeInfo ( ) } ,
59
+ { "varchar" , new DbTypeInfo ( ) } ,
60
+ { "var_string" , new DbTypeInfo ( ) } ,
61
+ { "json" , new DbTypeInfo ( ) }
45
62
} , ordinal => $ "reader.GetString({ ordinal } )") ,
46
63
new ( "DateTime" ,
47
- new Dictionary < string , string ? >
64
+ new Dictionary < string , DbTypeInfo >
48
65
{
49
- { "date" , null } ,
50
- { "datetime" , null } ,
51
- { "timestamp" , null }
66
+ { "date" , new DbTypeInfo ( ) } ,
67
+ { "datetime" , new DbTypeInfo ( ) } ,
68
+ { "timestamp" , new DbTypeInfo ( ) }
52
69
} , ordinal => $ "reader.GetDateTime({ ordinal } )") ,
53
- new ( "short" ,
54
- new Dictionary < string , string ? >
55
- {
56
- { "smallint" , null } ,
57
- { "year" , null }
58
- } , ordinal => $ "reader.GetInt16({ ordinal } )") ,
59
70
new ( "int" ,
60
- new Dictionary < string , string ? >
71
+ new Dictionary < string , DbTypeInfo >
61
72
{
62
- { "int" , null } ,
63
- { "mediumint" , null } ,
73
+ { "int" , new DbTypeInfo ( ) } ,
74
+ { "mediumint" , new DbTypeInfo ( ) } ,
64
75
} , ordinal => $ "reader.GetInt32({ ordinal } )") ,
65
- new ( "bool" ,
66
- new Dictionary < string , string ? >
67
- {
68
- { "bit" , null } ,
69
- { "tinyint" , null } ,
70
- { "bool" , null } ,
71
- { "boolean" , null }
72
- } , ordinal => $ "reader.GetBoolean({ ordinal } )") ,
73
76
new ( "double" ,
74
- new Dictionary < string , string ? >
77
+ new Dictionary < string , DbTypeInfo >
75
78
{
76
- { "double" , null } ,
77
- { "float" , null }
79
+ { "double" , new DbTypeInfo ( ) } ,
80
+ { "float" , new DbTypeInfo ( ) }
78
81
} , ordinal => $ "reader.GetDouble({ ordinal } )") ,
79
82
new ( "object" ,
80
- new Dictionary < string , string ? > ( ) , ordinal => $ "reader.GetValue({ ordinal } )")
83
+ new Dictionary < string , DbTypeInfo > ( ) , ordinal => $ "reader.GetValue({ ordinal } )")
81
84
] ;
82
85
83
86
public override UsingDirectiveSyntax [ ] GetUsingDirectives ( )
@@ -170,24 +173,31 @@ public string GetCopyFromImpl(Query query, string queryTextConstant)
170
173
var csvWriterVar = Variable . CsvWriter . AsVarName ( ) ;
171
174
var loaderVar = Variable . Loader . AsVarName ( ) ;
172
175
var connectionVar = Variable . Connection . AsVarName ( ) ;
176
+ var nullConverterFn = Variable . NullConverterFn . AsVarName ( ) ;
173
177
174
178
var loaderColumns = query . Params . Select ( p => $ "\" { p . Column . Name } \" ") . JoinByComma ( ) ;
175
179
var ( establishConnection , connectionOpen ) = EstablishConnection ( query ) ;
176
180
return $$ """
177
181
const string supportedDateTimeFormat = "yyyy-MM-dd H:mm:ss";
178
182
var {{ Variable . Config . AsVarName ( ) }} = new CsvConfiguration(CultureInfo.CurrentCulture) { Delimiter = "{{ csvDelimiter }} " };
183
+ var {{ nullConverterFn }} = new Utils.NullToStringConverter();
179
184
using (var {{ Variable . Writer . AsVarName ( ) }} = new StreamWriter("{{ tempCsvFilename }} ", false, new UTF8Encoding(false)))
180
185
using (var {{ csvWriterVar }} = new CsvWriter({{ Variable . Writer . AsVarName ( ) }} , {{ Variable . Config . AsVarName ( ) }} ))
181
186
{
182
- var options = new TypeConverterOptions { Formats = new[] { supportedDateTimeFormat } };
183
- {{ csvWriterVar }} .Context.TypeConverterOptionsCache.AddOptions<DateTime>(options);
184
- {{ csvWriterVar }} .Context.TypeConverterOptionsCache.AddOptions<DateTime?>(options);
185
- {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<bool?>(new Utils.NullToNStringConverter());
186
- {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<short?>(new Utils.NullToNStringConverter());
187
- {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<int?>(new Utils.NullToNStringConverter());
188
- {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<long?>(new Utils.NullToNStringConverter());
189
- {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<DateTime?>(new Utils.NullToNStringConverter());
190
- {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<string>(new Utils.NullToNStringConverter());
187
+ var {{ Variable . Options }} = new TypeConverterOptions { Formats = new[] { supportedDateTimeFormat } };
188
+ {{ csvWriterVar }} .Context.TypeConverterOptionsCache.AddOptions<DateTime>({{ Variable . Options }} );
189
+ {{ csvWriterVar }} .Context.TypeConverterOptionsCache.AddOptions<DateTime?>({{ Variable . Options }} );
190
+ {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<bool?>(new Utils.BoolToBitConverter());
191
+ {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<byte?>({{ nullConverterFn }} );
192
+ {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<short?>({{ nullConverterFn }} );
193
+ {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<int?>({{ nullConverterFn }} );
194
+ {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<long?>({{ nullConverterFn }} );
195
+ {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<float?>({{ nullConverterFn }} );
196
+ {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<decimal?>({{ nullConverterFn }} );
197
+ {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<double?>({{ nullConverterFn }} );
198
+ {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<DateTime?>({{ nullConverterFn }} );
199
+ {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<{{ AddNullableSuffixIfNeeded ( "string" , false ) }} >({{ nullConverterFn }} );
200
+ {{ csvWriterVar }} .Context.TypeConverterCache.AddConverter<{{ AddNullableSuffixIfNeeded ( "object" , false ) }} >({{ nullConverterFn }} );
191
201
await {{ csvWriterVar }} .WriteRecordsAsync({{ Variable . Args . AsVarName ( ) }} );
192
202
}
193
203
0 commit comments