#include #include #include "ant.h" #include "sqlite3.h" #if SQLITE_VERSION_NUMBER < 3005000 #error "SQLite too old!" #endif void sqlite_store_result (sqlite3 *sql) { } int GenericSQLCallback (void *pArg, int argc, char **argv, char **columnNames) { return 0; } long long day_number (int real_year, int dayofyear, int sec) { int year = real_year - 1; /* get all days plus all leap years, minus non-leap years */ long long days = year * 365; days += year / 4 - year / 100 + year / 400; days = days - (1900 * 365); days += dayofyear; /* convert to milliseconds */ days *= 144000000; days += sec; return (days); } void between_times (sqlite3_context *context, int argc, sqlite3_value **argv) { int bt1_yr, et1_yr, bt1_day, et1_day; long bt1_msec, et1_msec; int bt2_yr, bt2_day, et2_day, et2_yr; long bt2_msec, et2_msec; long long dayn1, dayn2, dayn3, dayn4; bt1_yr = sqlite3_value_int (argv [0]); bt1_day = sqlite3_value_int (argv [1]); bt1_msec = sqlite3_value_int (argv [2]); et1_yr = sqlite3_value_int (argv [3]); et1_day = sqlite3_value_int (argv [4]); et1_msec = sqlite3_value_int (argv [5]); bt2_yr = sqlite3_value_int (argv [6]); bt2_day = sqlite3_value_int (argv [7]); bt2_msec = sqlite3_value_int (argv [8]); et2_yr = sqlite3_value_int (argv [9]); et2_day = sqlite3_value_int (argv [10]); et2_msec = sqlite3_value_int (argv [11]); /* convert the year and the day to a single number */ dayn1 = day_number (bt1_yr, bt1_day, bt1_msec); dayn2 = day_number (et1_yr, et1_day, et1_msec); dayn3 = day_number (bt2_yr, bt2_day, bt2_msec); dayn4 = day_number (et2_yr, et2_day, et2_msec); if ((dayn3 > dayn1) && (dayn3 >= dayn2)) { sqlite3_result_int (context, 0); return; } if ((dayn3 < dayn1) && (dayn1 > dayn4)) { sqlite3_result_int (context, 0); return; } sqlite3_result_int (context, 1); } void create_between_times (sqlite3 *sql) { sqlite3_create_function (sql, "between_times", 12, SQLITE_ANY, NULL, between_times, NULL, NULL); }