Branch: Tag:

2017-03-12

2017-03-12 14:54:40 by Henrik Grubbström (Grubba) <grubba@grubba.org>

Sql.mysql: Reduce code duplication somewhat.

537:    return e;   }    - // The following time conversion functions assumes the SQL server - // handles time in this local timezone. They map the special zero - // time/date spec to 0. -  - private constant timezone = localtime (0)->timezone; -  +    //! Converts a system time value to an appropriately formatted time   //! spec for the database.   //!
555:   //! seconds-since-midnight value.   string encode_time (int time, void|int date)   { -  if (date) { -  if (!time) return "000000"; -  mapping(string:int) ct = localtime (time); -  return sprintf ("%02d%02d%02d", ct->hour, ct->min, ct->sec); +  return ::encode_time(time, date) - ":";   } -  else return sprintf ("%02d%02d%02d", time / 3600 % 24, time / 60 % 60, time % 60); - } +       //! Converts a system time value to an appropriately formatted   //! date-only spec for the database.
570:   //! Time to encode.   string encode_date (int time)   { -  if (!time) return "00000000"; -  mapping(string:int) ct = localtime (time); -  return sprintf ("%04d%02d%02d", ct->year + 1900, ct->mon + 1, ct->mday); +  return ::encode_date(time) - "-";   }      //! Converts a system time value to an appropriately formatted
582:   //! Time to encode.   string encode_datetime (int time)   { -  if (!time) return "00000000000000"; -  mapping(string:int) ct = localtime (time); -  return sprintf ("%04d%02d%02d%02d%02d%02d", -  ct->year + 1900, ct->mon + 1, ct->mday, -  ct->hour, ct->min, ct->sec); +  return replace(::encode_datetime(time), "-:T"/"", ({"", "", ""}));   }    - //! Converts a database time spec to a system time value. - //! - //! @param timestr - //! Time spec to decode. - //! - //! @param date - //! Take the date part from this system time value. If zero, a - //! seconds-since-midnight value is returned. - int decode_time (string timestr, void|int date) - { -  int hour = 0, min = 0, sec = 0; -  if (sscanf (timestr, "%d:%d:%d", hour, min, sec) <= 1) -  sscanf (timestr, "%2d%2d%2d", hour, min, sec); -  if (date && (hour || min || sec)) { -  mapping(string:int) ct = localtime (date); -  return mktime (sec, min, hour, ct->mday, ct->mon, ct->year, ct->isdst, ct->timezone); -  } -  else return (hour * 60 + min) * 60 + sec; - } -  - //! Converts a database date-only spec to a system time value. - //! Assumes 4-digit years. - //! - //! @param datestr - //! Date spec to decode. - int decode_date (string datestr) - { -  int year = 0, mon = 0, mday = 0, n; -  n = sscanf (datestr, "%d-%d-%d", year, mon, mday); -  if (n <= 1) n = sscanf (datestr, "%4d%2d%2d", year, mon, mday); -  if (year || mon || mday) -  return mktime (0, 0, 0, n == 3 ? mday : 1, n >= 2 && mon - 1, year - 1900, -  -1, timezone); -  else return 0; - } -  - //! Converts a database date and time spec to a system time value. - //! Can decode strings missing the time part. - //! - //! @param datestr - //! Date and time spec to decode. - int decode_datetime (string timestr) - { -  array(string) a = timestr / " "; -  if (sizeof (a) == 2) -  return decode_date (a[0]) + decode_time (a[1]); -  else { -  int n = sizeof (timestr); -  if (n >= 12) -  return decode_date (timestr[..n-7]) + decode_time (timestr[n-6..n-1]); -  else -  return decode_date (timestr); -  } - } -  +    #if constant (Mysql.mysql.HAVE_MYSQL_FIELD_CHARSETNR)   #define HAVE_MYSQL_FIELD_CHARSETNR_IFELSE(TRUE, FALSE) TRUE   #else