#include #define __USE_XOPEN #include #include #include "mi.h" mi_lvarchar *oni_gettimeofday(mi_lvarchar *dtestr, MI_FPARAM *fp) { struct timeval tv; struct tm *ptm; char format[40]; char str[40]; gettimeofday(&tv, NULL); ptm=localtime(&tv.tv_sec); if(mi_fp_argisnull(fp,0)==MI_TRUE) stcopy("%Y-%m-%d %H:%M:%S",format); else sprintf(format,"%.*s", mi_get_varlen(dtestr), mi_get_vardata(dtestr)); strftime(str, 40, format, ptm); sprintf(str, "%s.%05ld", str, tv.tv_usec / 1000); mi_set_varlen(dtestr, stleng(str)); mi_set_vardata(dtestr, str); return(dtestr); } mi_integer oni_isoweek(mi_datetime *p_dte, MI_FPARAM *fp) { struct timeval tv; struct tm *ptm; char dtestr[40]; gettimeofday(&tv, NULL); ptm=localtime(&tv.tv_sec); if(mi_fp_argisnull(fp,0) != MI_TRUE) { if(NULL == strcpy(dtestr, mi_datetime_to_string(p_dte))) mi_db_error_raise(NULL, MI_EXCEPTION, "Failed convert datetime"); dtestr[19]= 0 ; if(NULL == (strptime(dtestr, "%F %R:%S", ptm))) mi_db_error_raise(NULL, MI_EXCEPTION, "Format of date failed"); } return ((ptm->tm_yday/7 + 1)); } mi_integer oni_isoday(mi_datetime *p_dte, MI_FPARAM *fp) { struct timeval tv; struct tm *ptm; char dtestr[40]; gettimeofday(&tv, NULL); ptm=localtime(&tv.tv_sec); if(mi_fp_argisnull(fp,0) != MI_TRUE) { if(NULL == strcpy(dtestr, mi_datetime_to_string(p_dte))) mi_db_error_raise(NULL, MI_EXCEPTION, "Failed convert datetime"); dtestr[19]= 0 ; if(NULL == (strptime(dtestr, "%F %R:%S", ptm))) mi_db_error_raise(NULL, MI_EXCEPTION, "Format of date failed"); } return (ptm->tm_yday); } void oni_sleep(mi_integer ms) { struct timespec ts; int i; long wait; clock_getres(CLOCK_MONOTONIC, &ts); clock_gettime(CLOCK_MONOTONIC, &ts); for(i=ms;i--;) { wait = (ts.tv_sec * 1000000000L + ts.tv_nsec) + 1000000; ts.tv_sec = wait / 1000000000L; ts.tv_nsec = wait % 1000000000L; clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &ts, NULL); mi_yield(); } }