~drizzle-trunk/drizzle/development

574.3.14 by Lee
moving functions from item_timefunc to functions/time directory
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
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
1241.9.36 by Monty Taylor
ZOMG. I deleted drizzled/server_includes.h.
20
#include "config.h"
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
21
813.1.21 by Jay Pipes
Fixes the WEEKDAY() function use the new temporal system and enable proper error throwing on bad datetimes. Adds test case for the WEEKDAY() function.
22
#include "drizzled/temporal.h"
23
#include "drizzled/error.h"
24
#include "drizzled/function/time/weekday.h"
574.3.14 by Lee
moving functions from item_timefunc to functions/time directory
25
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
26
namespace drizzled
27
{
28
574.3.14 by Lee
moving functions from item_timefunc to functions/time directory
29
int64_t Item_func_weekday::val_int()
30
{
813.1.21 by Jay Pipes
Fixes the WEEKDAY() function use the new temporal system and enable proper error throwing on bad datetimes. Adds test case for the WEEKDAY() function.
31
  assert(fixed);
574.3.14 by Lee
moving functions from item_timefunc to functions/time directory
32
813.1.21 by Jay Pipes
Fixes the WEEKDAY() function use the new temporal system and enable proper error throwing on bad datetimes. Adds test case for the WEEKDAY() function.
33
  if (args[0]->is_null())
34
  {
35
    /* For NULL argument, we return a NULL result */
36
    null_value= true;
574.3.14 by Lee
moving functions from item_timefunc to functions/time directory
37
    return 0;
813.1.21 by Jay Pipes
Fixes the WEEKDAY() function use the new temporal system and enable proper error throwing on bad datetimes. Adds test case for the WEEKDAY() function.
38
  }
39
40
  /* Grab the first argument as a DateTime object */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
41
  DateTime temporal;
813.1.21 by Jay Pipes
Fixes the WEEKDAY() function use the new temporal system and enable proper error throwing on bad datetimes. Adds test case for the WEEKDAY() function.
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
        if (! temporal.from_string(res->c_ptr(), res->length()))
61
        {
62
          /* 
63
          * Could not interpret the function argument as a temporal value, 
64
          * so throw an error and return 0
65
          */
66
          my_error(ER_INVALID_DATETIME_VALUE, MYF(0), res->c_ptr());
67
          return 0;
68
        }
69
      }
70
      break;
71
    case INT_RESULT:
72
      if (temporal.from_int64_t(args[0]->val_int()))
73
        break;
74
      /* Intentionally fall-through on invalid conversion from integer */
75
    default:
76
      {
77
        /* 
78
        * Could not interpret the function argument as a temporal value, 
79
        * so throw an error and return 0
80
        */
81
        null_value= true;
82
        char buff[DRIZZLE_MAX_LENGTH_DATETIME_AS_STRING];
83
        String tmp(buff,sizeof(buff), &my_charset_utf8_bin);
84
        String *res;
85
86
        res= args[0]->val_str(&tmp);
87
88
        my_error(ER_INVALID_DATETIME_VALUE, MYF(0), res->c_ptr());
89
        return 0;
90
      }
91
  }
92
  /* @TODO This ODBC thing is a complete hack. Fix it. */
93
  bool sunday_first= odbc_type;
94
  int64_t julian_day= julian_day_number_from_gregorian_date(temporal.years(), temporal.months(), temporal.days());
95
  return (int64_t) day_of_week(julian_day, sunday_first) + test(odbc_type);
574.3.14 by Lee
moving functions from item_timefunc to functions/time directory
96
}
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
97
98
} /* namespace drizzled */