@ -27,19 +27,30 @@
@ b r i e f S W I G interface file for type t r a n s l a t i o n of t i m e 64 t y p e s
@ a u t h o r M a r k J e n k i n s , P a r I T W o r k e r C o - o p e r a t i v e < m a r k @ p a r i t . c a >
@ a u t h o r J e f f G r e e n , P a r I T W o r k e r C o - o p e r a t i v e < j e f f @ p a r i t . c a >
@ a u t h o r C h r i s t o p h H o l t e r m a n n , m a i l @ c - h o l t e r m a n n . n e t - m o d i f i c a t i o n s 2019 - 04
@ i n g r o u p p y t h o n _ b i n d i n g s * /
// A typemap for converting python dates to time64 in functions that
// require time64 as an argument
% t y p e m a p ( in ) t i m e 64 {
P y D a t e T i m e _ I M P O R T ;
s t r u c t t m time = { P y D a t e T i m e _ D A T E _ G E T _ S E C O N D ( $ i n p u t ) ,
P y D a t e T i m e _ D A T E _ G E T _ M I N U T E ( $ input ) ,
P y D a t e T i m e _ D A T E _ G E T _ H O U R ( $ input ) ,
P y D a t e T i m e _ G E T _ D A Y ( $ input ) ,
P y D a t e T i m e _ G E T _ M O N T H ( $ input ) - 1 ,
P y D a t e T i m e _ G E T _ Y E A R ( $ input ) - 1900 } ;
$ 1 = g n c _ m k t i m e ( &time);
if ( ! P y D a t e _ C h e c k ( $ input ) && !PyInt_Check($input)) {
P y E r r _ S e t S t r i n g ( P y E x c _ V a l u e E r r o r , "date, datetime or integer expected" ) ;
return NULL ;
}
if ( P y D a t e _ C h e c k ( $ input ) ) {
s t r u c t t m time = { P y D a t e T i m e _ D A T E _ G E T _ S E C O N D ( $ i n p u t ) ,
P y D a t e T i m e _ D A T E _ G E T _ M I N U T E ( $ input ) ,
P y D a t e T i m e _ D A T E _ G E T _ H O U R ( $ input ) ,
P y D a t e T i m e _ G E T _ D A Y ( $ input ) ,
P y D a t e T i m e _ G E T _ M O N T H ( $ input ) - 1 ,
P y D a t e T i m e _ G E T _ Y E A R ( $ input ) - 1900 } ;
$ 1 = g n c _ m k t i m e ( &time);
} else {
$ 1 = P y I n t _ A s L o n g ( $ input ) ;
}
}
// A typemap for converting python dates to time64 *, for functions that
@ -59,20 +70,38 @@
// stack. (SWIG will name the variables ts1, ts2, ts3...)
//
// Mark Jenkins <mark@parit.ca>
//
// as far as I can see all occurences of pointers to time64 are now covered
// by the named typemaps below (2019-04)
//
// Christoph Holtermann <mail@c-holtermann.net>
% t y p e m a p ( in ) t i m e 64 * ( t i m e 64 s e c s ) {
P y D a t e T i m e _ I M P O R T ;
s t r u c t t m time = { P y D a t e T i m e _ D A T E _ G E T _ S E C O N D ( $ i n p u t ) ,
P y D a t e T i m e _ D A T E _ G E T _ M I N U T E ( $ input ) ,
P y D a t e T i m e _ D A T E _ G E T _ H O U R ( $ input ) ,
P y D a t e T i m e _ G E T _ D A Y ( $ input ) ,
P y D a t e T i m e _ G E T _ M O N T H ( $ input ) - 1 ,
P y D a t e T i m e _ G E T _ Y E A R ( $ input ) - 1900 } ;
t i m e 64 s e c s = g n c _ m k t i m e ( &time);
$ 1 = &secs;
if ( ! P y D a t e _ C h e c k ( $ input ) && !PyInt_Check($input)) {
P y E r r _ S e t S t r i n g ( P y E x c _ V a l u e E r r o r , "date, datetime or integer expected" ) ;
return NULL ;
}
if ( P y D a t e _ C h e c k ( $ input ) ) {
s t r u c t t m time = { P y D a t e T i m e _ D A T E _ G E T _ S E C O N D ( $ i n p u t ) ,
P y D a t e T i m e _ D A T E _ G E T _ M I N U T E ( $ input ) ,
P y D a t e T i m e _ D A T E _ G E T _ H O U R ( $ input ) ,
P y D a t e T i m e _ G E T _ D A Y ( $ input ) ,
P y D a t e T i m e _ G E T _ M O N T H ( $ input ) - 1 ,
P y D a t e T i m e _ G E T _ Y E A R ( $ input ) - 1900 } ;
t i m e 64 s e c s = g n c _ m k t i m e ( &time);
$ 1 = &secs;
} else {
t i m e 64 s e c s = P y I n t _ A s L o n g ( $ input ) ;
$ 1 = &secs;
}
}
// A typemap for converting time64 values returned from functions to
// python dates. Note that we can't use Python DateTime's fromtimestamp function because it relies upon libc's localtime. Note also that while we create times with timegm we retrieve it with localtime
/* A t y p e m a p f o r c o n v e r t i n g t i m e 6 4 v a l u e s r e t u r n e d f r o m f u n c t i o n s t o
p y t h o n d a t e s . N o t e t h a t w e c a n 't use Python DateTime's fromtimestamp function because it relies upon libc' s
l o c a l t i m e . N o t e a l s o t h a t while w e create t i m e s with t i m e g m w e r e t r i e v e i t with l o c a l t i m e * /
% t y p e m a p ( o u t ) t i m e 64 {
if ( $ 1 = = I N T 64 _ M A X ) {
$ r e s u l t = P y _ N o n e ;
@ -85,3 +114,40 @@
t . t m _ s e c , 0 ) ;
}
}
// functions using a pointer to time64 to return data
// these are named typemaps focussing for
//
// gboolean qof_query_date_predicate_get_date (const QofQueryPredData *pd, time64 *date)
// gboolean xaccAccountGetReconcileLastDate (const Account *acc, time64 *last_date)
// gboolean xaccAccountGetReconcilePostponeDate (const Account *acc, time64 *postpone_date)
//
// python functions return a list where the first item is the boolean return value and
// the second item is a datetime object. This could be reduced to only returning a date or
// null
//
// the modifiable argument is omitted in python function call
% t y p e m a p ( in , n u m i n p u t s = 0 ) t i m e 64 * date ( t i m e 64 s e c s ) {
$ 1 = &secs;
}
% t y p e m a p ( a r g o u t ) t i m e 64 * date ( t i m e 64 s e c s ) {
P y D a t e T i m e _ I M P O R T ;
P y O b j e c t * t p ;
s t r u c t t m t ;
// directly access return value (result) of function
// only return datetime if TRUE
if ( r e s u l t ) {
g n c _ l o c a l t i m e _ r ( $ 1 , &t);
t p = P y D a t e T i m e _ F r o m D a t e A n d T i m e ( t . t m _ y e a r + 1900 , t . t m _ m o n + 1 ,
t . t m _ m d a y , t . t m _ h o u r , t . t m _ m i n ,
t . t m _ s e c , 0 ) ;
$ r e s u l t = S W I G _ P y t h o n _ A p p e n d O u t p u t ( $ r e s u l t , t p ) ;
} else $ r e s u l t = S W I G _ P y t h o n _ A p p e n d O u t p u t ( $ r e s u l t , P y _ N o n e ) ;
}
% apply t i m e 64 * date { t i m e 6 4 * l a s t _ d a t e } ;
% apply t i m e 64 * date { t i m e 6 4 * p o s t p o n e _ d a t e } ;