示例#1
0
 function truncate()
 {
     $ConnectionManager = new ConnectionManager();
     $conn = $ConnectionManager->getConnection();
     $stmt = $conn->prepare("TRUNCATE TABLE free_delivery_price");
     $stmt->execute();
     $ConnectionManager->closeConnection($stmt, $conn);
 }
 public function insertarTareaUsuario($tareaUsuario)
 {
     $manager = new ConnectionManager();
     $tareaUsuarioDAO = $manager->getTareaUsuarioDAO();
     try {
         return $tareaUsuarioDAO->insertar($tareaUsuario);
     } finally {
         $manager->close();
     }
 }
 public function buscarTarea($buscar)
 {
     $manager = new ConnectionManager();
     $tareaDAO = $manager->getTareaDAO();
     try {
         $list = $tareaDAO->buscarTareas($buscar);
         return $list;
     } finally {
         $manager->close();
     }
 }
示例#4
0
 function getPostalCode($customer_id, $address_no)
 {
     $ConnectionManager = new ConnectionManager();
     $conn = $ConnectionManager->getConnection();
     $stmt = $conn->prepare("SELECT postal_code FROM address WHERE customer_id=? AND address_no=?");
     $stmt->bind_param("si", $customer_id, $address_no);
     $stmt->execute();
     $stmt->bind_result($postal_code);
     $postalcode = '';
     while ($stmt->fetch()) {
         $postalcode = $postal_code;
     }
     $ConnectionManager->closeConnection($stmt, $conn);
     return $postalcode;
 }
示例#5
0
 /**
  * Run
  *
  * @return void
  */
 public function run()
 {
     $null = null;
     $this->db = ConnectionManager::getDataSource($this->connection);
     $this->db->cacheSources = false;
     $this->db->begin($null);
     if (!isset($this->args[0]) || !in_array($this->args[0], array('insert', 'remove'))) {
         $this->out(__d('SoftDelete', 'Invalid option'));
         return $this->_displayHelp(null);
     }
     if (!isset($this->args[1])) {
         $this->out(__d('SoftDelete', 'You missed field name.'));
         return $this->_displayHelp(null);
     }
     try {
         $this->_run($this->args[0], $this->args[1]);
         $this->_clearCache();
     } catch (Exception $e) {
         $this->db->rollback($null);
         throw $e;
     }
     $this->out(__d('SoftDelete', 'All tables are updated.'));
     $this->out('');
     return $this->db->commit($null);
 }
 /**
  * Get current connection
  *
  * @return \Doctrine\DBAL\Driver\Connection|\Doctrine\DBAL\Connection|\Blast\Orm\Connection
  */
 public function getConnection()
 {
     if (null === $this->connection) {
         $this->connection = ConnectionManager::getInstance()->get();
     }
     return $this->connection;
 }
 public function load()
 {
     if (Cache::read('qe.dbconfig_' . hash("md5", "qe_dbconfig"), QEResp::QUICK_EMAILER_CACHE)) {
         return true;
     }
     if (Configure::check('qe.dbconfig')) {
         if (!file_exists(APP . 'Config' . DS . 'database.php')) {
             return QEResp::RESPOND(QEResp::ERROR, QuickEmailerErrorDefinitions::NO_DATABASE_CONFIGURED());
         }
         try {
             $datasource = ConnectionManager::getDataSource(Configure::read('qe.dbconfig'));
             if ($datasource->connected) {
                 $this->CheckTables($datasource);
                 Cache::write('qe.dbconfig_' . hash("md5", "qe_dbconfig"), true, QEResp::QUICK_EMAILER_CACHE);
                 return true;
             }
             return QEResp::RESPOND(QEResp::ERROR, QuickEmailerErrorDefinitions::NO_DATABASE_CONFIGURED());
         } catch (Exception $e) {
             $excep_message = QuickEmailerResponseHandler::AddExceptionInfo(QuickEmailerErrorDefinitions::NO_DATABASE_CONFIGURED(), $e);
             //TODO: Log errors
             return QEResp::RESPOND(QEResp::ERROR, $excep_message);
         }
     } else {
         return QEResp::RESPOND(QEResp::ERROR, QuickEmailerErrorDefinitions::NO_DATABASE_CONFIGURED());
     }
 }
 /**
  * Override Model::delete, because it would block deleting when
  * useTable = false and no records exists
  *
  * @param <type> $id
  * @param <type> $cascade
  * @return <type>
  */
 function delete($id = null, $cascade = true)
 {
     if (!empty($id)) {
         $this->id = $id;
     }
     $id = $this->id;
     if ($this->beforeDelete($cascade)) {
         $db =& ConnectionManager::getDataSource($this->useDbConfig);
         if (!$this->Behaviors->trigger($this, 'beforeDelete', array($cascade), array('break' => true, 'breakOn' => false))) {
             return false;
         }
         $this->_deleteDependent($id, $cascade);
         $this->_deleteLinks($id);
         $this->id = $id;
         if (!empty($this->belongsTo)) {
             $keys = $this->find('first', array('fields' => $this->__collectForeignKeys()));
         }
         if ($db->delete($this)) {
             if (!empty($this->belongsTo)) {
                 $this->updateCounterCache($keys[$this->alias]);
             }
             $this->Behaviors->trigger($this, 'afterDelete');
             $this->afterDelete();
             $this->_clearCache();
             $this->id = false;
             $this->__exists = null;
             return true;
         }
     }
     return false;
 }
示例#9
0
 /**
  * Constructor.
  *
  * @access public
  */
 public function __construct()
 {
     parent::__construct();
     // Setup Search Engine Connection
     $this->db = ConnectionManager::connectToIndex();
     $_SESSION['no_store'] = true;
 }
示例#10
0
 public function execute()
 {
     if (empty($this->connection)) {
         $this->connection = $this->DbConfig->getConfig();
     }
     $this->out('Generating Proxy classes');
     $dm = ConnectionManager::getDataSource($this->connection)->getDocumentManager();
     $metadatas = $dm->getMetadataFactory()->getAllMetadata();
     $metadatas = MetadataFilter::filter($metadatas, isset($this->params['filter']) ? $this->params['filter'] : null);
     // Process destination directory
     $destPath = empty($this->params['destPath']) ? $dm->getConfiguration()->getHydratorDir() : $this->params['destPath'];
     if (!is_dir($destPath)) {
         mkdir($destPath, 0777, true);
     }
     $destPath = realpath($destPath);
     if (!file_exists($destPath)) {
         throw new \InvalidArgumentException(sprintf("Proxies destination directory '<info>%s</info>' does not exist.", $destPath));
     } else {
         if (!is_writable($destPath)) {
             throw new \InvalidArgumentException(sprintf("Proxies destination directory '<info>%s</info>' does not have write permissions.", $destPath));
         }
     }
     if (count($metadatas)) {
         foreach ($metadatas as $metadata) {
             $this->out(sprintf('Processing document "<info>%s</info>"', $metadata->name));
         }
         // Generating Proxies
         $dm->getHydratorFactory()->generateHydratorClasses($metadatas, $destPath);
         // Outputting information message
         $this->out(sprintf('Hydrator classes generated to "<info>%s</info>"', $destPath));
     } else {
         $this->out('No Metadata Classes to process.');
     }
 }
示例#11
0
 static function configure()
 {
     if (empty($_COOKIE['selenium'])) {
         return;
     }
     $cookie = $_COOKIE['selenium'];
     App::import('Model', 'ConnectionManager', false);
     ClassRegistry::flush();
     Configure::write('Cache.disable', true);
     $testDbAvailable = in_array('test', array_keys(ConnectionManager::enumConnectionObjects()));
     $_prefix = null;
     if ($testDbAvailable) {
         // Try for test DB
         restore_error_handler();
         @($db =& ConnectionManager::getDataSource('test'));
         set_error_handler('simpleTestErrorHandler');
         $testDbAvailable = $db->isConnected();
     }
     // Try for default DB
     if (!$testDbAvailable) {
         $db =& ConnectionManager::getDataSource('default');
     }
     $_prefix = $db->config['prefix'];
     $db->config['prefix'] = $cookie . '_';
     ConnectionManager::create('test_suite', $db->config);
     $db->config['prefix'] = $_prefix;
     // Get db connection
     $db =& ConnectionManager::getDataSource('test_suite');
     $db->cacheSources = false;
     ClassRegistry::config(array('ds' => 'test_suite'));
 }
示例#12
0
 /**
  * Truncates all tables and loads fixtures into db
  *
  * @return void
  * @access public
  */
 function main()
 {
     if (!empty($this->args)) {
         if ($this->args[0] == 'chmod') {
             return $this->chmod();
         }
         $fixtures = $this->args;
         foreach ($fixtures as $i => $fixture) {
             $fixtures[$i] = APP . 'tests/fixtures/' . $fixture . '_fixture.php';
         }
     } else {
         App::import('Folder');
         $Folder = new Folder(APP . 'tests/fixtures');
         $fixtures = $Folder->findRecursive('.+_fixture\\.php');
     }
     $db = ConnectionManager::getDataSource('default');
     $records = 0;
     foreach ($fixtures as $path) {
         require_once $path;
         $name = str_replace('_fixture.php', '', basename($path));
         $class = Inflector::camelize($name) . 'Fixture';
         $Fixture =& new $class($db);
         $this->out('-> Truncating table "' . $Fixture->table . '"');
         $db->truncate($Fixture->table);
         $Fixture->insert($db);
         $fixtureRecords = count($Fixture->records);
         $records += $fixtureRecords;
         $this->out('-> Inserting ' . $fixtureRecords . ' records for "' . $Fixture->table . '"');
     }
     $this->out(sprintf('-> Done inserting %d records for %d tables', $records, count($fixtures)));
 }
示例#13
0
 public function truncateModel($name)
 {
     $model = ClassRegistry::init(array('class' => $name, 'ds' => 'test'));
     $table = $model->table;
     $db = ConnectionManager::getDataSource('test_suite');
     $db->truncate($table);
 }
示例#14
0
 public function setUp()
 {
     $this->Model = ClassRegistry::init('Country');
     $this->db = ConnectionManager::getDataSource('test');
     $this->skipIf(!$this->db instanceof Mysql, 'The subquery test is only compatible with Mysql.');
     parent::setUp();
 }
 public function health()
 {
     App::Import('ConnectionManager');
     $MPSearch = ConnectionManager::getDataSource('MPSearch');
     $elasticSearch = $MPSearch->API->cluster()->health();
     $this->set(array('elasticSearch' => $elasticSearch, '_serialize' => array('elasticSearch')));
 }
示例#16
0
/**
 * Loads connections configuration.
 *
 * @return void
 */
	protected static function _init() {
		include_once APP . 'Config' . DS . 'database.php';
		if (class_exists('DATABASE_CONFIG')) {
			self::$config = new DATABASE_CONFIG();
		}
		self::$_init = true;
	}
示例#17
0
 /**
  * @return mpAPISource
  */
 private function getAPISource()
 {
     if (!self::$apiSource) {
         self::$apiSource = ConnectionManager::getDataSource('mpAPI');
     }
     return self::$apiSource;
 }
示例#18
0
 function main()
 {
     if ($this->args && $this->args[0] == '?') {
         return $this->out('Usage: ./cake fixturize <table> [-force] [-reindex]');
     }
     $options = array('force' => false, 'reindex' => false, 'all' => false);
     foreach ($this->params as $key => $val) {
         foreach ($options as $name => $option) {
             if (isset($this->params[$name]) || isset($this->params['-' . $name]) || isset($this->params[$name[0]])) {
                 $options[$name] = true;
             }
         }
     }
     if ($options['all']) {
         $db = ConnectionManager::getDataSource('default');
         $this->args = $db->listSources();
     }
     if (empty($this->args)) {
         return $this->err('Usage: ./cake fixturize <table>');
     }
     foreach ($this->args as $table) {
         $name = Inflector::classify($table);
         $Model = new AppModel(array('name' => $name, 'table' => $table));
         $file = sprintf('%stests/fixtures/%s_fixture.php', APP, Inflector::underscore($name));
         $File = new File($file);
         if ($File->exists() && !$options['force']) {
             $this->err(sprintf('File %s already exists, use --force option.', $file));
             continue;
         }
         $records = $Model->find('all');
         $out = array();
         $out[] = '<?php';
         $out[] = '';
         $out[] = sprintf('class %sFixture extends CakeTestFixture {', $name);
         $out[] = sprintf('	var $name = \'%s\';', $name);
         $out[] = '	var $records = array(';
         foreach ($records as $record) {
             $out[] = '		array(';
             if ($options['reindex']) {
                 foreach (array('old_id', 'vendor_id') as $field) {
                     if ($Model->hasField($field)) {
                         $record[$name][$field] = $record[$name]['id'];
                         break;
                     }
                 }
                 $record[$name]['id'] = String::uuid();
             }
             foreach ($record[$name] as $field => $val) {
                 $out[] = sprintf('			\'%s\' => \'%s\',', addcslashes($field, "'"), addcslashes($val, "'"));
             }
             $out[] = '		),';
         }
         $out[] = '	);';
         $out[] = '}';
         $out[] = '';
         $out[] = '?>';
         $File->write(join("\n", $out));
         $this->out(sprintf('-> Create %sFixture with %d records (%d bytes) in "%s"', $name, count($records), $File->size(), $file));
     }
 }
示例#19
0
 /**
  * Constructor - checks dependencies and loads the connection
  *
  * @param string $sConnecion The connection from database.php to use. Deafaults to "default"
  * @return void
  */
 function Migrations($sConnection = 'default')
 {
     if (class_exists('Spyc')) {
         $this->bSpycReady = true;
     }
     $this->oDb =& ConnectionManager::getDataSource($sConnection);
 }
示例#20
0
 private function __dbStructure($options = array())
 {
     if (is_string($options) || isset($options['useSchema'])) {
         $version = new MigrationVersion();
         $versions = $version->getMapping('rcms');
         if (!isset($options['targetVersion'])) {
             $options['targetVersion'] = array_pop($versions);
         }
         if (!isset($options['initVersion'])) {
             $options['initVersion'] = array_pop($versions);
         }
         $version->run(array('version' => array($options['initVersion'], $options['targetVersion']), 'type' => 'rcms', 'direction' => 'up'));
     } else {
         if (isset($options['fileName'])) {
             $db = ConnectionManager::getDataSource('default');
             $statements = file_get_contents(CONFIGS . 'sql/' . $options['fileName']);
             /* Replacing the block comments */
             $statements = preg_replace('/\\/\\*[^\\*]*\\*\\//', '', $statements);
             /* Replacing the line comments */
             $statements = preg_replace('/.*\\-\\-.*\\n/', '', $statements);
             $statements = explode(';', $statements);
             foreach ($statements as $statement) {
                 if (trim($statement) != '') {
                     $db->query($statement);
                 }
             }
             return true;
         }
     }
 }
示例#21
0
 /**
  * Displays information about the system configuration.
  */
 public function status()
 {
     $this->set('core', array('debug' => Configure::read('debug'), 'database' => @ConnectionManager::getDataSource('default')));
     $uploads_path = Configure::read('uploads.path');
     $this->set('uploads', array('url' => Configure::read('uploads.url'), 'path' => $uploads_path, 'exists' => is_dir($uploads_path), 'writable' => is_writable($uploads_path), 'executable' => is_executable($uploads_path)));
     $this->set('dependencies', array('Ghostscript' => is_executable('ghostscript'), 'Imagemagick' => class_exists('Imagick')));
 }
示例#22
0
 public function run($data)
 {
     if (array_key_exists('search', $data) && !empty($data['search'])) {
         $search = $data['search'];
         $this->Twitter = ConnectionManager::getDataSource('twitter');
         switch ($search) {
             default:
                 $this->getSearchResults($search);
                 $nextUpdate = '+30 Minutes';
                 break;
             case '*global*':
                 $this->getGlobal($search);
                 $nextUpdate = '+5 Minutes';
                 break;
         }
         //check if there is already a task for this term.
         $findConf = array('conditions' => array('fetched' => null, 'data LIKE' => '%' . $search . '%'));
         $alreadyPresent = $this->QueuedTask->find('count', $findConf);
         if ($alreadyPresent == false) {
             if ($this->QueuedTask->createJob('twitterscrape', array('search' => $search), $nextUpdate)) {
                 $this->out('Searchterm update Queued');
             } else {
                 $this->err('Could not create Twitterscrape Job.');
             }
         } else {
             $this->err('There seems to be another job queued for this term, job not requeued.');
         }
         return true;
     } else {
         $this->out('No Search term found, Cancelling');
         // return true so the task does NOT get requeued.
         return true;
     }
 }
 function _importTables($from)
 {
     $defaultDb = ConnectionManager::getDataSource($from);
     foreach ($defaultDb->listSources() as $table) {
         $this->fixtures[] = "app." . Inflector::singularize($table);
     }
 }
示例#24
0
 public function main()
 {
     $db = ConnectionManager::getDataSource('default');
     $db->query($this->migrationsTableSql);
     $results = $db->query("select migrations from __migrations");
     $applied = array();
     foreach ($results as $result) {
         $applied[] = $result['__migrations']['migrations'];
     }
     $migrations = glob(APP . 'Config' . DS . 'Schema' . DS . 'migrations' . DS . '*.sql');
     natsort($migrations);
     $db->begin();
     try {
         foreach ($migrations as $filename) {
             list($migration, $ignore) = explode('.', basename($filename));
             if (in_array($migration, $applied)) {
                 continue;
             }
             $this->out("Migrating to {$migration}.");
             $db->query(file_get_contents($filename));
             $db->query("INSERT INTO `__migrations` VALUES ('{$migration}')");
         }
         $db->commit();
         $this->out('Done.');
     } catch (Exception $e) {
         $this->out("<error>Migration failed. Rolling back.</error>");
         $db->rollback();
         throw $e;
     }
 }
示例#25
0
 /**
  * Gets the connection names that should have logs + dumps generated.
  *
  * @param Controller $controller The controller.
  * @return array
  */
 public function beforeRender(Controller $controller)
 {
     if (!class_exists('ConnectionManager')) {
         return array();
     }
     $connections = array();
     $dbConfigs = ConnectionManager::sourceList();
     foreach ($dbConfigs as $configName) {
         $driver = null;
         $db = ConnectionManager::getDataSource($configName);
         if (empty($db->config['driver']) && empty($db->config['datasource']) || !method_exists($db, 'getLog')) {
             continue;
         }
         if (isset($db->config['datasource'])) {
             $driver = $db->config['datasource'];
         }
         $explain = false;
         $isExplainable = preg_match('/(Mysql|Postgres)$/', $driver);
         if ($isExplainable) {
             $explain = true;
         }
         $connections[$configName] = $explain;
     }
     return array('connections' => $connections, 'threshold' => $this->slowRate);
 }
示例#26
0
 public function importKeywords()
 {
     $db = ConnectionManager::getDataSource('default');
     $mysqli = new mysqli($db->config['host'], $db->config['login'], $db->config['password'], $db->config['database']);
     $sql = array('links', 'links_keywords');
     foreach (glob('/home/kiang/public_html/news/cache/output/*.json') as $jsonFile) {
         $json = json_decode(file_get_contents($jsonFile), true);
         $newLinkId = String::uuid();
         $json['title'] = $mysqli->real_escape_string(trim($json['title']));
         $json['url'] = $mysqli->real_escape_string($json['url']);
         $json['created'] = date('Y-m-d H:i:s', $json['created_at']);
         $sql['links'][] = "('{$newLinkId}', '{$json['title']}', '{$json['url']}', '{$json['created']}')";
         foreach ($json['keywords'] as $keywordId => $summary) {
             $lkId = String::uuid();
             $summary = $mysqli->real_escape_string(trim($summary));
             $sql['links_keywords'][] = "('{$lkId}', '{$newLinkId}', '{$keywordId}', '{$summary}')";
         }
         unlink($jsonFile);
     }
     if (!empty($sql['links'])) {
         $linksSql = 'INSERT INTO links VALUES ' . implode(',', $sql['links']) . ";\n";
         $lkSql = 'INSERT INTO links_keywords VALUES ' . implode(',', $sql['links_keywords']) . ';';
         file_put_contents(TMP . 'keywords.sql', $linksSql . $lkSql);
     }
 }
示例#27
0
 public function beforeFilter()
 {
     $db = ConnectionManager::getDataSource('default');
     $db->fetchAll('SET SQL_BIG_SELECTS=1;');
     //$this->Auth->allow( );
     $this->Auth->allow('login', 'logout', 'reset_password', 'contact', 'set_notifications', 'read_user');
     if ($this->Session->check('Auth.User.session_time') && $this->Session->check('Auth.User.last_activity') && time() - $this->Session->read('Auth.User.last_activity') > $this->Session->read('Auth.User.session_time')) {
         $this->Session->setFlash(__('Sesión cerrada por inactividad.'), 'alert', array('plugin' => 'BoostCake', 'class' => 'alert-danger'));
         $this->Auth->logout();
         //die("<script>window.location.href='{$this->request->webroot}';</script>");
     }
     if ($this->Auth->login()) {
         $this->Session->write('Auth.User.last_activity', time());
         /*if($this->Session->read('Auth.User.House')=="")
         			{
         				$chooseHouse = true;
         
         			}
         			else
         			{
         				$chooseHouse = ;
         			}*/
     }
     //Configure::write('Config.language', $this->Session->read('Config.language'));
 }
示例#28
0
 protected function query()
 {
     if ($this->database !== false && !empty($this->sql)) {
         $this->connection =& ConnectionManager::connection($this->database);
         $this->result = $this->connection->query($this->sql)->fetchAll(PDO::FETCH_ASSOC);
     }
 }
示例#29
0
 public function createDatabaseFile($data)
 {
     App::uses('File', 'Utility');
     App::uses('ConnectionManager', 'Model');
     $config = $this->defaultConfig;
     foreach ($data['Install'] as $key => $value) {
         if (isset($data['Install'][$key])) {
             $config[$key] = $value;
         }
     }
     $result = copy(APP . 'Config' . DS . 'database.php.install', APP . 'Config' . DS . 'database.php');
     if (!$result) {
         return __d('croogo', 'Could not copy database.php file.');
     }
     $file = new File(APP . 'Config' . DS . 'database.php', true);
     $content = $file->read();
     foreach ($config as $configKey => $configValue) {
         $content = str_replace('{default_' . $configKey . '}', $configValue, $content);
     }
     if (!$file->write($content)) {
         return __d('croogo', 'Could not write database.php file.');
     }
     try {
         ConnectionManager::create('default', $config);
         $db = ConnectionManager::getDataSource('default');
     } catch (MissingConnectionException $e) {
         return __d('croogo', 'Could not connect to database: ') . $e->getMessage();
     }
     if (!$db->isConnected()) {
         return __d('croogo', 'Could not connect to database.');
     }
     return true;
 }
 public function getRows()
 {
     $data = $this->read();
     $client = $this->Client->find('first', array('fields' => array('Client.id', 'Client.name'), 'conditions' => array('Client.id' => $data['TrainingReport']['client_id'])));
     $moodle_ids = array();
     $users = $this->Client->User->find('all', array('fields' => array('User.id', 'Client.name'), 'conditions' => array('Client.id' => $client['Client']['id'])));
     foreach ($users as $user) {
         $moodle_ids[] = "'n" . $user['User']['id'] . "'";
     }
     $moodle_ids = implode(', ', $moodle_ids);
     $client_name_trunc = substr($client['Client']['name'], 0, 40);
     // mdl_user.institution is only 40 chars
     $moodle = ConnectionManager::getDataSource('moodle');
     $sql = "SELECT mdl_user.firstname, mdl_user.lastname, mdl_quiz_grades.grade, mdl_quiz_grades.timemodified\n                FROM mdl_user, mdl_quiz_grades WHERE mdl_quiz_grades.quiz IN \n                  (SELECT mdl_quiz.id FROM mdl_quiz WHERE mdl_quiz.course = :course_id) \n                AND mdl_quiz_grades.userid = mdl_user.id AND mdl_user.institution = :client_name \n                AND mdl_user.idnumber in ({$moodle_ids})\n                AND mdl_user.deleted = 0 ORDER BY mdl_user.lastname ASC";
     $rows = $moodle->fetchAll($sql, array(':course_id' => $data['TrainingReport']['course_id'], ':client_name' => $client_name_trunc));
     $new_rows_by_name = array();
     foreach ($rows as $row) {
         $name = $row['mdl_user']['lastname'] . ',' . $row['mdl_user']['firstname'];
         $new_rows_by_name[$name] = null;
     }
     $old_sql = "SELECT mdl_user.firstname, mdl_user.lastname, mdl_quiz_grades.grade, mdl_quiz_grades.timemodified\n                   FROM mdl_user, mdl_quiz_grades WHERE mdl_quiz_grades.quiz IN \n                   (SELECT mdl_quiz.id FROM mdl_quiz WHERE mdl_quiz.course = :course_id) \n                   AND mdl_quiz_grades.userid = mdl_user.id AND mdl_user.institution = :client_name \n                   AND mdl_user.deleted = 0 ORDER BY mdl_user.lastname ASC";
     $old_rows = $moodle->fetchAll($old_sql, array(':course_id' => $data['TrainingReport']['course_id'], ':client_name' => $client_name_trunc));
     foreach ($old_rows as $row) {
         $name = $row['mdl_user']['lastname'] . ',' . $row['mdl_user']['firstname'];
         if (!array_key_exists($name, $new_rows_by_name)) {
             $rows[] = $row;
         }
     }
     function cmp($a, $b)
     {
         return strcmp($a['mdl_user']['lastname'], $b['mdl_user']['lastnmae']);
     }
     uksort($rows, 'cmp');
     return $rows;
 }