⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timeseries_8h-source.html

📁 FastDb是高效的内存数据库系统
💻 HTML
📖 第 1 页 / 共 3 页
字号:
00277         <a class="code" href="classdbCursor.html">dbCursor&lt; dbTimeSeriesBlock&lt;T&gt;</a> &gt; 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, &amp;interval)) { 00280             <span class="keywordflow">do</span> { 00281                 <span class="keywordtype">int</span> n = blocks-&gt;used;00282                 T <span class="keyword">const</span>* e =  blocks-&gt;elements.<a class="code" href="classdbCursor.html#dbCursora2">get</a>();00283                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; n &amp;&amp; e[i].time() &lt;= 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&lt; dbTimeSeriesBlock&lt;T&gt;</a> &gt; blocks;00313 00314         size_t nSelected = 0;00315         blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a21">select</a>(selectBlock, dbCursorViewOnly, &amp;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-&gt;used;00319                 T <span class="keyword">const</span>* e =  blocks-&gt;elements.<a class="code" href="classdbCursor.html#dbCursora2">get</a>();00320                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = n; --i &gt;= 0 &amp;&amp; e[i].time() &gt;= 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>&amp; 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 &gt; 0 &amp;&amp; maxElementsInBlock &gt;= 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-&gt;maxElementsInBlock = maxElementsInBlock;00364         this-&gt;minElementsInBlock = minElementsInBlock;00365         this-&gt;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-&gt;from,<span class="stringliteral">"and"</span>,dummy-&gt;till;00370         selectBlockReverse = <span class="stringliteral">"blockId between"</span>,dummy-&gt;from,<span class="stringliteral">"and"</span>,dummy-&gt;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&lt; dbTimeSeriesBlock&lt;T&gt;</a> &gt; 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, &amp;interval)) { 00388             <span class="keywordflow">do</span> { 00389                 <span class="keywordtype">int</span> n = blocks-&gt;used;00390                 T <span class="keyword">const</span>* e =  blocks-&gt;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 &lt; r)  {00393                     <span class="keywordtype">int</span> i = (l+r) &gt;&gt; 1;00394                     <span class="keywordflow">if</span> (from &gt; e[i].time()) { 00395                         l = i+1;00396                     } <span class="keywordflow">else</span> { 00397                         r = i;00398                     }00399                 }00400                 assert(l == r &amp;&amp; (l == n || e[l].time() &gt;= from)); 00401                 <span class="keywordflow">while</span> (r &lt; n &amp;&amp; e[r].time() &lt;= till) {00402                     r += 1;00403                     nRemoved += 1;00404                 }00405                 <span class="keywordflow">if</span> (l == 0 &amp;&amp; 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 &lt; n &amp;&amp; l != r) { 00408                     <span class="keywordflow">if</span> (l == 0) { 00409                         blocks-&gt;blockId = generateBlockId(oid, e[r].time());00410                     }00411                     T* ue = blocks-&gt;elements.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a29">update</a>();00412                     <span class="keywordflow">while</span> (r &lt; n) { 00413                         ue[l++] = ue[r++];00414                     }00415                     blocks-&gt;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>&lt; <a class="code" href="classdbTimeSeriesBlock.html">dbTimeSeriesBlock&lt;T&gt;</a> &gt;&amp; 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, &amp;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>&amp; data)00446      {00447          <a class="code" href="classdbTimeSeriesBlock.html">dbTimeSeriesBlock&lt;T&gt;</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>&lt; <a class="code" href="classdbTimeSeriesBlock.html">dbTimeSeriesBlock&lt;T&gt;</a> &gt;&amp; blocks, T <span class="keyword">const</span>&amp; data)00456      {00457          time_t t = data.time();00458          <span class="keywordtype">int</span> i, n = blocks-&gt;used;00459 00460          T <span class="keyword">const</span>* e =  blocks-&gt;elements.get();00461          <span class="keywordtype">int</span> l = 0, r = n;00462          <span class="keywordflow">while</span> (l &lt; r)  {00463              i = (l+r) &gt;&gt; 1;00464              <span class="keywordflow">if</span> (t &gt; e[i].time()) { 00465                  l = i+1;00466              } <span class="keywordflow">else</span> { 00467                  r = i;00468              }00469          }00470          assert(l == r &amp;&amp; (l == n || e[l].time() &gt;= t));00471          <span class="keywordflow">if</span> (r == 0) { 00472              <span class="keywordflow">if</span> (e[n-1].time() - t &gt; maxBlockTimeInterval || n == maxElementsInBlock) { 00473                  addNewBlock(oid, data);00474                  <span class="keywordflow">return</span>;00475              }00476              blocks-&gt;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() &gt; 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-&gt;elements.length()) { 00484              <span class="keywordflow">if</span> (n == maxElementsInBlock) { 00485                  T* u = blocks-&gt;elements.update();00486                  addNewBlock(oid, u[n-1]);00487                  <span class="keywordflow">for</span> (i = n; --i &gt; r; ) { 00488                      u[i] = u[i-1];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -