/adei/trunk

To get this branch, use:
bzr branch http://darksoft.org/webbzr/adei/trunk

« back to all changes in this revision

Viewing changes to classes/readers/zeus.php

  • Committer: Suren A. Chilingaryan
  • Date: 2018-04-11 23:44:11 UTC
  • Revision ID: csa@suren.me-20180411234411-n3b1zfnep0hxt0rs
Support group splitting in ZEUSReader

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
<?php
2
2
 
 
3
/*
 
4
 ToDo:
 
5
  - Channel splitting is not supported in ZEUSMask, Backup, etc.
 
6
*/
 
7
 
3
8
class ZEUSLogGroup extends LOGGROUP {
4
9
 var $table;
 
10
 var $offset;
 
11
 var $length;
 
12
 var $zeus_gid;
5
13
 
6
14
 function __construct(array &$info, ZEUS $zeus, $flags = 0) {
7
15
    parent::__construct($info, $zeus, $flags);
8
16
    
9
 
    if ($this->gid === false) $this->gid = 0;
10
 
    $this->table = "log" . $this->gid;
 
17
    if ($this->gid === false) {
 
18
        $this->gid = 0;
 
19
        $this->zeus_gid = 0;
 
20
        $this->offset = 0;
 
21
        $this->length = 65535;
 
22
    } elseif (preg_match("/_/", $this->gid)) {
 
23
        $prm = preg_split("/_/", $this->gid);
 
24
        $this->zeus_gid=$prm[0];
 
25
        $this->length=$zeus->req->GetGroupOption("max_channels", $this, ZEUS::MAX_CHANNELS);
 
26
        $this->offset=$prm[1] * $this->length;
 
27
    } else {
 
28
        $this->zeus_gid = $this->gid;
 
29
        $this->offset = 0;
 
30
        $this->length = 65535;
 
31
    }
 
32
    $this->table = "log" . $this->zeus_gid;
11
33
 }
12
34
}
13
35
 
42
64
 
43
65
class ZEUSData implements Iterator {
44
66
 var $zeus;
 
67
 var $grp;
45
68
 var $stmt;
46
69
 var $row;
47
70
 var $ts;
48
71
 
49
 
 function __construct(ZEUS $zeus, PDOStatement $stmt) {
 
72
 function __construct(ZEUS $zeus, ZEUSLogGroup $grp, PDOStatement $stmt) {
50
73
    $this->zeus = $zeus;
51
74
    $this->stmt = $stmt;
52
75
    $this->ts = false;
 
76
 
 
77
    $split = $zeus->req->GetGroupOption("split_channels", $grp, false);
 
78
    if ($split) $this->grp = $grp;
 
79
    else $this->grp = false;
53
80
 }
54
81
 
55
82
 function ParseBlob($data) {
71
98
 
72
99
        if (is_nan($res[$i])) $res[$i] = NULL;
73
100
    }
 
101
 
 
102
    if ($this->grp) {
 
103
        return array_slice($res, $this->grp->offset, $this->grp->length);
 
104
    }
 
105
 
74
106
    return $res;
75
107
 }
76
108
 
186
218
 const TYPE_FLOAT = 1;
187
219
 const TYPE_INT32 = 2;
188
220
 
 
221
 const MAX_CHANNELS = 200;
 
222
 
189
223
 var $data_filters = array (
190
224
    array (
191
225
        "class" => "LENGTHFilter",
308
342
    else
309
343
        $req_cols = "gid, name";
310
344
 
311
 
    if ($grp)
312
 
        $res = $this->db->Query("SELECT $req_cols FROM groups WHERE gid=" . $grp->gid);
313
 
    else
 
345
    if ($grp) {
 
346
        if ($grp instanceof ZEUSLogGroup)
 
347
            $res = $this->db->Query("SELECT $req_cols FROM groups WHERE gid=" . $grp->zeus_gid);
 
348
        else
 
349
            $res = $this->db->Query("SELECT $req_cols FROM groups WHERE gid=" . $grp->gid);
 
350
    } else {
314
351
        $res = $this->db->Query("SELECT $req_cols FROM groups");
 
352
    }
315
353
 
316
354
    $groups = array();
317
 
    if ($flags&REQUEST::NEED_INFO) {
318
 
        foreach ($res as $row) {
319
 
            $gid = $row['gid'];
320
 
            $groups[$gid] = $row;
321
 
        
322
 
            $ginfo = array("db_group" => $gid);
323
 
            $grzeus = $this->CreateGroup($ginfo);
 
355
    foreach ($res as $row) {
 
356
        $gid0 = $row['gid'];
 
357
        $ginfo0 = array("db_group" => $gid0);
 
358
        $grzeus0 = $this->CreateGroup($ginfo0);
 
359
 
 
360
        if ($flags&REQUEST::CONTROL) {
 
361
            $n_groups = 1;      // Splitting not supported and not neeeded
 
362
        } else {
 
363
            $split = $this->req->GetGroupOption("split_channels", $grzeus0, false);
 
364
            if ($split) {
 
365
                $maxchan = $this->req->GetGroupOption("max_channels", $grzeus0, ZEUS::MAX_CHANNELS);
 
366
                $size = $this->GetGroupSize($grzeus0, $flags);
 
367
                $n_groups = $size / $maxchan;
 
368
            } else {
 
369
                $n_groups = 1;
 
370
            }
 
371
        }
324
372
            
 
373
        for ($sgid = 0; $sgid < $n_groups; $sgid++) {
 
374
            if ($n_groups > 1) {
 
375
                $gid = $gid0 . "_" . $sgid;
 
376
                $ginfo = array("db_group" => $gid);
 
377
                $grzeus = $this->CreateGroup($ginfo);
 
378
            } else {
 
379
                $gid = $gid0;
 
380
                $grzeus = $grzeus0;
 
381
            }
 
382
 
 
383
            $groups[$gid] = $row;
 
384
 
 
385
            if ($n_groups > 1) {
 
386
                $groups[$gid]['name'] .= " (channels " . ($grzeus->offset) . " - " . ($grzeus->offset + $grzeus->length - 1) . ")";
 
387
                $groups[$gid]['gid'] = $gid;
 
388
            }
 
389
 
 
390
            if (!($flags&REQUEST::NEED_INFO)) continue;
 
391
 
325
392
            $groups[$gid]['__internal__'] = array();
326
393
            
327
394
            try {
365
432
            if ($flags&REQUEST::NEED_ITEMINFO) {
366
433
                $groups[$gid]['items'] = $this->GetItemList($grzeus, NULL, $flags);
367
434
            }
368
 
 
369
 
        }
370
 
    } else {
371
 
        foreach ($res as $row) {
372
 
            $groups[$row['gid']] = $row;
373
 
        }
374
 
    }
375
 
 
 
435
        }
 
436
    } 
 
437
    
376
438
    return $grp?$groups[$grp->gid]:$groups;
377
439
 }
378
440
 
410
472
 
411
473
    $list = array();
412
474
    
413
 
    $resp = $this->db->Query("SELECT maskid, name, mask FROM masks WHERE gid=" . $grp->gid);
 
475
    $resp = $this->db->Query("SELECT maskid, name, mask FROM masks WHERE gid=" . $grp->zeus_gid);
414
476
    foreach ($resp as $row) {
415
477
        if (!preg_match("/[\w\d]/", $row['name'])) $row['name'] = _("No name");
416
478
 
506
568
    $bids = array();
507
569
    $items = array();
508
570
 
509
 
    $resp = $this->db->Query("SELECT id FROM g2id WHERE gid=" . $grp->gid . " ORDER BY pos ASC");
 
571
    $resp = $this->db->Query("SELECT id FROM g2id WHERE gid=" . $grp->zeus_gid . " ORDER BY pos ASC");
510
572
    foreach ($resp as $row) {
511
573
        array_push($bids, $row['id']);
512
574
    }
520
582
            
521
583
        $names = preg_split("/\r?\n/",  $this->db->RecodeMessage($res['itemnames']));
522
584
        for ($i = 0; $i < $res['length']; $i++, $pos++) {
523
 
            if (!$mask->Check($pos)) continue;
 
585
            if (($pos < $grp->offset)||($pos >= ($grp->offset + $grp->length))) continue;
 
586
            if (!$mask->Check($pos - $grp->offset)) continue;
524
587
            
525
588
            $items[$rpos] = array(
526
 
                "id" => $pos,
 
589
                "id" => $pos - $grp->offset,
527
590
                "block_name" =>  $this->db->RecodeMessage($res['name']),
528
591
                "chan_name" => $names[$i],
529
592
                "name" =>  $names[$i],
614
677
    $bids = array();
615
678
    
616
679
    try {    
617
 
        $resp = $this->db->Query("SELECT id FROM g2id WHERE gid=" . $grp->gid);
 
680
        $resp = $this->db->Query("SELECT id FROM g2id WHERE gid=" . $grp->zeus_gid);
618
681
        foreach ($resp as $row) {
619
682
            array_push($bids, $row['id']);
620
683
        }
630
693
        throw new Exception($e->getMessage());
631
694
    }
632
695
    
 
696
    $size = $size - $grp->offset;
 
697
    if ($size > $grp->length) $size = $grp->length;
 
698
    
633
699
    $params['width'] = $size;
634
700
    
635
701
    return $size;
689
755
    $query = $this->db->SelectRequest($grp->table, "ts, data", $selopts);
690
756
    $stmt = $this->db->Prepare($query);
691
757
    
692
 
    return new ZEUSData($this, $stmt);
 
758
    return new ZEUSData($this, $grp, $stmt);
693
759
 }
694
760
 
695
761
 function GetRawAlarms(LOGGROUP $grp = NULL, $from = false, $to = false, DATAFilter $filter = NULL, &$filter_data = NULL) {