From: pallo Date: Fri, 13 Oct 2000 20:29:31 +0000 (+0000) Subject: First version of an address book backend for personal address books that X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=7902aca2bd4fe5929217e9151c63d2261816d0ee;p=squirrelmail.git First version of an address book backend for personal address books that are stored in a database using the PEAR database abstraction. git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@797 7612ce4b-ef26-0410-bec9-ea0150e637f0 --- diff --git a/functions/abook_database.php b/functions/abook_database.php new file mode 100644 index 00000000..e885ffa4 --- /dev/null +++ b/functions/abook_database.php @@ -0,0 +1,297 @@ + database DNS (see PEAR for syntax) + ** table => table to store addresses in (must exist) + ** owner => current user (owner of address data) + ** ? writeable => set writeable flag (true/false) + ** + ** The table used should have the following columns: + ** owner, nickname, firstname, lastname, email, label + ** The pair (owner,nickname) should be unique (primary key). + ** + ** NOTE. This class should not be used directly. Use the + ** "AddressBook" class instead. + **/ + + require_once("DB.php"); + + class abook_database extends addressbook_backend { + var $btype = "local"; + var $bname = "database"; + + var $dsn = ""; + var $table = ""; + var $owner = ""; + var $dbh = false; + + var $writeable = true; + + // ========================== Private ======================= + + // Constructor + function abook_database($param) { + $this->sname = _("Personal address book"); + + if(is_array($param)) { + if(empty($param["dsn"]) || + empty($param["table"]) || + empty($param["owner"])) + return $this->set_error("Invalid parameters"); + + $this->dsn = $param["dsn"]; + $this->table = $param["table"]; + $this->owner = $param["owner"]; + + if(!empty($param["name"])) + $this->sname = $param["name"]; + + if(isset($param["writeable"])) + $this->writeable = $param["writeable"]; + + $this->open(true); + } else { + return $this->set_error("Invalid argument to constructor"); + } + } + + + // Open the database. New connection if $new is true + function open($new = false) { + $this->error = ""; + + // Return true is file is open and $new is unset + if($this->dbh && !$new) + return true; + + // Close old file, if any + if($this->dbh) $this->close(); + + $dbh = DB::connect($this->dsn, true); + + if(DB::isError($dbh) || DB::isWarning($dbh)) + return $this->set_error(sprintf(_("Database error: %s"), + DB::errorMessage($dbh))); + + $this->dbh = $dbh; + return true; + } + + // Close the file and forget the filehandle + function close() { + $this->dbh->disconnect(); + $this->dbh = false; + } + + // ========================== Public ======================== + + // Search the file + function &search($expr) { + $ret = array(); + if(!$this->open()) + return false; + + // To be replaced by advanded search expression parsing + if(is_array($expr)) return; + + // Make regexp from glob'ed expression + $expr = ereg_replace("\?", "_", $expr); + $expr = ereg_replace("\*", "%", $expr); + $expr = $this->dbh->quoteString($expr); + $expr = "%$expr%"; + + $query = sprintf("SELECT * FROM %s WHERE owner='%s' AND ". + "(firstname LIKE '%s' OR lastname LIKE '%s')", + $this->table, $this->owner, $expr, $expr); + $res = $this->dbh->query($query); + + if(DB::isError($res)) + return $this->set_error(sprintf(_("Database error: %s"), + DB::errorMessage($res))); + + while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) { + array_push($ret, array("nickname" => $row["nickname"], + "name" => $row["firstname"] . " " . $row["lastname"], + "firstname" => $row["firstname"], + "lastname" => $row["lastname"], + "email" => $row["email"], + "label" => $row["label"], + "backend" => $this->bnum, + "source" => &$this->sname)); + } + return $ret; + } + + // Lookup alias + function &lookup($alias) { + if(empty($alias)) + return array(); + + $alias = strtolower($alias); + + if(!$this->open()) + return false; + + $query = sprintf("SELECT * FROM %s WHERE owner='%s' AND nickname='%s'", + $this->table, $this->owner, $alias); + + $res = $this->dbh->query($query); + + if(DB::isError($res)) + return $this->set_error(sprintf(_("Database error: %s"), + DB::errorMessage($res))); + + if ($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) { + return array("nickname" => $row["nickname"], + "name" => $row["firstname"] . " " . $row["lastname"], + "firstname" => $row["firstname"], + "lastname" => $row["lastname"], + "email" => $row["email"], + "label" => $row["label"], + "backend" => $this->bnum, + "source" => &$this->sname); + } + + return array(); + } + + // List all addresses + function &list_addr() { + $ret = array(); + if(!$this->open()) + return false; + + $query = sprintf("SELECT * FROM %s WHERE owner='%s'", + $this->table, $this->owner); + + $res = $this->dbh->query($query); + + if(DB::isError($res)) + return $this->set_error(sprintf(_("Database error: %s"), + DB::errorMessage($res))); + + while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) { + array_push($ret, array("nickname" => $row["nickname"], + "name" => $row["firstname"] . " " . $row["lastname"], + "firstname" => $row["firstname"], + "lastname" => $row["lastname"], + "email" => $row["email"], + "label" => $row["label"], + "backend" => $this->bnum, + "source" => &$this->sname)); + } + return $ret; + } + + // Add address + function add($userdata) { + if(!$this->writeable) + return $this->set_error(_("Addressbook is read-only")); + + if(!$this->open()) + return false; + + // See if user exist already + $ret = $this->lookup($userdata["nickname"]); + if(!empty($ret)) + return $this->set_error(sprintf(_("User '%s' already exist"), + $ret["nickname"])); + + // Create query + $query = sprintf("INSERT INTO %s (owner, nickname, firstname, ". + "lastname, email, label) VALUES('%s','%s','%s',". + "'%s','%s','%s')", + $this->table, $this->owner, + $this->dbh->quoteString($userdata["nickname"]), + $this->dbh->quoteString($userdata["firstname"]), + $this->dbh->quoteString($userdata["lastname"]), + $this->dbh->quoteString($userdata["email"]), + $this->dbh->quoteString($userdata["label"]) ); + + // Do the insert + $r = $this->dbh->simpleQuery($query); + if($r == DB_OK) return true; + + // Fail + return $this->set_error(sprintf(_("Database error: %s"), + DB::errorMessage($r))); + } + + // Delete address + function remove($alias) { + if(!$this->writeable) + return $this->set_error(_("Addressbook is read-only")); + + if(!$this->open()) + return false; + + // Create query + $query = sprintf("DELETE FROM %s WHERE owner='%s' AND (", + $this->table, $this->owner); + + $sepstr = ""; + while(list($undef, $nickname) = each($alias)) { + $query .= sprintf("%s nickname='%s' ", $sepstr, + $this->dbh->quoteString($nickname)); + $sepstr = "OR"; + } + $query .= ")"; + + // Delete entry + $r = $this->dbh->simpleQuery($query); + if($r == DB_OK) return true; + + // Fail + return $this->set_error(sprintf(_("Database error: %s"), + DB::errorMessage($r))); + } + + // Modify address + function modify($alias, $userdata) { + if(!$this->writeable) + return $this->set_error(_("Addressbook is read-only")); + + if(!$this->open()) + return false; + + // See if user exist + $ret = $this->lookup($alias); + if(empty($ret)) + return $this->set_error(sprintf(_("User '%s' does not exist"), + $alias)); + + // Create query + $query = sprintf("UPDATE %s SET nickname='%s', firstname='%s', ". + "lastname='%s', email='%s', label='%s' ". + "WHERE owner='%s' AND nickname='%s'", + $this->table, + $this->dbh->quoteString($userdata["nickname"]), + $this->dbh->quoteString($userdata["firstname"]), + $this->dbh->quoteString($userdata["lastname"]), + $this->dbh->quoteString($userdata["email"]), + $this->dbh->quoteString($userdata["label"]), + $this->owner, + $this->dbh->quoteString($alias) ); + + // Do the insert + $r = $this->dbh->simpleQuery($query); + if($r == DB_OK) return true; + + // Fail + return $this->set_error(sprintf(_("Database error: %s"), + DB::errorMessage($r))); + } + } // End of class abook_database + +} ?>