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

📄 timeseries_8h-source.html

📁 最新版本!fastdb是高效的内存数据库系统
💻 HTML
📖 第 1 页 / 共 3 页
字号:
00277         interval.till = generateBlockId(oid, till);
00278         <a class="code" href="classdbCursor.html">dbCursor&lt; dbTimeSeriesBlock&lt;T&gt;</a> &gt; blocks;
00279         size_t nSelected = 0;
00280         <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a20">select</a>(selectBlock, dbCursorViewOnly, &amp;interval)) { 
00281             <span class="keywordflow">do</span> { 
00282                 <span class="keywordtype">int</span> n = blocks-&gt;used;
00283                 T <span class="keyword">const</span>* e =  blocks-&gt;elements.<a class="code" href="classdbCursor.html#dbCursora2">get</a>();
00284                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; n &amp;&amp; e[i].time() &lt;= till; i++) { 
00285                     buf[nSelected++] = e[i];
00286                     <span class="keywordflow">if</span> (nSelected == bufSize) { 
00287                         <span class="keywordflow">return</span> nSelected;
00288                     }
00289                 }
00290             } <span class="keywordflow">while</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora3">next</a>());
00291         }
00292         <span class="keywordflow">return</span> nSelected;
00293     }        
00294 
00295 
<a name="l00305"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora9">00305</a>     size_t <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora9">getLastInterval</a>(oid_t oid, time_t from, T* buf, size_t bufSize) 
00306     {
00307         <span class="keywordflow">if</span> (bufSize == 0) { 
00308             <span class="keywordflow">return</span> 0;
00309         }
00310         Interval interval;
00311         interval.from = generateBlockId(oid, from == 0 ? 0 : from - maxBlockTimeInterval);
00312         interval.till = generateBlockId(oid, INFINITE_TIME);
00313         <a class="code" href="classdbCursor.html">dbCursor&lt; dbTimeSeriesBlock&lt;T&gt;</a> &gt; blocks;
00314 
00315         size_t nSelected = 0;
00316         blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a20">select</a>(selectBlock, dbCursorViewOnly, &amp;interval);
00317         <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora6">last</a>()) { 
00318             <span class="keywordflow">do</span> { 
00319                 <span class="keywordtype">int</span> n = blocks-&gt;used;
00320                 T <span class="keyword">const</span>* e =  blocks-&gt;elements.<a class="code" href="classdbCursor.html#dbCursora2">get</a>();
00321                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = n; --i &gt;= 0 &amp;&amp; e[i].time() &gt;= from;) { 
00322                     buf[nSelected++] = e[i];
00323                     <span class="keywordflow">if</span> (nSelected == bufSize) { 
00324                         <span class="keywordflow">return</span> nSelected;
00325                     }
00326                 }
00327             } <span class="keywordflow">while</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora4">prev</a>());
00328         }
00329         <span class="keywordflow">return</span> nSelected;
00330     }        
00331 
00332 
00333 
<a name="l00340"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora10">00340</a>     <span class="keywordtype">bool</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora10">hasElement</a>(oid_t oid, time_t t) 
00341     { 
00342         T dummy;
00343         <span class="keywordflow">return</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora7">getElement</a>(oid, dummy, t);
00344     }        
00345 
<a name="l00357"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora11">00357</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) :
00358         db(database) 
00359     {
00360         assert(minElementsInBlock &gt; 0 &amp;&amp; maxElementsInBlock &gt;= minElementsInBlock);
00361         <span class="keywordflow">if</span> (maxBlockTimeInterval == 0) { 
00362             maxBlockTimeInterval = 2*(maxElementsInBlock*24*60*60); <span class="comment">// doubled interval in seconds, one element per day</span>
00363         }        
00364         this-&gt;maxElementsInBlock = maxElementsInBlock;
00365         this-&gt;minElementsInBlock = minElementsInBlock;
00366         this-&gt;maxBlockTimeInterval = maxBlockTimeInterval;
00367 
00368         <span class="comment">// correct instance of interval will be specified in select</span>
00369         Interval* dummy = NULL;
00370         selectBlock = <span class="stringliteral">"blockId between"</span>,dummy-&gt;from,<span class="stringliteral">"and"</span>,dummy-&gt;till;
00371         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>;
00372     }
00373 
<a name="l00381"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora12">00381</a>     <span class="keywordtype">int</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora12">remove</a>(oid_t oid, time_t from, time_t till)
00382     {
00383         Interval interval;
00384         interval.from = generateBlockId(oid, from == 0 ? 0 : from - maxBlockTimeInterval);
00385         interval.till = generateBlockId(oid, till);
00386         <a class="code" href="classdbCursor.html">dbCursor&lt; dbTimeSeriesBlock&lt;T&gt;</a> &gt; blocks;
00387         size_t nRemoved = 0;
00388         <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a20">select</a>(selectBlock, dbCursorForUpdate, &amp;interval)) { 
00389             <span class="keywordflow">do</span> { 
00390                 <span class="keywordtype">int</span> n = blocks-&gt;used;
00391                 T <span class="keyword">const</span>* e =  blocks-&gt;elements.<a class="code" href="classdbCursor.html#dbCursora2">get</a>();
00392                 <span class="keywordtype">int</span> l = 0, r = n;
00393                 <span class="keywordflow">while</span> (l &lt; r)  {
00394                     <span class="keywordtype">int</span> i = (l+r) &gt;&gt; 1;
00395                     <span class="keywordflow">if</span> (from &gt; e[i].time()) { 
00396                         l = i+1;
00397                     } <span class="keywordflow">else</span> { 
00398                         r = i;
00399                     }
00400                 }
00401                 assert(l == r &amp;&amp; (l == n || e[l].time() &gt;= from)); 
00402                 <span class="keywordflow">while</span> (r &lt; n &amp;&amp; e[r].time() &lt;= till) {
00403                     r += 1;
00404                     nRemoved += 1;
00405                 }
00406                 <span class="keywordflow">if</span> (l == 0 &amp;&amp; r == n) { 
00407                     blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a14">remove</a>();
00408                 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (l &lt; n &amp;&amp; l != r) { 
00409                     <span class="keywordflow">if</span> (l == 0) { 
00410                         blocks-&gt;blockId = generateBlockId(oid, e[r].time());
00411                     }
00412                     T* ue = blocks-&gt;elements.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a28">update</a>();
00413                     <span class="keywordflow">while</span> (r &lt; n) { 
00414                         ue[l++] = ue[r++];
00415                     }
00416                     blocks-&gt;used = l;
00417                     blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a28">update</a>();
00418                 }
00419             } <span class="keywordflow">while</span> (blocks.nextAvailable());
00420         }
00421         <span class="keywordflow">return</span> nRemoved;
00422     }        
00423     
00424     <span class="keyword">virtual</span>~<a class="code" href="classdbTimeSeriesProcessor.html">dbTimeSeriesProcessor</a>() {}
00425 
<a name="l00431"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora14">00431</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) 
00432     { 
00433         Interval interval;
00434         interval.from = generateBlockId(oid, from == 0 ? 0 : from - maxBlockTimeInterval);
00435         interval.till = generateBlockId(oid, till);
00436         <span class="keywordflow">return</span> cursor.select(selectBlock, dbCursorViewOnly, &amp;interval);
00437     }
00438 
00439    <span class="keyword">private</span>:
00440      db_int8 generateBlockId(oid_t oid, time_t date) 
00441      {
00442         <span class="keywordflow">return</span> cons_int8(oid, date);
00443      }
00444      
00445      
00446      <span class="keywordtype">void</span> addNewBlock(oid_t oid, T <span class="keyword">const</span>&amp; data)
00447      {
00448          <a class="code" href="classdbTimeSeriesBlock.html">dbTimeSeriesBlock&lt;T&gt;</a> block;
00449          block.<a class="code" href="classdbTimeSeriesBlock.html#dbTimeSeriesBlockm1">blockId</a> = generateBlockId(oid, data.time());
00450          block.<a class="code" href="classdbTimeSeriesBlock.html#dbTimeSeriesBlockm2">elements</a>.resize(minElementsInBlock);
00451          block.<a class="code" href="classdbTimeSeriesBlock.html#dbTimeSeriesBlockm0">used</a> = 1;
00452          block.<a class="code" href="classdbTimeSeriesBlock.html#dbTimeSeriesBlockm2">elements</a>.putat(0, data);
00453          insert(block);
00454      }
00455 
00456      <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)
00457      {
00458          time_t t = data.time();
00459          <span class="keywordtype">int</span> i, n = blocks-&gt;used;
00460 
00461          T <span class="keyword">const</span>* e =  blocks-&gt;elements.get();
00462          <span class="keywordtype">int</span> l = 0, r = n;
00463          <span class="keywordflow">while</span> (l &lt; r)  {
00464              i = (l+r) &gt;&gt; 1;
00465              <span class="keywordflow">if</span> (t &gt; e[i].time()) { 
00466                  l = i+1;
00467              } <span class="keywordflow">else</span> { 
00468                  r = i;
00469              }
00470          }
00471          assert(l == r &amp;&amp; (l == n || e[l].time() &gt;= t));
00472          <span class="keywordflow">if</span> (r == 0) { 
00473              <span class="keywordflow">if</span> (e[n-1].time() - t &gt; maxBlockTimeInterval || n == maxElementsInBlock) { 
00474                  addNewBlock(oid, data);
00475                  <span class="keywordflow">return</span>;
00476              }
00477              blocks-&gt;blockId = generateBlockId(oid, t);
00478          } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (r == n) {
00479              <span class="keywordflow">if</span> (t - e[0].time() &gt; maxBlockTimeInterval || n == maxElementsInBlock) { 
00480                  addNewBlock(oid, data);
00481                  <span class="keywordflow">return</span>;
00482              } 
00483          }
00484          <span class="keywordflow">if</span> ((size_t)n == blocks-&gt;elements.length()) { 
00485              <span class="keywordflow">if</span> (n == maxElementsInBlock) { 
00486                  T* u = blocks-&gt;elements.update();
00487                  addNewBlock(oid, u[n-1]);
00488                  <span class="keywordflow">for</span> (i = n; --i &gt; r; ) { 
00489                      u[i] = u[i-1];

⌨️ 快捷键说明

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