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'
. ')'
);
}
}
?>
|