diff options
Diffstat (limited to 'js/RrdDataFile.js')
-rw-r--r-- | js/RrdDataFile.js | 129 |
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 | */ | ||
27 | var RrdDataFile = function() { | ||
28 | this.init.apply(this, arguments); | ||
29 | }; | ||
30 | |||
31 | RrdDataFile.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 | }; | ||