db_access.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  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. int db_load_page(db_t* db, uint64_t page, db_data_t* buffer)
  117. {
  118. int fd = open("data", O_RDONLY), r;
  119. if(fd<0)
  120. {
  121. fprintf(stderr, "Error unable to load page %ld (%x->%x) (db_load_page())",
  122. page, page*db->cache->page_size*sizeof(db_data_t),
  123. (page+1)*db->cache->page_size*sizeof(db_data_t));
  124. perror(" ");
  125. return -1;
  126. }
  127. lseek(fd,page*db->cache->page_size*sizeof(db_data_t), SEEK_SET);
  128. r=read(fd, buffer, db->cache->page_size*sizeof(db_data_t));
  129. close(fd);
  130. return r;
  131. }
  132. void write_data()
  133. {
  134. int f = open("data", O_RDWR | O_CREAT, 0777);
  135. int i;
  136. db_data_t data;
  137. data.date.day=1;
  138. data.date.month=1;
  139. data.date.year=2016;
  140. data.micros=0;
  141. for(i=0; i<N_ANNEES*N_MONTH*N_DAYS*N_BY_DAYS; i++)
  142. {
  143. if(data.micros>=N_BY_DAYS*1000)
  144. {
  145. data.date.day++;
  146. data.micros=0;
  147. if(data.date.day>N_DAYS)
  148. {
  149. data.date.day=1;
  150. data.date.month++;
  151. if(data.date.month>N_MONTH)
  152. {
  153. data.date.month=1;
  154. data.date.year++;
  155. }
  156. }
  157. }
  158. write(f, &data, sizeof(db_data_t));
  159. data.micros+=1000;
  160. //fprintf(f, "%d %d %d : %ld\n", data.date.year, data.date.month, data.date.day, data.micros);
  161. }
  162. close(f);
  163. }
  164. void write_day()
  165. {
  166. int f = open("metadata_days", O_RDWR | O_CREAT, 0777 );
  167. off_t i;
  168. db_metadata_t data;
  169. data.date.day=0;
  170. data.date.month=1;
  171. data.date.year=2016;
  172. data.index=0;
  173. for(i=0; i<N_ANNEES*N_MONTH*N_DAYS; i++)
  174. {
  175. data.index=i*N_BY_DAYS;
  176. //data.index=i;
  177. data.date.day++;
  178. if(data.date.day>N_DAYS)
  179. {
  180. data.date.day=1;
  181. data.date.month++;
  182. if(data.date.month>N_MONTH)
  183. {
  184. data.date.month=1;
  185. data.date.year++;
  186. }
  187. }
  188. write(f, &data, sizeof(db_metadata_t));
  189. }
  190. close(f);
  191. }
  192. void write_month()
  193. {
  194. int f = open("metadata_monthes", O_RDWR | O_CREAT, 0777 );
  195. int i;
  196. db_metadata_t data;
  197. data.date.day=1;
  198. data.date.month=0;
  199. data.date.year=2016;
  200. data.index=0;
  201. for(i=0; i<N_MONTH*N_ANNEES; i++)
  202. {
  203. data.index=i*N_DAYS;
  204. data.date.month++;
  205. if(data.date.month>N_MONTH)
  206. {
  207. data.date.month=1;
  208. data.date.year++;
  209. }
  210. write(f, &data, sizeof(db_metadata_t));
  211. }
  212. close(f);
  213. }
  214. void write_year()
  215. {
  216. int f = open("metadata_years", O_RDWR | O_CREAT, 0777 );
  217. int i;
  218. db_metadata_t data;
  219. data.date.day=1;
  220. data.date.month=1;
  221. data.date.year=2016-1;
  222. data.index=0;
  223. for(i=0; i<N_ANNEES; i++)
  224. {
  225. data.index=i*N_MONTH;
  226. data.date.year++;
  227. write(f, &data, sizeof(db_metadata_t));
  228. }
  229. close(f);
  230. }
  231. db_data_interval_t* db_data_load(db_t* db, db_date_t ds, uint32_t dsm,
  232. db_date_t de, uint32_t dem)
  233. {
  234. int f;
  235. db_data_interval_t *inter=NULL;
  236. uint32_t start, len;
  237. off_t size;
  238. f=open("data", O_RDONLY | O_LARGEFILE);
  239. if(f<0)
  240. {
  241. fprintf(stderr, "Unable to open 'data' (db_data_load())");
  242. perror(" ");
  243. return NULL;
  244. }
  245. start=db_index_get(db, ds, dsm, f);
  246. len=db_index_get(db, de, dem, f)-start+1;
  247. if(start==0xffffffff || len==0xffffffff)
  248. {
  249. close(f);
  250. return NULL;
  251. }
  252. inter=db_data_interval_new(start, len);
  253. lseek(f, start*sizeof(db_data_t), SEEK_SET);
  254. size=read(f, inter->data, sizeof(db_data_t)*(len));
  255. if(size<(len)*sizeof(db_data_t))
  256. {
  257. fprintf(stderr, "Unable to read entire %ld / %ld bytes (db_data_load())",
  258. size, (len)*sizeof(db_data_t));
  259. perror(" ");
  260. return inter;
  261. }
  262. close(f);
  263. return inter;
  264. }
  265. int main(int argc, char** argv)
  266. {
  267. /* write_data();
  268. write_day();
  269. write_month();
  270. write_year();*/
  271. db_t db;
  272. db_data_interval_t *di;
  273. db_date_t ds, de;
  274. int i;
  275. uint32_t dsm=9999;
  276. ds.year=2019; ds.month=12; ds.day=31;
  277. de.year=2016; de.month=12; de.day=7;
  278. db_init(&db);
  279. //di=db_data_load(&db, ds, dsm, de, dsm+100000000);
  280. di=db_data_load(&db, ds, dsm, ds, dsm);
  281. for(i=0; i<di->len; i++)
  282. {
  283. printf("%ld : (%.2ld-%.2ld-%.4ld) -> %ld\n", di->start+i
  284. , di->data[i].date.day
  285. , di->data[i].date.month
  286. , di->data[i].date.year
  287. , di->data[i].micros);
  288. }
  289. free(di->data);
  290. int a,m,j,ms;
  291. /*for(a=2015; a<2021; a++)
  292. {
  293. printf("year: %d\n", a);
  294. ds.year=a;
  295. de.year=a;
  296. for(m=1; m<13; m++)
  297. {
  298. printf("\tmonth: %d\n", m);
  299. ds.month=m;
  300. de.month=m;
  301. for(j=1; j<31; j++)
  302. {
  303. printf("\t\tday: %d\n", j);
  304. ds.day=j;
  305. de.day=j+1;
  306. for(ms=0; ms<24*3600*1000; ms+=60*1000)
  307. {
  308. di=db_data_load(&db, ds, dsm, ds, dsm);
  309. if(!di)
  310. {
  311. fprintf(stderr , "Error on (%.2d-%.2d-%.2d : %d)\n", j, m ,a ,ms/1000);
  312. }
  313. else free(di->data);
  314. }
  315. di=db_data_load(&db, ds, dsm, ds, dsm);
  316. int l;
  317. di=db_data_load(&db, ds, dsm, de, dsm);
  318. if(!di)
  319. {
  320. fprintf(stderr , "Error on (%.2d-%.2d-%.2d : %d)\n", j, m ,a ,ms/1000);
  321. }
  322. else free(di->data);
  323. }
  324. }
  325. }*/
  326. ds.year=2016;
  327. de.year=ds.year;
  328. ds.month=5;
  329. de.month=ds.month;
  330. ds.day=15;
  331. de.day=ds.day+1;
  332. dsm=1000*3600*24;
  333. int l;
  334. di=db_data_load(&db, ds, 3600*24*100, de, 1);
  335. for(l=0; l<di->len; l++)
  336. printf("\t\t%d-%d-%d %d:%d:%d.%d\n", di->data[l].date.day, di->data[l].date.month, di->data[l].date.year,
  337. di->data[l].micros/3600000, (di->data[l].micros%3600000)/60000, di->data[l].micros%60000/1000, di->data[l].micros%1000);
  338. db_free(&db);
  339. return 0;
  340. }