Skip to content

Commit

Permalink
CardDAV now also has Postgres support
Browse files Browse the repository at this point in the history
  • Loading branch information
evert committed Apr 28, 2016
1 parent e1262ac commit 2349007
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 94 deletions.
File renamed without changes.
Expand Up @@ -29,10 +29,6 @@ ALTER TABLE ONLY cards
CREATE UNIQUE INDEX cards_ukey
ON cards USING btree (addressbookid, uri);

ALTER TABLE ONLY cards
ADD CONSTRAINT cards_addressbookid_fkey FOREIGN KEY (addressbookid) REFERENCES addressbooks(id)
ON DELETE CASCADE;

CREATE TABLE addressbookchanges (
id SERIAL NOT NULL,
uri VARCHAR(200) NOT NULL,
Expand All @@ -46,7 +42,3 @@ ALTER TABLE ONLY addressbookchanges

CREATE INDEX addressbookchanges_addressbookid_synctoken_ix
ON addressbookchanges USING btree (addressbookid, synctoken);

ALTER TABLE ONLY addressbookchanges
ADD CONSTRAINT addressbookchanges_addressbookid_fkey FOREIGN KEY (addressbookid) REFERENCES addressbooks(id)
ON DELETE CASCADE;
9 changes: 7 additions & 2 deletions lib/CardDAV/Backend/PDO.php
Expand Up @@ -128,7 +128,7 @@ function updateAddressBook($addressBookId, \Sabre\DAV\PropPatch $propPatch) {
} else {
$query .= ', ';
}
$query .= ' `' . $key . '` = :' . $key . ' ';
$query .= ' ' . $key . ' = :' . $key . ' ';
}
$query .= ' WHERE id = :addressbookid';

Expand Down Expand Up @@ -180,7 +180,9 @@ function createAddressBook($principalUri, $url, array $properties) {
$query = 'INSERT INTO ' . $this->addressBooksTableName . ' (uri, displayname, description, principaluri, synctoken) VALUES (:uri, :displayname, :description, :principaluri, 1)';
$stmt = $this->pdo->prepare($query);
$stmt->execute($values);
return $this->pdo->lastInsertId();
return $this->pdo->lastInsertId(
$this->addressBooksTableName . '_id_seq'
);

}

Expand Down Expand Up @@ -230,6 +232,7 @@ function getCards($addressbookId) {
$result = [];
while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
$row['etag'] = '"' . $row['etag'] . '"';
$row['lastmodified'] = (int)$row['lastmodified'];
$result[] = $row;
}
return $result;
Expand Down Expand Up @@ -258,6 +261,7 @@ function getCard($addressBookId, $cardUri) {
if (!$result) return false;

$result['etag'] = '"' . $result['etag'] . '"';
$result['lastmodified'] = (int)$result['lastmodified'];
return $result;

}
Expand Down Expand Up @@ -286,6 +290,7 @@ function getMultipleCards($addressBookId, array $uris) {
$result = [];
while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
$row['etag'] = '"' . $row['etag'] . '"';
$row['lastmodified'] = (int)$row['lastmodified'];
$result[] = $row;
}
return $result;
Expand Down
48 changes: 36 additions & 12 deletions tests/Sabre/CardDAV/Backend/AbstractPDOTest.php
Expand Up @@ -7,23 +7,26 @@

abstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {

use \Sabre\DAV\DbTestHelperTrait;

/**
* @var CardDAV\Backend\PDO
*/
protected $backend;

/**
* @abstract
* @return PDO
*/
abstract function getPDO();

function setUp() {

$this->dropTables([
'addressbooks',
'cards',
'addressbookchanges',
]);
$this->createSchema('addressbooks');
$pdo = $this->getPDO();

$this->backend = new PDO($pdo);
$pdo->exec('INSERT INTO addressbooks (principaluri, displayname, uri, description, synctoken) VALUES ("principals/user1", "book1", "book1", "addressbook 1", 1)');
$pdo->exec('INSERT INTO cards (addressbookid, carddata, uri, lastmodified, etag, size) VALUES (1, "card1", "card1", 0, "' . md5('card1') . '", 5)');
$pdo->exec("INSERT INTO addressbooks (principaluri, displayname, uri, description, synctoken) VALUES ('principals/user1', 'book1', 'book1', 'addressbook 1', 1)");
$pdo->exec("INSERT INTO cards (addressbookid, carddata, uri, lastmodified, etag, size) VALUES (1, 'card1', 'card1', 0, '" . md5('card1') . "', 5)");

}

Expand Down Expand Up @@ -219,6 +222,10 @@ function testGetCard() {
'size' => 5
];

if (is_resource($result['carddata'])) {
$result['carddata'] = stream_get_contents($result['carddata']);
}

$this->assertEquals($expected, $result);

}
Expand All @@ -233,6 +240,9 @@ function testCreateCard() {
$result = $this->backend->getCard(1, 'card2');
$this->assertEquals(2, $result['id']);
$this->assertEquals('card2', $result['uri']);
if (is_resource($result['carddata'])) {
$result['carddata'] = stream_get_contents($result['carddata']);
}
$this->assertEquals('data2', $result['carddata']);

}
Expand Down Expand Up @@ -271,10 +281,21 @@ function testGetMultiple() {

foreach ($node as $k => $v) {

if ($k !== 'lastmodified') {
$this->assertEquals($v, $result[$index][$k]);
} else {
$this->assertTrue(isset($result[$index][$k]));
$expected = $v;
$actual = $result[$index][$k];

switch($k) {
case 'lastmodified' :
$this->assertInternalType('int', $actual);
break;
case 'carddata' :
if (is_resource($actual)) {
$actual = stream_get_contents($actual);
}
// No break intended.
default :
$this->assertEquals($expected, $actual);
break;
}

}
Expand All @@ -294,6 +315,9 @@ function testUpdateCard() {

$result = $this->backend->getCard(1, 'card1');
$this->assertEquals(1, $result['id']);
if (is_resource($result['carddata'])) {
$result['carddata'] = stream_get_contents($result['carddata']);
}
$this->assertEquals('newdata', $result['carddata']);

}
Expand Down
28 changes: 1 addition & 27 deletions tests/Sabre/CardDAV/Backend/PDOMySQLTest.php
Expand Up @@ -2,34 +2,8 @@

namespace Sabre\CardDAV\Backend;

require_once 'Sabre/TestUtil.php';

class PDOMySQLTest extends AbstractPDOTest {

/**
* @return PDO
*/
function getPDO() {

if (!SABRE_HASMYSQL) $this->markTestSkipped('MySQL driver is not available, or not properly configured');

$pdo = \Sabre\TestUtil::getMySQLDB();
if (!$pdo) $this->markTestSkipped('Could not connect to MySQL database');

$pdo->query("DROP TABLE IF EXISTS addressbooks, cards, addressbookchanges");

$queries = explode(
';',
file_get_contents(__DIR__ . '/../../../../examples/sql/mysql.addressbook.sql')
);

foreach ($queries as $query) {
$query = trim($query, " \r\n\t");
if ($query)
$pdo->exec($query);
}
return $pdo;

}
public $driver = 'mysql';

}
9 changes: 9 additions & 0 deletions tests/Sabre/CardDAV/Backend/PDOPgSqlTest.php
@@ -0,0 +1,9 @@
<?php

namespace Sabre\CardDAV\Backend;

class PDOPgSqlTest extends AbstractPDOTest {

public $driver = 'pgsql';

}
46 changes: 1 addition & 45 deletions tests/Sabre/CardDAV/Backend/PDOSqliteTest.php
Expand Up @@ -2,52 +2,8 @@

namespace Sabre\CardDAV\Backend;

require_once 'Sabre/TestUtil.php';

class PDOSqliteTest extends AbstractPDOTest {

function tearDown() {

if (file_exists(SABRE_TEMPDIR . '/pdobackend')) unlink(SABRE_TEMPDIR . '/pdobackend');
if (file_exists(SABRE_TEMPDIR . '/pdobackend2')) unlink(SABRE_TEMPDIR . '/pdobackend2');

}

/**
* @return PDO
*/
function getPDO() {

return self::getSQLite();

}

/**
* @return PDO
*/
static function getSQLite() {

if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
$pdo = new \PDO('sqlite:' . SABRE_TEMPDIR . '/pdobackend');
$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

$pdo->query("DROP TABLE IF EXISTS addressbooks");
$pdo->query("DROP TABLE IF EXISTS addressbookchanges");
$pdo->query("DROP TABLE IF EXISTS cards");

$queries = explode(
';',
file_get_contents(__DIR__ . '/../../../../examples/sql/sqlite.addressbooks.sql')
);

foreach ($queries as $query) {
$query = trim($query, " \r\n\t");
if ($query)
$pdo->exec($query);
}

return $pdo;

}
public $driver = 'sqlite';

}

0 comments on commit 2349007

Please sign in to comment.