Passed
Push — master ( 251b1a...cf6e60 )
by Gaetano
08:24
created

getComments()   A

Complexity

Conditions 5
Paths 6

Size

Total Lines 30
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 5
eloc 21
c 2
b 0
f 0
nc 6
nop 1
dl 0
loc 30
ccs 0
cts 19
cp 0
crap 30
rs 9.2728
1
<?php
2
/**
3
 * A basic comment server. Given an ID it will store a list of names and comment texts against it.
4
 * It uses a Berkeley DB database for storage.
5
 */
6
7
require_once __DIR__ . "/_prepend.php";
8
9
use PhpXmlRpc\Value;
10
11 1
$addComment_sig = array(array(Value::$xmlrpcInt, Value::$xmlrpcString, Value::$xmlrpcString, Value::$xmlrpcString));
12
13 1
$addComment_doc = 'Adds a comment to an item. The first parameter
14
is the item ID, the second the name of the commenter, and the third
15
is the comment itself. Returns the number of comments against that
16
ID.';
17
18
function addComment($req)
19
{
20
    $err = "";
21
    // since validation has already been carried out for us,
22
    // we know we got exactly 3 string values
23
    $encoder = new PhpXmlRpc\Encoder();
24
    $n = $encoder->decode($req);
25
    $msgID = $n[0];
26
    $name = $n[1];
27
    $comment = $n[2];
28
29
    $dbh = dba_open("/tmp/comments.db", "c", "db2");
30
    if ($dbh) {
0 ignored issues
show
introduced by
$dbh is of type resource, thus it always evaluated to false.
Loading history...
31
        $countID = "${msgID}_count";
32
        if (dba_exists($countID, $dbh)) {
33
            $count = dba_fetch($countID, $dbh);
34
        } else {
35
            $count = 0;
36
        }
37
        // add the new comment in
38
        dba_insert($msgID . "_comment_${count}", $comment, $dbh);
39
        dba_insert($msgID . "_name_${count}", $name, $dbh);
40
        $count++;
41
        dba_replace($countID, $count, $dbh);
42
        dba_close($dbh);
43
    } else {
44
        $err = "Unable to open comments database.";
45
    }
46
    // if we generated an error, create an error return response
47
    if ($err) {
48
        return new PhpXmlRpc\Response(0, PhpXmlRpc\PhpXmlRpc::$xmlrpcerruser, $err);
49
    } else {
50
        // otherwise, we create the right response
51
        return new PhpXmlRpc\Response(new PhpXmlRpc\Value($count, "int"));
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $count does not seem to be defined for all execution paths leading up to this point.
Loading history...
52
    }
53
}
54
55 1
$getComments_sig = array(array(Value::$xmlrpcArray, Value::$xmlrpcString));
56
57 1
$getComments_doc = 'Returns an array of comments for a given ID, which
58
is the sole argument. Each array item is a struct containing name
59
and comment text.';
60
61
function getComments($req)
62
{
63
    $err = "";
64
    $ra = array();
65
    $encoder = new PhpXmlRpc\Encoder();
66
    $msgID = $encoder->decode($req->getParam(0));
67
    $dbh = dba_open("/tmp/comments.db", "r", "db2");
68
    if ($dbh) {
0 ignored issues
show
introduced by
$dbh is of type resource, thus it always evaluated to false.
Loading history...
69
        $countID = "${msgID}_count";
70
        if (dba_exists($countID, $dbh)) {
71
            $count = dba_fetch($countID, $dbh);
72
            for ($i = 0; $i < $count; $i++) {
73
                $name = dba_fetch("${msgID}_name_${i}", $dbh);
74
                $comment = dba_fetch("${msgID}_comment_${i}", $dbh);
75
                // push a new struct onto the return array
76
                $ra[] = array(
77
                    "name" => $name,
78
                    "comment" => $comment,
79
                );
80
            }
81
        }
82
    } else {
83
        $err = "Unable to open comments database.";
84
    }
85
    // if we generated an error, create an error return response
86
    if ($err) {
87
        return new PhpXmlRpc\Response(0, PhpXmlRpc\PhpXmlRpc::$xmlrpcerruser, $err);
88
    } else {
89
        // otherwise, we create the right response
90
        return new PhpXmlRpc\Response($encoder->encode($ra));
91
    }
92
}
93
94
// NB: take care not to output anything else after this call, as it will mess up the responses and it will be hard to
95
// debug. In case you have to do so, at least re-emit a correct Content-Length http header (requires output buffering)
96
97 1
$srv = new PhpXmlRpc\Server(array(
98
    "discuss.addComment" => array(
99 1
        "function" => "addComment",
100 1
        "signature" => $addComment_sig,
101 1
        "docstring" => $addComment_doc,
102
    ),
103
    "discuss.getComments" => array(
104 1
        "function" => "getComments",
105 1
        "signature" => $getComments_sig,
106 1
        "docstring" => $getComments_doc,
107
    ),
108
));
109