1 /**
2     Copyright: © 2015 Chris Barnes
3     License: The MIT License, see license file
4     Authors: Chris Barnes
5 */
6 module quill.variant_mapper;
7 
8 import ddbc.all;
9 import std.datetime;
10 import std.variant;
11 import quill.mapper_base;
12 
13 /**
14     Maps Variant parameters to a PreparedStatement
15 
16     See_also:
17         quill.database
18 */
19 class VariantMapper : MapperBase
20 {
21     this(PreparedStatement statement)
22     {
23         super(statement);
24     }
25 
26     /**
27         Maps an array of Variants into a PreparedStatement
28 
29         Params:
30             parameters = an array of variants where the index matches the index of the parameter
31     */
32     void map(Variant[] parameters)
33     {
34         foreach(int i, parameter;parameters)
35         {
36             this.mapType(i + 1, parameter);
37         }
38     }
39 
40     private:
41         /**
42             Sets a parameter on the PreparedStatement if it is supported
43         */
44         void mapType(int parameterIndex, Variant value)
45         {
46             if(value.convertsTo!(float))
47             {
48                 this.statement.setFloat(parameterIndex, value.get!(float));
49             }
50             else if(value.convertsTo!(double))
51             {
52                 this.statement.setDouble(parameterIndex, value.get!(double));
53             }
54             else if(value.convertsTo!(bool))
55             {
56                 this.statement.setBoolean(parameterIndex, value.get!(bool));
57             }
58             else if(value.convertsTo!(long))
59             {
60                 this.statement.setLong(parameterIndex, value.get!(long));
61             }
62             else if(value.convertsTo!(ulong))
63             {
64                 this.statement.setUlong(parameterIndex, value.get!(ulong));
65             }
66             else if(value.convertsTo!(int))
67             {
68                 this.statement.setInt(parameterIndex, value.get!(int));
69             }
70             else if(value.convertsTo!(uint))
71             {
72                 this.statement.setUint(parameterIndex, value.get!(uint));
73             }
74             else if(value.convertsTo!(short))
75             {
76                 this.statement.setShort(parameterIndex, value.get!(short));
77             }
78             else if(value.convertsTo!(ushort))
79             {
80                 this.statement.setUshort(parameterIndex, value.get!(ushort));
81             }
82             else if(value.convertsTo!(byte))
83             {
84                 this.statement.setByte(parameterIndex, value.get!(byte));
85             }
86             else if(value.convertsTo!(ubyte))
87             {
88                 this.statement.setUbyte(parameterIndex, value.get!(ubyte));
89             }
90             else if(value.convertsTo!(byte[]))
91             {
92                 this.statement.setBytes(parameterIndex, value.get!(byte[]));
93             }
94             else if(value.convertsTo!(ubyte[]))
95             {
96                 this.statement.setUbytes(parameterIndex, value.get!(ubyte[]));
97             }
98             else if(value.convertsTo!(string))
99             {
100                 this.statement.setString(parameterIndex, value.get!(string));
101             }
102             else if(value.convertsTo!(DateTime))
103             {
104                 this.statement.setDateTime(parameterIndex, value.get!(DateTime));
105             }
106             else
107             {
108                 this.statement.setNull(parameterIndex);
109             }
110         }
111 }