#include "db.h" #include "cache.h" #include "db_access.h" off_t _db_index_year(db_t* db, db_date_t d) { db_metadata_t* md = db->index.years; int max = db->index.nyears, min=0; int i = max/2; while(1) { if(md[i].date.year==d.year) return md[i].index; else if(d.year>md[i].date.year) { if( max!=min ) { min=i+1; i=(max-i)/2+i; } else if(max==db->index.nyears) return db->index.nmonthes; else return 0xffffffff; } else { if( max!=min ) { max=i; i=(i-min)/2+min; } else if(!min) return 0; else return 0xffffffff; } } } off_t _db_index_month(db_t* db, db_date_t d, off_t start, off_t len) { db_metadata_t* md = db->index.monthes; int max = len, min = 0; int i = max/2; if(min==max) return min; while(1) { if(md[i+start].date.month==d.month) return md[i+start].index; else if(d.month>md[i+start].date.month) { if( max!=min ) { min=i+1; i=(max-i)/2+i; } else if(max==len && len+startindex.nmonthes) return md[len+start].index; else if(max==len && len+start>=db->index.nmonthes) return db->index.ndays; else return 0xffffffff; } else { if( max!=min ) { max=i; i=(i-min)/2+min; } else if(!min) return 0; else return 0xffffffff; } } } off_t _db_index_day(db_t* db, db_date_t d, off_t start, off_t len) { db_metadata_t* md = db->index.days; int max = len, min=0; int i = max/2; if(min==max) return min; while(1) { if(md[i+start].date.day==d.day) return md[i+start].index; else if(d.day>md[i+start].date.day) { if( max!=min ) { min=i+1; i=(max-i)/2+i; } else if(max==len && len+startindex.ndays) return md[len+start].index; else if(max==len && len+start>=db->index.ndays) return db->index.data_count; else return 0xffffffff; } else { if( max!=min) { max=i; i=(i-min)/2+min; } else if(!min) return 0; else return 0xffffffff; } } } db_interval_t db_inter_get(db_t* db, db_date_t d) { db_interval_t inter; db_date_t d2; off_t ys, yl, ms, ml; inter.start=0xFFFFFFFF; inter.len=0xFFFFFFFF; d2=d; ys=_db_index_year(db, d2); if(ys==0XFFFFFFFF) return inter; d2.year++; yl=_db_index_year(db, d2); if(yl==0XFFFFFFFF) return inter; d2=d; ms=_db_index_month(db, d2, ys, yl-ys); if(ms==0XFFFFFFFF) return inter; d2.month++; ml=_db_index_month(db, d2, ys, yl-ys); if(ml==0XFFFFFFFF) return inter; d2=d; inter.start=_db_index_day(db, d2, ms, ml-ms); if(inter.start==0XFFFFFFFF) return inter; d2.day++; inter.len=_db_index_day(db, d2, ms, ml-ms)-inter.start; return inter; } int db_init(db_t* db) { if(!db) return -1; if(db_index_load(&db->index)); return 0; } void db_free(db_t* db) { if(!db) return; db_index_release(&db->index); } int db_time_cmp( db_time_t* a, db_time_t* b) { if(a->date.year > b->date.year) return 1; if(a->date.year < b->date.year) return -1; if(a->date.month > b->date.month) return 1; if(a->date.month < b->date.month) return -1; if(a->date.day > b->date.day) return 1; if(a->date.day < b->date.day) return -1; if(a->millis > b->millis) return 1; if(a->millis < b->millis) return -1; return 0; } db_data_set_t* db_get(db_t* db, db_time_t* start, db_time_t* end) { db_interval_t s, e, total; s=db_inter_get(db, start->date); e=db_inter_get(db, end->date); total.start=s.start; total.len=e.start+e.len-s.start; return NULL; } /* int main(int argc, char** argv) { cache_t cache; cache_init(&cache, CACHE_PAGE_SIZE, CACHE_PAGE_COUNT); cache_free(&cache); } */