Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LinkDB: prefix private members with an underscore #267

Merged
merged 1 commit into from
Jul 10, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 62 additions & 62 deletions application/LinkDB.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
class LinkDB implements Iterator, Countable, ArrayAccess
{
// Links are stored as a PHP serialized string
private $datastore;
private $_datastore;

// Datastore PHP prefix
protected static $phpPrefix = '<?php /* ';
Expand All @@ -39,23 +39,23 @@ class LinkDB implements Iterator, Countable, ArrayAccess
// List of links (associative array)
// - key: link date (e.g. "20110823_124546"),
// - value: associative array (keys: title, description...)
private $links;
private $_links;

// List of all recorded URLs (key=url, value=linkdate)
// for fast reserve search (url-->linkdate)
private $urls;
private $_urls;

// List of linkdate keys (for the Iterator interface implementation)
private $keys;
private $_keys;

// Position in the $this->keys array (for the Iterator interface)
private $position;
// Position in the $this->_keys array (for the Iterator interface)
private $_position;

// Is the user logged in? (used to filter private links)
private $loggedIn;
private $_loggedIn;

// Hide public links
private $hidePublicLinks;
private $_hidePublicLinks;

/**
* Creates a new LinkDB
Expand All @@ -66,19 +66,19 @@ class LinkDB implements Iterator, Countable, ArrayAccess
*/
function __construct($datastore, $isLoggedIn, $hidePublicLinks)
{
$this->datastore = $datastore;
$this->loggedIn = $isLoggedIn;
$this->hidePublicLinks = $hidePublicLinks;
$this->checkDB();
$this->readdb();
$this->_datastore = $datastore;
$this->_loggedIn = $isLoggedIn;
$this->_hidePublicLinks = $hidePublicLinks;
$this->_checkDB();
$this->_readDB();
}

/**
* Countable - Counts elements of an object
*/
public function count()
{
return count($this->links);
return count($this->_links);
}

/**
Expand All @@ -87,7 +87,7 @@ public function count()
public function offsetSet($offset, $value)
{
// TODO: use exceptions instead of "die"
if (!$this->loggedIn) {
if (!$this->_loggedIn) {
die('You are not authorized to add a link.');
}
if (empty($value['linkdate']) || empty($value['url'])) {
Expand All @@ -96,62 +96,62 @@ public function offsetSet($offset, $value)
if (empty($offset)) {
die('You must specify a key.');
}
$this->links[$offset] = $value;
$this->urls[$value['url']]=$offset;
$this->_links[$offset] = $value;
$this->_urls[$value['url']]=$offset;
}

/**
* ArrayAccess - Whether or not an offset exists
*/
public function offsetExists($offset)
{
return array_key_exists($offset, $this->links);
return array_key_exists($offset, $this->_links);
}

/**
* ArrayAccess - Unsets an offset
*/
public function offsetUnset($offset)
{
if (!$this->loggedIn) {
if (!$this->_loggedIn) {
// TODO: raise an exception
die('You are not authorized to delete a link.');
}
$url = $this->links[$offset]['url'];
unset($this->urls[$url]);
unset($this->links[$offset]);
$url = $this->_links[$offset]['url'];
unset($this->_urls[$url]);
unset($this->_links[$offset]);
}

/**
* ArrayAccess - Returns the value at specified offset
*/
public function offsetGet($offset)
{
return isset($this->links[$offset]) ? $this->links[$offset] : null;
return isset($this->_links[$offset]) ? $this->_links[$offset] : null;
}

/**
* Iterator - Returns the current element
*/
function current()
{
return $this->links[$this->keys[$this->position]];
return $this->_links[$this->_keys[$this->_position]];
}

/**
* Iterator - Returns the key of the current element
*/
function key()
{
return $this->keys[$this->position];
return $this->_keys[$this->_position];
}

/**
* Iterator - Moves forward to next element
*/
function next()
{
++$this->position;
++$this->_position;
}

/**
Expand All @@ -161,32 +161,32 @@ function next()
*/
function rewind()
{
$this->keys = array_keys($this->links);
rsort($this->keys);
$this->position = 0;
$this->_keys = array_keys($this->_links);
rsort($this->_keys);
$this->_position = 0;
}

/**
* Iterator - Checks if current position is valid
*/
function valid()
{
return isset($this->keys[$this->position]);
return isset($this->_keys[$this->_position]);
}

/**
* Checks if the DB directory and file exist
*
* If no DB file is found, creates a dummy DB.
*/
private function checkDB()
private function _checkDB()
{
if (file_exists($this->datastore)) {
if (file_exists($this->_datastore)) {
return;
}

// Create a dummy database for example
$this->links = array();
$this->_links = array();
$link = array(
'title'=>' Shaarli: the personal, minimalist, super-fast, no-database delicious clone',
'url'=>'https://github.com/shaarli/Shaarli/wiki',
Expand All @@ -199,7 +199,7 @@ private function checkDB()
'linkdate'=> date('Ymd_His'),
'tags'=>'opensource software'
);
$this->links[$link['linkdate']] = $link;
$this->_links[$link['linkdate']] = $link;

$link = array(
'title'=>'My secret stuff... - Pastebin.com',
Expand All @@ -209,60 +209,60 @@ private function checkDB()
'linkdate'=> date('Ymd_His', strtotime('-1 minute')),
'tags'=>'secretstuff'
);
$this->links[$link['linkdate']] = $link;
$this->_links[$link['linkdate']] = $link;

// Write database to disk
// TODO: raise an exception if the file is not write-able
file_put_contents(
$this->datastore,
self::$phpPrefix.base64_encode(gzdeflate(serialize($this->links))).self::$phpSuffix
$this->_datastore,
self::$phpPrefix.base64_encode(gzdeflate(serialize($this->_links))).self::$phpSuffix
);
}

/**
* Reads database from disk to memory
*/
private function readdb()
private function _readDB()
{

// Public links are hidden and user not logged in => nothing to show
if ($this->hidePublicLinks && !$this->loggedIn) {
$this->links = array();
if ($this->_hidePublicLinks && !$this->_loggedIn) {
$this->_links = array();
return;
}

// Read data
// Note that gzinflate is faster than gzuncompress.
// See: http://www.php.net/manual/en/function.gzdeflate.php#96439
$this->links = array();
$this->_links = array();

if (file_exists($this->datastore)) {
$this->links = unserialize(gzinflate(base64_decode(
substr(file_get_contents($this->datastore),
if (file_exists($this->_datastore)) {
$this->_links = unserialize(gzinflate(base64_decode(
substr(file_get_contents($this->_datastore),
strlen(self::$phpPrefix), -strlen(self::$phpSuffix)))));
}

// If user is not logged in, filter private links.
if (!$this->loggedIn) {
if (!$this->_loggedIn) {
$toremove = array();
foreach ($this->links as $link) {
foreach ($this->_links as $link) {
if ($link['private'] != 0) {
$toremove[] = $link['linkdate'];
}
}
foreach ($toremove as $linkdate) {
unset($this->links[$linkdate]);
unset($this->_links[$linkdate]);
}
}

// Keep the list of the mapping URLs-->linkdate up-to-date.
$this->urls = array();
foreach ($this->links as $link) {
$this->urls[$link['url']] = $link['linkdate'];
$this->_urls = array();
foreach ($this->_links as $link) {
$this->_urls[$link['url']] = $link['linkdate'];
}

// Escape links data
foreach($this->links as &$link) {
foreach($this->_links as &$link) {
sanitizeLink($link);
}
}
Expand All @@ -272,13 +272,13 @@ private function readdb()
*/
public function savedb()
{
if (!$this->loggedIn) {
if (!$this->_loggedIn) {
// TODO: raise an Exception instead
die('You are not authorized to change the database.');
}
file_put_contents(
$this->datastore,
self::$phpPrefix.base64_encode(gzdeflate(serialize($this->links))).self::$phpSuffix
$this->_datastore,
self::$phpPrefix.base64_encode(gzdeflate(serialize($this->_links))).self::$phpSuffix
);
invalidateCaches();
}
Expand All @@ -288,8 +288,8 @@ public function savedb()
*/
public function getLinkFromUrl($url)
{
if (isset($this->urls[$url])) {
return $this->links[$this->urls[$url]];
if (isset($this->_urls[$url])) {
return $this->_links[$this->_urls[$url]];
}
return false;
}
Expand All @@ -316,7 +316,7 @@ public function filterFulltext($searchterms)
$search = mb_convert_case($searchterms, MB_CASE_LOWER, 'UTF-8');
$keys = array('title', 'description', 'url', 'tags');

foreach ($this->links as $link) {
foreach ($this->_links as $link) {
$found = false;

foreach ($keys as $key) {
Expand Down Expand Up @@ -352,7 +352,7 @@ public function filterTags($tags, $casesensitive=false)
$searchtags = explode(' ', $t);
$filtered = array();

foreach ($this->links as $l) {
foreach ($this->_links as $l) {
$linktags = explode(
' ',
($casesensitive ? $l['tags']:mb_convert_case($l['tags'], MB_CASE_LOWER, 'UTF-8'))
Expand Down Expand Up @@ -380,7 +380,7 @@ public function filterDay($day)
}

$filtered = array();
foreach ($this->links as $l) {
foreach ($this->_links as $l) {
if (startsWith($l['linkdate'], $day)) {
$filtered[$l['linkdate']] = $l;
}
Expand All @@ -395,7 +395,7 @@ public function filterDay($day)
public function filterSmallHash($smallHash)
{
$filtered = array();
foreach ($this->links as $l) {
foreach ($this->_links as $l) {
if ($smallHash == smallHash($l['linkdate'])) {
// Yes, this is ugly and slow
$filtered[$l['linkdate']] = $l;
Expand All @@ -412,7 +412,7 @@ public function filterSmallHash($smallHash)
public function allTags()
{
$tags = array();
foreach ($this->links as $link) {
foreach ($this->_links as $link) {
foreach (explode(' ', $link['tags']) as $tag) {
if (!empty($tag)) {
$tags[$tag] = (empty($tags[$tag]) ? 1 : $tags[$tag] + 1);
Expand All @@ -431,7 +431,7 @@ public function allTags()
public function days()
{
$linkDays = array();
foreach (array_keys($this->links) as $day) {
foreach (array_keys($this->_links) as $day) {
$linkDays[substr($day, 0, 8)] = 0;
}
$linkDays = array_keys($linkDays);
Expand Down
4 changes: 2 additions & 2 deletions tests/LinkDBTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ public function testCheckDBNew()
unlink(self::$testDatastore);
$this->assertFileNotExists(self::$testDatastore);

$checkDB = self::getMethod('checkDB');
$checkDB = self::getMethod('_checkDB');
$checkDB->invokeArgs($linkDB, array());
$this->assertFileExists(self::$testDatastore);

Expand All @@ -120,7 +120,7 @@ public function testCheckDBLoad()
$datastoreSize = filesize(self::$testDatastore);
$this->assertGreaterThan(0, $datastoreSize);

$checkDB = self::getMethod('checkDB');
$checkDB = self::getMethod('_checkDB');
$checkDB->invokeArgs($linkDB, array());

// ensure the datastore is left unmodified
Expand Down
Loading