KumbiaPHP  beta2
Framework PHP
 Todo Estructuras de Datos Namespaces Archivos Funciones Variables Páginas
mssql.php
Ir a la documentación de este archivo.
1 <?php
29 class DbMsSQL extends DbBase implements DbBaseInterface {
30 
37 
44 
50  protected $last_query;
51 
57  public $last_error;
58 
63  const DB_ASSOC = MSSQL_ASSOC;
64 
69  const DB_BOTH = MSSQL_BOTH;
70 
75  const DB_NUM = MSSQL_NUM;
76 
81  const TYPE_INTEGER = 'INT';
82 
87  const TYPE_DATE = 'SMALLDATETIME';
88 
93  const TYPE_VARCHAR = 'VARCHAR';
94 
99  const TYPE_DECIMAL = 'DECIMAL';
100 
105  const TYPE_DATETIME = 'DATETIME';
106 
111  const TYPE_CHAR = 'CHAR';
112 
119  public function connect($config){
120  if(!extension_loaded('mssql')){
121  throw new KumbiaException('Debe cargar la extensión de PHP llamada php_mssql');
122  }
123  if(!isset($config['port']) || !$config['port']) {
124  $config['port'] = 1433;
125  }
126  //if($this->id_connection = mssql_connect("{$config['host']},{$config['port']}", $config['username'], $config['password'], true)){
127  if($this->id_connection = mssql_connect($config['host'], $config['username'], $config['password'], true)){
128  if($config['name']!=='') {
129  if(!mssql_select_db($config['name'], $this->id_connection)){
130  throw new KumbiaException($this->error());
131  }
132  }
133  return true;
134  } else {
135  throw new KumbiaException($this->error());
136  }
137  }
144  public function query($sql_query){
145  $this->debug($sql_query);
146  if($this->logger){
147  Logger::debug($sql_query);
148  }
149 
150  $this->last_query = $sql_query;
151  if($result_query = mssql_query($sql_query, $this->id_connection)){
152  $this->last_result_query = $result_query;
153  return $result_query;
154  }else{
155  throw new KumbiaException($this->error(" al ejecutar <em>\"$sql_query\"</em>"));
156  }
157  }
161  public function close(){
162  if($this->id_connection) {
163  return mssql_close();
164  }
165  return false;
166  }
174  public function fetch_array($result_query='', $opt=MSSQL_BOTH){
175 
176  if(!$result_query){
177  $result_query = $this->last_result_query;
178  if(!$result_query){
179  return false;
180  }
181  }
182  return mssql_fetch_array($result_query, $opt);
183  }
189  public function __construct($config){
190  $this->connect($config);
191  }
195  public function num_rows($result_query=''){
196 
197  if(!$result_query){
198  $result_query = $this->last_result_query;
199  if(!$result_query){
200  return false;
201  }
202  }
203  if(($number_rows = mssql_num_rows($result_query))!==false){
204  return $number_rows;
205  } else {
206  throw new KumbiaException($this->error());
207  }
208  }
209 
217  public function field_name($number, $result_query=''){
218 
219  if(!$result_query){
220  $result_query = $this->last_result_query;
221  if(!$result_query){
222  return false;
223  }
224  }
225  if(($fieldName = mssql_field_name($result_query, $number))!==false){
226  return $fieldName;
227  } else {
228  throw new KumbiaException($this->error());
229  }
230  }
238  public function data_seek($number, $result_query=''){
239  if(!$result_query){
240  $result_query = $this->last_result_query;
241  if(!$result_query){
242  return false;
243  }
244  }
245  if(($success = mssql_data_seek($result_query, $number))!==false){
246  return $success;
247  } else {
248  throw new KumbiaException($this->error());
249  }
250  }
251 
258  public function affected_rows($result_query=''){
259  if(($numberRows = mssql_affected_rows())!==false){
260  return $numberRows;
261  } else {
262  throw new KumbiaException($this->error());
263  }
264  }
265 
271  public function error($err=''){
272  if(!$this->id_connection){
273  $this->last_error = mssql_get_last_message() ? mssql_get_last_message() : "[Error Desconocido en MsSQL: $err]";
274  if($this->logger){
275  Logger::error($this->last_error);
276  }
277  return $this->last_error;
278  }
279  $this->last_error = mssql_get_last_message() ? mssql_get_last_message() : "[Error Desconocido en MsSQL: $err]";
280  $this->last_error.= $err;
281  if($this->logger){
282  Logger::error($this->last_error);
283  }
284  return $this->last_error;
285  }
291  public function no_error(){
292  return mssql_errno();
293  }
299  public function last_insert_id($table='', $primary_key=''){
300 
301  //$id = false;
302  $result = mssql_query("select max({$primary_key}) from $table");
303  if ($row = mssql_fetch_row($result)) {
304  $this->id_connection = trim($row[0]);
305  }
306  mssql_free_result($result);
307  return $this->id_connection;
308  }
315  public function table_exists($table, $schema=''){
316  $table = addslashes("$table");
317  if($schema==''){
318  $num = $this->fetch_one("SELECT COUNT(*) FROM
319  INFORMATION_SCHEMA.TABLES
320  WHERE TABLE_NAME = '$table'");
321  } else {
322  $schema = addslashes("$schema");
323  $num = $this->fetch_one("SELECT COUNT(*) FROM
324  INFORMATION_SCHEMA.TABLES
325  WHERE TABLE_NAME = '$table'
326  AND TABLE_SCHEMA = '$schema'");
327  }
328  return $num[0];
329  }
336  public function limit($sql){
337  $params = Util::getParams(func_get_args());
338 
339  //TODO: añadirle el offset
340  if(isset($params['limit'])){
341  $sql = str_ireplace("SELECT ", "SELECT TOP $params[limit] ", $sql);
342  }
343  return $sql;
344  }
345 
352  public function drop_table($table, $if_exists=true){
353  if($if_exists){
354  $sql = "IF EXISTS(SELECT TABLE_NAME FROM
355  INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '$table')
356  DROP TABLE $table;";
357  return $this->query($sql);
358  } else {
359  return $this->query("DROP TABLE $table");
360  }
361  }
367  public function list_tables(){
368  return $this->fetch_all("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES");
369  }
370 
377  /*
378  public function describe_table($table, $schema=''){
379  $sql = "SELECT A.name as Field,
380  (case when A.isnullable=0 then 'NO' when A.isnullable=1 then 'YES' end) as 'Null',
381  (case when A.colorder=1 then 'PRI' when A.colorder>1 then '' end ) as 'Key',
382  convert(varchar, C.name) + '(' + convert(varchar, (A.length)) + ')' as 'Type',
383  (case when A.cdefault=0 then 'NULL' when A.cdefault<>0 then '0' end) as 'Default'
384  FROM syscolumns A
385  left join sysobjects B on A.id = B.id
386  left join systypes C on C.xtype = A.xtype
387  WHERE B.name = '$table'";
388  return $this->fetch_all($sql);
389  }
390  */
391  public function describe_table($table, $schema=''){
392  $describeTable = $this->fetch_all("exec sp_columns @table_name = '$table'");
393  $finalDescribe = array();
394  foreach($describeTable as $field){
395  $finalDescribe[] = array(
396  'Field' => $field['COLUMN_NAME'],
397  'Type' => $field['LENGTH'] ? $field['TYPE_NAME'] : $field['TYPE_NAME'].'('.$field['LENGTH'].')',
398  'Null' => $field['NULLABLE'] == 1 ? 'YES' : 'NO'
399  );
400  }
401  $describeKeys = $this->fetch_all("exec sp_pkeys @table_name = '$table'");
402  foreach($describeKeys as $field){
403  for($i=0;$i<=count($finalDescribe)-1;++$i){
404  if($finalDescribe[$i]['Field']==$field['COLUMN_NAME']){
405  $finalDescribe[$i]['Key'] = 'PRI';
406  } else {
407  $finalDescribe[$i]['Key'] = "";
408  }
409  }
410  }
411  return $finalDescribe;
412  }
413 
414 
421  public function fetch_object($result_query = NULL){
422  if(!$result_query){
423  $result_query = $this->last_result_query;
424  }
425  return mssql_fetch_object($result_query);
426  }
427 
428  public function create_table ($table, $definition, $index = array()){
429 
430  }
431 }