123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- from cpython.object cimport PyObject
- cdef extern from "Python.h":
- ctypedef struct PyTypeObject:
- pass
- cdef extern from "datetime.h":
- ctypedef extern class datetime.date[object PyDateTime_Date]:
- pass
- ctypedef extern class datetime.time[object PyDateTime_Time]:
- pass
- ctypedef extern class datetime.datetime[object PyDateTime_DateTime]:
- pass
- ctypedef extern class datetime.timedelta[object PyDateTime_Delta]:
- pass
- ctypedef extern class datetime.tzinfo[object PyDateTime_TZInfo]:
- pass
- ctypedef struct PyDateTime_Date:
- pass
- ctypedef struct PyDateTime_Time:
- char hastzinfo
- PyObject *tzinfo
- ctypedef struct PyDateTime_DateTime:
- char hastzinfo
- PyObject *tzinfo
- ctypedef struct PyDateTime_Delta:
- int days
- int seconds
- int microseconds
- # Define structure for C API.
- ctypedef struct PyDateTime_CAPI:
- # type objects
- PyTypeObject *DateType
- PyTypeObject *DateTimeType
- PyTypeObject *TimeType
- PyTypeObject *DeltaType
- PyTypeObject *TZInfoType
- # constructors
- object (*Date_FromDate)(int, int, int, PyTypeObject*)
- object (*DateTime_FromDateAndTime)(int, int, int, int, int, int, int, object, PyTypeObject*)
- object (*Time_FromTime)(int, int, int, int, object, PyTypeObject*)
- object (*Delta_FromDelta)(int, int, int, int, PyTypeObject*)
- # constructors for the DB API
- object (*DateTime_FromTimestamp)(object, object, object)
- object (*Date_FromTimestamp)(object, object)
- # Check type of the object.
- bint PyDate_Check(object op)
- bint PyDate_CheckExact(object op)
- bint PyDateTime_Check(object op)
- bint PyDateTime_CheckExact(object op)
- bint PyTime_Check(object op)
- bint PyTime_CheckExact(object op)
- bint PyDelta_Check(object op)
- bint PyDelta_CheckExact(object op)
- bint PyTZInfo_Check(object op)
- bint PyTZInfo_CheckExact(object op)
- # Getters for date and datetime (C macros).
- int PyDateTime_GET_YEAR(object o)
- int PyDateTime_GET_MONTH(object o)
- int PyDateTime_GET_DAY(object o)
- # Getters for datetime (C macros).
- int PyDateTime_DATE_GET_HOUR(object o)
- int PyDateTime_DATE_GET_MINUTE(object o)
- int PyDateTime_DATE_GET_SECOND(object o)
- int PyDateTime_DATE_GET_MICROSECOND(object o)
- # Getters for time (C macros).
- int PyDateTime_TIME_GET_HOUR(object o)
- int PyDateTime_TIME_GET_MINUTE(object o)
- int PyDateTime_TIME_GET_SECOND(object o)
- int PyDateTime_TIME_GET_MICROSECOND(object o)
- # Getters for timedelta (C macros).
- int PyDateTime_DELTA_GET_DAYS(object o)
- int PyDateTime_DELTA_GET_SECONDS(object o)
- int PyDateTime_DELTA_GET_MICROSECONDS(object o)
- # PyDateTime CAPI object.
- PyDateTime_CAPI *PyDateTimeAPI
- void PyDateTime_IMPORT()
- # Datetime C API initialization function.
- # You have to call it before any usage of DateTime CAPI functions.
- cdef inline void import_datetime():
- PyDateTime_IMPORT
- # Create date object using DateTime CAPI factory function.
- # Note, there are no range checks for any of the arguments.
- cdef inline object date_new(int year, int month, int day):
- return PyDateTimeAPI.Date_FromDate(year, month, day, PyDateTimeAPI.DateType)
- # Create time object using DateTime CAPI factory function
- # Note, there are no range checks for any of the arguments.
- cdef inline object time_new(int hour, int minute, int second, int microsecond, object tz):
- return PyDateTimeAPI.Time_FromTime(hour, minute, second, microsecond, tz, PyDateTimeAPI.TimeType)
- # Create datetime object using DateTime CAPI factory function.
- # Note, there are no range checks for any of the arguments.
- cdef inline object datetime_new(int year, int month, int day, int hour, int minute, int second, int microsecond, object tz):
- return PyDateTimeAPI.DateTime_FromDateAndTime(year, month, day, hour, minute, second, microsecond, tz, PyDateTimeAPI.DateTimeType)
- # Create timedelta object using DateTime CAPI factory function.
- # Note, there are no range checks for any of the arguments.
- cdef inline object timedelta_new(int days, int seconds, int useconds):
- return PyDateTimeAPI.Delta_FromDelta(days, seconds, useconds, 1, PyDateTimeAPI.DeltaType)
- # More recognizable getters for date/time/datetime/timedelta.
- # There are no setters because datetime.h hasn't them.
- # This is because of immutable nature of these objects by design.
- # If you would change time/date/datetime/timedelta object you need to recreate.
- # Get tzinfo of time
- cdef inline object time_tzinfo(object o):
- if (<PyDateTime_Time*>o).hastzinfo:
- return <object>(<PyDateTime_Time*>o).tzinfo
- else:
- return None
- # Get tzinfo of datetime
- cdef inline object datetime_tzinfo(object o):
- if (<PyDateTime_DateTime*>o).hastzinfo:
- return <object>(<PyDateTime_DateTime*>o).tzinfo
- else:
- return None
- # Get year of date
- cdef inline int date_year(object o):
- return PyDateTime_GET_YEAR(o)
- # Get month of date
- cdef inline int date_month(object o):
- return PyDateTime_GET_MONTH(o)
- # Get day of date
- cdef inline int date_day(object o):
- return PyDateTime_GET_DAY(o)
- # Get year of datetime
- cdef inline int datetime_year(object o):
- return PyDateTime_GET_YEAR(o)
- # Get month of datetime
- cdef inline int datetime_month(object o):
- return PyDateTime_GET_MONTH(o)
- # Get day of datetime
- cdef inline int datetime_day(object o):
- return PyDateTime_GET_DAY(o)
- # Get hour of time
- cdef inline int time_hour(object o):
- return PyDateTime_TIME_GET_HOUR(o)
- # Get minute of time
- cdef inline int time_minute(object o):
- return PyDateTime_TIME_GET_MINUTE(o)
- # Get second of time
- cdef inline int time_second(object o):
- return PyDateTime_TIME_GET_SECOND(o)
- # Get microsecond of time
- cdef inline int time_microsecond(object o):
- return PyDateTime_TIME_GET_MICROSECOND(o)
- # Get hour of datetime
- cdef inline int datetime_hour(object o):
- return PyDateTime_DATE_GET_HOUR(o)
- # Get minute of datetime
- cdef inline int datetime_minute(object o):
- return PyDateTime_DATE_GET_MINUTE(o)
- # Get second of datetime
- cdef inline int datetime_second(object o):
- return PyDateTime_DATE_GET_SECOND(o)
- # Get microsecond of datetime
- cdef inline int datetime_microsecond(object o):
- return PyDateTime_DATE_GET_MICROSECOND(o)
- # Get days of timedelta
- cdef inline int timedelta_days(object o):
- return (<PyDateTime_Delta*>o).days
- # Get seconds of timedelta
- cdef inline int timedelta_seconds(object o):
- return (<PyDateTime_Delta*>o).seconds
- # Get microseconds of timedelta
- cdef inline int timedelta_microseconds(object o):
- return (<PyDateTime_Delta*>o).microseconds
|