aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/js/RrdDataFile.js
diff options
context:
space:
mode:
authorPim van den Berg2013-05-10 21:36:54 +0200
committerPim van den Berg2013-05-10 21:36:54 +0200
commit0163faefef02207ad0ea3330af688103633293ff (patch)
treec407fca93a3418af59c4c7133327f5bc1630fba5 /js/RrdDataFile.js
parentMerge pull request #5 from mce35/nut (diff)
downloadapt-panopticon_cgp-0163faefef02207ad0ea3330af688103633293ff.zip
apt-panopticon_cgp-0163faefef02207ad0ea3330af688103633293ff.tar.gz
apt-panopticon_cgp-0163faefef02207ad0ea3330af688103633293ff.tar.bz2
apt-panopticon_cgp-0163faefef02207ad0ea3330af688103633293ff.tar.xz
import js directory from jsrrdgraph for client side graph rendering
Source: https://github.com/manuelluis/jsrrdgraph@276b880
Diffstat (limited to 'js/RrdDataFile.js')
-rw-r--r--js/RrdDataFile.js129
1 files changed, 129 insertions, 0 deletions
diff --git a/js/RrdDataFile.js b/js/RrdDataFile.js
new file mode 100644
index 0000000..ae4dcff
--- /dev/null
+++ b/js/RrdDataFile.js
@@ -0,0 +1,129 @@
1/**
2 *
3 * This program is free software; you can redistribute it and/or modify it
4 * under the terms of the GNU General Public License as published by the Free
5 * Software Foundation; either version 2 of the License, or (at your option)
6 * any later version.
7 *
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
16
17 *
18 * Manuel Sanmartin <manuel.luis at gmail.com>
19 **/
20
21"use strict";
22
23/**
24 * RrdDataFile
25 * @constructor
26 */
27var RrdDataFile = function() {
28 this.init.apply(this, arguments);
29};
30
31RrdDataFile.prototype = {
32 rrdfiles: null,
33
34 init: function()
35 {
36 this.rrdfiles = {};
37 },
38 fetch: function(gdp, ft_step)
39 {
40 var cal_start, cal_end;
41 var best_full_rra = 0, best_part_rra = 0, chosen_rra = 0;
42 var best_full_step_diff = 0, best_part_step_diff = 0, tmp_step_diff = 0, tmp_match = 0, best_match = 0;
43 var full_match, rra_base;
44 var first_full = 1;
45 var first_part = 1;
46 var rrd;
47 var data_ptr;
48 var rows;
49
50 if (gdp.rrd in this.rrdfiles) {
51 rrd = this.rrdfiles[gdp.rrd];
52 } else {
53 var bf = FetchBinaryURL(gdp.rrd);
54 rrd = new RRDFile(bf);
55 this.rrdfiles[gdp.rrd] = rrd;
56 }
57
58 var cf_idx = gdp.cf;
59 var ds_cnt = rrd.getNrDSs();
60 var rra_cnt = rrd.getNrRRAs();
61
62 for (var i = 0; i < ds_cnt; i++)
63 gdp.ds_namv[i] = rrd.rrd_header.getDSbyIdx(i).getName();
64
65 for (var i = 0; i < rra_cnt; i++) {
66 var rra = rrd.getRRAInfo(i);
67 if (RrdGraphDesc.cf_conv(rra.getCFName()) === cf_idx) {
68 cal_end = (rrd.getLastUpdate() - (rrd.getLastUpdate() % (rra.getPdpPerRow() * rra.pdp_step)));
69 cal_start = (cal_end - (rra.getPdpPerRow() * rra.row_cnt * rra.pdp_step));
70 full_match = gdp.end - gdp.start;
71
72 tmp_step_diff = Math.abs(ft_step - (rrd.getMinStep() * rra.pdp_cnt));
73 if (cal_start <= gdp.start) {
74 if (first_full || (tmp_step_diff < best_full_step_diff)) {
75 first_full = 0;
76 best_full_step_diff = tmp_step_diff;
77 best_full_rra = i;
78 }
79 } else {
80 tmp_match = full_match;
81 if (cal_start > gdp.start) tmp_match -= (cal_start - gdp.start);
82 if (first_part || (best_match < tmp_match) || (best_match === tmp_match && tmp_step_diff < best_part_step_diff)) {
83 first_part = 0;
84 best_match = tmp_match;
85 best_part_step_diff = tmp_step_diff;
86 best_part_rra = i;
87 }
88 }
89 }
90 }
91
92 if (first_full === 0) chosen_rra = best_full_rra;
93 else if (first_part === 0) chosen_rra = best_part_rra;
94 else throw "the RRD does not contain an RRA matching the chosen CF";
95
96 var rra_info = rrd.getRRAInfo(chosen_rra);
97 var rra = rrd.getRRA(chosen_rra);
98
99 ft_step = rrd.rrd_header.pdp_step * rra_info.getPdpPerRow();
100 gdp.start -= (gdp.start % ft_step);
101 gdp.end += (ft_step - gdp.end % ft_step);
102 rows = (gdp.end - gdp.start) / ft_step + 1;
103
104 gdp.ds_cnt = ds_cnt;
105 data_ptr = 0;
106
107 var rra_end_time = (rrd.getLastUpdate() - (rrd.getLastUpdate() % ft_step));
108 var rra_start_time = (rra_end_time - (ft_step * (rra_info.row_cnt - 1)));
109 /* here's an error by one if we don't be careful */
110 var start_offset = (gdp.start + ft_step - rra_start_time) / ft_step;
111 var end_offset = (rra_end_time - gdp.end) / ft_step;
112
113 gdp.data = [];
114
115 for (i = start_offset; i < rra.row_cnt - end_offset; i++) {
116 if (i < 0) {
117 for (var ii = 0; ii < ds_cnt; ii++)
118 gdp.data[data_ptr++] = Number.NaN;
119 } else if (i >= rra.row_cnt) {
120 for (var ii = 0; ii < ds_cnt; ii++)
121 gdp.data[data_ptr++] = Number.NaN;
122 } else {
123 for (var ii = 0; ii < ds_cnt; ii++)
124 gdp.data[data_ptr++] = rra.getEl(i, ii);
125 }
126 }
127 return ft_step;
128 }
129};