* @package Mammut\DB\Adapter\MSSQL */ class MSSQLv1 extends MSSQLBase { public function __construct($cstring, $user, $password, array $options = array(), \Mammut\Cache\iCache $cache = NULL) { $pers = in_array(self::OPT_PERSISTENT, $options); if(!extension_loaded('mssql')) throw new \Mammut\Exception\ExtensionException('mssql'); $dbname = ''; // adress,port style if(preg_match('#^([a-zA-Z0-9\.-]+)(,[0-9]+){0,1}/([a-zA-Z0-9_-]+)$#', $cstring, $match)) { if($pers) $this->dbi = mssql_pconnect($match[1] . ($match[2] ? $match[2] : ''), $user, $password, true); else $this->dbi = mssql_connect($match[1] . ($match[2] ? $match[2] : ''), $user, $password, true); $dbname = $match[3]; } // instance naming elseif(preg_match('#^([a-zA-Z0-9\._-]+)(\\\\[a-zA-Z0-9]+){0,1}/([a-zA-Z0-9_-]+)$#', $cstring, $match)) { if($pers) $this->dbi = mssql_pconnect($match[1] . $match[2], $user, $password, false); else $this->dbi = mssql_connect($match[1] . $match[2], $user, $password, false); $dbname = $match[3]; } else throw new \UnexpectedValueException('$cstring is invalid: ' . $cstring); $this->dialect = new \Mammut\DB\Sql\Dialect\SqlServer($this->dbi); $this->setDatabase($dbname); // set some server-dependend things to default styles mssql_query('SET DATEFORMAT ymd', $this->dbi); // yyyy-mm-dd date format mssql_query('SET IMPLICIT_TRANSACTIONS OFF'); $this->logDebug('db connection successfull'); } public function close() { mssql_close($this->dbi); parent::close(); } public function setDatabase($name) { if(!mssql_select_db($name)) throw new DBException('error while setting database to ' . $name); } public function startTransaction() { mssql_query("BEGIN TRANSACTION", $this->dbi); } public function commit() { mssql_query("COMMIT", $this->dbi); } public function rollback() { mssql_query("ROLLBACK", $this->dbi); } public function query($query, $limit = -1, $skip = 0) { $query = $this->checkQuery($query); $limit = intval($limit); $skip = intval($skip); if($limit >= 0) { if(preg_match('#^\s*SELECT\s+(.*)#i', $query, $match)) $query = 'SELECT TOP ' . ($limit + $skip) . ' ' . $match[1]; } $this->logDebug(get_class($this) . ': sending new query: ' . $query); $this->qcount++; $result = mssql_query($query, $this->dbi); if(!$result) throw new SQLException(mssql_get_last_message(), $query, 4711); for($i = 0; $i < $skip; $i++) mssql_fetch_row($result); if(is_resource($result)) return new Result($this->dbi, $result, $skip); else return $result; } public function getObject($query, $class = false, $param = array()) { $query = $this->checkQuery($query); $this->qcount++; $result = mssql_query($query, $this->dbi); if(!$result) throw new SQLException(mssql_get_last_message(), $sql, 4711); // fetch result if($class) { if(class_exists($class)) $obj = new $class(); else throw new \InvalidArgumentException("Invalid class: $class"); $row = mssql_fetch_assoc($result); if($row === false) return false; foreach(array_keys($row) as $k) $obj->$k = $row[$k]; return $obj; } else return mssql_fetch_object($result); } public function getArray($query) { $query = $this->checkQuery($query); $this->qcount++; $result = mssql_query($query, $this->dbi); if(!$result) throw new SQLException(mssql_get_last_message(), $query, 4711); // fetch result return mssql_fetch_assoc($result); } public function getRow($query) { $query = $this->checkQuery($query); $this->qcount++; $result = mssql_query($query, $this->dbi); if(!$result) throw new SQLException(mssql_get_last_message(), $query, 4711); // fetch result return mssql_fetch_row($result); } public function getAffectedRowCount() { return mssql_rows_affected($this->dbi); } public function tableList() { $result = false; $this->qcount++; $result = mssql_query('SELECT Table_name AS "Table name" FROM INFORMATION_SCHEMA.TABLES WHERE Table_type = \'BASE TABLE\' AND (Objectproperty (Object_id(Table_name), \'IsMsShipped\') = 0 OR Objectproperty (Object_id(Table_name), \'IsMsShipped\') IS NULL)'); if(is_resource($result)) { $tables = array(); while($next = mssql_fetch_row($result)) { $tables[] = $next[0]; } return $tables; } else return false; } public function getServer() { $result = mssql_query('SELECT CAST(SERVERPROPERTY(\'ServerName\') AS VARCHAR(255)) AS name', $this->dbi); $this->qcount++; if(!$result) throw new SQLException(mssql_get_last_message(), $query, 4711); return mssql_fetch_object($result)->name; } public function getServerVersion() { $result = mssql_query('SELECT CAST(SERVERPROPERTY(\'productversion\') AS VARCHAR(255)) AS version', $this->dbi); $this->qcount++; if(!$result) throw new SQLException(mssql_get_last_message(), $query, 4711); return mssql_fetch_object($result)->version; } }