prepare('SELECT * FROM ext_parkinglot LIMIT :limit OFFSET :offset'); // TODO: Implemente sorting $query->bindParam(':limit' , $limit , PDO::PARAM_INT); $query->bindParam(':offset' , $offset , PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } $ret = $query->fetchAll(PDO::FETCH_ASSOC); return $ret; } static function retrive($pk_extension) { $pdo = database::pdo(); $extension = extensions::retrive($pk_extension); /* Get general information about this parking lot extension */ $query = $pdo->prepare("SELECT * FROM ext_parkinglot WHERE pk_extension=:pk_extension LIMIT 1"); $query->bindParam(':pk_extension', $pk_extension, PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } $ret = $query->fetch(PDO::FETCH_ASSOC); /* If we have no results at the last query, return a null array */ if ($query->rowCount() != 1) { return null; } $ret = array_merge($extension, $ret); return $ret; } static function save($data) { $pdo = database::pdo(); /* set a flag if this is a newly created extension */ if ($data['pk_extension'] == "") { $create_new = true; } /* force type to parkinglot */ $data['type'] = 'parkinglot'; /* triger a save on the extensions tables */ $data['pk_extension'] = extensions::save($data); /* create a record in the ext_parkinglot table if this is a newly created extension */ if ($create_new) { $query = $pdo->prepare("INSERT INTO ext_parkinglot(pk_extension) VALUES(:pk_extension)"); $query->bindParam(':pk_extension', $data['pk_extension'], PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } } /* update the parkinglot extension options */ $query = $pdo->prepare(" UPDATE ext_parkinglot SET start = :start, stop = :stop, timeout = :timeout WHERE pk_extension = :pk_extension "); $query->bindValue(':start' , $data['start'] , PDO::PARAM_INT); $query->bindValue(':stop' , $data['stop'] , PDO::PARAM_INT); $query->bindValue(':timeout' , $data['timeout'] , PDO::PARAM_INT); $query->bindValue(':pk_extension', $data['pk_extension'], PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } /* delete old parkinglot_reserved extensions */ $query = $pdo->prepare("DELETE FROM extensions WHERE type='parkinglot_reserved'"); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } /* create new parkinglot_reserved extensions */ for($i=$data['start']; $i<=$data['stop']; $i++) { $aux['type'] = 'parkinglot_reserved'; $aux['extension'] = "$i"; extensions::save($aux); } /* Notify the pbx about the changes */ pbx::notify_changes('ext_parkinglot'); return $data['pk_extension']; } static function validate($data) { $errors = array(); /* validate first against the extensions table */ $errors = extensions::validate($data); /* check that parking timeout it's a valid number (1-9999) */ if (! preg_match('/^[1-9]{1}[0-9]{0,3}$/', $data['timeout'])) { $errors['timeout']['invalid'] = true; } /* Check that parking lot start extension is valid */ $aux_extension['extension'] = $data['start']; $aux_errors = extensions::validate($aux_extension); if ($aux_errors['extension']['invalid']) { $errors['start']['invalid'] = true; } /* Check that parking lot stop extension is valid */ $aux_extension['extension'] = $data['stop']; $aux_errors = extensions::validate($aux_extension); if ($aux_errors['extension']['invalid']) { $errors['stop']['invalid'] = true; } /* Check that parking lot's stop extension is greater that the start */ if (empty($errors['stop']) && empty($errors['start'])) { if (intval($data['start']) > intval($data['stop'])) { $errors['stop']['small'] = true; } } /* Check if the parking extensions are empty */ if (empty($errors['stop']) && empty($errors['start'])) { for($extension = $data['start']; $extension <= $data['stop']; $extension++) { $aux = extensions::retrive_by_extension($extension); if ($aux != null && $aux['type'] != 'parkinglot_reserved') { $errors['stop']['conflict'] = true; $errors['start']['conflict'] = true; $errors['conflicts'][] = $extension; } } } return $errors; } static function generate() { $ret = extensions::generate(); $ret['timeout'] = '90'; return $ret; } static function delete($pk_extension) { $pdo = database::pdo(); /* Delete from the extensions table */ extensions::delete($pk_extension); /* Delete entry from the parkinglot extensions table */ $query = $pdo->prepare("DELETE FROM ext_parkinglot WHERE pk_extension = :pk_extension"); $query->bindParam(':pk_extension', $pk_extension, PDO::PARAM_INT); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } /* Delete reserved extensions from the extensions table */ $query = $pdo->prepare("DELETE FROM extensions WHERE type = 'parkinglot_reserved'"); $query->execute(); if ($query->errorCode() != '00000') { $error = $query->errorInfo(); throw new Exception($error[2]); } /* Notify the pbx about the changes */ pbx::notify_changes('ext_parkinglot'); } }