function importDatabase($importDatabase)
 {
     global $serendipity;
     set_time_limit(0);
     serendipity_db_begin_transaction();
     if ($this->get_config('dbversion', 2) == 3 && ($serendipity['dbType'] == 'mysql' || $serendipity['dbType'] == 'mysqli')) {
         #now there is a primary key we can use
         foreach ($importDatabase as $importToken) {
             $token = $importToken[0];
             $ham = $importToken[1];
             $spam = $importToken[2];
             $type = $importToken[3];
             $sql = "INSERT INTO\n                            {$serendipity['dbPrefix']}spamblock_bayes\n                                (token, ham, spam, type)\n                        VALUES\n                            ('{$token}', {$ham}, {$spam}, '{$type}')\n                        ON DUPLICATE KEY\n                            UPDATE\n                                ham = ham + VALUES(ham),\n                                spam = spam + VALUES(spam);";
             serendipity_db_query($sql);
             $result = mysql_error();
             if ($result != "") {
                 serendipity_db_end_transaction(false);
                 return $result;
             }
             if ($ham > 0) {
                 $this->set_config("{$type}_ham", $this->get_config("{$type}_ham", 0) + 1);
             }
             if ($spam > 0) {
                 $this->set_config("{$type}_spam", $this->get_config("{$type}_spam", 0) + 1);
             }
         }
     } else {
         if ($serendipity['dbType'] == 'sqlite') {
             foreach ($importDatabase as $importToken) {
                 $token = $importToken[0];
                 $ham = $importToken[1];
                 $spam = $importToken[2];
                 $type = $importToken[3];
                 $sql = "INSERT OR IGNORE INTO\n                            {$serendipity['dbPrefix']}spamblock_bayes\n                                (token, ham, spam, type)\n                        VALUES\n                            ('{$token}', 0, 0, '{$type}');";
                 serendipity_db_query($sql);
                 $sql = "UPDATE\n                            {$serendipity['dbPrefix']}spamblock_bayes\n                        SET\n                            ham = ham + {$ham}, spam = spam + {$spam}\n                        WHERE\n                            token = '{$token}' AND type = '{$type}'";
                 serendipity_db_query($sql);
                 if ($ham > 0) {
                     $this->set_config("{$type}_ham", $this->get_config("{$type}_ham", 0) + 1);
                 }
                 if ($spam > 0) {
                     $this->set_config("{$type}_spam", $this->get_config("{$type}_spam", 0) + 1);
                 }
             }
         } else {
             foreach ($importDatabase as $importToken) {
                 $token = $importToken[0];
                 $ham = $importToken[1];
                 $spam = $importToken[2];
                 $type = $importToken[3];
                 $sql = "SELECT\n                            token\n                        FROM\n                            {$serendipity['dbPrefix']}spamblock_bayes\n                        WHERE\n                             token = '{$token}' AND type = '{$type}'";
                 $tester = serendipity_db_query($sql);
                 if (empty($tester[0])) {
                     $sql = "INSERT INTO\n                            {$serendipity['dbPrefix']}spamblock_bayes\n                                (token, ham, spam, type)\n                        VALUES('{$token}', {$ham}, {$spam}, '{$type}')";
                 } else {
                     $sql = "UPDATE {$serendipity['dbPrefix']}spamblock_bayes\n                        SET\n                            ham = ham + {$ham},\n                            spam = spam + {$spam}\n                        WHERE token = '{$token}' AND type = '{$type}'";
                 }
                 serendipity_db_query($sql);
                 #NOTE: We do this wrongly, but as good as possible (really?).
                 #      The config is supposed to store the amount of
                 #      ham/spam-comments, not a guess of that.
                 if ($ham > 0) {
                     $this->set_config("{$type}_ham", $this->get_config("{$type}_ham", 0) + 1);
                 }
                 if ($spam > 0) {
                     $this->set_config("{$type}_spam", $this->get_config("{$type}_spam", 0) + 1);
                 }
             }
         }
     }
     serendipity_db_end_transaction(true);
     return true;
 }
예제 #2
0
 function import()
 {
     global $serendipity;
     $force = $this->data['mt_force'] == 'true';
     if ($this->data['autodiscovery'] == 'false') {
         $serendipity['noautodiscovery'] = 1;
     }
     // Rewritten to parse the file line by line. Can save quite some
     // memory on large blogs
     //$contents   = file_get_contents($_FILES['serendipity']['tmp_name']['import']['mt_dat']);
     $this->categories = serendipity_fetchCategories();
     $tasks = array();
     $entries = array();
     if (empty($_FILES['serendipity']['tmp_name']['import']['mt_dat'])) {
         $fh = fopen('/tmp/mt.dat', 'r');
     } else {
         $fh = fopen($_FILES['serendipity']['tmp_name']['import']['mt_dat'], 'r');
     }
     $entry = array();
     $el = "";
     $c_el = "";
     $skip = false;
     $is_comment = false;
     $is_trackback = false;
     $nofetch = false;
     while (!feof($fh)) {
         if ($nofetch === false) {
             $this->debug('Next line');
             $line = $this->decode(fgets($fh, 8192));
         } else {
             $this->debug('NO Next line');
             // Keep line from previous run.
             $nofetch = false;
         }
         if ($is_comment || $is_trackback) {
             $this->debug("COMMENT/TRACKBACK mode is active.");
             if (preg_match('/^--------/', $line)) {
                 $this->debug("Next full section requested.");
                 $is_comment = $is_trackback = false;
             } elseif (preg_match('/^-----/', $line)) {
                 $this->debug("Next partial section requested.");
                 if ($is_trackback) {
                     $this->debug("Parsing trackback.");
                     $entry['s9y_comments'][] = $this->doCommentWork($comment, $tasks, 'TRACKBACK');
                 } elseif ($is_comment) {
                     $this->debug("Parsing comment.");
                     $entry['s9y_comments'][] = $this->doCommentWork($comment, $tasks, 'NORMAL');
                 }
                 $el = $c_el = "";
             }
         }
         if ($skip && !preg_match('/^--------/', $line)) {
             $this->debug("No next section match, and skip is activated. Skipping '{$line}'");
             continue;
         }
         if (preg_match('/^--------/', $line)) {
             // We found the end marker of the current entry. Add to entries-Array
             $this->debug("End marker found. Parsing full entry.");
             $entries[] = $this->doEntryWork($entry, $tasks);
             $entry = array();
             $el = "";
             $c_el = "";
             $skip = false;
             $is_comment = false;
             $is_trackback = false;
         } elseif (preg_match('/^-----/', $line)) {
             $this->debug("New section match. Current EL: {$el}");
             unset($el);
             # DEBUG!
             if (empty($el)) {
                 $line = $this->decode(fgets($fh, 8192));
                 $this->debug("Inspecting next line: {$line}");
                 $tline = trim($line);
                 while (($is_comment || $is_trackback) && empty($tline)) {
                     $line = $this->decode(fgets($fh, 8192));
                     $tline = trim($line);
                     $this->debug("Continuing inspecting next line: {$line}");
                 }
                 if (preg_match('/^--------/', $line)) {
                     $this->debug('Next line is new element. End marker found. Parsing full entry.');
                     $entries[] = $this->doEntryWork($entry, $tasks);
                     $entry = array();
                     $el = "";
                     $c_el = "";
                     $skip = false;
                     $is_comment = false;
                     $is_trackback = false;
                 } elseif (preg_match('/^([A-Z\\s]+):/', $line, $matches)) {
                     $this->debug("Match result: {$matches['1']}");
                     if ($matches[1] == 'COMMENT') {
                         $this->debug("Marking COMMENT.");
                         $is_comment = true;
                         $is_trackback = false;
                         $comment = array();
                         $skip = false;
                     } elseif ($matches[1] == 'PING') {
                         $this->debug("Marking TRACKBACK");
                         $is_comment = false;
                         $is_trackback = true;
                         $comment = array();
                         $skip = false;
                     }
                     $this->debug("Setting EL to {$matches[1]}");
                     $el = $matches[1];
                     $c_el = "";
                 } else {
                     $this->debug("Could not parse next line. Keeping it for next cycle.");
                     $nofetch = true;
                 }
             } else {
                 $this->debug("Resetting EL to an empty string");
                 $el = $c_el = "";
             }
         } elseif (empty($el)) {
             $this->debug("EL is empty. Line is '{$line}'");
             $content = "";
             if (preg_match('/^([A-Z\\s]+):\\s+(.*)$/s', $line, $matches)) {
                 $this->debug("Section match {$matches[1]} found, input: {$matches[2]}");
                 $c_el = $matches[1];
                 $content = $matches[2];
             } elseif (!empty($c_el)) {
                 $this->debug("Still in subsection of previous run: {$c_el}.");
                 $content = trim($line);
             }
             if (!empty($content)) {
                 if ($is_comment || $is_trackback) {
                     $this->debug("Appending to comments: {$line}");
                     $comment[$c_el] = $content;
                 } else {
                     $this->debug("Appending to entry: {$line}");
                     if (isset($entry[$c_el])) {
                         $entry[$c_el] .= "" . $content;
                     } else {
                         $entry[$c_el] = $content;
                     }
                 }
             }
         } elseif ($is_comment || $is_trackback) {
             $this->debug("Appending Line in current Element {$el} to comments: {$line}");
             $comment[$el] .= $line;
         } else {
             $this->debug("Appending Line in current Element {$el} to entries: {$line}");
             $entry[$el] .= $line;
         }
     }
     fclose($fh);
     if (!sizeof($tasks) || $force == true) {
         serendipity_db_begin_transaction();
         foreach ($entries as $entry) {
             #echo '<pre>' . printR_($entry, true) . '</pre><br />';
             #continue;
             if (empty($entry['authorid'])) {
                 $entry['authorid'] = $serendipity['authorid'];
                 $entry['author'] = $serendipity['realname'];
             }
             if (!isset($entry['isdraft'])) {
                 $entry['isdraft'] = 'false';
             }
             if (!isset($entry['allow_comments'])) {
                 $entry['allow_comments'] = 'true';
             }
             $comments = $entry['s9y_comments'];
             $entryprops = $entry['props'];
             unset($entry['props']);
             unset($entry['s9y_comments']);
             if (!is_int($r = serendipity_updertEntry($entry))) {
                 echo '<div class="serendipityAdminMsgError"><img style="width: 22px; height: 22px; border: 0px; padding-right: 4px; vertical-align: middle" src="' . serendipity_getTemplateFile('admin/img/admin_msg_error.png') . '" alt="" />' . $r . '</div>';
             } else {
                 $this->debug('Saved entry ' . $r . ' (' . $entry['title'] . ')');
                 $entry['id'] = $r;
                 foreach ((array) $comments as $comment) {
                     $comment['entry_id'] = $r;
                     if ($rc = serendipity_db_insert('comments', $comment)) {
                         $cid = serendipity_db_insert_id('comments', 'id');
                         serendipity_approveComment($cid, $entry['id'], true);
                     } else {
                         echo '<div class="serendipityAdminMsgError"><img style="width: 22px; height: 22px; border: 0px; padding-right: 4px; vertical-align: middle" src="' . serendipity_getTemplateFile('admin/img/admin_msg_error.png') . '" alt="" />' . $rc . '</div>';
                     }
                 }
                 // Let the plugins do some additional stuff. Here it's used with
                 // event_entryproperties in mind to setup the nl2br-stuff
                 serendipity_plugin_api::hook_event('backend_import_entry', $entry, $entryprops);
             }
         }
         serendipity_db_end_transaction(true);
         return true;
     } else {
         return '<ul><li>' . implode('</li><li>', array_unique($tasks)) . '</li></ul>';
     }
 }