/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=2:tabstop=2:smarttab: * * Copyright (C) 2008 Sun Microsystems, Inc. * * Authors: * * Jay Pipes * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /** * @file * * Defines the API for matching datetime formats. */ #ifndef DRIZZLED_TEMPORAL_FORMAT_H #define DRIZZLED_TEMPORAL_FORMAT_H #include PCRE_HEADER /* Output vector size for pcre matching. Should be multiple of 3. */ #define OUT_VECTOR_SIZE 30 namespace drizzled { /* Forward declaration needed */ class Temporal; class TemporalFormat { protected: const char *_pattern; /**< The regular expression string to match */ pcre *_re; /**< The compiled regular expression struct */ int32_t _error_offset; /**< Any error encountered during compilation or matching */ const char *_error; /* Index of the pattern which is a specific temporal part */ uint32_t _year_part_index; uint32_t _month_part_index; uint32_t _day_part_index; uint32_t _hour_part_index; uint32_t _minute_part_index; uint32_t _second_part_index; uint32_t _usecond_part_index; uint32_t _nsecond_part_index; public: /** * Constructor which takes a regex string as * it's only parameter. * * @param Pattern to use in matching */ TemporalFormat(const char *pattern); /** * Returns whether the instance is compiled * and contains a valid regular expression. */ inline bool is_valid() const {return _re && (_error == NULL);} /** * Sets the index for the year part of the pattern. * * @param index of the temporal part */ inline void set_year_part_index(int32_t index) {_year_part_index= ((index - 1) * 2) + 2;} /** * Sets the index for the month part of the pattern. * * @param index of the temporal part */ inline void set_month_part_index(int32_t index) {_month_part_index= ((index - 1) * 2) + 2;} /** * Sets the index for the day part of the pattern. * * @param index of the temporal part */ inline void set_day_part_index(int32_t index) {_day_part_index= ((index - 1) * 2) + 2;} /** * Sets the index for the hour part of the pattern. * * @param index of the temporal part */ inline void set_hour_part_index(int32_t index) {_hour_part_index= ((index - 1) * 2) + 2;} /** * Sets the index for the minute part of the pattern. * * @param index of the temporal part */ inline void set_minute_part_index(int32_t index) {_minute_part_index= ((index - 1) * 2) + 2;} /** * Sets the index for the second part of the pattern. * * @param index of the temporal part */ inline void set_second_part_index(int32_t index) {_second_part_index= ((index - 1) * 2) + 2;} /** * Sets the index for the microsecond part of the pattern. * * @param index of the temporal part */ inline void set_usecond_part_index(int32_t index) {_usecond_part_index= ((index - 1) * 2) + 2;} /** * Sets the index for the nanosecond part of the pattern. * * @param index of the temporal part */ inline void set_nsecond_part_index(int32_t index) {_nsecond_part_index= ((index - 1) * 2) + 2;} /** * Returns true or false whether a supplied * string matches the internal pattern for this * temporal format string. * * @param Subject to match * @param Length of subject string */ bool matches(const char *data, size_t data_len, Temporal *to); }; /** * Initializes the regular expressions used by the datetime * string matching conversion functions. * * Returns whether initialization was successful. * * @note * * This function is not thread-safe. Call before threading * is initialized on server init. */ bool init_temporal_formats(); /** * Frees all memory allocated for temporal format objects */ void deinit_temporal_formats(); } /* end namespace drizzled */ #endif /* DRIZZLED_TEMPORAL_FORMAT_H */