1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2009 Sun Microsystems, Inc.
8
* Clint Byrum <clint@fewbar.com>
10
* This program is free software; you can redistribute it and/or modify
11
* it under the terms of the GNU General Public License as published by
12
* the Free Software Foundation; version 2 of the License.
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24
#ifndef DRIZZLED_TEMPORAL_INTERVAL_H
25
#define DRIZZLED_TEMPORAL_INTERVAL_H
27
/* @TODO Replace this include with some forward decls */
28
#include <drizzled/item.h>
29
#include <drizzled/type/time.h>
36
* Stores time interval for date/time manipulation
38
class TemporalInterval
42
TemporalInterval(uint32_t in_year,
48
uint64_t in_second_part,
56
second_part(in_second_part),
72
* Sets whether or not this object specifies a negative interval
73
* @param[in] in_neg true if this is a negative interval, false if not
75
inline void setNegative(bool in_neg= true)
81
* reverse boolean value of the negative flag
83
inline void toggleNegative()
89
* @retval true this is a negative temporal interval
90
* @retval false this is a positive temporal interval
92
inline bool getNegative() const
97
inline uint32_t get_year() { return year; }
98
inline void set_year(uint32_t new_year) { year = new_year; }
100
inline uint32_t get_month(){ return month; }
101
inline void set_month(uint32_t new_month) { month = new_month; }
103
inline uint32_t get_day(){ return day; }
104
inline void set_day(uint32_t new_day) { day = new_day; }
106
inline uint32_t get_hour(){ return hour; }
107
inline void set_hour(uint32_t new_hour) { hour = new_hour; }
109
inline uint64_t get_minute(){ return minute; }
110
inline void set_minute(uint32_t new_minute) { minute = new_minute; }
112
inline uint64_t get_second(){ return second; }
113
inline void set_second(uint32_t new_second) { second = new_second; }
115
inline uint64_t get_second_part(){ return second_part; }
116
inline void set_second_part(uint32_t new_second_part) { second_part = new_second_part; }
119
* Populate this TemporalInterval from a string value
121
* To make code easy, allow interval objects without separators.
123
* @param args argument Item structure
124
* @param int_type type of interval to create
125
* @param str_value String pointer to the input value
126
* @return true if the string would result in a null interval
129
bool initFromItem(Item *args, interval_type int_type, String *str_value);
132
* Adds this interval to a DRIZZLE_LTIME structure
134
* @param[in,out] ltime the interval will be added to ltime directly in the ltime structure
135
* @param[in] int_type the type of interval requested
136
* @retval true date was added and value stored properly
137
* @retval false result of addition is a null value
139
bool addDate(type::Time *ltime, interval_type int_type);
144
* The maximum number of text elements to extract into a temporal interval
146
static const uint32_t MAX_STRING_ELEMENTS = 5;
149
* Each of these corresponds to an 'interval_type'
151
static const uint32_t NUM_YEAR_MONTH_STRING_ELEMENTS = 2;
152
static const uint32_t NUM_DAY_HOUR_STRING_ELEMENTS = 2;
153
static const uint32_t NUM_DAY_MICROSECOND_STRING_ELEMENTS = 5;
154
static const uint32_t NUM_DAY_MINUTE_STRING_ELEMENTS = 3;
155
static const uint32_t NUM_DAY_SECOND_STRING_ELEMENTS = 4;
156
static const uint32_t NUM_HOUR_MICROSECOND_STRING_ELEMENTS = 4;
157
static const uint32_t NUM_HOUR_MINUTE_STRING_ELEMENTS = 2;
158
static const uint32_t NUM_HOUR_SECOND_STRING_ELEMENTS = 3;
159
static const uint32_t NUM_MINUTE_MICROSECOND_STRING_ELEMENTS = 3;
160
static const uint32_t NUM_MINUTE_SECOND_STRING_ELEMENTS = 2;
161
static const uint32_t NUM_SECOND_MICROSECOND_STRING_ELEMENTS = 2;
165
* Get a array of positive numbers from a string object.
166
* Each number is separated by 1 non digit character
167
* Return error if there is too many numbers.
168
* If there is too few numbers, assume that the numbers are left out
169
* from the high end. This allows one to give:
170
* DAY_TO_SECOND as "D MM:HH:SS", "MM:HH:SS" "HH:SS" or as seconds.
172
* @param[in] length: length of str
173
* @param[in] cs: charset of str
174
* @param[out] values: array of results
175
* @param[out] count: count of elements in result array
176
* @param transform_msec: if value is true we suppose
177
* that the last part of string value is microseconds
178
* and we should transform value to six digit value.
179
* For example, '1.1' -> '1.100000'
181
bool getIntervalFromString(const char *str,
183
const CHARSET_INFO * const cs,
186
bool transform_msec);
194
uint64_t second_part;
199
} /* namespace drizzled */
201
#endif /* DRIZZLED_TEMPORAL_INTERVAL_H */