@@ -26,6 +26,17 @@ const DbTypeToGenericType = {
26
26
'double precision' : 'decimal'
27
27
} ;
28
28
29
+ // Order of keys is important here: from more specific to less specific
30
+ const DbTypeValueMatcher = {
31
+ timestamp : ( v ) => v instanceof Date || v . toString ( ) . match ( / ^ \d \d \d \d - \d \d - \d \d T \d \d : \d \d : \d \d / ) ,
32
+ date : ( v ) => v instanceof Date || v . toString ( ) . match ( / ^ \d \d \d \d - \d \d - \d \d $ / ) ,
33
+ int : ( v ) => Number . isInteger ( v ) || v . toString ( ) . match ( / ^ \d + $ / ) ,
34
+ decimal : ( v ) => v instanceof Number || v . toString ( ) . match ( / ^ \d + ( \. \d + ) ? $ / ) ,
35
+ boolean : ( v ) => v === false || v === true || v . toLowerCase ( ) === 'true' || v . toLowerCase === 'false' ,
36
+ string : ( v ) => v . length < 256 ,
37
+ text : ( ) => true
38
+ } ;
39
+
29
40
class BaseDriver {
30
41
informationSchemaQuery ( ) {
31
42
return `
@@ -46,8 +57,22 @@ class BaseDriver {
46
57
throw new Error ( 'Not implemented' ) ;
47
58
}
48
59
49
- downloadQueryResults ( ) {
50
- throw new Error ( 'Not implemented' ) ;
60
+ async downloadQueryResults ( query , values ) {
61
+ const rows = await this . query ( query , values ) ;
62
+ const fields = Object . keys ( rows [ 0 ] ) ;
63
+
64
+ const types = fields . map ( field => ( {
65
+ name : field ,
66
+ type : Object . keys ( DbTypeValueMatcher ) . find (
67
+ type => ! rows . filter ( row => ! ! row [ field ] ) . find ( row => ! DbTypeValueMatcher [ type ] ( row [ field ] ) ) &&
68
+ rows . find ( row => ! ! row [ field ] )
69
+ ) || 'text'
70
+ } ) ) ;
71
+
72
+ return {
73
+ rows,
74
+ types,
75
+ } ;
51
76
}
52
77
53
78
readOnly ( ) {
0 commit comments