123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- #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+start<db->index.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+start<db->index.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);
- }
- */
|