aboutsummaryrefslogtreecommitdiff
path: root/src/callnotifier/Logger/CallDb.php
blob: 752443b3d40e7b1a024a85edb840aecec13c222f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
namespace callnotifier;

/**
 * Logs finished calls into a SQL database.
 *
 * To use this, setup the database table using the script
 * in docs/create-call-log.sql
 */
class Logger_CallDb extends Logger_CallBase
{
    protected $db;
    protected $dsn;
    protected $username;
    protected $password;

    /**
     * Create new detailler object
     *
     * @param string $dsn      PDO connection string, for example
     *                         'mysql:host=dojo;dbname=opengeodb'
     * @param string $username Database username
     * @param string $password Database password
     */
    public function __construct(
        $dsn, $username, $password, $callTypes = 'io', $msns = array()
    ) {
        parent::__construct($callTypes, $msns);

        $this->dsn      = $dsn;
        $this->username = $username;
        $this->password = $password;
        //check if the credentials are correct
        $this->connect();
    }

    /**
     * Connect to the SQL server.
     * SQL servers close the connection automatically after some hours,
     * and since calls often don't come in every minute, we will have
     * disconnects in between.
     * Thus, we will reconnect on every location load.
     *
     * @return void
     */
    protected function connect()
    {
        $this->db = new \PDO(
            $this->dsn, $this->username, $this->password,
            array(
                \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
                \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
                \PDO::ATTR_PERSISTENT => true
            )
        );
    }

    public function log($type, $arData)
    {
        if ($type != 'finishedCall') {
            return;
        }

        $call = $arData['call'];
        if (!$this->hasValidType($call)) {
            return;
        }
        if (!$this->hasValidMsn($call)) {
            return;
        }

        $this->addUnsetVars($call);

        $this->connect();
        $stmt = $this->prepareDbStatement();
        $ret  = $stmt->execute(
            array(
                'call_start'         => date('Y-m-d H:i:s', $call->start),
                'call_end'           => date('Y-m-d H:i:s', $call->end),
                'call_type'          => $call->type,
                'call_from'          => $call->from,
                'call_from_name'     => $call->fromName,
                'call_from_location' => $call->fromLocation,
                'call_to'            => $call->to,
                'call_to_name'       => $call->toName,
                'call_to_location'   => $call->toLocation,
                'call_length'        => $call->end - $call->start
            )
        );
        if ($ret === false) {
            throw new \Exception(
                'Error logging call to database: '
                . implode(' / ', $stmt->errorInfo())
            );
        }
    }

    protected function prepareDbStatement()
    {
        return $this->db->prepare(
            'INSERT INTO finished ('
            . '  call_start'
            . ', call_end'
            . ', call_type'
            . ', call_from'
            . ', call_from_name'
            . ', call_from_location'
            . ', call_to'
            . ', call_to_name'
            . ', call_to_location'
            . ', call_length'
            . ') VALUES ('
            . '  :call_start'
            . ', :call_end'
            . ', :call_type'
            . ', :call_from'
            . ', :call_from_name'
            . ', :call_from_location'
            . ', :call_to'
            . ', :call_to_name'
            . ', :call_to_location'
            . ', :call_length'
            . ')'
        );
    }

}

?>