1
1
#include " acl_stdafx.hpp"
2
2
#include < assert.h>
3
3
#include " acl_cpp/stdlib/log.hpp"
4
+ #include " acl_cpp/stdlib/snprintf.hpp"
4
5
#include " acl_cpp/db/query.hpp"
5
6
6
7
namespace acl
@@ -39,6 +40,8 @@ bool query::append_key(string& buf, char* key)
39
40
return false ;
40
41
}
41
42
43
+ char fmt[256 ];
44
+
42
45
query_param* param = it->second ;
43
46
switch (param->type )
44
47
{
@@ -58,6 +61,14 @@ bool query::append_key(string& buf, char* key)
58
61
buf.format_append (" '%s'" ,
59
62
escape (param->v .S , param->dlen , buf_).c_str ());
60
63
break ;
64
+ case DB_PARAM_FLOAT:
65
+ safe_snprintf (fmt, sizeof (fmt), " %%.%df" , param->precision );
66
+ buf.format_append (fmt, param->v .f );
67
+ break ;
68
+ case DB_PARAM_DOUBLE:
69
+ safe_snprintf (fmt, sizeof (fmt), " %%.%df" , param->precision );
70
+ buf.format_append (fmt, param->v .d );
71
+ break ;
61
72
default :
62
73
logger_error (" unknown type: %d" , param->type );
63
74
break ;
@@ -210,7 +221,7 @@ query& query::set_parameter(const char* name, acl_int64 value)
210
221
return *this ;
211
222
}
212
223
213
- query& query::set_parameter (const char * name, float value)
224
+ query& query::set_parameter (const char * name, float value, int precision /* = 8 */ )
214
225
{
215
226
string key (name);
216
227
key.lower ();
@@ -220,12 +231,16 @@ query& query::set_parameter(const char* name, float value)
220
231
param->type = DB_PARAM_FLOAT;
221
232
param->v .f = value;
222
233
param->dlen = sizeof (float );
234
+ if (precision >= 0 )
235
+ param->precision = precision;
236
+ else
237
+ param->precision = 8 ;
223
238
224
239
params_[key] = param;
225
240
return *this ;
226
241
}
227
242
228
- query& query::set_parameter (const char * name, double value)
243
+ query& query::set_parameter (const char * name, double value, int precision /* = 8 */ )
229
244
{
230
245
string key (name);
231
246
key.lower ();
@@ -235,6 +250,10 @@ query& query::set_parameter(const char* name, double value)
235
250
param->type = DB_PARAM_DOUBLE;
236
251
param->v .d = value;
237
252
param->dlen = sizeof (double );
253
+ if (precision >= 0 )
254
+ param->precision = precision;
255
+ else
256
+ param->precision = 8 ;
238
257
239
258
params_[key] = param;
240
259
return *this ;
0 commit comments