📄 timeseries_8h-source.html
字号:
00277 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;00278 size_t nSelected = 0;00279 <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a21">select</a>(selectBlock, dbCursorViewOnly, &interval)) { 00280 <span class="keywordflow">do</span> { 00281 <span class="keywordtype">int</span> n = blocks->used;00282 T <span class="keyword">const</span>* e = blocks->elements.<a class="code" href="classdbCursor.html#dbCursora2">get</a>();00283 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n && e[i].time() <= till; i++) { 00284 buf[nSelected++] = e[i];00285 <span class="keywordflow">if</span> (nSelected == bufSize) { 00286 <span class="keywordflow">return</span> nSelected;00287 }00288 }00289 } <span class="keywordflow">while</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora3">next</a>());00290 }00291 <span class="keywordflow">return</span> nSelected;00292 } 00293 00294 <a name="l00304"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora9">00304</a> size_t <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora9">getLastInterval</a>(oid_t oid, time_t from, T* buf, size_t bufSize) 00305 {00306 <span class="keywordflow">if</span> (bufSize == 0) { 00307 <span class="keywordflow">return</span> 0;00308 }00309 Interval interval;00310 interval.from = generateBlockId(oid, from == 0 ? 0 : from - maxBlockTimeInterval);00311 interval.till = generateBlockId(oid, INFINITE_TIME);00312 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;00313 00314 size_t nSelected = 0;00315 blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a21">select</a>(selectBlock, dbCursorViewOnly, &interval);00316 <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora6">last</a>()) { 00317 <span class="keywordflow">do</span> { 00318 <span class="keywordtype">int</span> n = blocks->used;00319 T <span class="keyword">const</span>* e = blocks->elements.<a class="code" href="classdbCursor.html#dbCursora2">get</a>();00320 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = n; --i >= 0 && e[i].time() >= from;) { 00321 buf[nSelected++] = e[i];00322 <span class="keywordflow">if</span> (nSelected == bufSize) { 00323 <span class="keywordflow">return</span> nSelected;00324 }00325 }00326 } <span class="keywordflow">while</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora4">prev</a>());00327 }00328 <span class="keywordflow">return</span> nSelected;00329 } 00330 00331 00332 <a name="l00339"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora10">00339</a> <span class="keywordtype">bool</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora10">hasElement</a>(oid_t oid, time_t t) 00340 { 00341 T dummy;00342 <span class="keywordflow">return</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora7">getElement</a>(oid, dummy, t);00343 } 00344 <a name="l00356"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora11">00356</a> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora11">dbTimeSeriesProcessor</a>(<a class="code" href="classdbDatabase.html">dbDatabase</a>& database, <span class="keywordtype">int</span> minElementsInBlock=100, <span class="keywordtype">int</span> maxElementsInBlock=100, time_t maxBlockTimeInterval=0) :00357 db(database) 00358 {00359 assert(minElementsInBlock > 0 && maxElementsInBlock >= minElementsInBlock);00360 <span class="keywordflow">if</span> (maxBlockTimeInterval == 0) { 00361 maxBlockTimeInterval = 2*(maxElementsInBlock*24*60*60); <span class="comment">// doubled interval in seconds, one element per day</span>00362 } 00363 this->maxElementsInBlock = maxElementsInBlock;00364 this->minElementsInBlock = minElementsInBlock;00365 this->maxBlockTimeInterval = maxBlockTimeInterval;00366 00367 <span class="comment">// correct instance of interval will be specified in select</span>00368 Interval* dummy = NULL;00369 selectBlock = <span class="stringliteral">"blockId between"</span>,dummy->from,<span class="stringliteral">"and"</span>,dummy->till;00370 selectBlockReverse = <span class="stringliteral">"blockId between"</span>,dummy->from,<span class="stringliteral">"and"</span>,dummy->till,<span class="stringliteral">"order by blockId desc"</span>;00371 }00372 <a name="l00380"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora12">00380</a> <span class="keywordtype">int</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora12">remove</a>(oid_t oid, time_t from, time_t till)00381 {00382 Interval interval;00383 interval.from = generateBlockId(oid, from == 0 ? 0 : from - maxBlockTimeInterval);00384 interval.till = generateBlockId(oid, till);00385 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;00386 size_t nRemoved = 0;00387 <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a21">select</a>(selectBlock, dbCursorForUpdate, &interval)) { 00388 <span class="keywordflow">do</span> { 00389 <span class="keywordtype">int</span> n = blocks->used;00390 T <span class="keyword">const</span>* e = blocks->elements.<a class="code" href="classdbCursor.html#dbCursora2">get</a>();00391 <span class="keywordtype">int</span> l = 0, r = n;00392 <span class="keywordflow">while</span> (l < r) {00393 <span class="keywordtype">int</span> i = (l+r) >> 1;00394 <span class="keywordflow">if</span> (from > e[i].time()) { 00395 l = i+1;00396 } <span class="keywordflow">else</span> { 00397 r = i;00398 }00399 }00400 assert(l == r && (l == n || e[l].time() >= from)); 00401 <span class="keywordflow">while</span> (r < n && e[r].time() <= till) {00402 r += 1;00403 nRemoved += 1;00404 }00405 <span class="keywordflow">if</span> (l == 0 && r == n) { 00406 blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a15">remove</a>();00407 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (l < n && l != r) { 00408 <span class="keywordflow">if</span> (l == 0) { 00409 blocks->blockId = generateBlockId(oid, e[r].time());00410 }00411 T* ue = blocks->elements.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a29">update</a>();00412 <span class="keywordflow">while</span> (r < n) { 00413 ue[l++] = ue[r++];00414 }00415 blocks->used = l;00416 blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a29">update</a>();00417 }00418 } <span class="keywordflow">while</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora12">nextAvailable</a>());00419 }00420 <span class="keywordflow">return</span> nRemoved;00421 } 00422 00423 <span class="keyword">virtual</span>~<a class="code" href="classdbTimeSeriesProcessor.html">dbTimeSeriesProcessor</a>() {}00424 <a name="l00430"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora14">00430</a> <span class="keywordtype">int</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora14">_openIteratorCursor</a>(<a class="code" href="classdbCursor.html">dbCursor</a>< <a class="code" href="classdbTimeSeriesBlock.html">dbTimeSeriesBlock<T></a> >& cursor, oid_t oid, time_t from, time_t till) 00431 { 00432 Interval interval;00433 interval.from = generateBlockId(oid, from == 0 ? 0 : from - maxBlockTimeInterval);00434 interval.till = generateBlockId(oid, till);00435 <span class="keywordflow">return</span> cursor.select(selectBlock, dbCursorViewOnly, &interval);00436 }00437 00438 <span class="keyword">private</span>:00439 db_int8 generateBlockId(oid_t oid, time_t date) 00440 {00441 <span class="keywordflow">return</span> cons_int8(oid, date);00442 }00443 00444 00445 <span class="keywordtype">void</span> addNewBlock(oid_t oid, T <span class="keyword">const</span>& data)00446 {00447 <a class="code" href="classdbTimeSeriesBlock.html">dbTimeSeriesBlock<T></a> block;00448 block.<a class="code" href="classdbTimeSeriesBlock.html#dbTimeSeriesBlocko0">blockId</a> = generateBlockId(oid, data.time());00449 block.<a class="code" href="classdbTimeSeriesBlock.html#dbTimeSeriesBlocko2">elements</a>.resize(minElementsInBlock);00450 block.<a class="code" href="classdbTimeSeriesBlock.html#dbTimeSeriesBlocko1">used</a> = 1;00451 block.<a class="code" href="classdbTimeSeriesBlock.html#dbTimeSeriesBlocko2">elements</a>.putat(0, data);00452 insert(block);00453 }00454 00455 <span class="keywordtype">void</span> insertInBlock(oid_t oid, <a class="code" href="classdbCursor.html">dbCursor</a>< <a class="code" href="classdbTimeSeriesBlock.html">dbTimeSeriesBlock<T></a> >& blocks, T <span class="keyword">const</span>& data)00456 {00457 time_t t = data.time();00458 <span class="keywordtype">int</span> i, n = blocks->used;00459 00460 T <span class="keyword">const</span>* e = blocks->elements.get();00461 <span class="keywordtype">int</span> l = 0, r = n;00462 <span class="keywordflow">while</span> (l < r) {00463 i = (l+r) >> 1;00464 <span class="keywordflow">if</span> (t > e[i].time()) { 00465 l = i+1;00466 } <span class="keywordflow">else</span> { 00467 r = i;00468 }00469 }00470 assert(l == r && (l == n || e[l].time() >= t));00471 <span class="keywordflow">if</span> (r == 0) { 00472 <span class="keywordflow">if</span> (e[n-1].time() - t > maxBlockTimeInterval || n == maxElementsInBlock) { 00473 addNewBlock(oid, data);00474 <span class="keywordflow">return</span>;00475 }00476 blocks->blockId = generateBlockId(oid, t);00477 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (r == n) {00478 <span class="keywordflow">if</span> (t - e[0].time() > maxBlockTimeInterval || n == maxElementsInBlock) { 00479 addNewBlock(oid, data);00480 <span class="keywordflow">return</span>;00481 } 00482 }00483 <span class="keywordflow">if</span> ((size_t)n == blocks->elements.length()) { 00484 <span class="keywordflow">if</span> (n == maxElementsInBlock) { 00485 T* u = blocks->elements.update();00486 addNewBlock(oid, u[n-1]);00487 <span class="keywordflow">for</span> (i = n; --i > r; ) { 00488 u[i] = u[i-1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -