Drizzled Public API Documentation

dayofmonth.cc
1 /* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3  *
4  * Copyright (C) 2008 Sun Microsystems, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; version 2 of the License.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 
20 #include <config.h>
21 
22 #include <drizzled/temporal.h>
23 #include <drizzled/error.h>
24 #include <drizzled/function/time/dayofmonth.h>
25 
26 namespace drizzled
27 {
28 
30 {
31  assert(fixed);
32 
33  if (args[0]->is_null())
34  {
35  /* For NULL argument, we return a NULL result */
36  null_value= true;
37  return 0;
38  }
39 
40  /* Grab the first argument as a DateTime object */
41  DateTime temporal;
42  Item_result arg0_result_type= args[0]->result_type();
43 
44  switch (arg0_result_type)
45  {
46  case DECIMAL_RESULT:
47  /*
48  * For doubles supplied, interpret the arg as a string,
49  * so intentionally fall-through here...
50  * This allows us to accept double parameters like
51  * 19971231235959.01 and interpret it the way MySQL does:
52  * as a TIMESTAMP-like thing with a microsecond component.
53  * Ugh, but need to keep backwards-compat.
54  */
55  case STRING_RESULT:
56  {
57  char buff[DRIZZLE_MAX_LENGTH_DATETIME_AS_STRING];
58  String tmp(buff,sizeof(buff), &my_charset_utf8_bin);
59  String *res= args[0]->val_str(&tmp);
60 
61  if (res && (res != &tmp))
62  {
63  tmp.copy(*res);
64  }
65 
66  if (! temporal.from_string(tmp.c_ptr(), tmp.length()))
67  {
68  /*
69  * Could not interpret the function argument as a temporal value,
70  * so throw an error and return 0
71  */
72  my_error(ER_INVALID_DATETIME_VALUE, MYF(0), tmp.c_ptr());
73  return 0;
74  }
75  }
76  break;
77  case INT_RESULT:
78  if (temporal.from_int64_t(args[0]->val_int()))
79  break;
80  /* Intentionally fall-through on invalid conversion from integer */
81  default:
82  {
83  /*
84  * Could not interpret the function argument as a temporal value,
85  * so throw an error and return 0
86  */
87  null_value= true;
88  char buff[DRIZZLE_MAX_LENGTH_DATETIME_AS_STRING];
89  String tmp(buff,sizeof(buff), &my_charset_utf8_bin);
90  String *res;
91 
92  res= args[0]->val_str(&tmp);
93 
94  if (res && (res != &tmp))
95  {
96  tmp.copy(*res);
97  }
98 
99  my_error(ER_INVALID_DATETIME_VALUE, MYF(0), tmp.c_ptr());
100  return 0;
101  }
102  }
103  return (int64_t) temporal.days();
104 }
105 
106 } /* namespace drizzled */
bool from_string(const char *from, size_t from_len)
Definition: temporal.cc:160
virtual int64_t val_int()=0
bool fixed
Definition: item.h:120
bool null_value
Definition: item.h:122
bool from_int64_t(const int64_t from, bool convert)
Definition: temporal.cc:1144
bool is_null()
Definition: func.cc:512
uint32_t days() const
Definition: temporal.h:142
virtual String * val_str(String *str)=0