AAAAstorage.intf.php000066600000014166151375522130007700 0ustar00 * @copyright 2012 Klarna AB (http://klarna.com) * @license http://opensource.org/licenses/BSD-2-Clause BSD-2 * @link http://integration.klarna.com/ */ /** * KlarnaPClass Storage interface * * This class provides an interface with which to save the PClasses easily. * * @category Payment * @package KlarnaAPI * @author MS Dev * @copyright 2012 Klarna AB (http://klarna.com) * @license http://opensource.org/licenses/BSD-2-Clause BSD-2 * @link http://integration.klarna.com/ */ abstract class PCStorage { /** * An array of KlarnaPClasses. * * @var array */ protected $pclasses; /** * Thhe name of the implementation. * The file should be storage.class.php * * @return string */ abstract public function getName(); /** * Adds a PClass to the storage. * * @param KlarnaPClass $pclass PClass object. * * @throws KlarnaException * @return void */ public function addPClass($pclass) { if (! $pclass instanceof KlarnaPClass) { throw new Klarna_InvalidTypeException('pclass', 'KlarnaPClass'); } if (!isset($this->pclasses) || !is_array($this->pclasses)) { $this->pclasses = array(); } if ($pclass->getDescription() === null || $pclass->getType() === null) { //Something went wrong, do not save these! return; } if (!isset($this->pclasses[$pclass->getEid()])) { $this->pclasses[$pclass->getEid()] = array(); } $this->pclasses[$pclass->getEid()][$pclass->getId()] = $pclass; } /** * Gets the PClass by ID. * * @param int $id PClass ID. * @param int $eid Merchant ID. * @param int $country {@link KlarnaCountry Country} constant. * * @throws KlarnaException * @return KlarnaPClass */ public function getPClass($id, $eid, $country) { if (!is_int($id)) { throw new InvalidArgumentException('Supplied ID is not an integer!'); } if (!is_array($this->pclasses)) { throw new Klarna_PClassException('No match for that eid!'); } if (!isset($this->pclasses[$eid]) || !is_array($this->pclasses[$eid])) { throw new Klarna_PClassException('No match for that eid!'); } if (!isset($this->pclasses[$eid][$id]) || !$this->pclasses[$eid][$id]->isValid() ) { throw new Klarna_PClassException('No such pclass available!'); } if ($this->pclasses[$eid][$id]->getCountry() !== $country) { throw new Klarna_PClassException( 'You cannot use this pclass with set country!' ); } return $this->pclasses[$eid][$id]; } /** * Returns an array of KlarnaPClasses, keyed with pclass ID. * If type is specified, only that type will be returned. * * Types available:
* {@link KlarnaPClass::ACCOUNT}
* {@link KlarnaPClass::CAMPAIGN}
* {@link KlarnaPClass::SPECIAL}
* {@link KlarnaPClass::DELAY}
* {@link KlarnaPClass::MOBILE}
* * @param int $eid Merchant ID. * @param int $country {@link KlarnaCountry Country} constant. * @param int $type PClass type identifier. * * @throws KlarnaException * @return array An array of {@link KlarnaPClass PClasses}. */ public function getPClasses($eid, $country, $type = null) { if (!is_int($country)) { throw new Klarna_ArgumentNotSetException('country'); } $tmp = false; if (!is_array($this->pclasses)) { return; } $tmp = array(); foreach ($this->pclasses as $eid => $pclasses) { $tmp[$eid] = array(); foreach ($pclasses as $pclass) { if (!$pclass->isValid()) { continue; //Pclass invalid, skip it. } if ($pclass->getEid() === $eid && $pclass->getCountry() === $country && ($pclass->getType() === $type || $type === null) ) { $tmp[$eid][$pclass->getId()] = $pclass; } } } return $tmp; } /** * Returns a flattened array of all pclasses * * @return array */ public function getAllPClasses() { if (!is_array($this->pclasses)) { return array(); } return $this->_flatten(array_values($this->pclasses)); } /** * Flatten an array * * @param array $array array to flatten * * @return array */ private function _flatten($array) { if (!is_array($array)) { // nothing to do if it's not an array return array($array); } $result = array(); foreach ($array as $value) { // explode the sub-array, and add the parts $result = array_merge($result, $this->_flatten($value)); } return $result; } /** * Loads the PClasses and calls {@link self::addPClass()} to store them * in runtime. * URI can be location to a file, or a db prefixed table. * * @param string $uri URI to stored PClasses. * * @throws KlarnaException|Exception * @return void */ abstract public function load($uri); /** * Takes the internal PClass array and stores it. * URI can be location to a file, or a db prefixed table. * * @param string $uri URI to stored PClasses. * * @throws KlarnaException|Exception * @return void */ abstract public function save($uri); /** * Removes the internally stored pclasses. * * @param string $uri URI to stored PClasses. * * @throws KlarnaException|Exception * @return void */ abstract public function clear($uri); } index.html000066600000000057151375522130006553 0ustar00 xmlstorage.class.php000066600000017070151375522130010563 0ustar00 * @copyright 2012 Klarna AB (http://klarna.com) * @license http://opensource.org/licenses/BSD-2-Clause BSD-2 * @link http://integration.klarna.com/ */ /** * Include the {@link PCStorage} interface. */ require_once 'storage.intf.php'; /** * XML storage class for KlarnaPClass * * This class is an XML implementation of the PCStorage interface. * * @category Payment * @package KlarnaAPI * @author MS Dev * @copyright 2012 Klarna AB (http://klarna.com) * @license http://opensource.org/licenses/BSD-2-Clause BSD-2 * @link http://integration.klarna.com/ */ class XMLStorage extends PCStorage { /** * The internal XML document. * * @var DOMDocument */ protected $dom; /** * XML version for the DOM document. * * @var string */ protected $version = '1.0'; /** * Encoding for the DOM document. * * @var string */ protected $encoding = 'ISO-8859-1'; /** * Class constructor */ public function __construct() { $this->dom = new DOMDocument($this->version, $this->encoding); $this->dom->formatOutput = true; $this->dom->preserveWhiteSpace = false; } /** * return the name of the storage type * * @return string */ public function getName() { return "xml"; } /** * Checks if the file is writeable, readable or if the directory is. * * @param string $xmlFile URI to XML file. * * @throws KlarnaException * @return void */ protected function checkURI($xmlFile) { //If file doesn't exist, check the directory. if (!file_exists($xmlFile)) { $xmlFile = dirname($xmlFile); } if (!is_writable($xmlFile)) { throw new Klarna_FileNotWritableException($xmlFile); } if (!is_readable($xmlFile)) { throw new Klarna_FileNotReadableException($xmlFile); } } /** * Load pclasses from file * * @param string $uri uri to file to load * * @throws KlarnaException * @return void */ public function load($uri) { $this->checkURI($uri); if (!file_exists($uri)) { //Do not fail, if file doesn't exist. return; } if (!@$this->dom->load($uri)) { throw new Klarna_XMLParseException($uri); } $xpath = new DOMXpath($this->dom); foreach ($xpath->query('/klarna/estore') as $estore) { $eid = $estore->getAttribute('id'); foreach ($xpath->query('pclass', $estore) as $node) { $pclass = new KlarnaPClass(); $pclass->setId( $node->getAttribute('pid') ); $pclass->setType( $node->getAttribute('type') ); $pclass->setEid($eid); $pclass->setDescription( $xpath->query('description', $node)->item(0)->textContent ); $pclass->setMonths( $xpath->query('months', $node)->item(0)->textContent ); $pclass->setStartFee( $xpath->query('startfee', $node)->item(0)->textContent ); $pclass->setInvoiceFee( $xpath->query('invoicefee', $node)->item(0)->textContent ); $pclass->setInterestRate( $xpath->query('interestrate', $node)->item(0)->textContent ); $pclass->setMinAmount( $xpath->query('minamount', $node)->item(0)->textContent ); $pclass->setCountry( $xpath->query('country', $node)->item(0)->textContent ); $pclass->setExpire( $xpath->query('expire', $node)->item(0)->textContent ); $this->addPClass($pclass); } } } /** * Creates DOMElement for all fields for specified PClass. * * @param KlarnaPClass $pclass pclass object * * @return array Array of DOMElements. */ protected function createFields($pclass) { $fields = array(); //This is to prevent HTMLEntities to be converted to the real character. $fields[] = $this->dom->createElement('description'); end($fields)->appendChild( $this->dom->createTextNode($pclass->getDescription()) ); $fields[] = $this->dom->createElement( 'months', $pclass->getMonths() ); $fields[] = $this->dom->createElement( 'startfee', $pclass->getStartFee() ); $fields[] = $this->dom->createElement( 'invoicefee', $pclass->getInvoiceFee() ); $fields[] = $this->dom->createElement( 'interestrate', $pclass->getInterestRate() ); $fields[] = $this->dom->createElement( 'minamount', $pclass->getMinAmount() ); $fields[] = $this->dom->createElement( 'country', $pclass->getCountry() ); $fields[] = $this->dom->createElement( 'expire', $pclass->getExpire() ); return $fields; } /** * Save pclasses to file * * @param string $uri uri to file to save * * @throws KlarnaException * @return void */ public function save($uri) { $this->checkURI($uri); //Reset DOMDocument. if (!$this->dom->loadXML( "version' encoding='$this->encoding'?" .">" ) ) { throw new Klarna_XMLParseException($uri); } ksort($this->pclasses, SORT_NUMERIC); $xpath = new DOMXpath($this->dom); foreach ($this->pclasses as $eid => $pclasses) { $estore = $xpath->query('/klarna/estore[@id="'.$eid.'"]'); if ($estore === false || $estore->length === 0) { //No estore with matching eid, create it. $estore = $this->dom->createElement('estore'); $estore->setAttribute('id', $eid); $this->dom->documentElement->appendChild($estore); } else { $estore = $estore->item(0); } foreach ($pclasses as $pclass) { if ($eid != $pclass->getEid()) { //This should never occur, failsafe. continue; } $pnode = $this->dom->createElement('pclass'); foreach ($this->createFields($pclass) as $field) { $pnode->appendChild($field); } $pnode->setAttribute('pid', $pclass->getId()); $pnode->setAttribute('type', $pclass->getType()); $estore->appendChild($pnode); } } if (!$this->dom->save($uri)) { throw new KlarnaException('Failed to save XML document!'); } } /** * This uses unlink (delete) to clear the pclasses! * * @param string $uri uri to file to clear * * @throws KlarnaException * @return void */ public function clear($uri) { $this->checkURI($uri); unset($this->pclasses); if (file_exists($uri)) { unlink($uri); } } } jsonstorage.class.php000066600000006760151375522130010740 0ustar00 * @copyright 2012 Klarna AB (http://klarna.com) * @license http://opensource.org/licenses/BSD-2-Clause BSD-2 * @link http://integration.klarna.com/ */ /** * Include the {@link PCStorage} interface. */ require_once 'storage.intf.php'; /** * JSON storage class for KlarnaPClass * * This class is an JSON implementation of the PCStorage interface. * * @category Payment * @package KlarnaAPI * @author MS Dev * @copyright 2012 Klarna AB (http://klarna.com) * @license http://opensource.org/licenses/BSD-2-Clause BSD-2 * @link http://integration.klarna.com/ */ class JSONStorage extends PCStorage { /** * return the name of the storage type * * @return string */ public function getName() { return "json"; } /** * Checks if the file is writeable, readable or if the directory is. * * @param string $jsonFile json file that holds the pclasses * * @throws error * @return void */ protected function checkURI($jsonFile) { //If file doesn't exist, check the directory. if (!file_exists($jsonFile)) { $jsonFile = dirname($jsonFile); } if (!is_writable($jsonFile)) { throw new Klarna_FileNotWritableException($jsonFile); } if (!is_readable($jsonFile)) { throw new Klarna_FileNotReadableException($jsonFile); } } /** * Clear the pclasses * * @param string $uri uri to file to clear * * @throws KlarnaException * @return void */ public function clear($uri) { $this->checkURI($uri); unset($this->pclasses); if (file_exists($uri)) { unlink($uri); } } /** * Load pclasses from file * * @param string $uri uri to file to load * * @throws KlarnaException * @return void */ public function load($uri) { $this->checkURI($uri); if (!file_exists($uri)) { //Do not fail, if file doesn't exist. return; } $arr = json_decode(file_get_contents($uri), true); if (count($arr) == 0) { return; } foreach ($arr as $pclasses) { if (count($pclasses) == 0) { continue; } foreach ($pclasses as $pclass) { $this->addPClass(new KlarnaPClass($pclass)); } } } /** * Save pclasses to file * * @param string $uri uri to file to save * * @throws KlarnaException * @return void */ public function save($uri) { try { $this->checkURI($uri); $output = array(); foreach ($this->pclasses as $eid => $pclasses) { foreach ($pclasses as $pclass) { if (!isset($output[$eid])) { $output[$eid] = array(); } $output[$eid][] = $pclass->toArray(); } } if (count($this->pclasses) > 0) { file_put_contents($uri, json_encode($output)); } else { file_put_contents($uri, ""); } } catch(Exception $e) { throw new KlarnaException($e->getMessage()); } } } sqlstorage.class.php000066600000031244151375522130010561 0ustar00 * @copyright 2012 Klarna AB (http://klarna.com) * @license http://opensource.org/licenses/BSD-2-Clause BSD-2 * @link http://integration.klarna.com/ */ /** * Include the {@link PCStorage} interface. */ require_once 'storage.intf.php'; /** * SQL storage class for KlarnaPClass * * This class is an MySQL implementation of the PCStorage interface.
* Config field pcURI needs to match format: * user:passwd@addr:port/dbName.dbTable
* Port can be omitted.
* * Acceptable characters:
* Username: [A-Za-z0-9_]
* Password: [A-Za-z0-9_]
* Address: [A-Za-z0-9_.]
* Port: [0-9]
* DB name: [A-Za-z0-9_]
* DB table: [A-Za-z0-9_]
* * To allow for more special characters, and to avoid having
* a regular expression that is too hard to understand, you can
* use an associative array:
* * array( * "user" => "myuser", * "passwd" => "mypass", * "dsn" => "localhost", * "db" => "mydatabase", * "table" => "mytable" * ); * * * @category Payment * @package KlarnaAPI * @author MS Dev * @copyright 2012 Klarna AB (http://klarna.com) * @license http://opensource.org/licenses/BSD-2-Clause BSD-2 * @link http://integration.klarna.com/ */ class SQLStorage extends PCStorage { /** * Database name. * * @var string */ protected $dbName; /** * Database table. * * @var string */ protected $dbTable; /** * Database address. * * @var string */ protected $addr; /** * PDO DSN notation. * * @var string */ protected $dsn; /** * Database username. * * @var string */ protected $user; /** * Database password. * * @var string */ protected $passwd; /** * PDO DB link resource. * * @var PDO */ protected $pdo; /** * return the name of the storage type * * @return string */ public function getName() { return "sql"; } /** * Splits the URI for the following formats:
* user:passwd@addr/dbName.dbTable (assumes MySQL)
* user:password@pdo:dsn/dbName.dbTable
* * To allow for more special characters, and to avoid having
* a regular expression that is too hard to understand, you can
* use an associative array:
* * array( * "user" => "myuser", * "passwd" => "mypass", * "dsn" => "localhost", * "db" => "mydatabase", * "table" => "mytable" * ); * * * @param string|array $uri Specified URI to database and table. * * @throws KlarnaException * @return void */ protected function splitURI($uri) { /* If you want to have some characters that would make the regexp too complex, you can use an array as input instead. */ if (is_array($uri)) { $this->user = $uri['user']; $this->passwd = $uri['passwd']; $this->dsn = $uri['dsn']; $this->dbName = $uri['db']; $this->dbTable = $uri['table']; return array( $uri, $this->user, $this->passwd, $this->dsn, $this->dbName, $this->dbTable ); } $pdo_rex = '/^([\w-]+):([\w-]+)@pdo:([\w.,:;\/ \\\t=\(\){}\*-]+)\/([\w-]+)'. '.([\w-]+)$/'; $pcuri_rex = '/^([\w-]+):([\w-]+)@([\w\.-]+|[\w\.-]+:[\d]+|[\w\.-]+:'. '[\w\.\/-]+|:[\w\.\/-]+)\/([\w-]+).([\w-]+)$/'; $arr = null; if (preg_match($pdo_rex, $uri, $arr) === 1) { /* * [0] => user:password@pdo:dsn/dbName.dbTable * [1] => user * [2] => passwd * [3] => dsn * [4] => dbName * [5] => dbTable */ if (count($arr) != 6) { throw new Klarna_DatabaseException( 'URI is invalid! Missing field or invalid characters used!' ); } $this->user = $arr[1]; $this->passwd = $arr[2]; $this->dsn = $arr[3]; $this->dbName = $arr[4]; $this->dbTable = $arr[5]; } else if (preg_match($pcuri_rex, $uri, $arr) === 1) { //user:pass@127.0.0.1:3306/dbName.dbTable //user:pass@localhost:/tmp/mysql.sock/dbName.dbTable /* * [0] => user:passwd@addr/dbName.dbTable * [1] => user * [2] => passwd * [3] => addr * [4] => dbName * [5] => dbTable */ if (count($arr) != 6) { throw new Klarna_DatabaseException( 'URI is invalid! Missing field or invalid characters used!' ); } $this->user = $arr[1]; $this->passwd = $arr[2]; $this->addr = $arr[3]; $this->port = 3306; if (preg_match( '/^([0-9.]+(:([0-9]+))?)$/', $this->addr, $tmp ) === 1 ) { if (isset($tmp[3])) { $this->port = $tmp[3]; } } $this->dbName = $arr[4]; $this->dbTable = $arr[5]; $this->dsn = "mysql:host={$this->addr};port={$this->port};"; } else { throw new Klarna_DatabaseException( 'URI to SQL is not valid! ( user:passwd@addr/dbName.dbTable )' ); } return $arr; } /** * Grabs the PDO connection to the database, specified by the URI. * * @param string $uri pclass uri * * @return void * @throws KlarnaException */ protected function getConnection($uri) { if ($this->pdo) { return; //Already have a connection } $this->splitURI($uri); try { $this->pdo = new PDO($this->dsn, $this->user, $this->passwd); $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { throw new Klarna_DatabaseException('Failed to connect to database!'); } } /** * Initializes the DB, if the database or table is missing. * * @return void * @throws KlarnaException */ protected function initDB() { try { $this->pdo->exec("CREATE DATABASE `{$this->dbName}`"); } catch (PDOException $e) { //SQLite does not support this... //throw new KlarnaException( // 'Database non-existant, failed to create it!' //); } $sql = <<dbName}`.`{$this->dbTable}` ( `eid` int(10) NOT NULL, `id` int(10) NOT NULL, `type` int(4) NOT NULL, `description` varchar(255) NOT NULL, `months` int(11) NOT NULL, `interestrate` decimal(11,2) NOT NULL, `invoicefee` decimal(11,2) NOT NULL, `startfee` decimal(11,2) NOT NULL, `minamount` decimal(11,2) NOT NULL, `country` int(11) NOT NULL, `expire` int(11) NOT NULL ); SQL; try { $this->pdo->exec($sql); } catch (PDOException $e) { throw new Klarna_DatabaseException( 'Table non-existant, failed to create it!' ); } } /** * Connects to the DB and checks if DB and table exists. * * @param string|array $uri pclass uri * * @throws KlarnaException * @return void */ protected function connect($uri) { $this->getConnection($uri); $this->initDB(); } /** * Loads the PClasses. * * @param string|array $uri pclass uri * * @return void * @throws KlarnaException */ public function load($uri) { $this->connect($uri); $this->loadPClasses(); } /** * Loads the PClasses. * * @return void * @throws KlarnaException */ protected function loadPClasses() { try { $sth = $this->pdo->prepare( "SELECT * FROM `{$this->dbName}`.`{$this->dbTable}`", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY) ); $sth->execute(); while ($row = $sth->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)) { $this->addPClass(new KlarnaPClass($row)); } $sth->closeCursor(); $sth = null; } catch (PDOException $e) { throw new Klarna_DatabaseException( 'Could not fetch PClasses from database!' ); } } /** * Saves the PClasses. * * @param string|array $uri pclass uri * * @return void * @throws KlarnaException */ public function save($uri) { $this->connect($uri); //Only attempt to savePClasses if there are any. if (!is_array($this->pclasses)) { return; } if (count($this->pclasses) == 0) { return; } $this->savePClasses(); } /** * Saves the PClasses. * * @return void * @throws KlarnaException */ protected function savePClasses() { //Insert PClass SQL statement. $sql = <<dbName}`.`{$this->dbTable}` (`eid`, `id`, `type`, `description`, `months`, `interestrate`, `invoicefee`, `startfee`, `minamount`, `country`, `expire`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) SQL; foreach ($this->pclasses as $pclasses) { foreach ($pclasses as $pclass) { try { //Remove the pclass if it exists. $sth = $this->pdo->prepare( "DELETE FROM `{$this->dbName}`.`{$this->dbTable}` WHERE `id` = ? AND `eid` = ?" ); $sth->execute( array( $pclass->getId(), $pclass->getEid() ) ); $sth->closeCursor(); $sth = null; } catch(PDOException $e) { //Fail silently, we don't care if the removal failed. } try { //Attempt to insert the PClass into the DB. $sth = $this->pdo->prepare($sql); $sth->execute( array( $pclass->getEid(), $pclass->getId(), $pclass->getType(), $pclass->getDescription(), $pclass->getMonths(), $pclass->getInterestRate(), $pclass->getInvoiceFee(), $pclass->getStartFee(), $pclass->getMinAmount(), $pclass->getCountry(), $pclass->getExpire() ) ); $sth->closeCursor(); $sth = null; } catch(PDOException $e) { throw new Klarna_DatabaseException( 'Failed to insert PClass into database!' ); } } } } /** * Drops the database table, to clear the PClasses. * * @param string|array $uri pclass uri * * @return void * @throws KlarnaException */ public function clear($uri) { try { $this->connect($uri); unset($this->pclasses); $this->clearTable(); } catch(Exception $e) { throw new Klarna_DatabaseException( $e->getMessage(), $e->getCode() ); } } /** * Drops the database table, to clear the PClasses. * * @return void * @throws KlarnaException */ protected function clearTable() { try { $this->pdo->exec("DELETE FROM `{$this->dbName}`.`{$this->dbTable}`"); } catch (PDOException $e) { throw new Klarna_DatabaseException('Could not clear the database!'); } } } mysqlstorage.class.php000066600000021520151375522130011123 0ustar00 * @copyright 2012 Klarna AB (http://klarna.com) * @license http://opensource.org/licenses/BSD-2-Clause BSD-2 * @link http://integration.klarna.com/ */ /** * Include the {@link PCStorage} interface. */ require_once 'storage.intf.php'; /** * MySQL storage class for KlarnaPClass * * This class is an MySQL implementation of the PCStorage interface.
* Config field pcURI needs to match format: * user:passwd@addr:port/dbName.dbTable
* Port can be omitted.
* * Acceptable characters:
* Username: [A-Za-z0-9_]
* Password: [A-Za-z0-9_]
* Address: [A-Za-z0-9_.]
* Port: [0-9]
* DB name: [A-Za-z0-9_]
* DB table: [A-Za-z0-9_]
* * To allow for more special characters, and to avoid having
* a regular expression that is too hard to understand, you can
* use an associative array:
* * array( * "user" => "myuser", * "passwd" => "mypass", * "dsn" => "localhost", * "db" => "mydatabase", * "table" => "mytable" * ); * * * @category Payment * @package KlarnaAPI * @author MS Dev * @copyright 2012 Klarna AB (http://klarna.com) * @license http://opensource.org/licenses/BSD-2-Clause BSD-2 * @link http://integration.klarna.com/ */ class MySQLStorage extends PCStorage { /** * Database name. * * @var string */ protected $dbName; /** * Database table. * * @var string */ protected $dbTable; /** * Database address. * * @var string */ protected $addr; /** * Database username. * * @var string */ protected $user; /** * Database password. * * @var string */ protected $passwd; /** * MySQL DB link resource. * * @var resource */ protected $link; /** * return the name of the storage type * * @return string */ public function getName() { return "mysql"; } /** * Connects to the DB and checks if DB and table exists. * * @throws KlarnaException * @return void */ protected function connect() { $this->link = mysql_connect($this->addr, $this->user, $this->passwd); if ($this->link === false) { throw new Klarna_DatabaseException( 'Failed to connect to database! ('.mysql_error().')' ); } if (!mysql_query( "CREATE DATABASE IF NOT EXISTS `{$this->dbName}`", $this->link ) ) { throw new Klarna_DatabaseException( 'Failed to create! ('.mysql_error().')' ); } $create = mysql_query( "CREATE TABLE IF NOT EXISTS `{$this->dbName}`.`{$this->dbTable}` ( `eid` int(10) unsigned NOT NULL, `id` int(10) unsigned NOT NULL, `type` tinyint(4) NOT NULL, `description` varchar(255) NOT NULL, `months` int(11) NOT NULL, `interestrate` decimal(11,2) NOT NULL, `invoicefee` decimal(11,2) NOT NULL, `startfee` decimal(11,2) NOT NULL, `minamount` decimal(11,2) NOT NULL, `country` int(11) NOT NULL, `expire` int(11) NOT NULL, KEY `id` (`id`) )", $this->link ); if (!$create) { throw new Klarna_DatabaseException( 'Table not existing, failed to create! ('.mysql_error().')' ); } } /** * Splits the URI in format: user:passwd@addr/dbName.dbTable
* * To allow for more special characters, and to avoid having
* a regular expression that is too hard to understand, you can
* use an associative array:
* * array( * "user" => "myuser", * "passwd" => "mypass", * "dsn" => "localhost", * "db" => "mydatabase", * "table" => "mytable" * ); * * * @param string|array $uri Specified URI to database and table. * * @throws KlarnaException * @return void */ protected function splitURI($uri) { if (is_array($uri)) { $this->user = $uri['user']; $this->passwd = $uri['passwd']; $this->addr = $uri['dsn']; $this->dbName = $uri['db']; $this->dbTable = $uri['table']; } else if (preg_match( '/^([\w-]+):([\w-]+)@([\w\.-]+|[\w\.-]+:[\d]+)\/([\w-]+).([\w-]+)$/', $uri, $arr ) === 1 ) { /* [0] => user:passwd@addr/dbName.dbTable [1] => user [2] => passwd [3] => addr [4] => dbName [5] => dbTable */ if (count($arr) != 6) { throw new Klarna_DatabaseException( 'URI is invalid! Missing field or invalid characters used!' ); } $this->user = $arr[1]; $this->passwd = $arr[2]; $this->addr = $arr[3]; $this->dbName = $arr[4]; $this->dbTable = $arr[5]; } else { throw new Klarna_DatabaseException( 'URI to MySQL is not valid! ( user:passwd@addr/dbName.dbTable )' ); } } /** * Load pclasses * * @param string $uri pclass uri * * @throws KlarnaException * @return void */ public function load($uri) { $this->splitURI($uri); $this->connect(); $result = mysql_query( "SELECT * FROM `{$this->dbName}`.`{$this->dbTable}`", $this->link ); if ($result === false) { throw new Klarna_DatabaseException( 'SELECT query failed! ('.mysql_error().')' ); } while ($row = mysql_fetch_assoc($result)) { $this->addPClass(new KlarnaPClass($row)); } } /** * Save pclasses to database * * @param string $uri pclass uri * * @throws KlarnaException * @return void */ public function save($uri) { $this->splitURI($uri); $this->connect(); if (!is_array($this->pclasses) || count($this->pclasses) == 0) { return; } foreach ($this->pclasses as $pclasses) { foreach ($pclasses as $pclass) { //Remove the pclass if it exists. mysql_query( "DELETE FROM `{$this->dbName}`.`{$this->dbTable}` WHERE `id` = '{$pclass->getId()}' AND `eid` = '{$pclass->getEid()}'" ); //Insert it again. $result = mysql_query( "INSERT INTO `{$this->dbName}`.`{$this->dbTable}` (`eid`, `id`, `type`, `description`, `months`, `interestrate`, `invoicefee`, `startfee`, `minamount`, `country`, `expire` ) VALUES ('{$pclass->getEid()}', '{$pclass->getId()}', '{$pclass->getType()}', '{$pclass->getDescription()}', '{$pclass->getMonths()}', '{$pclass->getInterestRate()}', '{$pclass->getInvoiceFee()}', '{$pclass->getStartFee()}', '{$pclass->getMinAmount()}', '{$pclass->getCountry()}', '{$pclass->getExpire()}')", $this->link ); if ($result === false) { throw new Klarna_DatabaseException( 'INSERT INTO query failed! ('.mysql_error().')' ); } } } } /** * Clear the pclasses * * @param string $uri pclass uri * * @throws KlarnaException * @return void */ public function clear($uri) { try { $this->splitURI($uri); unset($this->pclasses); $this->connect(); mysql_query( "DELETE FROM `{$this->dbName}`.`{$this->dbTable}`", $this->link ); } catch(Exception $e) { throw new Klarna_DatabaseException( $e->getMessage(), $e->getCode() ); } } } .htaccess000066600000000177151375522130006357 0ustar00 Order allow,deny Deny from all