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

📄 timeseries_8h-source.html

📁 俄罗斯牛人KK的作品,著名的ORDBMS,这里上传最新的3.39版本源代码.希望了解对象关系数据库的同好,请不要错过.
💻 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_4a22">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_4a22">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_4a22">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_4a16">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_4a30">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_4a30">update</a>();00418                 }00419             } <span class="keywordflow">while</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora12">nextAvailable</a>());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#dbTimeSeriesBlockm0">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#dbTimeSeriesBlockm1">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 + -