blob: 3cca57fa554a608311299792842ce7450536d769 [file] [log] [blame]
/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
**********************************************************************/
#ifndef EXP_DATETIME_H
#define EXP_DATETIME_H
/* -*-C++-*-
*****************************************************************************
*
* File: exp_datetime.h
* Description: Datetime Type
*
*
* Created: 8/19/96
* Language: C++
*
*
*
*
*****************************************************************************
*/
#include "Platform.h"
#include "ExpError.h"
#include "exp_attrs.h"
#include "Int64.h"
UInt32 Date2Julian(int y, int m ,int d);
class ExpDatetime : public SimpleType {
public:
// these enums must be in the same order as the datetimeFormat[] array
// (defined in exp_datetime.cpp).
enum DatetimeFormats
{
DATETIME_FORMAT_MIN = 0,
DATETIME_FORMAT_MIN_DATE = DATETIME_FORMAT_MIN,
DATETIME_FORMAT_DEFAULT = DATETIME_FORMAT_MIN_DATE, // YYYY-MM-DD
DATETIME_FORMAT_USA, // MM/DD/YYYY AM|PM
DATETIME_FORMAT_EUROPEAN, // DD.MM.YYYY
DATETIME_FORMAT_DEFAULT2, // YYYY-MM
DATETIME_FORMAT_USA2, // MM/DD/YYYY
DATETIME_FORMAT_USA3, // YYYY/MM/DD
DATETIME_FORMAT_USA4, // YYYYMMDD
DATETIME_FORMAT_USA5, // YY/MM/DD
DATETIME_FORMAT_USA6, // MM/DD/YY
DATETIME_FORMAT_USA7, // MM-DD-YYYY
DATETIME_FORMAT_USA8, // YYYYMM
DATETIME_FORMAT_EUROPEAN2, // DD-MM-YYYY
DATETIME_FORMAT_EUROPEAN3, // DD-MON-YYYY
DATETIME_FORMAT_EUROPEAN4, // DDMONYYYY
DATETIME_FORMAT_MAX_DATE = DATETIME_FORMAT_EUROPEAN4,
DATETIME_FORMAT_MIN_TIME,
DATETIME_FORMAT_TS4 = DATETIME_FORMAT_MIN_TIME, // HH24:MI:SS
DATETIME_FORMAT_MAX_TIME = DATETIME_FORMAT_TS4,
DATETIME_FORMAT_MIN_TS,
DATETIME_FORMAT_TS1 = DATETIME_FORMAT_MIN_TS, // YYYYMMDDHH24MISS
DATETIME_FORMAT_TS2, // DD.MM.YYYY:HH24:MI:SS
DATETIME_FORMAT_TS3, // YYYY-MM-DD HH24:MI:SS
DATETIME_FORMAT_TS5, // YYYYMMDD:HH24:MI:SS
DATETIME_FORMAT_TS6, // MMDDYYYY HH24:MI:SS
DATETIME_FORMAT_TS7, // MM/DD/YYYY HH24:MI:SS
DATETIME_FORMAT_TS8, // DD-MON-YYYY HH:MI:SS
DATETIME_FORMAT_TS9, // MONTH DD, YYYY, HH:MI AM|PM
DATETIME_FORMAT_TS10, // DD.MM.YYYY HH24:MI:SS
DATETIME_FORMAT_TS11, // YYYY/MM/DD HH24:MI:SS
DATETIME_FORMAT_MAX_TS = DATETIME_FORMAT_TS11,
DATETIME_FORMAT_MAX = DATETIME_FORMAT_MAX_TS,
DATETIME_FORMAT_MIN_NUM = DATETIME_FORMAT_MAX,
DATETIME_FORMAT_NUM1, // 99:99:99:99
DATETIME_FORMAT_NUM2, // -99:99:99:99
DATETIME_FORMAT_MAX_NUM = DATETIME_FORMAT_NUM2,
DATETIME_FORMAT_EXTRA_MIN = DATETIME_FORMAT_MAX_NUM,
DATETIME_FORMAT_EXTRA_HH, // hour of day(00-23)
DATETIME_FORMAT_EXTRA_HH12, // hour of day(01-12)
DATETIME_FORMAT_EXTRA_HH24, // hour of day(00-23)
DATETIME_FORMAT_EXTRA_MI, // minute(00-59)
DATETIME_FORMAT_EXTRA_SS, // second(00-59)
DATETIME_FORMAT_EXTRA_YYYY, // year(4 digits)
DATETIME_FORMAT_EXTRA_YYY, // year(last 3 digits of year)
DATETIME_FORMAT_EXTRA_YY, // year(last 2 digits of year)
DATETIME_FORMAT_EXTRA_Y, // year(last digit of year)
DATETIME_FORMAT_EXTRA_MON, // month(3 chars in English)
DATETIME_FORMAT_EXTRA_MM, // month(01-12)
DATETIME_FORMAT_EXTRA_DY, // name of day(3 chars in English) exp. SUN
DATETIME_FORMAT_EXTRA_DAY, // name of day,padded with blanks to length of 9 characters. exp. SUNDAY
DATETIME_FORMAT_EXTRA_CC, // century
DATETIME_FORMAT_EXTRA_D, // day of week(Sunday(1) to Saturday(7))
DATETIME_FORMAT_EXTRA_DD, // day of month(01-31)
DATETIME_FORMAT_EXTRA_DDD, // day of year(1-366)
DATETIME_FORMAT_EXTRA_W, // week of month(1-5)
DATETIME_FORMAT_EXTRA_WW, // week number of year(1-53)
DATETIME_FORMAT_EXTRA_J, //number of days since January 1, 4713 BC
DATETIME_FORMAT_EXTRA_Q, // the quarter of year(1-4)
DATETIME_FORMAT_EXTRA_MAX = DATETIME_FORMAT_EXTRA_Q,
// the following are intended for binder time resolution based
// on operand type to one of the formats above
DATETIME_FORMAT_MIN_UNRESOLVED = DATETIME_FORMAT_EXTRA_MAX,
DATETIME_FORMAT_UNSPECIFIED, // Default format for TO_CHAR; resolved at bind time
// based on the datatype of the operand
DATETIME_FORMAT_MAX_UNRESOLVED = DATETIME_FORMAT_UNSPECIFIED,
DATETIME_FORMAT_DATE_STR, // format in str
DATETIME_FORMAT_TIME_STR, // format in str
DATETIME_FORMAT_NONE,
DATETIME_FORMAT_ERROR = -1
};
struct DatetimeFormatInfo
{
Lng32 format; // defined by enum DatetimeFormats
const char * str; // string representation of datetime format
Lng32 minLen; // minimum length to hold this format
Lng32 maxLen;
};
static const DatetimeFormatInfo datetimeFormat[];
enum { DATETIME_MAX_NUM_FIELDS = 7 };
enum { MAX_DATETIME_SIZE = 11 };
enum { MAX_DATETIME_MICROS_FRACT_PREC = 6 };
enum { MAX_DATETIME_NANOS_FRACT_PREC = 9 };
enum { MAX_DATETIME_FRACT_PREC = 9 };
// MAX Length of Datetime string is 50 -
// "DATE 'YYYY-MM-DD';"
// "TIME 'HH:MM:SS';"
// "TIMESTAMP 'YYYY-MM-DD:HH:MM:SS.MSSSSS';"
// "DATETIME 'YYYY-MM-DD:HH:MM' YEAR TO MINUTE;"
// "DATETIME 'MM-DD:HH:MM:SS.MSSSSS' MONTH TO SECOND;"
// 012345678901234567890123456789012345678901234567890
//
enum { MAX_DATETIME_STRING_LEN = 50 };
enum arithOps {DATETIME_ADD, DATETIME_SUB};
ExpDatetime();
~ExpDatetime();
static Int64 getTotalDays(short year, short month, short day);
static short getDatetimeFields(Lng32 datetimeCode,
rec_datetime_field &startField,
rec_datetime_field &endField);
static NABoolean fractionStoredAsNanos(rec_datetime_field endField,
short fractionPrecision);
void convertDatetimeToInterval(rec_datetime_field datetimeStartField,
rec_datetime_field datetimeEndField,
short fractionPrecision,
rec_datetime_field intervalEndField,
char *datetimeOpData,
Int64 &interval,
char * intervalBignum,
NABoolean &isBignum) const;
static short getYearMonthDay(Int64 totalDays,
short &year,
char &month,
char &day);
short convertIntervalToDatetime(Int64 interval,
char * intervalBignum,
rec_datetime_field startField,
rec_datetime_field endField,
short fractionPrecision,
char *datetimeOpData) const;
static short validateDate(rec_datetime_field startField,
rec_datetime_field endField,
char *datetimeOpData,
ExpDatetime *attr,
short intervalFlag,
NABoolean &LastDayPrevMonth);
static short validateTime(const char *datetimeOpData);
short compDatetimes(char *datetimeOpData1,
char *datetimeOpData2);
short arithDatetimeInterval(ExpDatetime::arithOps operation,
ExpDatetime *datetimeOpType,
Attributes *intervalOpType,
char *datetimeOpData,
char *intervalOpData,
char *resultData,
CollHeap *heap,
ComDiagsArea** diagsArea);
short subDatetimeDatetime(Attributes *datetimeOpType,
Attributes *intervalOpType,
char *datetimeOpData1,
char *datetimeOpData2,
char *resultData,
CollHeap *heap,
ComDiagsArea** diagsArea) const;
static short getDisplaySize(Lng32 datetimeCode,
short fractionPrecision);
static Lng32 getDatetimeFormatLen(Lng32 format, NABoolean to_date,
rec_datetime_field startField,
rec_datetime_field endField);
Attributes * newCopy();
Attributes * newCopy(CollHeap *);
void copyAttrs(Attributes *source_); // copy source attrs to this.
// ---------------------------------------------------------------------
// Perform type-safe pointer casts.
// ---------------------------------------------------------------------
virtual
ExpDatetime* castToExpDatetime();
short convDatetimeDatetime(char *srcData,
rec_datetime_field dstStartField,
rec_datetime_field dstEndField,
short dstFractPrec,
char *dstData,
Lng32 dstLen,
short validateFlag,
NABoolean *roundedDownFlag = NULL);
static short currentTimeStamp(char *dstData,
rec_datetime_field startField,
rec_datetime_field endField,
short fractPrec);
short extractDatetime(rec_datetime_field srcStartField,
rec_datetime_field srcEndField,
short srcFractPrec,
char *srcData,
char *dstData);
static short convAsciiToDatetime(char *source,
Lng32 sourceLen,
char *target,
Lng32 targetLen,
rec_datetime_field dstStartField,
rec_datetime_field dstEndField,
Lng32 format,
Lng32 &scale,
CollHeap *heap,
ComDiagsArea** diagsArea,
ULng32 flags);
short convAsciiToDatetime(char *source,
Lng32 sourceLen,
char *target,
Lng32 targetLen,
Lng32 format,
CollHeap *heap,
ComDiagsArea** diagsArea,
ULng32 flags);
short convAsciiToDate(char *target,
Lng32 targetLen,
char *source,
Lng32 sourceLen,
Int32 format,
CollHeap *heap,
ComDiagsArea** diagsArea,
ULng32 flags);
Lng32 convDatetimeToASCII(char *srcData,
char *dstData,
Lng32 dstLen,
Int32 format,
char *formatStr,
CollHeap *heap,
ComDiagsArea** diagsArea);
static Lng32 convNumericTimeToASCII(char *srcData,
char *dstData,
Lng32 dstLen,
Int32 format,
char *formatStr,
CollHeap *heap,
ComDiagsArea** diagsArea);
static
short convAsciiDatetimeToASCII(char *srcData,
Lng32 srcPrecision,
Lng32 srcScale,
Lng32 srcLen,
char *dstData,
Lng32 dstLen,
Int32 format,
CollHeap *heap,
ComDiagsArea** diagsArea);
char *getDefaultStringValue(CollHeap *heap);
// ---------------------------------------------------------------------
// Redefinition of methods inherited from NAVersionedObject.
// ---------------------------------------------------------------------
virtual unsigned char getClassVersionID()
{
return 1;
}
virtual void populateImageVersionIDArray()
{
setImageVersionID(2,getClassVersionID());
SimpleType::populateImageVersionIDArray();
}
virtual short getClassSize() { return (short)sizeof(*this); }
// ---------------------------------------------------------------------
static const char * getDatetimeFormatStr(Lng32 frmt)
{
return datetimeFormat[frmt].str;
}
static const Lng32 getDatetimeFormat(const char * formatStr)
{
for (Lng32 i = DATETIME_FORMAT_MIN; i <= DATETIME_FORMAT_MAX; i++)
{
if (stricmp(formatStr, datetimeFormat[i].str) == 0)
{
if (datetimeFormat[i].format != i)
return -1;
return i;
}
}
for (Lng32 i = DATETIME_FORMAT_MIN_NUM; i <= DATETIME_FORMAT_MAX_NUM; i++)
{
if (stricmp(formatStr, datetimeFormat[i].str) == 0)
{
if (datetimeFormat[i].format != i)
return -1;
return i;
}
}
for (Lng32 i = DATETIME_FORMAT_EXTRA_MIN; i <= DATETIME_FORMAT_EXTRA_MAX; i++)
{
if (stricmp(formatStr, datetimeFormat[i].str) == 0)
{
if (datetimeFormat[i].format != i)
return -1;
return i;
}
}
for (Lng32 i = DATETIME_FORMAT_MIN_UNRESOLVED; i <= DATETIME_FORMAT_MAX_UNRESOLVED; i++)
{
if (stricmp(formatStr, datetimeFormat[i].str) == 0)
{
if (datetimeFormat[i].format != i)
return -1;
return i;
}
}
return -1;
}
static NABoolean isDateTimeFormat(Lng32 frmt)
{
return ((frmt >= DATETIME_FORMAT_MIN) &&
(frmt <= DATETIME_FORMAT_MAX));
}
static NABoolean isDateFormat(Lng32 frmt)
{
return ((frmt >= DATETIME_FORMAT_MIN_DATE) &&
(frmt <= DATETIME_FORMAT_MAX_DATE));
}
static NABoolean isTimestampFormat(Lng32 frmt)
{
return ((frmt >= DATETIME_FORMAT_MIN_TS) &&
(frmt <= DATETIME_FORMAT_MAX_TS));
}
static NABoolean isTimeFormat(Lng32 frmt)
{
return ((frmt >= DATETIME_FORMAT_MIN_TIME) &&
(frmt <= DATETIME_FORMAT_MAX_TIME));
}
static NABoolean isExtraFormat(Lng32 frmt)
{
return ((frmt >= DATETIME_FORMAT_EXTRA_MIN) &&
(frmt <= DATETIME_FORMAT_EXTRA_MAX));
}
static NABoolean isNumericFormat(Lng32 frmt)
{
return ((frmt == DATETIME_FORMAT_NUM1) || (frmt == DATETIME_FORMAT_NUM2));
}
static Lng32 getDatetimeFormatLen(Lng32 frmt)
{
return datetimeFormat[frmt].minLen;
}
static Lng32 getDatetimeFormatMaxLen(Lng32 frmt)
{
return datetimeFormat[frmt].maxLen;
}
private:
};
#endif