db_access.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. #include "db_access.h"
  2. #include "db.h"
  3. #define N_ANNEES 4
  4. #define N_MONTH 12
  5. #define N_DAYS 31
  6. #define N_BY_DAYS (3600*24)
  7. int _db_index_load(db_metadata_t** out, off_t *n, const char* path)
  8. {
  9. int f = open(path, O_RDONLY );
  10. if(f<0)
  11. {
  12. fprintf(stderr, "Error reading '%s' (_db_index_load())", path);
  13. perror(" ");
  14. *out=NULL;
  15. return errno;
  16. }
  17. *n=lseek(f, 0, SEEK_END)/sizeof(db_metadata_t);
  18. *out=malloc(sizeof(db_metadata_t)* (*n));
  19. if(!*out)
  20. {
  21. fprintf(stderr, "Error allocating %ld bytes (_db_index_load())", sizeof(db_metadata_t)*(*n));
  22. perror(" ");
  23. return errno;
  24. }
  25. lseek(f,0,SEEK_SET);
  26. read(f, *out, sizeof(db_metadata_t)* (*n));
  27. close(f);
  28. return 0;
  29. }
  30. int db_index_load(db_index_t* out)
  31. {
  32. int fd;
  33. if(!out) return -1;
  34. if(_db_index_load(&out->days, &out->ndays, "metadata_days")) return errno;
  35. if(_db_index_load(&out->monthes, &out->nmonthes, "metadata_monthes")) return errno;
  36. if(_db_index_load(&out->years, &out->nyears, "metadata_years")) return errno;
  37. fd = open("data", O_RDONLY);
  38. if(fd<0)
  39. {
  40. fprintf(stderr, "Unable to open data file (db_index_load())");
  41. perror(" ");
  42. return -1;
  43. }
  44. out->data_count=lseek(fd, 0, SEEK_END)/sizeof(db_data_t);
  45. close(fd);
  46. return 0;
  47. }
  48. void db_index_release(db_index_t* in)
  49. {
  50. if(!in) return;
  51. if(in->days) free(in->days);
  52. if(in->monthes) free(in->monthes);
  53. if(in->years) free(in->years);
  54. }
  55. db_data_interval_t* db_data_interval_new(uint32_t start, uint32_t len)
  56. {
  57. db_data_interval_t* ret;
  58. ret=malloc(sizeof(db_data_interval_t));
  59. if(!ret)
  60. {
  61. fprintf(stderr, "Unable to allocate %ld bytes (db_data_interval_new())",
  62. sizeof(db_data_interval_t));
  63. perror(" ");
  64. return NULL;
  65. }
  66. ret->start=start;
  67. ret->len=len;
  68. ret->data=malloc((ret->len)*sizeof(db_data_t));
  69. if(!ret->data)
  70. {
  71. fprintf(stderr, "Unable to allocate %ld bytes (db_data_interval_new())",
  72. (ret->len)*sizeof(db_data_t));
  73. perror(" ");
  74. free(ret);
  75. return NULL;
  76. }
  77. return ret;
  78. }
  79. void db_data_interval_free(db_data_interval_t* dbdi)
  80. {
  81. if(!dbdi) return;
  82. if(dbdi->data) free(dbdi->data);
  83. free(dbdi);
  84. }
  85. uint32_t db_index_get(db_t* db, db_date_t d, uint32_t time, int f)
  86. {
  87. db_interval_t inter;
  88. db_data_t *buffer=NULL;
  89. off_t size;
  90. int i,n;
  91. inter = db_inter_get(db, d);
  92. if(inter.start==0xFFFFFFFF || inter.len==0xFFFFFFFF) return 0xFFFFFFFF;
  93. n=inter.len;
  94. buffer = malloc(inter.len*sizeof(db_data_t));
  95. if(!buffer)
  96. {
  97. fprintf(stderr, "Unable to allocate %ld bytes (db_index_get())", inter.len*sizeof(db_data_t));
  98. perror(" ");
  99. return 0xffffffff;
  100. }
  101. lseek(f, inter.start*sizeof(db_data_t), SEEK_SET);
  102. size=read(f, buffer, sizeof(db_data_t) * inter.len);
  103. if(size<inter.len*sizeof(db_data_t))
  104. {
  105. fprintf(stderr, "Unable to read entire %ld / %ld bytes (db_index_get())", size, inter.len*sizeof(db_data_t));
  106. perror(" ");
  107. return 0xffffffff;
  108. }
  109. for(i=0; i<n; i++)
  110. if(buffer[i].micros>time) break;
  111. free(buffer);
  112. i--;
  113. if(inter.start==0) return 0;
  114. return inter.start+i;
  115. }
  116. void write_data()
  117. {
  118. int f = open("data", O_RDWR | O_CREAT, 0777);
  119. int i;
  120. db_data_t data;
  121. data.date.day=1;
  122. data.date.month=1;
  123. data.date.year=2016;
  124. data.micros=0;
  125. for(i=0; i<N_ANNEES*N_MONTH*N_DAYS*N_BY_DAYS; i++)
  126. {
  127. if(data.micros>=N_BY_DAYS*1000)
  128. {
  129. data.date.day++;
  130. data.micros=0;
  131. if(data.date.day>N_DAYS)
  132. {
  133. data.date.day=1;
  134. data.date.month++;
  135. if(data.date.month>N_MONTH)
  136. {
  137. data.date.month=1;
  138. data.date.year++;
  139. }
  140. }
  141. }
  142. write(f, &data, sizeof(db_data_t));
  143. data.micros+=1000;
  144. //fprintf(f, "%d %d %d : %ld\n", data.date.year, data.date.month, data.date.day, data.micros);
  145. }
  146. close(f);
  147. }
  148. void write_day()
  149. {
  150. int f = open("metadata_days", O_RDWR | O_CREAT, 0777 );
  151. off_t i;
  152. db_metadata_t data;
  153. data.date.day=0;
  154. data.date.month=1;
  155. data.date.year=2016;
  156. data.index=0;
  157. for(i=0; i<N_ANNEES*N_MONTH*N_DAYS; i++)
  158. {
  159. data.index=i*N_BY_DAYS;
  160. //data.index=i;
  161. data.date.day++;
  162. if(data.date.day>N_DAYS)
  163. {
  164. data.date.day=1;
  165. data.date.month++;
  166. if(data.date.month>N_MONTH)
  167. {
  168. data.date.month=1;
  169. data.date.year++;
  170. }
  171. }
  172. write(f, &data, sizeof(db_metadata_t));
  173. }
  174. close(f);
  175. }
  176. void write_month()
  177. {
  178. int f = open("metadata_monthes", O_RDWR | O_CREAT, 0777 );
  179. int i;
  180. db_metadata_t data;
  181. data.date.day=1;
  182. data.date.month=0;
  183. data.date.year=2016;
  184. data.index=0;
  185. for(i=0; i<N_MONTH*N_ANNEES; i++)
  186. {
  187. data.index=i*N_DAYS;
  188. data.date.month++;
  189. if(data.date.month>N_MONTH)
  190. {
  191. data.date.month=1;
  192. data.date.year++;
  193. }
  194. write(f, &data, sizeof(db_metadata_t));
  195. }
  196. close(f);
  197. }
  198. void write_year()
  199. {
  200. int f = open("metadata_years", O_RDWR | O_CREAT, 0777 );
  201. int i;
  202. db_metadata_t data;
  203. data.date.day=1;
  204. data.date.month=1;
  205. data.date.year=2016-1;
  206. data.index=0;
  207. for(i=0; i<N_ANNEES; i++)
  208. {
  209. data.index=i*N_MONTH;
  210. data.date.year++;
  211. write(f, &data, sizeof(db_metadata_t));
  212. }
  213. close(f);
  214. }
  215. db_data_interval_t* db_load_fault(db_t* db, db_date_t ds, uint32_t dsm,
  216. db_date_t de, uint32_t dem)
  217. {
  218. int f;
  219. db_data_interval_t *inter=NULL;
  220. uint32_t start, len;
  221. off_t size;
  222. f=open("data", O_RDONLY | O_LARGEFILE);
  223. if(f<0)
  224. {
  225. fprintf(stderr, "Unable to open 'data' (db_data_load())");
  226. perror(" ");
  227. return NULL;
  228. }
  229. start=db_index_get(db, ds, dsm, f);
  230. len=db_index_get(db, de, dem, f)-start+1;
  231. if(start==0xffffffff || len==0xffffffff)
  232. {
  233. close(f);
  234. return NULL;
  235. }
  236. inter=db_data_interval_new(start, len);
  237. lseek(f, start*sizeof(db_data_t), SEEK_SET);
  238. size=read(f, inter->data, sizeof(db_data_t)*(len));
  239. if(size<(len)*sizeof(db_data_t))
  240. {
  241. fprintf(stderr, "Unable to read entire %ld / %ld bytes (db_data_load())",
  242. size, (len)*sizeof(db_data_t));
  243. perror(" ");
  244. return inter;
  245. }
  246. close(f);
  247. return inter;
  248. }
  249. /*
  250. int main(int argc, char** argv)
  251. {
  252. write_data();
  253. write_day();
  254. write_month();
  255. write_year();
  256. db_t db;
  257. db_data_interval_t *di;
  258. db_date_t ds, de;
  259. int i;
  260. uint32_t dsm=9999;
  261. ds.year=2019; ds.month=12; ds.day=31;
  262. de.year=2016; de.month=12; de.day=7;
  263. db_init(&db);
  264. //di=db_data_load(&db, ds, dsm, de, dsm+100000000);
  265. di=db_data_load(&db, ds, dsm, ds, dsm);
  266. for(i=0; i<di->len; i++)
  267. {
  268. printf("%ld : (%.2ld-%.2ld-%.4ld) -> %ld\n", di->start+i
  269. , di->data[i].date.day
  270. , di->data[i].date.month
  271. , di->data[i].date.year
  272. , di->data[i].micros);
  273. }
  274. free(di->data);
  275. int a,m,j,ms;
  276. for(a=2015; a<2021; a++)
  277. {
  278. printf("year: %d\n", a);
  279. ds.year=a;
  280. de.year=a;
  281. for(m=1; m<13; m++)
  282. {
  283. printf("\tmonth: %d\n", m);
  284. ds.month=m;
  285. de.month=m;
  286. for(j=1; j<31; j++)
  287. {
  288. printf("\t\tday: %d\n", j);
  289. ds.day=j;
  290. de.day=j+1;
  291. for(ms=0; ms<24*3600*1000; ms+=60*1000)
  292. {
  293. di=db_data_load(&db, ds, dsm, ds, dsm);
  294. if(!di)
  295. {
  296. fprintf(stderr , "Error on (%.2d-%.2d-%.2d : %d)\n", j, m ,a ,ms/1000);
  297. }
  298. else free(di->data);
  299. }
  300. di=db_data_load(&db, ds, dsm, de, dsm);
  301. if(!di)
  302. {
  303. fprintf(stderr , "Error on (%.2d-%.2d-%.2d : %d)\n", j, m ,a ,ms/1000);
  304. }
  305. else free(di->data);
  306. }
  307. }
  308. }
  309. db_free(&db);
  310. return 0;
  311. }*/