#include "db_access.h" #include "db.h" #define N_ANNEES 4 #define N_MONTH 12 #define N_DAYS 31 #define N_BY_DAYS (3600*24) int _db_index_load(db_metadata_t** out, off_t *n, const char* path) { int f = open(path, O_RDONLY ); if(f<0) { fprintf(stderr, "Error reading '%s' (_db_index_load())", path); perror(" "); *out=NULL; return errno; } *n=lseek(f, 0, SEEK_END)/sizeof(db_metadata_t); *out=malloc(sizeof(db_metadata_t)* (*n)); if(!*out) { fprintf(stderr, "Error allocating %ld bytes (_db_index_load())", sizeof(db_metadata_t)*(*n)); perror(" "); return errno; } lseek(f,0,SEEK_SET); read(f, *out, sizeof(db_metadata_t)* (*n)); close(f); return 0; } int db_index_load(db_index_t* out) { int fd; if(!out) return -1; if(_db_index_load(&out->days, &out->ndays, "metadata_days")) return errno; if(_db_index_load(&out->monthes, &out->nmonthes, "metadata_monthes")) return errno; if(_db_index_load(&out->years, &out->nyears, "metadata_years")) return errno; fd = open("data", O_RDONLY); if(fd<0) { fprintf(stderr, "Unable to open data file (db_index_load())"); perror(" "); return -1; } out->data_count=lseek(fd, 0, SEEK_END)/sizeof(db_data_t); close(fd); return 0; } void db_index_release(db_index_t* in) { if(!in) return; if(in->days) free(in->days); if(in->monthes) free(in->monthes); if(in->years) free(in->years); } db_data_interval_t* db_data_interval_new(uint32_t start, uint32_t len) { db_data_interval_t* ret; ret=malloc(sizeof(db_data_interval_t)); if(!ret) { fprintf(stderr, "Unable to allocate %ld bytes (db_data_interval_new())", sizeof(db_data_interval_t)); perror(" "); return NULL; } ret->start=start; ret->len=len; ret->data=malloc((ret->len)*sizeof(db_data_t)); if(!ret->data) { fprintf(stderr, "Unable to allocate %ld bytes (db_data_interval_new())", (ret->len)*sizeof(db_data_t)); perror(" "); free(ret); return NULL; } return ret; } void db_data_interval_free(db_data_interval_t* dbdi) { if(!dbdi) return; if(dbdi->data) free(dbdi->data); free(dbdi); } uint32_t db_index_get(db_t* db, db_date_t d, uint32_t time, int f) { db_interval_t inter; db_data_t *buffer=NULL; off_t size; int i,n; inter = db_inter_get(db, d); if(inter.start==0xFFFFFFFF || inter.len==0xFFFFFFFF) return 0xFFFFFFFF; n=inter.len; buffer = malloc(inter.len*sizeof(db_data_t)); if(!buffer) { fprintf(stderr, "Unable to allocate %ld bytes (db_index_get())", inter.len*sizeof(db_data_t)); perror(" "); return 0xffffffff; } lseek(f, inter.start*sizeof(db_data_t), SEEK_SET); size=read(f, buffer, sizeof(db_data_t) * inter.len); if(sizetime) break; free(buffer); i--; if(inter.start==0) return 0; return inter.start+i; } void write_data() { int f = open("data", O_RDWR | O_CREAT, 0777); int i; db_data_t data; data.date.day=1; data.date.month=1; data.date.year=2016; data.micros=0; for(i=0; i=N_BY_DAYS*1000) { data.date.day++; data.micros=0; if(data.date.day>N_DAYS) { data.date.day=1; data.date.month++; if(data.date.month>N_MONTH) { data.date.month=1; data.date.year++; } } } write(f, &data, sizeof(db_data_t)); data.micros+=1000; //fprintf(f, "%d %d %d : %ld\n", data.date.year, data.date.month, data.date.day, data.micros); } close(f); } void write_day() { int f = open("metadata_days", O_RDWR | O_CREAT, 0777 ); off_t i; db_metadata_t data; data.date.day=0; data.date.month=1; data.date.year=2016; data.index=0; for(i=0; iN_DAYS) { data.date.day=1; data.date.month++; if(data.date.month>N_MONTH) { data.date.month=1; data.date.year++; } } write(f, &data, sizeof(db_metadata_t)); } close(f); } void write_month() { int f = open("metadata_monthes", O_RDWR | O_CREAT, 0777 ); int i; db_metadata_t data; data.date.day=1; data.date.month=0; data.date.year=2016; data.index=0; for(i=0; iN_MONTH) { data.date.month=1; data.date.year++; } write(f, &data, sizeof(db_metadata_t)); } close(f); } void write_year() { int f = open("metadata_years", O_RDWR | O_CREAT, 0777 ); int i; db_metadata_t data; data.date.day=1; data.date.month=1; data.date.year=2016-1; data.index=0; for(i=0; idata, sizeof(db_data_t)*(len)); if(size<(len)*sizeof(db_data_t)) { fprintf(stderr, "Unable to read entire %ld / %ld bytes (db_data_load())", size, (len)*sizeof(db_data_t)); perror(" "); return inter; } close(f); return inter; } /* int main(int argc, char** argv) { write_data(); write_day(); write_month(); write_year(); db_t db; db_data_interval_t *di; db_date_t ds, de; int i; uint32_t dsm=9999; ds.year=2019; ds.month=12; ds.day=31; de.year=2016; de.month=12; de.day=7; db_init(&db); //di=db_data_load(&db, ds, dsm, de, dsm+100000000); di=db_data_load(&db, ds, dsm, ds, dsm); for(i=0; ilen; i++) { printf("%ld : (%.2ld-%.2ld-%.4ld) -> %ld\n", di->start+i , di->data[i].date.day , di->data[i].date.month , di->data[i].date.year , di->data[i].micros); } free(di->data); int a,m,j,ms; for(a=2015; a<2021; a++) { printf("year: %d\n", a); ds.year=a; de.year=a; for(m=1; m<13; m++) { printf("\tmonth: %d\n", m); ds.month=m; de.month=m; for(j=1; j<31; j++) { printf("\t\tday: %d\n", j); ds.day=j; de.day=j+1; for(ms=0; ms<24*3600*1000; ms+=60*1000) { di=db_data_load(&db, ds, dsm, ds, dsm); if(!di) { fprintf(stderr , "Error on (%.2d-%.2d-%.2d : %d)\n", j, m ,a ,ms/1000); } else free(di->data); } di=db_data_load(&db, ds, dsm, de, dsm); if(!di) { fprintf(stderr , "Error on (%.2d-%.2d-%.2d : %d)\n", j, m ,a ,ms/1000); } else free(di->data); } } } db_free(&db); return 0; }*/