def value(self, raw_value): if self.sqltype == SQL_TYPE_TEXT: if self.sqlsubtype == 1: # OCTETS return raw_value else: return self.bytes_to_str(raw_value) elif self.sqltype == SQL_TYPE_VARYING: if self.sqlsubtype == 1: # OCTETS return raw_value else: return self.bytes_to_str(raw_value) elif self.sqltype in (SQL_TYPE_SHORT, SQL_TYPE_LONG, SQL_TYPE_INT64): n = bytes_to_bint(raw_value) if self.sqlscale: return decimal.Decimal(str(n) + 'e' + str(self.sqlscale)) else: return n elif self.sqltype == SQL_TYPE_DATE: yyyy, mm, dd = self._parse_date(raw_value) return datetime.date(yyyy, mm, dd) elif self.sqltype == SQL_TYPE_TIME: h, m, s, ms = self._parse_time(raw_value) return datetime.time(h, m, s, ms) elif self.sqltype == SQL_TYPE_TIMESTAMP: yyyy, mm, dd = self._parse_date(raw_value[:4]) h, m, s, ms = self._parse_time(raw_value[4:]) return datetime.datetime(yyyy, mm, dd, h, m, s, ms) elif self.sqltype == SQL_TYPE_FLOAT: return struct.unpack('!f', raw_value)[0] elif self.sqltype == SQL_TYPE_DOUBLE: return struct.unpack('!d', raw_value)[0] else: return raw_value
def value(self, raw_value): if self.sqltype == SQL_TYPE_TEXT: if self.sqlsubtype in (4, 69): # UTF8 and GB18030 reallength = self.sqllen // 4 return self.bytes_to_str(raw_value)[:reallength] elif self.sqlsubtype == 3: # UNICODE_FSS reallength = self.sqllen // 3 return self.bytes_to_str(raw_value)[:reallength] else: return self.bytes_to_str(raw_value) elif self.sqltype == SQL_TYPE_VARYING: return self.bytes_to_str(raw_value) elif self.sqltype in (SQL_TYPE_SHORT, SQL_TYPE_LONG, SQL_TYPE_INT64): n = bytes_to_bint(raw_value) if self.sqlscale: return decimal.Decimal(str(n) + "e" + str(self.sqlscale)) else: return n elif self.sqltype == SQL_TYPE_DATE: yyyy, mm, dd = self._parse_date(raw_value) return datetime.date(yyyy, mm, dd) elif self.sqltype == SQL_TYPE_TIME: h, m, s, ms = self._parse_time(raw_value) return datetime.time(h, m, s, ms) elif self.sqltype == SQL_TYPE_TIMESTAMP: yyyy, mm, dd = self._parse_date(raw_value[:4]) h, m, s, ms = self._parse_time(raw_value[4:]) return datetime.datetime(yyyy, mm, dd, h, m, s, ms) elif self.sqltype == SQL_TYPE_FLOAT: return struct.unpack("!f", raw_value)[0] elif self.sqltype == SQL_TYPE_DOUBLE: return struct.unpack("!d", raw_value)[0] else: return raw_value
def _parse_time(self, raw_value): "Convert raw data to datetime.time" n = bytes_to_bint(raw_value) s = n // 10000 m = s // 60 h = m // 60 m = m % 60 s = s % 60 return (h, m, s, (n % 10000) * 100)
def _parse_date(self, raw_value): "Convert raw data to datetime.date" nday = bytes_to_bint(raw_value) + 678882 century = (4 * nday -1) // 146097 nday = 4 * nday - 1 - 146097 * century day = nday // 4 nday = (4 * day + 3) // 1461 day = 4 * day + 3 - 1461 * nday day = (day + 4) // 4 month = (5 * day -3) // 153 day = 5 * day - 3 - 153 * month day = (day + 5) // 5 year = 100 * century + nday if month < 10: month += 3 else: month -= 9 year += 1 return year, month, day
def _parse_date(self, raw_value): "Convert raw data to datetime.date" nday = bytes_to_bint(raw_value) + 678882 century = (4 * nday - 1) // 146097 nday = 4 * nday - 1 - 146097 * century day = nday // 4 nday = (4 * day + 3) // 1461 day = 4 * day + 3 - 1461 * nday day = (day + 4) // 4 month = (5 * day - 3) // 153 day = 5 * day - 3 - 153 * month day = (day + 5) // 5 year = 100 * century + nday if month < 10: month += 3 else: month -= 9 year += 1 return year, month, day