aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/js
diff options
context:
space:
mode:
authorManuel Luis SanmartĂ­n Rozada2014-07-25 19:43:29 +0200
committerPim van den Berg2014-07-25 20:35:54 +0200
commit8a1e2c64bf0679004a8b38d5f9ac62859b3f8cc2 (patch)
treedfca21be49b23428eba5e113de424dbe141abc4d /js
parentjsrrdgraph: Fix ident. Thanks to Poil (diff)
downloadapt-panopticon_cgp-8a1e2c64bf0679004a8b38d5f9ac62859b3f8cc2.zip
apt-panopticon_cgp-8a1e2c64bf0679004a8b38d5f9ac62859b3f8cc2.tar.gz
apt-panopticon_cgp-8a1e2c64bf0679004a8b38d5f9ac62859b3f8cc2.tar.bz2
apt-panopticon_cgp-8a1e2c64bf0679004a8b38d5f9ac62859b3f8cc2.tar.xz
jsrrdgraph: Upgrade to javascriptrrd ver 1.1.1
Diffstat (limited to 'js')
-rw-r--r--js/binaryXHR.js69
-rw-r--r--js/rrdFile.js159
2 files changed, 143 insertions, 85 deletions
diff --git a/js/binaryXHR.js b/js/binaryXHR.js
index d91ad72..e4e7515 100644
--- a/js/binaryXHR.js
+++ b/js/binaryXHR.js
@@ -37,6 +37,8 @@ function BinaryFile(strData, iDataOffset, iDataLength) {
37 var doubleMantExpLo=Math.pow(2,-52); 37 var doubleMantExpLo=Math.pow(2,-52);
38 var doubleMantExpFast=Math.pow(2,-20); 38 var doubleMantExpFast=Math.pow(2,-20);
39 39
40 var switch_endian = false;
41
40 this.getRawData = function() { 42 this.getRawData = function() {
41 return data; 43 return data;
42 } 44 }
@@ -57,6 +59,13 @@ function BinaryFile(strData, iDataOffset, iDataLength) {
57 throw new InvalidBinaryFile("Unsupported type " + (typeof strData)); 59 throw new InvalidBinaryFile("Unsupported type " + (typeof strData));
58 } 60 }
59 61
62 this.getEndianByteAt = function(iOffset,width,delta) {
63 if (this.switch_endian)
64 return this.getByteAt(iOffset+width-delta-1);
65 else
66 return this.getByteAt(iOffset+delta);
67 }
68
60 this.getLength = function() { 69 this.getLength = function() {
61 return dataLength; 70 return dataLength;
62 } 71 }
@@ -70,7 +79,7 @@ function BinaryFile(strData, iDataOffset, iDataLength) {
70 } 79 }
71 80
72 this.getShortAt = function(iOffset) { 81 this.getShortAt = function(iOffset) {
73 var iShort = (this.getByteAt(iOffset + 1) << 8) + this.getByteAt(iOffset) 82 var iShort = (this.getEndianByteAt(iOffset,2,1) << 8) + this.getEndianByteAt(iOffset,2,0)
74 if (iShort < 0) iShort += 65536; 83 if (iShort < 0) iShort += 65536;
75 return iShort; 84 return iShort;
76 } 85 }
@@ -82,10 +91,10 @@ function BinaryFile(strData, iDataOffset, iDataLength) {
82 return iUShort; 91 return iUShort;
83 } 92 }
84 this.getLongAt = function(iOffset) { 93 this.getLongAt = function(iOffset) {
85 var iByte1 = this.getByteAt(iOffset), 94 var iByte1 = this.getEndianByteAt(iOffset,4,0),
86 iByte2 = this.getByteAt(iOffset + 1), 95 iByte2 = this.getEndianByteAt(iOffset,4,1),
87 iByte3 = this.getByteAt(iOffset + 2), 96 iByte3 = this.getEndianByteAt(iOffset,4,2),
88 iByte4 = this.getByteAt(iOffset + 3); 97 iByte4 = this.getEndianByteAt(iOffset,4,3);
89 98
90 var iLong = (((((iByte4 << 8) + iByte3) << 8) + iByte2) << 8) + iByte1; 99 var iLong = (((((iByte4 << 8) + iByte3) << 8) + iByte2) << 8) + iByte1;
91 if (iLong < 0) iLong += 4294967296; 100 if (iLong < 0) iLong += 4294967296;
@@ -117,14 +126,14 @@ function BinaryFile(strData, iDataOffset, iDataLength) {
117 126
118 // Added 127 // Added
119 this.getDoubleAt = function(iOffset) { 128 this.getDoubleAt = function(iOffset) {
120 var iByte1 = this.getByteAt(iOffset), 129 var iByte1 = this.getEndianByteAt(iOffset,8,0),
121 iByte2 = this.getByteAt(iOffset + 1), 130 iByte2 = this.getEndianByteAt(iOffset,8,1),
122 iByte3 = this.getByteAt(iOffset + 2), 131 iByte3 = this.getEndianByteAt(iOffset,8,2),
123 iByte4 = this.getByteAt(iOffset + 3), 132 iByte4 = this.getEndianByteAt(iOffset,8,3),
124 iByte5 = this.getByteAt(iOffset + 4), 133 iByte5 = this.getEndianByteAt(iOffset,8,4),
125 iByte6 = this.getByteAt(iOffset + 5), 134 iByte6 = this.getEndianByteAt(iOffset,8,5),
126 iByte7 = this.getByteAt(iOffset + 6), 135 iByte7 = this.getEndianByteAt(iOffset,8,6),
127 iByte8 = this.getByteAt(iOffset + 7); 136 iByte8 = this.getEndianByteAt(iOffset,8,7);
128 var iSign=iByte8 >> 7; 137 var iSign=iByte8 >> 7;
129 var iExpRaw=((iByte8 & 0x7F)<< 4) + (iByte7 >> 4); 138 var iExpRaw=((iByte8 & 0x7F)<< 4) + (iByte7 >> 4);
130 var iMantHi=((((((iByte7 & 0x0F) << 8) + iByte6) << 8) + iByte5) << 8) + iByte4; 139 var iMantHi=((((((iByte7 & 0x0F) << 8) + iByte6) << 8) + iByte5) << 8) + iByte4;
@@ -141,10 +150,10 @@ function BinaryFile(strData, iDataOffset, iDataLength) {
141 // added 150 // added
142 // Extracts only 4 bytes out of 8, loosing in precision (20 bit mantissa) 151 // Extracts only 4 bytes out of 8, loosing in precision (20 bit mantissa)
143 this.getFastDoubleAt = function(iOffset) { 152 this.getFastDoubleAt = function(iOffset) {
144 var iByte5 = this.getByteAt(iOffset + 4), 153 var iByte5 = this.getEndianByteAt(iOffset,8,4),
145 iByte6 = this.getByteAt(iOffset + 5), 154 iByte6 = this.getEndianByteAt(iOffset,8,5),
146 iByte7 = this.getByteAt(iOffset + 6), 155 iByte7 = this.getEndianByteAt(iOffset,8,6),
147 iByte8 = this.getByteAt(iOffset + 7); 156 iByte8 = this.getEndianByteAt(iOffset,8,7);
148 var iSign=iByte8 >> 7; 157 var iSign=iByte8 >> 7;
149 var iExpRaw=((iByte8 & 0x7F)<< 4) + (iByte7 >> 4); 158 var iExpRaw=((iByte8 & 0x7F)<< 4) + (iByte7 >> 4);
150 var iMant=((((iByte7 & 0x0F) << 8) + iByte6) << 8) + iByte5; 159 var iMant=((((iByte7 & 0x0F) << 8) + iByte6) << 8) + iByte5;
@@ -190,10 +199,17 @@ function FetchBinaryURL(url) {
190 } 199 }
191 request.send(null); 200 request.send(null);
192 201
193 var response=request.responseBody; 202 var response=this.responseText;
194 if (response==undefined){ // responseBody is non standard, but the only way to make it work in IE 203 try {
195 response=request.responseText; 204 // for older IE versions, the value in responseText is not usable
205 if (IEBinary_getLength(this.responseBody)>0) {
206 // will get here only for older verson of IE
207 response=this.responseBody;
208 }
209 } catch (err) {
210 // not IE, do nothing
196 } 211 }
212
197 var bf=new BinaryFile(response); 213 var bf=new BinaryFile(response);
198 return bf; 214 return bf;
199} 215}
@@ -208,10 +224,17 @@ function FetchBinaryURL(url) {
208function FetchBinaryURLAsync(url, callback, callback_arg) { 224function FetchBinaryURLAsync(url, callback, callback_arg) {
209 var callback_wrapper = function() { 225 var callback_wrapper = function() {
210 if(this.readyState == 4) { 226 if(this.readyState == 4) {
211 var response=this.responseBody; 227 var response=this.responseText;
212 if (response==undefined){ // responseBody is non standard, but the only way to make it work in IE 228 try {
213 response=this.responseText; 229 // for older IE versions, the value in responseText is not usable
230 if (IEBinary_getLength(this.responseBody)>0) {
231 // will get here only for older verson of IE
232 response=this.responseBody;
233 }
234 } catch (err) {
235 // not IE, do nothing
214 } 236 }
237
215 var bf=new BinaryFile(response); 238 var bf=new BinaryFile(response);
216 if (callback_arg!=null) { 239 if (callback_arg!=null) {
217 callback(bf,callback_arg); 240 callback(bf,callback_arg);
diff --git a/js/rrdFile.js b/js/rrdFile.js
index 870c88e..eabebc7 100644
--- a/js/rrdFile.js
+++ b/js/rrdFile.js
@@ -5,7 +5,7 @@
5 * Igor Sfiligoi, isfiligoi@ucsd.edu 5 * Igor Sfiligoi, isfiligoi@ucsd.edu
6 * 6 *
7 * Original repository: http://javascriptrrd.sourceforge.net/ 7 * Original repository: http://javascriptrrd.sourceforge.net/
8 * 8 *
9 * MIT License [http://www.opensource.org/licenses/mit-license.php] 9 * MIT License [http://www.opensource.org/licenses/mit-license.php]
10 * 10 *
11 */ 11 */
@@ -17,10 +17,10 @@
17 * 17 *
18 * This software can be used to read files produced by the RRDTool 18 * This software can be used to read files produced by the RRDTool
19 * but has been developed independently. 19 * but has been developed independently.
20 * 20 *
21 * Limitations: 21 * Limitations:
22 * 22 *
23 * This version of the module assumes RRD files created on linux 23 * This version of the module assumes RRD files created on linux
24 * with intel architecture and supports both 32 and 64 bit CPUs. 24 * with intel architecture and supports both 32 and 64 bit CPUs.
25 * All integers in RRD files are suppoes to fit in 32bit values. 25 * All integers in RRD files are suppoes to fit in 32bit values.
26 * 26 *
@@ -33,7 +33,7 @@
33 33
34/* 34/*
35 * Dependencies: 35 * Dependencies:
36 * 36 *
37 * The data provided to this module require an object of a class 37 * The data provided to this module require an object of a class
38 * that implements the following methods: 38 * that implements the following methods:
39 * getByteAt(idx) - Return a 8 bit unsigned integer at offset idx 39 * getByteAt(idx) - Return a 8 bit unsigned integer at offset idx
@@ -89,13 +89,16 @@ RRDDS.prototype.getMax = function() {
89// ============================================================ 89// ============================================================
90// RRD RRA Info class 90// RRD RRA Info class
91function RRDRRAInfo(rrd_data,rra_def_idx, 91function RRDRRAInfo(rrd_data,rra_def_idx,
92 rrd_align,row_cnt,pdp_step,my_idx) { 92 int_align,row_cnt,pdp_step,my_idx) {
93 this.rrd_data=rrd_data; 93 this.rrd_data=rrd_data;
94 this.rra_def_idx=rra_def_idx; 94 this.rra_def_idx=rra_def_idx;
95 this.rrd_align=rrd_align; 95 this.int_align=int_align;
96 this.row_cnt=row_cnt; 96 this.row_cnt=row_cnt;
97 this.pdp_step=pdp_step; 97 this.pdp_step=pdp_step;
98 this.my_idx=my_idx; 98 this.my_idx=my_idx;
99
100 // char nam[20], uint row_cnt, uint pdp_cnt
101 this.rra_pdp_cnt_idx=rra_def_idx+Math.ceil(20/int_align)*int_align+int_align;
99} 102}
100 103
101RRDRRAInfo.prototype.getIdx = function() { 104RRDRRAInfo.prototype.getIdx = function() {
@@ -110,10 +113,7 @@ RRDRRAInfo.prototype.getNrRows = function() {
110// Get number of slots used for consolidation 113// Get number of slots used for consolidation
111// Mostly for internal use 114// Mostly for internal use
112RRDRRAInfo.prototype.getPdpPerRow = function() { 115RRDRRAInfo.prototype.getPdpPerRow = function() {
113 if (this.rrd_align==32) 116 return this.rrd_data.getLongAt(this.rra_pdp_cnt_idx);
114 return this.rrd_data.getLongAt(this.rra_def_idx+24,20);
115 else
116 return this.rrd_data.getLongAt(this.rra_def_idx+32,20);
117} 117}
118 118
119// Get RRA step (expressed in seconds) 119// Get RRA step (expressed in seconds)
@@ -158,7 +158,7 @@ function RRDRRA(rrd_data,rra_ptr_idx,
158 } 158 }
159 } else { 159 } else {
160 throw RangeError("Row idx ("+ row_idx +") out of range [0-" + this.row_cnt +")."); 160 throw RangeError("Row idx ("+ row_idx +") out of range [0-" + this.row_cnt +").");
161 } 161 }
162 } 162 }
163} 163}
164 164
@@ -199,43 +199,89 @@ RRDRRA.prototype.getElFast = function(row_idx,ds_idx) {
199function RRDHeader(rrd_data) { 199function RRDHeader(rrd_data) {
200 this.rrd_data=rrd_data; 200 this.rrd_data=rrd_data;
201 this.validate_rrd(); 201 this.validate_rrd();
202 this.load_header();
203 this.calc_idxs(); 202 this.calc_idxs();
204} 203}
205 204
206// Internal, used for initialization 205// Internal, used for initialization
207RRDHeader.prototype.validate_rrd = function() { 206RRDHeader.prototype.validate_rrd = function() {
207 if (this.rrd_data.getLength()<1) throw new InvalidRRD("Empty file.");
208 if (this.rrd_data.getLength()<16) throw new InvalidRRD("File too short.");
208 if (this.rrd_data.getCStringAt(0,4)!=="RRD") throw new InvalidRRD("Wrong magic id."); 209 if (this.rrd_data.getCStringAt(0,4)!=="RRD") throw new InvalidRRD("Wrong magic id.");
209 210
210 this.rrd_version=this.rrd_data.getCStringAt(4,5); 211 this.rrd_version=this.rrd_data.getCStringAt(4,5);
211 if ((this.rrd_version!=="0003")&&(this.rrd_version!=="0004")) { 212 if ((this.rrd_version!=="0003")&&(this.rrd_version!=="0004")&&(this.rrd_version!=="0001")) {
212 throw new InvalidRRD("Unsupported RRD version "+this.rrd_version+"."); 213 throw new InvalidRRD("Unsupported RRD version "+this.rrd_version+".");
213 } 214 }
214 215
215 if (this.rrd_data.getDoubleAt(12)==8.642135e+130) { 216 this.float_width=8;
216 this.rrd_align=32; 217 if (this.rrd_data.getLongAt(12)==0) {
217 } else if (this.rrd_data.getDoubleAt(16)==8.642135e+130) { 218 // not a double here... likely 64 bit
218 this.rrd_align=64; 219 this.float_align=8;
220 if (! (this.rrd_data.getDoubleAt(16)==8.642135e+130)) {
221 // uhm... wrong endian?
222 this.rrd_data.switch_endian=true;
223 }
224 if (this.rrd_data.getDoubleAt(16)==8.642135e+130) {
225 // now, is it all 64bit or only float 64 bit?
226 if (this.rrd_data.getLongAt(28)==0) {
227 // true 64 bit align
228 this.int_align=8;
229 this.int_width=8;
230 } else {
231 // integers are 32bit aligned
232 this.int_align=4;
233 this.int_width=4;
234 }
235 } else {
236 throw new InvalidRRD("Magic float not found at 16.");
237 }
219 } else { 238 } else {
220 throw new InvalidRRD("Unsupported platform."); 239 /// should be 32 bit alignment
240 if (! (this.rrd_data.getDoubleAt(12)==8.642135e+130)) {
241 // uhm... wrong endian?
242 this.rrd_data.switch_endian=true;
243 }
244 if (this.rrd_data.getDoubleAt(12)==8.642135e+130) {
245 this.float_align=4;
246 this.int_align=4;
247 this.int_width=4;
248 } else {
249 throw new InvalidRRD("Magic float not found at 12.");
250 }
221 } 251 }
222} 252 this.unival_width=this.float_width;
253 this.unival_align=this.float_align;
223 254
224// Internal, used for initialization 255 // process the header here, since I need it for validation
225RRDHeader.prototype.load_header = function() { 256
226 if (this.rrd_align==32) { 257 // char magic[4], char version[5], double magic_float
227 this.ds_cnt=this.rrd_data.getLongAt(20,false); 258
228 this.rra_cnt=this.rrd_data.getLongAt(24,false); 259 // long ds_cnt, long rra_cnt, long pdp_step, unival par[10]
229 this.pdp_step=this.rrd_data.getLongAt(28,false); 260 this.ds_cnt_idx=Math.ceil((4+5)/this.float_align)*this.float_align+this.float_width;
230 // 8*10 unused values follow 261 this.rra_cnt_idx=this.ds_cnt_idx+this.int_width;
231 this.top_header_size=112; 262 this.pdp_step_idx=this.rra_cnt_idx+this.int_width;
232 } else { 263
233 //get only the low 32 bits, the high 32 should always be 0 264 //always get only the low 32 bits, the high 32 on 64 bit archs should always be 0
234 this.ds_cnt=this.rrd_data.getLongAt(24,false); 265 this.ds_cnt=this.rrd_data.getLongAt(this.ds_cnt_idx);
235 this.rra_cnt=this.rrd_data.getLongAt(32,false); 266 if (this.ds_cnt<1) {
236 this.pdp_step=this.rrd_data.getLongAt(40,false); 267 throw new InvalidRRD("ds count less than 1.");
237 // 8*10 unused values follow 268 }
238 this.top_header_size=128; 269
270 this.rra_cnt=this.rrd_data.getLongAt(this.rra_cnt_idx);
271 if (this.ds_cnt<1) {
272 throw new InvalidRRD("rra count less than 1.");
273 }
274
275 this.pdp_step=this.rrd_data.getLongAt(this.pdp_step_idx);
276 if (this.pdp_step<1) {
277 throw new InvalidRRD("pdp step less than 1.");
278 }
279
280 // best guess, assuming no weird align problems
281 this.top_header_size=Math.ceil((this.pdp_step_idx+this.int_width)/this.unival_align)*this.unival_align+10*this.unival_width;
282 var t=this.rrd_data.getLongAt(this.top_header_size);
283 if (t==0) {
284 throw new InvalidRRD("Could not find first DS name.");
239 } 285 }
240} 286}
241 287
@@ -243,43 +289,29 @@ RRDHeader.prototype.load_header = function() {
243RRDHeader.prototype.calc_idxs = function() { 289RRDHeader.prototype.calc_idxs = function() {
244 this.ds_def_idx=this.top_header_size; 290 this.ds_def_idx=this.top_header_size;
245 // char ds_nam[20], char dst[20], unival par[10] 291 // char ds_nam[20], char dst[20], unival par[10]
246 this.ds_el_size=120; 292 this.ds_el_size=Math.ceil((20+20)/this.unival_align)*this.unival_align+10*this.unival_width;
247 293
248 this.rra_def_idx=this.ds_def_idx+this.ds_el_size*this.ds_cnt; 294 this.rra_def_idx=this.ds_def_idx+this.ds_el_size*this.ds_cnt;
249 // char cf_nam[20], uint row_cnt, uint pdp_cnt, unival par[10] 295 // char cf_nam[20], uint row_cnt, uint pdp_cnt, unival par[10]
250 this.row_cnt_idx; 296 this.row_cnt_idx=Math.ceil(20/this.int_align)*this.int_align;
251 if (this.rrd_align==32) { 297 this.rra_def_el_size=Math.ceil((this.row_cnt_idx+2*this.int_width)/this.unival_align)*this.unival_align+10*this.unival_width;
252 this.rra_def_el_size=108;
253 this.row_cnt_idx=20;
254 } else {
255 this.rra_def_el_size=120;
256 this.row_cnt_idx=24;
257 }
258 298
259 this.live_head_idx=this.rra_def_idx+this.rra_def_el_size*this.rra_cnt; 299 this.live_head_idx=this.rra_def_idx+this.rra_def_el_size*this.rra_cnt;
260 // time_t last_up, int last_up_usec 300 // time_t last_up, int last_up_usec
261 if (this.rrd_align==32) { 301 this.live_head_size=2*this.int_width;
262 this.live_head_size=8;
263 } else {
264 this.live_head_size=16;
265 }
266 302
267 this.pdp_prep_idx=this.live_head_idx+this.live_head_size; 303 this.pdp_prep_idx=this.live_head_idx+this.live_head_size;
268 // char last_ds[30], unival scratch[10] 304 // char last_ds[30], unival scratch[10]
269 this.pdp_prep_el_size=112; 305 this.pdp_prep_el_size=Math.ceil(30/this.unival_align)*this.unival_align+10*this.unival_width;
270 306
271 this.cdp_prep_idx=this.pdp_prep_idx+this.pdp_prep_el_size*this.ds_cnt; 307 this.cdp_prep_idx=this.pdp_prep_idx+this.pdp_prep_el_size*this.ds_cnt;
272 // unival scratch[10] 308 // unival scratch[10]
273 this.cdp_prep_el_size=80; 309 this.cdp_prep_el_size=10*this.unival_width;
274 310
275 this.rra_ptr_idx=this.cdp_prep_idx+this.cdp_prep_el_size*this.ds_cnt*this.rra_cnt; 311 this.rra_ptr_idx=this.cdp_prep_idx+this.cdp_prep_el_size*this.ds_cnt*this.rra_cnt;
276 // uint cur_row 312 // uint cur_row
277 if (this.rrd_align==32) { 313 this.rra_ptr_el_size=1*this.int_width;
278 this.rra_ptr_el_size=4; 314
279 } else {
280 this.rra_ptr_el_size=8;
281 }
282
283 this.header_size=this.rra_ptr_idx+this.rra_ptr_el_size*this.rra_cnt; 315 this.header_size=this.rra_ptr_idx+this.rra_ptr_el_size*this.rra_cnt;
284} 316}
285 317
@@ -325,7 +357,7 @@ RRDHeader.prototype.getDSbyIdx = function(idx) {
325 return new RRDDS(this.rrd_data,this.ds_def_idx+this.ds_el_size*idx,idx); 357 return new RRDDS(this.rrd_data,this.ds_def_idx+this.ds_el_size*idx,idx);
326 } else { 358 } else {
327 throw RangeError("DS idx ("+ idx +") out of range [0-" + this.ds_cnt +")."); 359 throw RangeError("DS idx ("+ idx +") out of range [0-" + this.ds_cnt +").");
328 } 360 }
329} 361}
330RRDHeader.prototype.getDSbyName = function(name) { 362RRDHeader.prototype.getDSbyName = function(name) {
331 for (var idx=0; idx<this.ds_cnt; idx++) { 363 for (var idx=0; idx<this.ds_cnt; idx++) {
@@ -344,20 +376,23 @@ RRDHeader.prototype.getRRAInfo = function(idx) {
344 if ((idx>=0) && (idx<this.rra_cnt)) { 376 if ((idx>=0) && (idx<this.rra_cnt)) {
345 return new RRDRRAInfo(this.rrd_data, 377 return new RRDRRAInfo(this.rrd_data,
346 this.rra_def_idx+idx*this.rra_def_el_size, 378 this.rra_def_idx+idx*this.rra_def_el_size,
347 this.rrd_align,this.rra_def_row_cnts[idx],this.pdp_step, 379 this.int_align,this.rra_def_row_cnts[idx],this.pdp_step,
348 idx); 380 idx);
349 } else { 381 } else {
350 throw RangeError("RRA idx ("+ idx +") out of range [0-" + this.rra_cnt +")."); 382 throw RangeError("RRA idx ("+ idx +") out of range [0-" + this.rra_cnt +").");
351 } 383 }
352} 384}
353 385
354// ============================================================ 386// ============================================================
355// RRDFile class 387// RRDFile class
356// Given a BinaryFile, gives access to the RRD archive fields 388// Given a BinaryFile, gives access to the RRD archive fields
357// 389//
358// Arguments: 390// Arguments:
359// bf must be an object compatible with the BinaryFile interface 391// bf must be an object compatible with the BinaryFile interface
360function RRDFile(bf) { 392// file_options - currently no semantics... introduced for future expandability
393function RRDFile(bf,file_options) {
394 this.file_options=file_options;
395
361 var rrd_data=bf 396 var rrd_data=bf
362 397
363 this.rrd_header=new RRDHeader(rrd_data); 398 this.rrd_header=new RRDHeader(rrd_data);
@@ -396,7 +431,7 @@ function RRDFile(bf) {
396 } 431 }
397 432
398 this.getRRA = function(idx) { 433 this.getRRA = function(idx) {
399 var rra_info=this.rrd_header.getRRAInfo(idx); 434 rra_info=this.rrd_header.getRRAInfo(idx);
400 return new RRDRRA(rrd_data, 435 return new RRDRRA(rrd_data,
401 this.rrd_header.rra_ptr_idx+idx*this.rrd_header.rra_ptr_el_size, 436 this.rrd_header.rra_ptr_idx+idx*this.rrd_header.rra_ptr_el_size,
402 rra_info, 437 rra_info,