/** * Function parseAIML * * * @param $fn * @param $aimlContent * @param bool $from_zip * @return string */ function parseAIML($fn, $aimlContent, $from_zip = false) { global $dbConn, $post_vars; if (empty($aimlContent)) { return "File {$fn} was empty!"; } global $dbConn, $debugmode, $bot_id, $charset; $fileName = basename($fn); $success = false; $topic = ''; #Clear the database of the old entries $sql = "DELETE FROM `aiml` WHERE `filename` = :filename AND bot_id = :bot_id"; if (isset($post_vars['clearDB'])) { $params = array(':filename' => $fileName, ':bot_id' => $bot_id); $affectedRows = db_write($sql, $params, false, __FILE__, __FUNCTION__, __LINE__); } $myBot_id = isset($post_vars['bot_id']) ? $post_vars['bot_id'] : $bot_id; # Read new file into the XML parser $sql = 'insert into `aiml` (`id`, `bot_id`, `aiml`, `pattern`, `thatpattern`, `template`, `topic`, `filename`) values (NULL, :bot_id, :aiml, :pattern, :that, :template, :topic, :fileName);'; # Validate the incoming document /*******************************************************/ /* Set up for validation from a common DTD */ /* This will involve removing the XML and */ /* AIML tags from the beginning of the file */ /* and replacing them with our own tags */ /*******************************************************/ $validAIMLHeader = '<?xml version="1.0" encoding="[charset]"?> <!DOCTYPE aiml PUBLIC "-//W3C//DTD Specification Version 1.0//EN" "http://www.program-o.com/xml/aiml.dtd"> <aiml version="1.0.1" xmlns="http://alicebot.org/2001/AIML-1.0.1">'; $validAIMLHeader = str_replace('[charset]', $charset, $validAIMLHeader); $aimlTagStart = stripos($aimlContent, '<aiml', 0); $aimlTagEnd = strpos($aimlContent, '>', $aimlTagStart) + 1; $aimlFile = $validAIMLHeader . substr($aimlContent, $aimlTagEnd); $tmpDir = _UPLOAD_PATH_ . 'tmp' . DIRECTORY_SEPARATOR; if (!file_exists($tmpDir)) { mkdir($tmpDir, 0755); } save_file(_UPLOAD_PATH_ . 'tmp/' . $fileName, $aimlFile); try { libxml_use_internal_errors(true); $xml = new DOMDocument(); $xml->loadXML($aimlFile); $aiml = new SimpleXMLElement($xml->saveXML()); $rowCount = 0; $_SESSION['failCount'] = 0; $params = array(); if (!empty($aiml->topic)) { foreach ($aiml->topic as $topicXML) { # handle any topic tag(s) in the file $topicAttributes = $topicXML->attributes(); $topic = $topicAttributes['name']; foreach ($topicXML->category as $category) { $fullCategory = $category->asXML(); $pattern = trim($category->pattern); $pattern = str_replace("'", ' ', $pattern); $pattern = IS_MB_ENABLED ? mb_strtoupper($pattern) : strtoupper($pattern); $that = $category->that; $that = IS_MB_ENABLED ? mb_strtoupper($that) : strtoupper($that); $template = $category->template->asXML(); $template = str_replace('<template>', '', $template); $template = str_replace('</template>', '', $template); $template = trim($template); # Strip CRLF and LF from category (Windows/mac/*nix) $aiml_add = str_replace(array("\r\n", "\n"), '', $fullCategory); $params[] = array(':bot_id' => $bot_id, ':aiml' => $aiml_add, ':pattern' => $pattern, ':that' => $that, ':template' => $template, ':topic' => $topic, ':fileName' => $fileName); } } } if (!empty($aiml->category)) { foreach ($aiml->category as $category) { $fullCategory = $category->asXML(); $pattern = trim($category->pattern); $pattern = str_replace("'", ' ', $pattern); $pattern = IS_MB_ENABLED ? mb_strtoupper($pattern) : strtoupper($pattern); $that = $category->that; $template = $category->template->asXML(); //strip out the <template> tags, as they aren't needed $template = substr($template, 10); $tLen = strlen($template); $template = substr($template, 0, $tLen - 11); $template = trim($template); # Strip CRLF and LF from category (Windows/mac/*nix) $aiml_add = str_replace(array("\r\n", "\n"), '', $fullCategory); $params[] = array(':bot_id' => $bot_id, ':aiml' => $aiml_add, ':pattern' => $pattern, ':that' => $that, ':template' => $template, ':topic' => '', ':fileName' => $fileName); } } if (!empty($params)) { $rowCount = db_write($sql, $params, true, __FILE__, __FUNCTION__, __LINE__); $success = $rowCount !== false ? true : false; } $msg = $from_zip === true ? '' : "Successfully added {$fileName} to the database.<br />\n"; } catch (Exception $e) { //$trace = print_r($e->getTrace(), true); //exit($e->getMessage() . ' at line ' . $e->getLine()); $msg = $e->getMessage() . ' at line ' . $e->getLine() . "<br>\n"; //trigger_error("Trace:\n$trace"); //file_put_contents(_LOG_PATH_ . 'error.trace.log', $trace . "\nEnd Trace\n\n", FILE_APPEND); $success = false; $_SESSION['failCount']++; $errMsg = "There was a problem adding file {$fileName} to the database. Please refer to the message below to correct the problem and try again.<br>\n" . $e->getMessage(); $msg .= upload_libxml_display_errors($errMsg); } return $msg; }
/** * Function parseAIML * * * @param $fn * @param $aimlContent * @param bool $from_zip * @return string */ function parseAIML($fn, $aimlContent, $from_zip = false) { global $dbConn, $post_vars; if (empty($aimlContent)) { return "File {$fn} was empty!"; } global $dbConn, $debugmode, $bot_id, $charset; $fileName = basename($fn); $success = false; #Clear the database of the old entries $sql = "DELETE FROM `aiml` WHERE `filename` = :filename AND bot_id = :bot_id"; if (isset($post_vars['clearDB'])) { $sth = $dbConn->prepare($sql); $sth->bindValue(':filename', $fileName); $sth->bindValue(':bot_id', $bot_id); $sth->execute(); $affectedRows = $sth->rowCount(); } $myBot_id = isset($post_vars['bot_id']) ? $post_vars['bot_id'] : $bot_id; # Read new file into the XML parser $sql_start = 'insert into `aiml` (`id`, `bot_id`, `aiml`, `pattern`, `thatpattern`, `template`, `topic`, `filename`) values' . PHP_EOL; $sql = $sql_start; $sql_template = "(NULL, {$myBot_id}, '[aiml_add]', '[pattern]', '[that]', '[template]', '[topic]', '{$fileName}'),\n"; # Validate the incoming document /*******************************************************/ /* Set up for validation from a common DTD */ /* This will involve removing the XML and */ /* AIML tags from the beginning of the file */ /* and replacing them with our own tags */ /*******************************************************/ $validAIMLHeader = '<?xml version="1.0" encoding="[charset]"?> <!DOCTYPE aiml PUBLIC "-//W3C//DTD Specification Version 1.0//EN" "http://www.program-o.com/xml/aiml.dtd"> <aiml version="1.0.1" xmlns="http://alicebot.org/2001/AIML-1.0.1">'; $validAIMLHeader = str_replace('[charset]', $charset, $validAIMLHeader); $aimlTagStart = stripos($aimlContent, '<aiml', 0); $aimlTagEnd = strpos($aimlContent, '>', $aimlTagStart) + 1; $aimlFile = $validAIMLHeader . substr($aimlContent, $aimlTagEnd); save_file(_UPLOAD_PATH_ . 'tmp/' . $fileName, $aimlFile); try { libxml_use_internal_errors(true); $xml = new DOMDocument(); $xml->loadXML($aimlFile); $aiml = new SimpleXMLElement($xml->saveXML()); $rowCount = 0; $_SESSION['failCount'] = 0; if (!empty($aiml->topic)) { $sql = $sql_start; foreach ($aiml->topic as $topicXML) { # handle any topic tag(s) in the file $topicAttributes = $topicXML->attributes(); $topic = $topicAttributes['name']; //$sth->bindValue(':topic', $topic); foreach ($topicXML->category as $category) { $fullCategory = $category->asXML(); $pattern = trim($category->pattern); $pattern = str_replace("'", ' ', $pattern); $pattern = IS_MB_ENABLED ? mb_strtoupper($pattern) : strtoupper($pattern); $that = $category->that; $template = $category->template->asXML(); $template = str_replace('<template>', '', $template); $template = str_replace('</template>', '', $template); $template = str_replace("'", "\\'", $template); $template = str_replace("\\'", "\\'", $template); # Strip CRLF and LF from category (Windows/mac/*nix) $aiml_add = str_replace(array("\r\n", "\n"), '', $fullCategory); $aiml_add = str_replace("'", "\\'", $aiml_add); $aiml_add = str_replace("\\'", "\\'", $aiml_add); $sql_add = str_replace('[aiml_add]', $aiml_add, $sql_template); $sql_add = str_replace('[pattern]', $pattern, $sql_add); $sql_add = str_replace('[that]', $that, $sql_add); $sql_add = str_replace('[template]', $template, $sql_add); $sql_add = str_replace('[topic]', $topic, $sql_add); $sql .= "{$sql_add}"; $rowCount++; if ($rowCount >= 100) { $rowCount = 0; $sql = rtrim($sql, ",\n") . ';'; save_file(_LOG_PATH_ . 'sql.txt', $sql . PHP_EOL, true); $sth = $dbConn->prepare($sql); $sth->execute(); $success = $sth->rowCount() >= 0 ? true : false; $sql = $sql_start; } } } } if (!empty($aiml->category)) { foreach ($aiml->category as $category) { $fullCategory = $category->asXML(); $pattern = trim($category->pattern); $pattern = str_replace("'", ' ', $pattern); $pattern = IS_MB_ENABLED ? mb_strtoupper($pattern) : strtoupper($pattern); $that = $category->that; $template = $category->template->asXML(); $template = substr($template, 10); $tLen = strlen($template); $template = substr($template, 0, $tLen - 11); $template = str_replace("'", "\\'", $template); $template = str_replace("\\'", "\\'", $template); # Strip CRLF and LF from category (Windows/mac/*nix) $aiml_add = str_replace(array("\r\n", "\n"), '', $fullCategory); $aiml_add = str_replace("'", "\\'", $aiml_add); $aiml_add = str_replace("\\'", "\\'", $aiml_add); $sql_add = str_replace('[aiml_add]', $aiml_add, $sql_template); $sql_add = str_replace('[pattern]', $pattern, $sql_add); $sql_add = str_replace('[that]', $that, $sql_add); $sql_add = str_replace('[template]', $template, $sql_add); $sql_add = str_replace('[topic]', '', $sql_add); $sql .= "{$sql_add}"; $rowCount++; if ($rowCount >= 100) { $rowCount = 0; $sql = rtrim($sql, ",\n") . ';'; //save_file(_LOG_PATH_ . 'sql1.txt', $sql . PHP_EOL); $sth = $dbConn->prepare($sql); $sth->execute(); $success = $sth->rowCount() >= 0 ? true : false; $sql = $sql_start; } } if ($sql != $sql_start) { $sql = rtrim($sql, ",\n") . ';'; //save_file(_LOG_PATH_ . 'sql2.txt', $sql . PHP_EOL, true); $sth = $dbConn->prepare($sql); $sth->execute(); $success = $sth->rowCount() >= 0 ? true : false; } } if ($sql != $sql_start) { $sql = rtrim($sql, ",\n") . ';'; //save_file(_LOG_PATH_ . 'sql3.txt', $sql . PHP_EOL, true); $sth = $dbConn->query($sql); $success = $sth->rowCount() >= 0 ? true : false; } $msg = $from_zip === true ? '' : "Successfully added {$fileName} to the database.<br />\n"; } catch (Exception $e) { //$trace = print_r($e->getTrace(), true); //exit($e->getMessage() . ' at line ' . $e->getLine()); $msg = $e->getMessage() . ' at line ' . $e->getLine() . "<br>\n"; //trigger_error("Trace:\n$trace"); //file_put_contents(_LOG_PATH_ . 'error.trace.log', $trace . "\nEnd Trace\n\n", FILE_APPEND); $success = false; $_SESSION['failCount']++; $errMsg = "There was a problem adding file {$fileName} to the database. Please refer to the message below to correct the problem and try again.<br>\n" . $e->getMessage(); $msg .= upload_libxml_display_errors($errMsg); } return $msg; }