summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--admin.php2
-rw-r--r--editgedcoms.php434
-rw-r--r--export_gedcom.php4
-rw-r--r--import.php234
-rw-r--r--includes/classes/class_menubar.php2
-rw-r--r--includes/session.php2
-rw-r--r--setup.php9
-rw-r--r--uploadgedcom.php1169
8 files changed, 493 insertions, 1363 deletions
diff --git a/admin.php b/admin.php
index 98d1adddf1..0d55718206 100644
--- a/admin.php
+++ b/admin.php
@@ -146,7 +146,7 @@ echo WT_JS_START, 'function showchanges() {window.location.reload();}', WT_JS_EN
</tr>
<tr>
<td class="optionbox width50"><a
- href="editgedcoms.php"><?php echo i18n::translate('Manage GEDCOMs and edit Privacy');?></a><?php echo help_link('edit_gedcoms'); ?></td>
+ href="editgedcoms.php"><?php echo i18n::translate('GEDCOM administration');?></a><?php echo help_link('edit_gedcoms'); ?></td>
<td class="optionbox width50"><a
href="edit_merge.php"><?php echo i18n::translate('Merge records'); ?></a><?php echo help_link('help_edit_merge.php'); ?></td>
</tr>
diff --git a/editgedcoms.php b/editgedcoms.php
index 12fc7ebefd..928e53b1cf 100644
--- a/editgedcoms.php
+++ b/editgedcoms.php
@@ -5,9 +5,6 @@
* webtrees: Web based Family History software
* Copyright (C) 2010 webtrees development team.
*
- * Derived from PhpGedView
- * Copyright (C) 2002 to 2009 PGV Development Team. All rights reserved.
- *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -22,219 +19,286 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * This Page Is Valid XHTML 1.0 Transitional! > 12 September 2005
- *
- * @author PGV Development Team
- * @package webtrees
- * @subpackage Admin
* @version $Id$
*/
define('WT_SCRIPT_NAME', 'editgedcoms.php');
require './includes/session.php';
-$all_gedcoms=get_all_gedcoms();
-asort($all_gedcoms);
-$action =safe_GET('action', array('delete', 'setdefault'));
-$ged =safe_GET('ged', $all_gedcoms);
-$default_ged=safe_GET('default_ged', $all_gedcoms);
-
-/**
- * Check if a gedcom file is downloadable over the internet
- *
- * @author opus27
- * @param string $gedfile gedcom file
- * @return mixed $url if file is downloadable, false if not
- */
-function check_gedcom_downloadable($gedfile) {
- $url = 'http://localhost/';
- if (substr($url,-1,1)!='/') $url .= '/';
- $url .= rawurlencode($gedfile);
- @ini_set('user_agent','MSIE 4\.0b2;'); // force a HTTP/1.0 request
- @ini_set('default_socket_timeout', '10'); // timeout
- $handle = @fopen ($url, 'r');
- if ($handle==false) return false;
- // open successfull : now make sure this is a GEDCOM file
- $txt = fread ($handle, 80);
- fclose($handle);
- if (strpos($txt, ' HEAD')==false) return false;
- return $url;
-}
-
-//-- make sure that they have admin status before they can use this page
-//-- otherwise have them login again
+// The gedcom admin page is for gedcom administrators only!
if (!WT_USER_GEDCOM_ADMIN) {
header('Location: login.php?url=editgedcoms.php');
exit;
}
-if ($action=='delete') {
- delete_gedcom(get_id_from_gedcom($ged));
- // Reload this page, otherwise the page header will still reference the now-deleted gedcom
- header('Location: editgedcoms.php');
-}
-print_header(i18n::translate('GEDCOM Administration'));
-echo '<center>';
+// Which directory contains our data files?
+$INDEX_DIRECTORY=get_site_setting('INDEX_DIRECTORY');
-if (($action=='setdefault') && in_array($default_ged, $all_gedcoms)) {
- set_site_setting('DEFAULT_GEDCOM', $default_ged);
- $DEFAULT_GEDCOM=$default_ged;
-} else {
- $DEFAULT_GEDCOM=get_site_setting('DEFAULT_GEDCOM');
-}
-?>
-<h2><?php echo i18n::translate('Current GEDCOMs'); ?></h2>
-<form name="defaultform" method="get" action="editgedcoms.php">
-<input type="hidden" name="action" value="setdefault" />
-<?php
-// Default gedcom choice
-echo '<br />';
-if (WT_USER_IS_ADMIN && count($all_gedcoms)>1) {
- echo i18n::translate('Default GEDCOM'), ' ', help_link('default_gedcom');
- echo '<select name="default_ged" class="header_select" onchange="document.defaultform.submit();">';
- if (!in_array($DEFAULT_GEDCOM, $all_gedcoms)) {
- echo '<option value="" selected="selected" onclick="document.defaultform.submit();">', htmlspecialchars($DEFAULT_GEDCOM), '</option>';
- }
- foreach ($all_gedcoms as $ged_id=>$ged_name) {
- echo '<option value="', urlencode($ged_name), '"';
- if ($DEFAULT_GEDCOM==$ged_name) echo ' selected="selected"';
- echo ' onclick="document.defaultform.submit();">';
- echo PrintReady(get_gedcom_setting($ged_id, 'title')).'</option>';
- }
- echo '</select><br /><br />';
+function import_gedcom_file($gedcom_id, $file_name) {
+ global $TBLPREFIX;
+
+ $fp=fopen($file_name, 'rb');
+ WT_DB::exec("START TRANSACTION");
+ WT_DB::prepare(
+ "UPDATE {$TBLPREFIX}gedcom".
+ " SET import_gedcom=?, import_offset=1".
+ " WHERE gedcom_id=?"
+ )
+ ->bindParam(1, $fp, PDO::PARAM_LOB)
+ ->bindParam(2, $gedcom_id, PDO::PARAM_INT)
+ ->execute();
+ WT_DB::exec("COMMIT");
+ fclose($fp);
}
-echo'<a href="editgedcoms.php?check_download=true">', i18n::translate('Check if GEDCOM files are downloadable'), '</a>', help_link('SECURITY_CHECK_GEDCOM_DOWNLOADABLE');
-// Print table heading
-if (WT_USER_IS_ADMIN) {
- echo '<table class="gedcom_table"><tr><td class="list_label" width="33%">';
- echo '<a href="editconfig_gedcom.php?source=add_form">', i18n::translate('Add GEDCOM'), '</a>'.help_link('help_addgedcom.php');
- echo '</td><td class="list_label">';
- echo '<a href="editconfig_gedcom.php?source=upload_form">', i18n::translate('Upload GEDCOM'), '</a>'.help_link('help_uploadgedcom.php');
- echo '</td><td class="list_label">';
- echo '<a href="editconfig_gedcom.php?source=add_new_form">', i18n::translate('Create a new GEDCOM'), '</a>'.help_link('help_addnewgedcom.php');
- echo '</td></tr></table>';
+// Process GET actions
+switch (safe_GET('action')) {
+case 'delete':
+ $ged=safe_GET('ged');
+ delete_gedcom(get_id_from_gedcom($ged));
+ break;
}
-echo '<table class="gedcom_table">';
-$GedCount = 0;
-// Print the table of available GEDCOMs
-foreach ($all_gedcoms as $ged_id=>$ged_name) {
- if (userGedcomAdmin(WT_USER_ID, $ged_id)) {
- // Row 0: Separator line
- if ($GedCount!=0) {
- echo '<tr><td colspan="7"><br /><hr class="gedcom_table" /><br /></td></tr>';
+// Process POST actions
+switch (safe_POST('action')) {
+case 'setdefault':
+ set_site_setting('DEFAULT_GEDCOM', safe_POST('default_ged'));
+ break;
+case 'add_ged':
+ $ged_name=basename(safe_POST('ged_name'));
+ $gedcom_id=get_id_from_gedcom($ged_name);
+ // check it doesn't already exist before we create it
+ if (!$gedcom_id && file_exists($INDEX_DIRECTORY.$ged_name)) {
+ $gedcom_id=get_id_from_gedcom($ged_name, true);
+ import_gedcom_file($gedcom_id, $INDEX_DIRECTORY.$ged_name);
+ }
+ break;
+case 'new_ged':
+ $ged_name=basename(safe_POST('ged_name'));
+ $gedcom_id=get_id_from_gedcom($ged_name);
+ // check it doesn't already exist before we create it
+ if (!$gedcom_id) {
+ $gedcom_id=get_id_from_gedcom($ged_name, true);
+ WT_DB::prepare(
+ "UPDATE {$TBLPREFIX}gedcom".
+ " SET import_gedcom=?, import_offset=1".
+ " WHERE gedcom_id=?"
+ )->execute(array("0 HEAD\n0 @I1@ INDI\n1 NAME John /DOE/\n1 SEX M\n1 BIRT\n2 DATE 1 JAN 1850\n2 NOTE Edit this individual and replace with your own details\n0 TRLR\n", $gedcom_id));
+ }
+ break;
+case 'upload_ged':
+ foreach ($_FILES as $FILE) {
+ if ($FILE['error']==0 && is_readable($FILE['tmp_name'])) {
+ $ged_name=$FILE['name'];
+ $gedcom_id=get_id_from_gedcom($ged_name);
+ // check it doesn't already exist before we create it
+ if (!$gedcom_id) {
+ $gedcom_id=get_id_from_gedcom($ged_name, true);
+ import_gedcom_file($gedcom_id, $FILE['tmp_name']);
+ }
}
- $GedCount++;
+ }
+ break;
+case 'replace_upload':
+ $gedcom_id=safe_POST('gedcom_id');
+ // Make sure the gedcom still exists
+ if (get_gedcom_from_id($gedcom_id)) {
+ foreach ($_FILES as $FILE) {
+ if ($FILE['error']==0 && is_readable($FILE['tmp_name'])) {
+ import_gedcom_file($gedcom_id, $FILE['tmp_name']);
+ }
+ }
+ }
+ break;
+case 'replace_import':
+ $gedcom_id=safe_POST('gedcom_id');
+ // Make sure the gedcom still exists
+ if (get_gedcom_from_id($gedcom_id)) {
+ $ged_name=basename(safe_POST('ged_name'));
+ import_gedcom_file($gedcom_id, $INDEX_DIRECTORY.$ged_name);
+ }
+ break;
+}
- // Row 1: Heading
- echo '<tr><td colspan="1" class="list_label">', i18n::translate('GEDCOM title'), '</td>';
- echo '<td colspan="7" class="list_value_wrap">';
- if ($DEFAULT_GEDCOM==$ged_name) echo '<span class="label">';
- echo PrintReady(get_gedcom_setting($ged_id, 'title')).'&nbsp;&nbsp;';
- if ($TEXT_DIRECTION=='rtl') echo getRLM(), '('.$ged_id.')', getRLM();
- else echo getLRM(), '(', $ged_id, ')', getLRM();
- if ($DEFAULT_GEDCOM==$ged_name) echo '</span>';
- echo '&nbsp;&nbsp;<a href="', encode_url('editconfig_gedcom.php?source=replace_form&path='.get_gedcom_setting($ged_id, 'path')), '&oldged=', get_gedcom_setting($ged_id, 'gedcom'), '">', i18n::translate('Upload Replacement'), '</a></td></tr>';
+$gedcoms=WT_DB::prepare(
+ "SELECT gedcom_id, gedcom_name, import_offset".
+ " FROM {$TBLPREFIX}gedcom".
+ " ORDER BY gedcom_name"
+)->fetchAll();
+$all_gedcoms=array();
+foreach ($gedcoms as $gedcom) {
+ $all_gedcoms[$gedcom->gedcom_id]=$gedcom->gedcom_name;
+}
- // Row 2: GEDCOM file name & functions
- echo '<tr><td valign="top">'; // Column 1 (row legend)
- echo i18n::translate('GEDCOM file');
- echo '</td>';
+print_header(i18n::translate('GEDCOM administration'));
+echo '<h2>', i18n::translate('GEDCOM administration'), '</h2>';
- echo '<td valign="top">'; // Column 2 (file name & notices)
- if (file_exists(get_gedcom_setting($ged_id, 'path'))) {
- if ($TEXT_DIRECTION=='ltr') echo get_gedcom_setting($ged_id, 'path'), ' (';
- else echo getLRM(), get_gedcom_setting($ged_id, 'path'), ' ', getRLM(), '(';
- printf('%.2fKB', (filesize(get_gedcom_setting($ged_id, 'path'))/1024));
- echo ')';
- /** deactivate [ 1573749 ]
- * -- activating based on a request parameter instead of a config parameter
- */
- if(!empty($_REQUEST['check_download'])){
- $url = check_gedcom_downloadable(get_gedcom_setting($ged_id, 'path'));
- if ($url!==false) {
- echo '<br /><span class="error">', i18n::translate('This GEDCOM file is downloadable over the internet!<br />Please see the SECURITY section of the <a href="readme.txt"><b>readme.txt</b></a> file to fix this problem'), ' :</span>';
- echo '<br /><a href="', $url, '">', $url, '</a>';
+// Process GET actions
+switch (safe_GET('action')) {
+case 'uploadform':
+case 'importform':
+ $gedcom_id=safe_GET('gedcom_id');
+ $gedcom_name=get_gedcom_from_id($gedcom_id);
+ // Check it exists
+ if (!$gedcom_name) {
+ break;
+ }
+ echo '<p>', i18n::translate('This will delete all the genealogical data from <b>%s</b> and replace it with data from another GEDCOM.', $gedcom_name), '</p>';
+ echo '<form name="replaceform" method="post" enctype="multipart/form-data" action="', WT_SCRIPT_NAME, '" onsubmit="if (document.replaceform.ged_name.value!=\'', htmlspecialchars($gedcom_name), '\') return confirm(\'', htmlspecialchars(i18n::translate('You have selected a GEDCOM with a different name. Is this correct?')), '\'); else return true;">';
+ echo '<input type="hidden" name="gedcom_id" value="', $gedcom_id, '" />';
+ if (safe_GET('action')=='uploadform') {
+ echo '<input type="hidden" name="action" value="replace_upload" />';
+ echo '<input type="file" name="ged_name" />';
+ echo '<br /><br /><input type="submit" value="', i18n::translate('Save'), '" /></form>';
+ } else {
+ echo '<input type="hidden" name="action" value="replace_import" />';
+ $d=opendir($INDEX_DIRECTORY);
+ $files=array();
+ while (($f=readdir($d))!==false) {
+ if (is_file($INDEX_DIRECTORY.$f) && is_readable($INDEX_DIRECTORY.$f)) {
+ $fp=fopen($INDEX_DIRECTORY.$f, 'rb');
+ $header=fread($fp, 64);
+ fclose($fp);
+ if (preg_match('/^('.WT_UTF8_BOM.')?0 *HEAD/', $header)) {
+ $files[]=$f;
}
- else echo '<br /><b>', i18n::translate('%s cannot be downloaded.', get_gedcom_setting($ged_id, 'path')), '</b><br />';
}
}
- else echo '<span class="error">', i18n::translate('File not found.'), '</span>';
- echo '</td>';
-
- echo '<td valign="top">'; // Column 3 (Import action)
- echo '<a href="', encode_url("uploadgedcom.php?GEDFILENAME={$ged_name}&verify=verify_gedcom&action=add_form&import_existing=1"), '">', i18n::translate('Import'), '</a>';
- if (!get_gedcom_setting($ged_id, 'imported')) {
- echo '<br /><span class="error">', i18n::translate('This GEDCOM has not yet been imported.'), '</span>';
+ if ($files) {
+ echo $INDEX_DIRECTORY, '<select name="ged_name" />';
+ foreach ($files as $file) {
+ echo '<option value="', htmlspecialchars($file), '"';
+ if ($file==$gedcom_name) {
+ echo ' selected="selected"';
+ }
+ echo'>', htmlspecialchars($file), '</option>';
+ }
+ echo '</select>';
+ echo '<br /><br /><input type="submit" value="', i18n::translate('Save'), '" /></form>';
+ } else {
+ echo '<p>', i18n::translate('No GEDCOM files found. You need to copy files to the <b>%s</b> directory on your server.', $INDEX_DIRECTORY);
}
- echo '&nbsp;&nbsp;</td>';
-
- echo '<td valign="top">'; // Column 4 (Export action)
- echo '<a href="javascript:" onclick="window.open(\'', encode_url("export_gedcom.php?export={$ged_name}"), '\', \'_blank\',\'left=50,top=50,width=500,height=500,resizable=1,scrollbars=1\');">', i18n::translate('Export'), '</a>';
- echo '</td>';
-
- echo '<td valign="top">'; // Column 5 (Delete action)
- echo '<a href="', encode_url("editgedcoms.php?action=delete&ged={$ged_name}"), "\" onclick=\"return confirm('".i18n::translate('Are you sure you want to delete this GEDCOM'), ' ', str_replace("'", "\'", $ged_name)."?');\">", i18n::translate('Delete'), '</a>';
- echo '&nbsp;&nbsp;';
- echo '</td>';
-
- echo '<td valign="top">'; // Column 6 (Download action)
- echo '<a href="', encode_url("downloadgedcom.php?ged={$ged_name}"), '">', i18n::translate('Download'), '</a>';
- echo '&nbsp;&nbsp;';
- echo '</td>';
-
- echo '<td valign="top">'; // Column 7 (Check action)
- echo '<a href="', encode_url("gedcheck.php?ged={$ged_name}"), '">', i18n::translate('Check'), '</a>';
- echo '&nbsp;&nbsp;';
- echo '</td>';
-
- echo '</tr>';
-
-
- // Row 3: Configuration file
- echo '<tr>';
- echo '<td valign="top">'; // Column 1 (row legend)
- echo i18n::translate('Configuration file');
- echo '</td>';
-
- echo '<td valign="top">'; // Column 2 (file name & notices)
- echo getLRM() . get_config_file($ged_id);
- echo '</td>';
-
- echo '<td valign="top">'; // Column 3 (Edit action)
- echo '<a href="', encode_url("editconfig_gedcom.php?ged={$ged_name}"), '">', i18n::translate('Edit'), '</a>';
- echo '</td>';
-
- echo '<td colspan="4" valign="top">'; // Columns 4-7 (blank)
- echo '&nbsp;';
- echo '</td>';
- echo '</tr>';
+ }
+ echo '</form>';
+ echo '<form name="cancel" method="get" action="', WT_SCRIPT_NAME, '"><input type="submit" value="', i18n::translate('Cancel'), '" /></form>';
+ print_footer();
+ exit;
+}
- // Row 4: Privacy File
- echo '<tr>';
- echo '<td valign="top">'; // Column 1 (row legend)
- echo i18n::translate('Privacy file');
- echo '</td>';
- echo '<td valign="top">'; // Column 2 (file name & notices)
- echo getLRM(), get_privacy_file($ged_id);
- echo '</td>';
+// List the gedcoms available to this user
+foreach ($gedcoms as $gedcom) {
+ if (userGedcomAdmin(WT_USER_ID, $gedcom->gedcom_id)) {
- echo '<td valign="top">'; // Column 3 (Edit action)
- echo '<a href="', encode_url("edit_privacy.php?ged={$ged_name}"), '">', i18n::translate('Edit'), '</a>';
- echo '</td>';
+ echo
+ '<table class="gedcom_table" width="100%">',
+ '<tr><td class="list_label" width="20%">', i18n::translate('GEDCOM name'),
+ '</td><td class="list_value"><a href="index.php?ctype=gedcom&ged="', urlencode($gedcom->gedcom_name), '">', htmlspecialchars($gedcom->gedcom_name), ' - ',
+ htmlspecialchars(get_gedcom_setting($gedcom->gedcom_id, 'title')), '</a>',
+ '</td></tr><tr><td class="list_label">', i18n::translate('GEDCOM administration'),
+ '</td><td class="list_value">';
- echo '<td colspan="4" valign="top">'; // Columns 4-7 (blank)
- echo '&nbsp;';
- echo '</td>';
- echo '</tr>';
+ // The third row shows an optional progress bar and a list of maintenance options
+ if ($gedcom->import_offset>0) {
+ echo
+ '<div id="import', $gedcom->gedcom_id, '"></div>',
+ WT_JS_START,
+ '$("#import', $gedcom->gedcom_id, '").load("import.php?gedcom_id=', $gedcom->gedcom_id, '")',
+ WT_JS_END;
+ }
+ echo
+ '<table border="0" width="100%"><tr align="center">',
+ // configuration
+ '<td><a href="editconfig_gedcom.php?ged=', urlencode($gedcom->gedcom_name), '">', i18n::translate('Configuration'), '</a>',
+ help_link('gedcom_configfile'),
+ '</td>',
+ // privacy
+ '<td><a href="edit_privacy.php?ged=', urlencode($gedcom->gedcom_name), '">', i18n::translate('Privacy'), '</a>',
+ help_link('edit_privacy'),
+ '</td>',
+ // export
+ '<td><a href="javascript:" onclick="window.open(\'', encode_url("export_gedcom.php?export={$gedcom->gedcom_name}"), '\', \'_blank\',\'left=50,top=50,width=500,height=500,resizable=1,scrollbars=1\');">', i18n::translate('Export'), '</a>',
+ help_link('export_gedcom.php'),
+ '</td>',
+ // import
+ '<td><a href="', WT_SCRIPT_NAME, '?action=importform&amp;gedcom_id=', $gedcom->gedcom_id, '">', i18n::translate('Import'), '</a>',
+ help_link('import_gedcom.php'),
+ '</td>',
+ // download
+ '<td><a href="downloadgedcom.php?ged=', urlencode($gedcom->gedcom_name),'">', i18n::translate('Download'), '</a>',
+ help_link('ownload_gedcom'),
+ '</td>',
+ // upload
+ '<td><a href="', WT_SCRIPT_NAME, '?action=uploadform&amp;gedcom_id=', $gedcom->gedcom_id, '">', i18n::translate('Upload'), '</a>',
+ help_link(''),
+ '</td>',
+ // delete
+ '<td><a href="editgedcoms.php?action=delete&ged=', urlencode($gedcom->gedcom_name), '" onclick="return confirm(\''.htmlspecialchars(i18n::translate('Permanently delete the GEDCOM %s and all its settings?', $gedcom->gedcom_name)),'\');">', i18n::translate('Delete'), '</a>',
+ help_link('delete_gedcom'),
+ '</td></tr></table></td></tr></table><br />';
}
}
-echo '</table></form></center>';
-require get_config_file(WT_GED_ID);
+// Options for creating new gedcoms and setting defaults
+if (WT_USER_IS_ADMIN) {
+ echo
+ '<br/><table class="gedcom_table"><tr>',
+ '<td class="list_label">', i18n::translate('Default GEDCOM'), help_link('default_gedcom'), '</td>',
+ '<td class="list_label">', i18n::translate('Add a new GEDCOM'), help_link('help_addgedcom.php'), '</td>',
+ '<td class="list_label">', i18n::translate('Upload a new GEDCOM'), help_link('help_uploadgedcom.php'), '</td>',
+ '<td class="list_label">', i18n::translate('Create a new GEDCOM'), help_link('help_addnewgedcom.php'), '</td>',
+ '</tr><tr>',
+ '<td class="list_value_wrap">',
+ '<form name="defaultform" method="post" action="', WT_SCRIPT_NAME, '">',
+ '<input type="hidden" name="action" value="setdefault" />',
+ '<select name="default_ged" class="header_select" onchange="document.defaultform.submit();">';
+ $DEFAULT_GEDCOM=get_site_setting('DEFAULT_GEDCOM');
+ foreach ($gedcoms as $gedcom) {
+ echo '<option value="', urlencode($gedcom->gedcom_name), '"';
+ if ($DEFAULT_GEDCOM==$gedcom->gedcom_name) echo ' selected="selected"';
+ echo '>', htmlspecialchars($gedcom->gedcom_name), '</option>';
+ }
+ echo
+ '</select>',
+ '</form></td>',
+ '<td class="list_value_wrap">',
+ '<form name="addform" method="post" action="', WT_SCRIPT_NAME, '">',
+ $INDEX_DIRECTORY,
+ '<input type="hidden" name="action" value="add_ged" />',
+ '<select name="ged_name" onchange="document.addform.submit();" />',
+ '<option>', i18n::translate('Select a file'), '</option>',
+ $d=opendir($INDEX_DIRECTORY);
+ $files=false;
+ while (($f=readdir($d))!==false) {
+ if (!in_array($f, $all_gedcoms) && is_readable($INDEX_DIRECTORY.$f)) {
+ $fp=fopen($INDEX_DIRECTORY.$f, 'rb');
+ $header=fread($fp, 64);
+ fclose($fp);
+ if (preg_match('/^('.WT_UTF8_BOM.')?0 *HEAD/', $header)) {
+ echo '<option>', htmlspecialchars($f), '</option>';
+ $files=true;
+ }
+ }
+ }
+ echo
+ '</select>',
+ '</form>',
+ '</td>',
+ '<td class="list_value_wrap">',
+ '<form name="uploadform" method="post" action="', WT_SCRIPT_NAME, '" enctype="multipart/form-data">',
+ '<input type="hidden" name="action" value="upload_ged" />',
+ '<input type="file" name="ged_name" onchange="document.uploadform.submit();" />',
+ '</form>',
+ '</td>',
+ '<td class="list_value_wrap">',
+ '<form name="createform" method="post" action="', WT_SCRIPT_NAME, '">',
+ '<input type="hidden" name="action" value="new_ged" />',
+ '<input name="ged_name" />',
+ ' <input type="submit" value="', i18n::translate('Save') , '"/>',
+ '</form>',
+ '</td>',
+ '</tr></table><br/>';
+}
print_footer();
-?>
diff --git a/export_gedcom.php b/export_gedcom.php
index ea950751c6..e4f62ca8a0 100644
--- a/export_gedcom.php
+++ b/export_gedcom.php
@@ -52,7 +52,7 @@ print_simple_header(i18n::translate('Export'));
if ($export) {
$ged_id = get_id_from_gedcom($export);
- $filename = get_gedcom_setting($ged_id, 'path');
+ $filename = get_site_setting('INDEX_DIRECTORY').$export;
echo '<h1>', i18n::translate('Export'), '</h1>';
echo '<p>', htmlspecialchars(filename_decode($export)), ' => ', $filename, '</p>';
flush();
@@ -71,7 +71,7 @@ if ($export) {
$end = microtime(true);
fclose($gedout);
- unlink($filename);
+ @unlink($filename);
rename($filename.'.tmp', $filename);
$stat = stat($filename);
echo sprintf('<p>%d bytes, %0.3f seconds</p>', $stat['size'], $end-$start);
diff --git a/import.php b/import.php
new file mode 100644
index 0000000000..5a7855478a
--- /dev/null
+++ b/import.php
@@ -0,0 +1,234 @@
+<?php
+/**
+ * Perform an incremental import of a gedcom file.
+ *
+ * For each gedcom that needs importing, editgedcoms.php will create
+ * a <div id="importNNN"></div>, where NNN is the gedcom ID.
+ * It will then call import.php to load the div's contents using AJAX.
+ *
+ * We start importing at position wt_gedcom.import_offset and continue
+ * for a couple of seconds. When we've finished we set import_offset to
+ * zero to indicate success.
+ *
+ * webtrees: Web based Family History software
+ * Copyright (C) 2010 webtrees development team.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @version $Id$
+ */
+
+define('WT_SCRIPT_NAME', 'import.php');
+require './includes/session.php';
+
+require_once WT_ROOT.'includes/functions/functions_import.php';
+
+// Don't use ged=XX as we want to be able to run without changing the current gedcom.
+// This will let us load several gedcoms together, or to edit one while loading another.
+$gedcom_id=safe_GET('gedcom_id');
+
+if (!userGedcomAdmin(WT_USER_ID, $gedcom_id)) {
+ header('HTTP/1.0 403 Forbidden');
+ exit;
+}
+
+// Don't allow the user to cancel the request. We do not want
+// to be left with an incomplete transaction, as this could cause a
+// timeout error in another session.
+ignore_user_abort(true);
+
+// Run in a transaction, and make sure we are the only ones importing this gedcom
+WT_DB::exec("START TRANSACTION");
+
+// What is the current import status?
+$row=WT_DB::prepare(
+ "SELECT import_offset, LENGTH(import_gedcom) AS import_total FROM {$TBLPREFIX}gedcom WHERE gedcom_id=? FOR UPDATE"
+)->execute(array($gedcom_id))->fetchOneRow();
+
+if (!$row) {
+ // No such gedcom? Deleted in another session? die quietly
+ WT_DB::exec("COMMIT");
+ exit;
+}
+
+header('Content-type: text/html; charset=UTF-8');
+
+if ($row->import_offset==0 || $row->import_total==0) {
+ // Finished? Show the maintenance links, similar to editgedcoms.php
+ WT_DB::exec("COMMIT");
+ echo "DONE";
+ exit;
+}
+
+// Calculate progress so far
+$percent=100*(($row->import_offset-1) / $row->import_total);
+if ($row->import_offset==1) {
+ $status=i18n::translate('Initialising ...');
+} else {
+ $status=sprintf('%.1f%%', $percent);
+}
+
+echo
+ '<div id="progressbar"><div style="position:absolute;">', htmlspecialchars($status), '</div></div>',
+ WT_JS_START,
+ '$("#progressbar").progressbar({value: ', round($percent, 1), '});',
+ WT_JS_END,
+flush();
+
+// Run for one second. This keeps the resource requirements low.
+for ($end_time=microtime(true)+1.0; microtime(true)<$end_time; ) {
+ // If we are at the start position, do some tidying up
+ if ($row->import_offset==1) {
+ // Delete any existing genealogical data
+ empty_database($gedcom_id, false);
+ set_gedcom_setting($gedcom_id, 'imported', false);
+ // Remove any byte-order-mark
+ WT_DB::prepare(
+ "UPDATE {$TBLPREFIX}gedcom".
+ " SET import_gedcom=TRIM(LEADING ? FROM import_gedcom)".
+ " WHERE gedcom_id=?"
+ )->execute(array(WT_UTF8_BOM, $gedcom_id));
+ // Convert line endings. Don't convert \r\n - it is very slow. Just deal
+ // with empty records later.
+ WT_DB::prepare(
+ "UPDATE {$TBLPREFIX}gedcom".
+ " SET import_gedcom=REPLACE(import_gedcom, '\r', '\n')".
+ " WHERE gedcom_id=?"
+ )->execute(array($gedcom_id));
+ // Fetch the header record
+ $data=WT_DB::prepare(
+ "SELECT LEFT(import_gedcom, CASE LOCATE('\n0', import_gedcom, 2) WHEN 0 THEN LENGTH(import_gedcom) ELSE LOCATE('\n0', import_gedcom, 2) END)".
+ " FROM {$TBLPREFIX}gedcom".
+ " WHERE gedcom_id=?"
+ )->execute(array($gedcom_id))->fetchOne();
+ WT_DB::prepare(
+ "UPDATE {$TBLPREFIX}gedcom".
+ " SET import_offset=?".
+ " WHERE gedcom_id=?"
+ )->execute(array(strlen($data)+1, $gedcom_id));
+ if (substr($data, 0, 6)!='0 HEAD') {
+ WT_DB::exec("ROLLBACK");
+ echo i18n::translate('Invalid GEDCOM file - no header record found.');
+ exit;
+ }
+ // What character set is this? Need to convert it to UTF8
+ if (preg_match('/\n1\s*CHAR(ACTER)\s+(.+)/', $data, $match)) {
+ $charset=strtoupper($match[1]);
+ } else {
+ $charset='ASCII';
+ }
+ // MySQL supports a wide range of collation conversions. These are ones that
+ // have been encountered "in the wild".
+ switch ($charset) {
+ case 'ANSI':
+ case 'ASCII':
+ WT_DB::prepare(
+ "UPDATE {$TBLPREFIX}gedcom".
+ " SET import_gedcom=CONVERT(CONVERT(import_gedcom USING ascii) USING utf8)".
+ " WHERE gedcom_id=?"
+ )->execute(array($gedcom_id));
+ break;
+ case 'IBMPC': // IBMPC could be anything. Mostly it means CP850.
+ case 'CP437':
+ case 'CP850':
+ // CP850 has extra letters with diacritics to replace box-drawing chars in CP437.
+ WT_DB::prepare(
+ "UPDATE {$TBLPREFIX}gedcom".
+ " SET import_gedcom=CONVERT(CONVERT(import_gedcom USING cp850) USING utf8)".
+ " WHERE gedcom_id=?"
+ )->execute(array($gedcom_id));
+ break;
+ case 'MACINTOSH':
+ // Convert from MAC Roman to UTF8.
+ WT_DB::prepare(
+ "UPDATE {$TBLPREFIX}gedcom".
+ " SET import_gedcom=CONVERT(CONVERT(import_gedcom USING macroman) USING utf8)".
+ " WHERE gedcom_id=?"
+ )->execute(array($gedcom_id));
+ break;
+ case 'UTF8':
+ case 'UTF-8':
+ // Already UTF-8 so nothing to do!
+ break;
+ case 'ANSEL':
+ // TODO: fisharebest has written a mysql stored procedure that converts ANSEL to UTF-8
+ default:
+ echo
+ WT_JS_START,
+ 'alert(', htmlspecialchars(i18n::translate('Error: cannot convert GEDCOM file from %s encoding to UTF-8 encoding.', $charset)), ');',
+ WT_JS_END;
+ break;
+ }
+ $data=preg_replace('/\n1 CHAR.*(\n[2-9].+)*/', '', $data)."\n1 CHAR UTF-8";
+ import_record(trim($data), $gedcom_id, false);
+ } else {
+ // Fetch the next block of data. At least 64KB, and ending on a record boundary.
+ $data=WT_DB::prepare(
+ "SELECT".
+ " CASE LOCATE('\n0', import_gedcom, import_offset+65536)".
+ " WHEN 0 THEN SUBSTR(import_gedcom FROM import_offset)".
+ " ELSE SUBSTR(import_gedcom FROM import_offset FOR LOCATE('\n0', import_gedcom, import_offset+65536)-import_offset)".
+ " END".
+ " FROM {$TBLPREFIX}gedcom".
+ " WHERE gedcom_id=?"
+ )->execute(array($gedcom_id))->fetchOne();
+ WT_DB::prepare(
+ "UPDATE {$TBLPREFIX}gedcom".
+ " SET import_offset=import_offset+?".
+ " WHERE gedcom_id=?"
+ )->execute(array(strlen($data), $gedcom_id));
+ echo WT_JS_START, WT_JS_END;
+ foreach (preg_split('/\n(?=0)/', $data) as $rec) {
+ if ($rec) {
+ import_record(trim($rec), $gedcom_id, false);
+ }
+ }
+ // Recalculate progress and update status bar.
+ /* This isn't working. These JS statements don't run until the script has finished. :-(
+ $row->import_offset+=strlen($data);
+ $percent=100*($row->import_offset / $row->import_total);
+ $status=sprintf('%.1f%%', $percent);
+ echo
+ WT_JS_START,
+ '$("#progress', $gedcom_id, '").attr("width", "', round($percent, 1), '%");',
+ '$("#status', $gedcom_id, '").html("', htmlspecialchars($status), '");',
+ WT_JS_END;
+ flush();
+ */
+ }
+}
+
+if ($row->import_offset>$row->import_total) {
+ // Done
+ set_gedcom_setting($gedcom_id, 'imported', true);
+ WT_DB::prepare(
+ "UPDATE {$TBLPREFIX}gedcom".
+ " SET import_offset=0".
+ " WHERE gedcom_id=?"
+ )->execute(array($gedcom_id));
+ echo
+ WT_JS_START,
+ '$("#import', $gedcom_id, '").toggle();',
+ '$("#actions', $gedcom_id, '").toggle();',
+ WT_JS_END;
+} else {
+ // Reload.....
+ echo
+ WT_JS_START,
+ '$("#import', $gedcom_id, '").load("import.php?gedcom_id=', $gedcom_id, '");',
+ WT_JS_END;
+}
+
+WT_DB::exec("COMMIT");
diff --git a/includes/classes/class_menubar.php b/includes/classes/class_menubar.php
index 617b32d459..04061264a9 100644
--- a/includes/classes/class_menubar.php
+++ b/includes/classes/class_menubar.php
@@ -153,7 +153,7 @@ class MenuBar
$submenu->addClass("submenuitem$ff", "submenuitem_hover$ff", "", "icon_small_admin");
$menu->addSubmenu($submenu);
//-- manage_gedcoms submenu
- $submenu = new Menu(i18n::translate('Manage GEDCOMs and edit Privacy'), "editgedcoms.php");
+ $submenu = new Menu(i18n::translate('GEDCOM administration'), "editgedcoms.php");
if (!empty($WT_IMAGES["admin"]["small"]))
$submenu->addIcon($WT_IMAGE_DIR."/".$WT_IMAGES["admin"]["small"]);
$submenu->addClass("submenuitem$ff", "submenuitem_hover$ff", "", "icon_small_admin");
diff --git a/includes/session.php b/includes/session.php
index 0c68fb548c..9549152f01 100644
--- a/includes/session.php
+++ b/includes/session.php
@@ -424,7 +424,7 @@ if (isset($SHOW_CONTEXT_HELP) && $show_context_help==='no') $_SESSION['show_cont
if (!isset($USE_THUMBS_MAIN)) $USE_THUMBS_MAIN = false;
if (WT_SCRIPT_NAME!='help_text.php') {
- if (!get_gedcom_setting(WT_GED_ID, 'imported') && !in_array(WT_SCRIPT_NAME, array('editconfig_gedcom.php', 'help_text.php', 'editgedcoms.php', 'downloadgedcom.php', 'uploadgedcom.php', 'login.php', 'siteconfig.php', 'admin.php', 'addnewgedcom.php', 'validategedcom.php', 'addmedia.php', 'importgedcom.php', 'client.php', 'edit_privacy.php', 'gedcheck.php', 'useradmin.php', 'export_gedcom.php', 'edit_changes.php'))) {
+ if (!get_gedcom_setting(WT_GED_ID, 'imported') && !in_array(WT_SCRIPT_NAME, array('editconfig_gedcom.php', 'help_text.php', 'editgedcoms.php', 'downloadgedcom.php', 'uploadgedcom.php', 'login.php', 'siteconfig.php', 'admin.php', 'addnewgedcom.php', 'validategedcom.php', 'addmedia.php', 'importgedcom.php', 'client.php', 'edit_privacy.php', 'gedcheck.php', 'useradmin.php', 'export_gedcom.php', 'edit_changes.php', 'import.php'))) {
header('Location: editgedcoms.php');
exit;
}
diff --git a/setup.php b/setup.php
index efa7f209a9..818d6732fc 100644
--- a/setup.php
+++ b/setup.php
@@ -589,8 +589,10 @@ try {
$TBLPREFIX=$_POST['tblpfx'];
$dbh->exec(
"CREATE TABLE IF NOT EXISTS {$TBLPREFIX}gedcom (".
- " gedcom_id INTEGER AUTO_INCREMENT NOT NULL,".
- " gedcom_name VARCHAR(255) NOT NULL,".
+ " gedcom_id INTEGER AUTO_INCREMENT NOT NULL,".
+ " gedcom_name VARCHAR(255) NOT NULL,".
+ " import_gedcom LONGBLOB NOT NULL DEFAULT '',".
+ " import_offset INTEGER UNSIGNED NOT NULL DEFAULT 1,".
" PRIMARY KEY (gedcom_id),".
" UNIQUE KEY ux1 (gedcom_name)".
") COLLATE utf8_unicode_ci ENGINE=InnoDB"
@@ -977,7 +979,6 @@ try {
$dbh->exec(
"INSERT IGNORE INTO {$TBLPREFIX}site_setting (setting_name, setting_value) VALUES ".
"('WT_SCHEMA_VERSION', '1'),".
- "('DEFAULT_GEDCOM', 'default.ged'),".
"('INDEX_DIRECTORY', 'data/'),".
"('AUTHENTICATION_MODULE', 'includes/authentication.php'),".
"('STORE_MESSAGES', '1'),".
@@ -988,7 +989,7 @@ try {
"('SESSION_SAVE_PATH', ''),".
"('SESSION_TIME', '7200'),".
"('SERVER_URL', ''),".
- "('LOGIN_URL', ''),".
+ "('LOGIN_URL', 'login.php'),".
"('MAX_VIEWS', '20'),".
"('MAX_VIEW_TIME', '1'),".
"('MEMORY_LIMIT', '".addcslashes($_POST['maxmem'], "'")."M'),".
diff --git a/uploadgedcom.php b/uploadgedcom.php
deleted file mode 100644
index 761b032f1c..0000000000
--- a/uploadgedcom.php
+++ /dev/null
@@ -1,1169 +0,0 @@
-<?php
-/**
- * Allow admin users to upload a new gedcom using a web interface.
- *
- * When importing a gedcom file, some of the gedcom structure is changed
- * so a new file is written during the import and then copied over the old
- * file.
- *
- * webtrees: Web based Family History software
- * Copyright (C) 2010 webtrees development team.
- *
- * Derived from PhpGedView
- * Copyright (C) 2002 to 2009 PGV Development Team. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * This Page Is Valid XHTML 1.0 Transitional! > 12 September 2005
- *
- * @author PGV Development Team
- * @package webtrees
- * @subpackage Admin
- * @version $Id$
- */
-
-// TODO: Progress bars don't show until </table> or </div>
-// TODO: Upload ZIP support alternative path and name
-
-// NOTE: $GEDFILENAME = The filename of the uploaded GEDCOM
-// NOTE: $action = Which form we should present
-// NOTE: $check = Which check to be performed
-// NOTE: $timelimit = The time limit for the import process
-// NOTE: $cleanup = If set to yes, the GEDCOM contains invalid tags
-// NOTE: $no_upload = When the user cancelled, we want to restore the original settings
-// NOTE: $path = The path to the GEDCOM file
-// NOTE: $continue = When the user decided to move on to the next step
-// NOTE: $import_existing = See if we are just importing an existing GEDCOM
-// NOTE: $replace_gedcom = When uploading a GEDCOM, user will be asked to replace an existing one. If yes, overwrite
-// NOTE: $bakfile = Name and path of the backupfile, this file is created if a file with the same name exists
-
-define('WT_SCRIPT_NAME', 'uploadgedcom.php');
-require './includes/session.php';
-require_once WT_ROOT.'includes/functions/functions_import.php';
-require_once WT_ROOT.'includes/functions/functions_export.php';
-
-if (!WT_USER_GEDCOM_ADMIN) {
- header("Location: login.php?url=uploadgedcom.php");
- exit;
-}
-
-// editconfig.php and uploadgedcom.php make extensive use of
-// import_request_variables and are heavily inter-dependent.
-@import_request_variables('cgp');
-
-@ini_set('zlib.output_compression','0');
-
-if (empty ($action)) $action = "upload_form";
-if (!isset ($path)) $path = "";
-if (!isset ($check)) $check = "";
-if (!isset ($error)) $error = "";
-if (!isset ($verify)) $verify = "";
-if (!isset ($import)) $import = false;
-if (!isset ($bakfile)) $bakfile = "";
-if (!isset ($cleanup_needed)) $cleanup_needed = false;
-if (!isset ($ok)) $ok = false;
-if (!isset ($startimport)) $startimport = false;
-if (!isset ($timelimit)) $timelimit = get_site_setting('MAX_EXECUTION_TIME');
-if (!isset ($importtime)) $importtime = 0;
-if (!isset ($no_upload)) $no_upload = false;
-if (!isset ($override)) $override = false;
-if ($no_upload == "cancel_upload" || $override == "no") $check = "cancel_upload";
-if (!isset ($exists)) $exists = false;
-if (!isset ($config_gedcom)) $config_gedcom = "";
-if (!isset ($continue)) $continue = false;
-if (!isset ($import_existing)) $import_existing = false;
-if (!isset($utf8convert)) $utf8convert = "no";
-if (isset($_REQUEST['keepmedia']) && $_REQUEST['keepmedia']=='yes') $keepmedia=true;
-else $keepmedia = false;
-
-// NOTE: GEDCOM was uploaded
-if ($check == "upload") {
- $verify = "verify_gedcom";
- $ok = true;
-}
-// NOTE: GEDCOM was added
-else if ($check == "add") {
- $verify = "verify_gedcom";
- $ok = true;
-} else if ($check == "add_new") {
- if (((!file_exists($INDEX_DIRECTORY.$GEDFILENAME)) && !file_exists($path.$GEDFILENAME)) || $override == "yes") {
- if ($path != "") $fp = fopen($path.$GEDFILENAME, "wb");
- else $fp = fopen($INDEX_DIRECTORY.$GEDFILENAME, "wb");
- if ($fp) {
- $newgedcom = gedcom_header($GEDFILENAME).
- "0 @I1@ INDI\n".
- "1 NAME Given Names /Surname/\n".
- "1 SEX M\n".
- "1 BIRT\n".
- "2 DATE 01 JAN 1850\n".
- "2 PLAC Click edit and change me\n".
- "0 TRLR\n";
- $newgedcom = preg_replace('/[\r\n]+/', WT_EOL, $newgedcom);
- fwrite($fp, $newgedcom);
- fclose($fp);
- $logline = AddToLog($GEDFILENAME." updated", 'config');
- $verify = "validate_form";
- $exists = true;
- // NOTE: Go straight to import, no other settings needed
- $xreftype = "NA";
- $utf8convert = "no";
- $ged = $GEDFILENAME;
- $startimport = "true";
- //-- set the current GEDCOM to be this new GEDCOM file
- //-- so that the import can proceed correctly
- $GEDCOM = $GEDFILENAME;
- $FILE = $GEDCOM;
- }
- } else {
- if ($path != "")
- $fp = fopen($path.$GEDFILENAME.".bak", "wb");
- else
- $fp = fopen($INDEX_DIRECTORY.$GEDFILENAME.".bak", "wb");
- if ($fp) {
- $newgedcom = gedcom_header($GEDFILENAME).
- "0 @I1@ INDI\n".
- "1 NAME Given Names /Surname/\n".
- "1 SEX M\n".
- "1 BIRT\n".
- "2 DATE 01 JAN 1850\n".
- "2 PLAC Click edit and change me\n".
- "0 TRLR\n";
- $newgedcom = preg_replace('/[\r\n]+/', WT_EOL, $newgedcom);
- fwrite($fp, $newgedcom);
- fclose($fp);
- if ($path != "")
- $bakfile = $path.$GEDFILENAME.".bak";
- else
- $bakfile = $INDEX_DIRECTORY.$GEDFILENAME.".bak";
- $ok = false;
- $verify = "verify_gedcom";
- $exists = true;
- }
- }
-} else
-if ($check == "cancel_upload") {
- if ($exists) {
- delete_gedcom(get_id_from_gedcom($GEDFILENAME));
- if ($action == "add_new_form")
- @ unlink($INDEX_DIRECTORY.$GEDFILENAME);
- }
- // NOTE: Cleanup everything no longer needed
- if (isset($bakfile) && file_exists($bakfile)) unlink($bakfile);
- $verify = "";
- unset($GEDFILENAME);
- $startimport = "";
- $import = false;
- $cleanup_needed = false;
- $noupload = true;
- header("Location: editgedcoms.php");
-}
-
-if ($cleanup_needed == "cleanup_needed" && $continue == i18n::translate('Continue')) {
- require_once WT_ROOT.'includes/functions/functions_tools.php';
-
- $filechanged = false;
- if (file_is_writeable(get_gedcom_setting(get_id_from_gedcom($GEDFILENAME), 'path')) && (file_exists(get_gedcom_setting(get_id_from_gedcom($GEDFILENAME), 'path')))) {
- $l_BOMcleanup = false;
- $l_headcleanup = false;
- $l_macfilecleanup = false;
- $l_lineendingscleanup = false;
- $l_placecleanup = false;
- $l_datecleanup = false;
- $l_isansi = false;
- $fp = fopen(get_gedcom_setting(get_id_from_gedcom($GEDFILENAME), 'path'), "rb");
- $fw = fopen($INDEX_DIRECTORY."/".$GEDFILENAME.".bak", "wb");
- //-- read the gedcom and test it in 8KB chunks
- while (!feof($fp)) {
- $fcontents = fread($fp, 1024 * 8);
- $lineend = "\n";
- if (need_macfile_cleanup()) {
- $l_macfilecleanup = true;
- $lineend = "\r";
- }
-
- //-- read ahead until the next line break
- $byte = "";
- while ((!feof($fp)) && ($byte != $lineend)) {
- $byte = fread($fp, 1);
- $fcontents .= $byte;
- }
-
- if (!$l_BOMcleanup && need_BOM_cleanup()) {
- BOM_cleanup();
- $l_BOMcleanup = true;
- }
-
- if (!$l_headcleanup && need_head_cleanup()) {
- head_cleanup();
- $l_headcleanup = true;
- }
-
- if ($l_macfilecleanup) {
- macfile_cleanup();
- }
-
- if (isset ($_POST["cleanup_places"]) && $_POST["cleanup_places"] == "YES") {
- if (($sample = need_place_cleanup()) !== false) {
- $l_placecleanup = true;
- place_cleanup();
- }
- }
-
- if (line_endings_cleanup()) {
- $filechanged = true;
- }
-
- if (isset ($_POST["datetype"])) {
- $filechanged = true;
- //month first
- date_cleanup($_POST["datetype"]);
- }
- /**
- if($_POST["xreftype"]!="NA") {
- $filechanged=true;
- xref_change($_POST["xreftype"]);
- }
- **/
- if (isset ($_POST["utf8convert"]) == "YES") {
- $filechanged = true;
- convert_ansi_utf8();
- }
- fwrite($fw, $fcontents);
- }
- fclose($fp);
- fclose($fw);
- copy($INDEX_DIRECTORY."/".$GEDFILENAME.".bak", get_gedcom_setting(get_id_from_gedcom($GEDFILENAME), 'path'));
- $cleanup_needed = false;
- $import = "true";
- } else {
- $error = i18n::translate('The GEDCOM file, <b>%s</b>, is not writable. Please check attributes and access rights.', $GEDFILENAME);
- }
-}
-
-// NOTE: Change header depending on action
-if ($action == "upload_form") {
- print_header(i18n::translate('Upload GEDCOM'));
-} elseif ($action == "add_form") {
- print_header(i18n::translate('Add GEDCOM'));
-} elseif ($action == "add_new_form") {
- print_header(i18n::translate('Create a new GEDCOM'));
-} else {
- print_header(i18n::translate('Import'));
-}
-
-// NOTE: Print form header
-echo "<form enctype=\"multipart/form-data\" method=\"post\" name=\"configform\" action=\"uploadgedcom.php\">";
-
-// NOTE: Print table header
-echo "\n<table class=\"facts_table center ", $TEXT_DIRECTION, "\">";
-
-// NOTE: Add GEDCOM form
-if ($action == "add_form") {
- echo "<tr><td class=\"topbottombar ", $TEXT_DIRECTION, "\" colspan=\"2\">";
- echo "<a href=\"javascript: ";
- if ($import_existing) {
- echo i18n::translate('Import');
- } else {
- echo i18n::translate('Add GEDCOM');
- }
- echo "\" onclick=\"expand_layer('add-form');return false\"><img id=\"add-form_img\" src=\"", $WT_IMAGE_DIR, "/";
- if ($startimport != "true") {
- echo $WT_IMAGES["minus"]["other"];
- } else {
- echo $WT_IMAGES["plus"]["other"];
- }
- echo "\" border=\"0\" width=\"11\" height=\"11\" alt=\"\" /></a>";
- echo help_link('add_gedcom');
- echo "&nbsp;<a href=\"javascript: ";
- if ($import_existing) {
- echo i18n::translate('Import');
- } else {
- echo i18n::translate('Add GEDCOM');
- }
- print "\" onclick=\"expand_layer('add-form');return false\">";
- if ($import_existing) {
- echo i18n::translate('Import');
- } else {
- echo i18n::translate('Add GEDCOM');
- }
- echo "</a>";
- echo "</td></tr>";
- echo "<tr><td class=\"optionbox\">";
- echo "<div id=\"add-form\" style=\"display: ";
- if ($startimport != "true") {
- echo "block ";
- } else {
- echo "none ";
- }
- echo "\">";
- ?>
- <input type="hidden" name="check" value="add" />
- <input type="hidden" name="action" value="<?php echo $action; ?>" />
- <input type="hidden" name="import_existing" value="<?php echo $import_existing; ?>" />
- <table class="facts_table">
- <?php
-
- $i = 0;
- if (!empty ($error)) {
- echo "<tr><td class=\"optionbox wrap\" colspan=\"2\">";
- echo "<span class=\"error\">", $error, "</span>\n";
- echo "</td></tr>";
- }
- ?>
- <tr>
- <td class="descriptionbox width20 wrap">
- <?php echo i18n::translate('GEDCOM File:'), help_link('gedcom_path'); ?></td>
- <td class="optionbox"><input type="text" name="GEDFILENAME" value="<?php if (isset($GEDFILENAME) && strlen($GEDFILENAME) > 4) echo get_gedcom_setting(get_id_from_gedcom($GEDFILENAME), 'path'); ?>"
- size="60" dir ="ltr" tabindex="<?php $i++; echo $i?>" <?php if ((!$no_upload && isset($GEDFILENAME)) && (empty($error))) echo "disabled "; ?> />
- </td>
- </tr>
- </table>
- </div>
- </td></tr>
-<?php
-}
-// NOTE: Upload GEDCOM form
-elseif ($action == "upload_form") {
- echo "<tr><td class=\"topbottombar ", $TEXT_DIRECTION, "\" colspan=\"2\">";
- echo "<a href=\"javascript: ", i18n::translate('Upload GEDCOM'), "\" onclick=\"expand_layer('upload_gedcom'); return false;\"><img id=\"upload_gedcom_img\" src=\"", $WT_IMAGE_DIR, "/";
- if ($startimport != "true") {
- echo $WT_IMAGES["minus"]["other"];
- } else {
- echo $WT_IMAGES["plus"]["other"];
- }
- echo "\" border=\"0\" width=\"11\" height=\"11\" alt=\"\" /></a>";
- echo "&nbsp;<a href=\"javascript: ", i18n::translate('Upload GEDCOM'), "\" onclick=\"expand_layer('upload_gedcom');return false\">", i18n::translate('Upload GEDCOM'), "</a>";
- echo help_link('upload_gedcom');
- echo "</td></tr>";
- echo "<tr><td class=\"optionbox wrap\">";
- echo "<div id=\"upload_gedcom\" style=\"display: ";
- if ($startimport != "true") {
- echo "block ";
- } else {
- echo "none ";
- }
- echo "\">";
-?>
-<input type="hidden" name="action" value="<?php echo $action; ?>" />
-<input type="hidden" name="check" value="upload" />
-<table class="facts_table">
-<?php
-
-if (!empty ($error)) {
- echo "<span class=\"error\">", $error, "</span><br />\n";
- echo i18n::translate('This error probably means that the file you tried to upload exceeded the limit set by your host. The default limit in PHP is 2MB. You can contact your host\'s Support group to have them increase the limit in the php.ini file, or you can upload the file using FTP. Use the <a href="uploadgedcom.php?action=add_form"><b>Add GEDCOM</b></a> page to add a GEDCOM file you have uploaded using FTP.');;
- echo "<br />\n";
-}
-?>
-<tr>
-<td class="descriptionbox width20 wrap">
-<?php echo i18n::translate('GEDCOM File:');?></td>
-<td class="optionbox" dir="ltr">
-<?php
-
-if (isset($GEDFILENAME)) {
- echo PrintReady($path.$GEDFILENAME);
-} elseif (isset($UPFILE)) {
- echo PrintReady($UPFILE["name"]);
-} else {
- echo "<input name=\"UPFILE\" type=\"file\" size=\"60\" />";
- if (!$filesize = ini_get('upload_max_filesize')) {
- $filesize = "2M";
- }
- echo " ( ", i18n::translate('Maximum upload size: '), " $filesize )";
-}
-?>
-</td>
-</tr>
-</table>
-<?php
-
-echo "</div>";
-echo "</td></tr>";
-}
-// NOTE: Add new GEDCOM form
-elseif ($action == "add_new_form") {
- echo "<tr><td class=\"topbottombar ", $TEXT_DIRECTION, "\" colspan=\"2\">";
- echo "<a href=\"javascript: ", i18n::translate('Create a new GEDCOM'), "\" onclick=\"expand_layer('add_new_gedcom');return false\"><img id=\"add_new_gedcom_img\" src=\"", $WT_IMAGE_DIR, "/";
- if ($startimport != "true") {
- echo $WT_IMAGES["minus"]["other"];
- } else {
- echo $WT_IMAGES["plus"]["other"];
- }
- echo "\" border=\"0\" width=\"11\" height=\"11\" alt=\"\" /></a>";
- echo "&nbsp;<a href=\"javascript: ", i18n::translate('Create a new GEDCOM'), "\" onclick=\"expand_layer('add_new_gedcom');return false\">", i18n::translate('Create a new GEDCOM'), "</a>";
- echo help_link('add_gedcom_instructions');
- echo "</td></tr>";
- echo "<tr><td class=\"optionbox\">";
- echo "<div id=\"add-form\" style=\"display: ";
- if ($startimport != "true") {
- echo "block ";
- } else {
- echo "none ";
- }
- echo "\">";
-?>
-<input type="hidden" name="action" value="<?php echo $action; ?>" />
-<input type="hidden" name="check" value="add_new" />
-<table class="facts_table">
-<?php
-
-if (!empty ($error)) {
- echo "<tr><td class=\"optionbox wrap\" colspan=\"2\">";
- echo "<span class=\"error\">", $error, "</span>\n";
- echo "</td></tr>";
-}
-?>
-<tr>
-<td class="descriptionbox width20 wrap">
-<?php echo i18n::translate('GEDCOM File:');?>
-</td>
-<td class="optionbox"><input name="GEDFILENAME" type="text" value="<?php if (isset($GEDFILENAME)) echo $path, $GEDFILENAME; ?>" size="60" <?php if (isset($GEDFILENAME) && !$no_upload) echo "disabled"; ?> /></td>
-</tr>
-</table>
-<?php
-
-echo "</div>";
-echo "</td></tr>";
-}
-
-if ($verify == "verify_gedcom") {
- // NOTE: Check if GEDCOM has been imported into DB
- $all_record_counts=count_all_records(get_id_from_gedcom($GEDFILENAME));
- $totalRecords = 0;
- foreach ($all_record_counts as $recordCount) {
- $totalRecords += $recordCount;
- }
- $imported = !empty($totalRecords);
- if ($imported || (!empty($bakfile) && file_exists($bakfile))) {
- // NOTE: If GEDCOM exists show warning
- print "<tr><td class=\"topbottombar $TEXT_DIRECTION\" colspan=\"2\">";
- print "<a href=\"javascript: ".i18n::translate('Verify GEDCOM')."\" onclick=\"expand_layer('verify_gedcom');return false\"><img id=\"verify_gedcom_img\" src=\"".$WT_IMAGE_DIR."/";
- if ($startimport != "true")
- print $WT_IMAGES["minus"]["other"];
- else
- print $WT_IMAGES["plus"]["other"];
- print "\" border=\"0\" width=\"11\" height=\"11\" alt=\"\" /></a>";
- print "&nbsp;<a href=\"javascript: ".i18n::translate('Verify GEDCOM')."\" onclick=\"expand_layer('verify_gedcom');return false\">".i18n::translate('Verify GEDCOM')."</a>";
- print help_link('verify_gedcom');
- print "</td></tr>";
- print "<tr><td class=\"optionbox\" colspan=\"2\">";
- print "<div id=\"verify_gedcom\" style=\"display: ";
- if ($startimport != "true")
- print "block ";
- else
- print "none ";
- print "\">";
- print "\n<table class=\"facts_table\">";
- print "<tr><td class=\"descriptionbox width20 wrap\" colspan=\"2\">";
- ?>
- <input type="hidden" name="no_upload" value="" />
- <input type="hidden" name="check" value="" />
- <input type="hidden" name="verify" value="validate_form" />
- <input type="hidden" name="GEDFILENAME" value="<?php if (isset($GEDFILENAME)) print $GEDFILENAME; ?>" />
- <input type="hidden" name="bakfile" value="<?php if (isset($bakfile)) print $bakfile; ?>" />
- <input type="hidden" name="path" value="<?php if (isset($path)) print $path; ?>" />
-
- <?php
-
- if ($imported) {
- print "<span class=error>".i18n::translate('A GEDCOM with this file name has already been imported into the database.')."</span><br /><br />";
- print "<span class=error>".i18n::translate('This GEDCOM file is <em>not</em> synchronized with the database. It may not contain the latest version of your data. To re-import from the database rather than the file, you should download and re-upload.')."</span><br /><br />";
- }
- if ($bakfile != "") print i18n::translate('A GEDCOM file with the same name has been found. If you choose to continue, the old GEDCOM file will be replaced with the file that you uploaded and the Import process will begin again. If you choose to cancel, the old GEDCOM will remain unchanged.')."</td></tr>";
- // NOTE: Check for existing changes
- $changes=WT_DB::prepare("SELECT 1 FROM {$TBLPREFIX}change WHERE status='pending' AND gedcom_id=?")->execute(array(get_id_from_gedcom($GEDFILENAME)))->fetchOne();
- if ($changes) {
- echo i18n::translate('The current GEDCOM has changes pending review. If you continue this Import, these pending changes will be discarded. You should review the pending changes before continuing the Import.');
- echo "<br /><br />";
- }
- print "<tr><td class=\"descriptionbox width20 wrap\">".i18n::translate('Do you want to erase the old data and replace it with this new data?')."</td><td class=\"optionbox vmiddle\">\n";
- print "<select name=\"override\">";
- print "<option value=\"yes\" ";
- if ($override == "yes")
- print "selected=\"selected\"";
- print ">".i18n::translate('Yes')."</option>";
- print "<option value=\"no\" ";
- if ($override != "yes")
- print "selected=\"selected\"";
- print ">".i18n::translate('No')."</option>";
- print "</select></td></tr>";
- //-- check if there are media in the DB already
- if (array_key_exists('OBJE', $all_record_counts)) {
- ?>
- <tr>
- <td class="descriptionbox wrap width20">
- <?php echo i18n::translate('Keep media links'), help_link('keep_media'); ?></td>
- <td class="optionbox">
- <select name="keepmedia">
- <option value="yes" <?php if ($keepmedia) print "selected=\"selected\"";?>><?php print i18n::translate('Yes'); ?></option>
- <option value="no" <?php if (!$keepmedia) print "selected=\"selected\"";?>><?php print i18n::translate('No'); ?></option>
- </select>
- </td>
- </tr>
- <?php
- }
- print "<tr><td class=\"optionbox wrap\" colspan=\"2\">";
- print "</td></tr></table>";
- } else {
- $verify = "validate_form";
- }
-}
-
-if ($verify == "validate_form") {
- print "<tr><td class=\"topbottombar $TEXT_DIRECTION\" colspan=\"2\">";
- print "<a href=\"javascript: ".i18n::translate('Validate GEDCOM')."\" onclick=\"expand_layer('validate_gedcom');return false\"><img id=\"validate_gedcom_img\" src=\"".$WT_IMAGE_DIR."/";
- if ($startimport != "true")
- print $WT_IMAGES["minus"]["other"];
- else
- print $WT_IMAGES["plus"]["other"];
- print "\" border=\"0\" width=\"11\" height=\"11\" alt=\"\" /></a>";
- print "&nbsp;<a href=\"javascript: ".i18n::translate('Validate GEDCOM')."\" onclick=\"expand_layer('validate_gedcom');return false\">".i18n::translate('Validate GEDCOM')."</a>";
- print help_link('validate_gedcom');
- print "</td></tr>";
- print "<tr><td class=\"optionbox\">";
- print "<div id=\"validate_gedcom\" style=\"display: ";
- if ($startimport != "true")
- print "block ";
- else
- print "none ";
- print "\">";
- print "\n<table class=\"facts_table\">";
- print "<tr><td class=\"descriptionbox\" colspan=\"2\">".i18n::translate('Performing GEDCOM validation...')."<br />";
- if (!empty ($error))
- print "<span class=\"error\">$error</span>\n";
-
- if ($import != true) {
- require_once WT_ROOT.'includes/functions/functions_tools.php';
-
- $l_BOMcleanup = false;
- $l_headcleanup = false;
- $l_macfilecleanup = false;
- $l_lineendingscleanup = false;
- $l_placecleanup = false;
- $l_datecleanup = false;
- $l_isansi = false;
- $fp = fopen(get_gedcom_setting(get_id_from_gedcom($GEDFILENAME), 'path'), "r");
-
- // TODO - there are two problems with this next block of code. Firstly, by
- // checking the file in chunks (rather than complete records), we won't spot
- // any problem that spans chunk boundaries. Secondly, the date checking
- // stops after the first error. If the first error is not an ambiguous date
- // then we won't ask the user to choose between DMY and YMD.
-
- //-- read the gedcom and test it in 8KB chunks
- while ($fp && !feof($fp)) {
- $fcontents = fread($fp, 1024 * 8);
- if (!$l_BOMcleanup && need_BOM_cleanup()) $l_BOMcleanup = true;
- if (!$l_headcleanup && need_head_cleanup()) $l_headcleanup = true;
- if (!$l_macfilecleanup && need_macfile_cleanup()) $l_macfilecleanup = true;
- if (!$l_lineendingscleanup && need_line_endings_cleanup()) $l_lineendingscleanup = true;
- if (!$l_placecleanup && ($placesample = need_place_cleanup()) !== false) $l_placecleanup = true;
- if (!$l_datecleanup && ($datesample = need_date_cleanup()) !== false) $l_datecleanup = true;
- if (!$l_isansi && is_ansi()) $l_isansi = true;
- }
- fclose($fp);
-
- $cleanup_needed = false;
- if (!$l_datecleanup && !$l_isansi && !$l_BOMcleanup && !$l_headcleanup && !$l_macfilecleanup && !$l_placecleanup && !$l_lineendingscleanup) {
- print i18n::translate('Valid GEDCOM detected. No cleanup required.');
- print "</td></tr>";
- $import = true;
- } else {
- $cleanup_needed = true;
- print "<input type=\"hidden\" name=\"cleanup_needed\" value=\"cleanup_needed\">";
- if (!file_is_writeable(get_gedcom_setting(get_id_from_gedcom($GEDFILENAME), 'path')) && (file_exists(get_gedcom_setting(get_id_from_gedcom($GEDFILENAME), 'path')))) {
- print "<span class=\"error\">".i18n::translate('The GEDCOM file, <b>%s</b>, is not writable. Please check attributes and access rights.', $GEDCOM)."</span>\n";
- print "</td></tr>";
- }
- // NOTE: Check for BOM cleanup
- if ($l_BOMcleanup) {
- print "<tr><td class=\"optionbox wrap\" colspan=\"2\">";
- print "<span class=\"error\">".i18n::translate('A Byte Order Mark (BOM) was detected at the beginning of the file. On cleanup, this special code will be removed.')."</span>\n";
- print help_link('BOM_detected');
- print "</td></tr>";
- }
- // NOTE: Check for head cleanup
- if ($l_headcleanup) {
- print "<tr><td class=\"optionbox wrap\" colspan=\"2\">";
- print "<span class=\"error\">".i18n::translate('Detected lines before the GEDCOM header <b>0&nbsp;HEAD</b>. On cleanup, these lines will be removed.')."</span>\n";
- print help_link('invalid_header');
- print "</td></tr>";
- }
- // NOTE: Check for mac file cleanup
- if ($l_macfilecleanup) {
- print "<tr><td class=\"optionbox wrap\" colspan=\"2\">";
- print "<span class=\"error\">".i18n::translate('Macintosh file detected. On cleanup your file will be converted to a DOS file.')."</span>\n";
- print help_link('macfile_detected');
- print "</td></tr>";
- }
- // NOTE: Check for line endings cleanup
- if ($l_lineendingscleanup) {
- print "<tr><td class=\"optionbox wrap\" colspan=\"2\">";
- print "<span class=\"error\">".i18n::translate('Empty lines were detected in your GEDCOM file. On cleanup, these empty lines will be removed.')."</span>\n";
- print help_link('empty_lines_detected');
- print "</td></tr>";
- }
- // NOTE: Check for place cleanup
- if ($l_placecleanup) {
- print "<tr><td class=\"optionbox wrap\" colspan=\"2\">";
- print "\n<table class=\"facts_table\">";
- print "<tr><td class=\"optionbox wrap\" colspan=\"2\">";
- print "<span class=\"error\">".i18n::translate('Invalid place encodings were detected. These errors should be fixed.')."</span>\n";
- print "</td></tr>";
- print "<tr><td class=\"descriptionbox wrap width20\">";
- print i18n::translate('Cleanup Places');
- print help_link('cleanup_places');
- print "</td><td class=\"optionbox\" colspan=\"2\"><select name=\"cleanup_places\">\n";
- print "<option value=\"YES\" selected=\"selected\">".i18n::translate('Yes')."</option>\n<option value=\"NO\">".i18n::translate('No')."</option>\n</select>";
- print "</td></tr>";
- print "</td></tr><tr><td class=\"optionbox\" colspan=\"2\">".i18n::translate('Example of invalid place from your GEDCOM:')."<br />".PrintReady(nl2br($placesample[0]));
- print "</table>\n";
- print "</td></tr>";
- }
- // NOTE: Check for date cleanup
- if ($l_datecleanup) {
- print "<tr><td class=\"optionbox wrap\" colspan=\"2\">";
- print "<span class=\"error\">".i18n::translate('Detected invalid date formats, on cleanup these will be changed to format of DD MMM YYYY (eg. 1 JAN 2004).')."</span>\n";
- print "\n<table class=\"facts_table\">";
- print "<tr><td class=\"descriptionbox width20\">";
- print i18n::translate('Date format');
- print help_link('detected_date');
-
- print "</td><td class=\"optionbox\" colspan=\"2\">";
- if (isset ($datesample["choose"])) {
- print "<select name=\"datetype\">\n";
- print "<option value=\"1\">".i18n::translate('Day before Month (DD MM YYYY)')."</option>\n<option value=\"2\">".i18n::translate('Month before Day (MM DD YYYY)')."</option>\n</select>";
- } else
- print "<input type=\"hidden\" name=\"datetype\" value=\"3\" />";
- print "</td></tr><tr><td class=\"optionbox\" colspan=\"2\">".i18n::translate('Example of invalid date from your GEDCOM:')."<br />".$datesample[0];
- print "</td></tr>";
- print "</table>\n";
- print "</td></tr>";
- }
- // NOTE: Check for ansi encoding
- if ($l_isansi) {
- print "<tr><td class=\"optionbox\" colspan=\"2\">";
- print "<span class=\"error\">".i18n::translate('ANSI file encoding detected. webtrees works best with files encoded in UTF-8.')."</span>\n";
- print "\n<table class=\"facts_table\">";
- print "<tr><td class=\"descriptionbox wrap width20\">";
- print i18n::translate('Convert this ANSI encoded GEDCOM to UTF-8?');
- print help_link('detected_ansi2utf');
- print "</td><td class=\"optionbox\"><select name=\"utf8convert\">\n";
- print "<option value=\"YES\" selected=\"selected\">".i18n::translate('Yes')."</option>\n";
- print "<option value=\"NO\">".i18n::translate('No')."</option>\n</select>";
- print "</td></tr>";
- print "</table>\n";
- }
- }
- } else if (!$cleanup_needed) {
- print i18n::translate('Valid GEDCOM detected. No cleanup required.');
- $import = true;
- } else $import = true;
- ?>
- <input type = "hidden" name="GEDFILENAME" value="<?php if (isset($GEDFILENAME)) print $GEDFILENAME; ?>" />
- <input type = "hidden" name="verify" value="validate_form" />
- <input type = "hidden" name="bakfile" value="<?php if (isset($bakfile)) print $bakfile; ?>" />
- <input type = "hidden" name="path" value="<?php if (isset($path)) print $path; ?>" />
- <input type = "hidden" name="no_upload" value="<?php if (isset($no_upload)) print $no_upload; ?>" />
- <input type = "hidden" name="override" value="<?php if (isset($override)) print $override; ?>" />
- <input type = "hidden" name="ok" value="<?php if (isset($ok)) print $ok; ?>" />
- <input type = "hidden" name="keepmedia" value="<?php print $keepmedia?'yes':'no'; ?>" />
- </table>
- </div>
- </td></tr>
-<?php
-}
-
-if ($import == true) {
- // NOTE: Additional import options
- print "<tr><td class=\"topbottombar $TEXT_DIRECTION\" colspan=\"2\">";
- print "<a href=\"javascript: ".i18n::translate('Import Options')."\" onclick=\"expand_layer('import_options');return false\"><img id=\"import_options_img\" src=\"".$WT_IMAGE_DIR."/";
- if ($startimport != "true")
- print $WT_IMAGES["minus"]["other"];
- else
- print $WT_IMAGES["plus"]["other"];
- print "\" border=\"0\" width=\"11\" height=\"11\" alt=\"\" /></a>";
- print "&nbsp;<a href=\"javascript: ".i18n::translate('Import Options')."\" onclick=\"expand_layer('import_options');return false\">".i18n::translate('Import Options')."</a>";
- print help_link('import_options');
- print "</td></tr>";
- print "<tr><td class=\"optionbox\" colspan=\"2\">";
- print "<div id=\"import_options\" style=\"display: ";
- if ($startimport != "true")
- print "block ";
- else
- print "none ";
- print "\">";
- print "\n<table class=\"facts_table\">";
-
- // NOTE: Time limit for import
- print "<tr><td class=\"descriptionbox width20 wrap\">";
- print i18n::translate('Time limit:');
- print help_link('time_limit');
- print "</td><td class=\"optionbox\"><input type=\"text\" name=\"timelimit\" value=\"".$timelimit."\" size=\"5\"";
- if ($startimport == "true")
- print " disabled ";
- print "/>\n";
- print "</td></tr>";
-
- // NOTE: Auto-click "Continue" button
- print "<tr><td class=\"descriptionbox width20 wrap\">";
- print i18n::translate('Automatically press «Continue» button');
- print help_link('autoContinue');
- print "</td><td class=\"optionbox\"><select name=\"autoContinue\">\n";
- print "<option value=\"YES\" selected=\"selected\">".i18n::translate('Yes')."</option>\n";
- print "<option value=\"NO\">".i18n::translate('No')."</option>\n</select>";
- print "</td></tr>";
-
- // NOTE: change XREF to RIN, REFN, or Don't change
- print "<tr><td class=\"descriptionbox wrap\">";
- print i18n::translate('Change Individual ID to:');
- print help_link('change_indi2id');
- print "</td><td class=\"optionbox\">";
- if ($startimport == "true") {
- if ($xreftype == "NA")
- print i18n::translate_c('Do not change Individual ID', 'Do not change');
- else
- print $xreftype;
- } else {
- print "<select name=\"xreftype\">\n";
- print "<option value=\"NA\">".i18n::translate_c('Do not change Individual ID', 'Do not change')."</option>\n<option value=\"RIN\">RIN</option>\n";
- print "<option value=\"REFN\">REFN</option>\n</select>";
- }
- print "</td></tr>\n";
-
- print "<input type=\"hidden\" name=\"startimport\" value=\"true\" />";
- print "<input type=\"hidden\" name=\"ged\" value=\"";
- if (isset ($GEDFILENAME))
- print $GEDFILENAME;
- print "\" />";
- print "<input type=\"hidden\" name=\"GEDFILENAME\" value=\"";
- if (isset ($GEDFILENAME))
- print $GEDFILENAME;
- print "\" />";
- print "<input type=\"hidden\" name=\"exists\" value=\"";
- if (isset ($exists))
- print $exists;
- print "\" />";
- print "<input type=\"hidden\" name=\"ok\" value=\"".$ok."\" />";
- print "<input type=\"hidden\" name=\"import\" value=\"".$import."\" />";
- print "<input type=\"hidden\" name=\"l_isansi\" value=\"";
- if (isset ($l_isansi))
- print $l_isansi;
- print "\" />";
- print "<input type=\"hidden\" name=\"check\" value=\"\" />";
- print "</table></div>";
- print "</td></tr>";
-}
-
-if ($startimport == "true") {
- set_gedcom_setting(get_id_from_gedcom($GEDFILENAME), 'imported', false);
-
- if (isset ($exectime)) {
- $oldtime = time() - $exectime;
- $skip_table = 0;
- } else
- $oldtime = time();
-
- /**
- * function that sets up the html required to run the progress bar
- * @param long $FILE_SIZE the size of the file
- */
- function setup_progress_bar($FILE_SIZE) {
- global $ged, $timelimit;
- ?>
- <script type="text/javascript">
- <!--
- function complete_progress(time, exectext, go_pedi, go_welc) {
- progress = document.getElementById("progress_header");
- if (progress) progress.innerHTML = '<span class="error"><b><?php print i18n::translate('Import complete'); ?></b></span><br />'+exectext+' '+time+' <?php print i18n::translate('sec.'); ?>';
- progress = document.getElementById("link1");
- if (progress) progress.innerHTML = '<a href="pedigree.php?ged=<?php print encode_url(str_replace("'", "\'", $ged)); ?>">'+go_pedi+'</a>';
- progress = document.getElementById("link2");
- if (progress) progress.innerHTML = '<a href="index.php?ctype=gedcom&ged=<?php print encode_url(str_replace("'", "\'", $ged)); ?>">'+go_welc+'</a>';
- progress = document.getElementById("link3");
- if (progress) progress.innerHTML = '<a href="editgedcoms.php"><?php print i18n::translate('Manage GEDCOMs and edit Privacy'); ?></a>';
- }
- function wait_progress() {
- progress = document.getElementById("progress_header");
- if (progress) progress.innerHTML = '<?php print i18n::translate('Please be patient'); ?>';
- }
-
- var FILE_SIZE = <?php print $FILE_SIZE; ?>;
- var TIME_LIMIT = <?php print $timelimit; ?>;
-
- function update_progress(bytes, time) {
- perc = Math.round(1000*(bytes / FILE_SIZE))/10;
- if (perc>100) perc = 100;
- progress = document.getElementById("progress_div");
- if (progress) {
- progress.style.width = perc+"%";
- progress.innerHTML = perc+"%";
- }
- perc = Math.round(100*(time / TIME_LIMIT));
- if (perc>100) perc = 100;
- progress = document.getElementById("time_div");
- if (progress) {
- progress.style.width = perc+"%"; progress.innerHTML = perc+"%";
- }
- }
- //-->
- </script>
- <?php
- print "\n<table style=\"width: 800px;\"><tr><td>";
- print "<div id=\"progress_header\" class=\"person_box\" style=\"width: 350px; margin: 10px; text-align: center;\">\n";
- print "<b>".i18n::translate('Import Progress...')."</b>";
- print "<div style=\"left: 10px; right: 10px; width: 300px; height: 20px; border: inset #CCCCCC 3px; background-color: #000000;\">\n";
- print "<div id=\"progress_div\" class=\"person_box\" style=\"width: 1%; height: 18px; text-align: center; overflow: hidden;\">1%</div>\n";
- print "</div>\n";
- print "</div>\n";
- print "</td><td style=\"text-align: center;\"><div id=\"link1\">&nbsp;</div>";
- print "<div id=\"link2\">&nbsp;</div><div id=\"link3\">&nbsp;</div>";
- print "</td></tr></table>";
- print "\n<table style=\"width: 800px;\"><tr><td>";
- print "<div id=\"progress_header\" class=\"person_box\" style=\"width: 350px; margin: 10px; text-align: center;\">\n";
- if ($timelimit == 0)
- print "<b>".i18n::translate('Time limit:')." ".i18n::translate('None')."</b>";
- else
- print "<b>".i18n::translate('Time limit:')." ".$timelimit." ".i18n::translate('sec.')."</b>";
- print "<div style=\"left: 10px; right: 10px; width: 300px; height: 20px; border: inset #CCCCCC 3px; background-color: #000000;\">\n";
- print "<div id=\"time_div\" class=\"person_box\" style=\"width: 1%; height: 18px; text-align: center; overflow: hidden;\">1%</div>\n";
- print "</div>\n";
- print "</div>\n";
- print "</td><td style=\"text-align: center;\"><div id=\"link1\">&nbsp;</div>";
- print "<div id=\"link2\">&nbsp;</div><div id=\"link3\">&nbsp;</div>";
- print "</td></tr></table>";
- flush();
- }
-//-- end of setup_progress_bar function
-
-if (!isset ($stage))
-$stage = 0;
-if ((empty ($ged)) || (!get_id_from_gedcom($ged))) {
- $ged = $GEDCOM;
-}
-$ged_id=get_id_from_gedcom($ged);
-$temp = $THEME_DIR;
-$GEDCOM_FILE = get_gedcom_setting($ged_id, 'path');
-$FILE = $ged;
-$TITLE = get_gedcom_setting($ged_id, 'title');
-require get_config_file($ged_id);
-
-$temp2 = $THEME_DIR;
-$THEME_DIR = $temp;
-$THEME_DIR = $temp2;
-
-if (isset ($GEDCOM_FILE)) {
- if ((!isFileExternal($GEDCOM_FILE)) && (!file_exists($GEDCOM_FILE))) {
- print "<span class=\"error\"><b>Could not locate gedcom file at $GEDCOM_FILE<br /></b></span>\n";
- unset ($GEDCOM_FILE);
- }
-}
-
-if ($stage == 0) {
- $_SESSION["resumed"] = 0;
- if (file_exists($INDEX_DIRECTORY.basename($GEDCOM_FILE).".new"))
- unlink($INDEX_DIRECTORY.basename($GEDCOM_FILE).".new");
- empty_database($ged_id, $keepmedia);
- $stage = 1;
-}
-flush();
-
-// Importing generates 1000's of separate updates, and in auto-commit mode, each of these
-// is a separate transaction, which must be flushed to disk. This limits writes to approx
-// 100 per second (on a typical 6000 RPM disk).
-// By wrapping it all in one transaction, we only have one disk flush.
-WT_DB::exec("START TRANSACTION");
-
-if ($stage == 1) {
- @ set_time_limit($timelimit);
- //-- make sure that we are working with the true time limit
- //-- commented out for now because PHP does not seem to be reporting it correctly on Linux
- //$timelimit = ini_get("max_execution_time");
-
- $FILE_SIZE = filesize($GEDCOM_FILE);
- print "<tr><td class=\"topbottombar $TEXT_DIRECTION\" colspan=\"2\">";
- print i18n::translate('Reading GEDCOM file')." ".$GEDCOM_FILE;
- print "</td></tr>";
- print "</table>";
-
- print i18n::translate('The status bars below will let you know how the Import is progressing. If the time limit runs out the Import will be stopped and you will be asked to press a <b>Continue</b> button. If you don\'t see the <b>Continue</b> button, you must restart the Import with a smaller time limit value.');
- //print "<tr><td class=\"optionbox\">";
- setup_progress_bar($FILE_SIZE);
- //print "</td></tr>";
- flush();
-
- // ------------------------------------------------------ Begin importing data
- $i = 0;
-
- //-- as we are importing the file, a new file is being written to store any
- //-- changes that might have occurred to the gedcom file (eg. conversion of
- //-- media objects). After the import is complete the new file is
- //-- copied over the old file.
- //-- The records are written during the import_record() method and the
- //-- update_media() method
- //-- open handle to read file
- $fpged = fopen($GEDCOM_FILE, "rb");
- //-- open handle to write changed file
- $fpnewged = fopen($INDEX_DIRECTORY.basename($GEDCOM_FILE).".new", "ab");
- $BLOCK_SIZE = 1024 * 4; //-- 4k bytes per read (4kb is usually the page size of a virtual memory system)
- //-- resume a halted import from the session
- if (!empty ($_SESSION["resumed"])) {
- $import_stats=$_SESSION['import_stats'];
- $start_time =$_SESSION['start_time'];
- $TOTAL_BYTES =$_SESSION["TOTAL_BYTES"];
- $fcontents = $_SESSION["fcontents"];
- $media_count = $_SESSION["media_count"];
- $found_ids = $_SESSION["found_ids"];
- $MAX_IDS = $_SESSION["MAX_IDS"];
- $autoContinue = $_SESSION["autoContinue"];
- fseek($fpged, $TOTAL_BYTES);
- } else {
- $fcontents = "";
- $TOTAL_BYTES = 0;
- $media_count = 0;
- $MAX_IDS = array();
- $_SESSION["resumed"] = 1;
- $import_stats=array();
- $start_time=microtime(true);
- }
- while (!feof($fpged)) {
- $temp = fread($fpged, $BLOCK_SIZE);
- $fcontents .= $temp;
- $TOTAL_BYTES += strlen($temp);
- $pos1 = 0;
- while ($pos1 !== false) {
- //-- find the start of the next record
- $pos2 = strpos($fcontents, "\n0", $pos1 +1);
- while ((!$pos2) && (!feof($fpged))) {
- $temp = fread($fpged, $BLOCK_SIZE);
- $fcontents .= $temp;
- $TOTAL_BYTES += strlen($temp);
- $pos2 = strpos($fcontents, "\n0", $pos1 +1);
- }
-
- //-- pull the next record out of the file
- if ($pos2) {
- $indirec = substr($fcontents, $pos1, $pos2 - $pos1);
- } else {
- $indirec = substr($fcontents, $pos1);
- }
-
- try {
- $record_type=import_record($indirec, $ged_id, false);
- } catch (PDOException $ex) {
- // Import errors are likely to be caused by duplicate records.
- // There is no safe way of handling these. Just display them
- // and let the user decide.
- echo '<pre class="error">', $ex->getMessage(), '</pre>';
- echo '<pre>', WT_GEDCOM, ': ', $ged_id, '</pre>';
- echo '<pre>', htmlspecialchars($indirec), '</pre>';
- // Don't let the error message disappear off the screen.
- $autoContinue=false;
- $record_type=i18n::translate('invalid');
- }
-
- // Generate import statistics
- if (!isset($import_stats[$record_type])) {
- $import_stats[$record_type]=array(
- 'records'=>0,
- 'bytes' =>0,
- 'seconds'=>0
- );
- }
- $end_time=microtime(true);
- $import_stats[$record_type]['records']++;
- $import_stats[$record_type]['bytes' ]+=$pos2 ? $pos2-$pos1 : strlen($indirec);
- $import_stats[$record_type]['seconds']+=$end_time-$start_time;
- $start_time=$end_time;
-
- //-- move the cursor to the start of the next record
- $pos1 = $pos2;
-
- $i ++;
-
- //-- update the progress bars at every 10 records
- if ($i % 10 == 0) {
- $newtime = time();
- $exectime = $newtime - $oldtime;
- echo WT_JS_START, "update_progress($TOTAL_BYTES, $exectime);", WT_JS_END;
- flush();
- } else {
- print ' ';
- }
-
- //-- check if we are getting close to timing out
- if ($i % 5 == 0) {
- //-- keep the browser informed by sending more data
- print "\n";
- $newtime = time();
- $exectime = $newtime - $oldtime;
- if (($timelimit != 0) && ($timelimit - $exectime) < 2) {
- $importtime = $importtime + $exectime;
- $fcontents = substr($fcontents, $pos2);
- //-- store the resume information in the session
- $_SESSION['import_stats']=$import_stats;
- $_SESSION['start_time']=$start_time;
- $_SESSION["media_count"] = $media_count;
- $_SESSION["TOTAL_BYTES"] = $TOTAL_BYTES;
- $_SESSION["fcontents"] = $fcontents;
- $_SESSION["importtime"] = $importtime;
- $_SESSION["MAX_IDS"] = $MAX_IDS;
- $_SESSION["found_ids"] = $found_ids;
- $_SESSION["autoContinue"] = $autoContinue;
-
- //-- close the file connection
- fclose($fpged);
- fclose($fpnewged);
- $_SESSION["resumed"]++;
- print "\n<table class=\"facts_table\">";
- ?>
- <tr>
- <td class="descriptionbox"><?php print i18n::translate('The execution time limit was reached. Click the Continue button below to resume importing the GEDCOM file.'); ?></td>
- </tr>
- <tr>
- <td class="topbottombar"><input type="hidden" name="ged"
- value="<?php print $ged; ?>" /> <input type="hidden" name="stage"
- value="1" /> <input type="hidden" name="timelimit"
- value="<?php print $timelimit; ?>" /> <input type="hidden"
- name="importtime" value="<?php print $importtime; ?>" />
- <input type="hidden" name="xreftype" value="<?php print $xreftype; ?>" />
- <input type="hidden" name="utf8convert"
- value="<?php print $utf8convert; ?>" /> <input type="hidden"
- name="verify" value="<?php print $verify; ?>" /> <input type="hidden"
- name="startimport" value="<?php print $startimport; ?>" /> <input
- type="hidden" name="import" value="<?php print $import; ?>" /> <input
- type="hidden" name="FILE" value="<?php print $FILE; ?>" /> <input
- type="submit" name="continue"
- value="<?php print i18n::translate('Continue'); ?>" /></td>
- </tr>
- </table>
- <?php if ($autoContinue=="YES") { ?>
- <script type="text/javascript">
- <!--
- (function (fn) {
- if (window.addEventListener) window.addEventListener('load', fn, false);
- else window.attachEvent('onload', fn);
- })
- (function() {
- document.forms['configform'].elements['continue'].click();
- });
- //-->
- </script>
- <?php
- }
- print_footer();
- session_write_close();
- exit;
- }
- }
- }
- $fcontents = substr($fcontents, $pos2);
- }
- fclose($fpged);
- fclose($fpnewged);
- //-- as we are importing the file, a new file is being written to store any
- //-- changes that might have occurred to the gedcom file (eg. conversion of
- //-- media objects). After the import is complete the new file is
- //-- copied over the old file.
- //-- The records are written during the import_record() method and the
- //-- update_media() method
- $res = @ copy($GEDCOM_FILE, $INDEX_DIRECTORY.basename($GEDCOM_FILE).".bak");
- if (!$res)
- print "<span class=\"error\">Unable to create backup of the GEDCOM file at ".$INDEX_DIRECTORY.basename($GEDCOM_FILE).".bak</span><br />";
- //unlink($GEDCOM_FILE);
- $res = @ copy($INDEX_DIRECTORY.basename($GEDCOM_FILE).".new", $GEDCOM_FILE);
- if (!$res) {
- print "<span class=\"error\">Unable to copy updated GEDCOM file ".$INDEX_DIRECTORY.basename($GEDCOM_FILE).".new to ".$GEDCOM_FILE."</span><br />";
- } else {
- @unlink($INDEX_DIRECTORY.basename($GEDCOM_FILE).".new");
- $logline = AddToLog($GEDCOM_FILE." updated", 'config');
- }
- $newtime = time();
- $exectime = $newtime - $oldtime;
- $importtime = $importtime + $exectime;
- $exec_text = i18n::translate('Execution time:');
- $go_pedi = i18n::translate('Click here to go to the Pedigree tree.');
- $go_welc = i18n::translate('Home Page');
- if (WT_LOCALE == "fr" || WT_LOCALE == "it") { // TODO Just escape it properly!
- echo WT_JS_START, "complete_progress($importtime, \"$exec_text\", \"$go_pedi\", \"$go_welc\");", WT_JS_END;
- } else {
- echo WT_JS_START, "complete_progress($importtime, '$exec_text', '$go_pedi', '$go_welc');", WT_JS_END;
- }
- flush();
-
- // Import Statistics
- $show_table1 = "<table class=\"list_table\"><tr>";
- $show_table1 .= "<tr><td class=\"topbottombar\" colspan=\"4\">".i18n::translate('Import')."</td></tr>";
- $show_table1 .= "<td class=\"descriptionbox\">".i18n::translate('Execution time:')."</td>";
- $show_table1 .= "<td class=\"descriptionbox\">".i18n::translate('Bytes read:')."</td>";
- $show_table1 .= "<td class=\"descriptionbox\">".i18n::translate('Found record')."</td>";
- $show_table1 .= "<td class=\"descriptionbox\">".i18n::translate('Type')."</td></tr>";
- $total_seconds=0;
- $total_bytes =0;
- $total_records=0;
- foreach ($import_stats as $type=>$stats) {
- $total_seconds+=$stats['seconds'];
- $total_bytes +=$stats['bytes'];
- $total_records+=$stats['records'];
- $show_table1 .= "<tr><td class=\"optionbox indent\">".sprintf("%.2f %s", $stats['seconds'], i18n::translate('sec.'))."</td>";
- $show_table1 .= "<td class=\"optionbox indent\">".$stats['bytes']."</td>";
- $show_table1 .= "<td class=\"optionbox indent\">".$stats['records']."</td>";
- $show_table1 .= "<td class=\"optionbox\">".$type."</td></tr>";
- }
- $show_table1 .= "<tr><td class=\"optionbox indent\">".sprintf("%.2f %s", $total_seconds, i18n::translate('sec.'))."</td>";
- $show_table1 .= "<td class=\"optionbox indent\">".$total_bytes.WT_JS_START."update_progress($total_bytes, $exectime);".WT_JS_END;
- $show_table1 .= "<td class=\"optionbox indent\">". $total_records."</td>";
- $show_table1 .= "<td class=\"optionbox\">&nbsp;</td></tr>";
- $show_table1 .= "</table>";
- echo "<tr><td class=\"topbottombar $TEXT_DIRECTION\">", i18n::translate('Import Statistics'), "</td></tr>";
- print "<tr><td class=\"optionbox\">";
- print "<table cellspacing=\"20px\"><tr><td class=\"optionbox\" style=\"vertical-align: top;\">";
- if (isset ($skip_table)) {
- print "<br />...";
- } else {
- print $show_table1;
- }
- print "</td></tr></table>";
- // NOTE: Finished Links
- import_max_ids($ged_id, $MAX_IDS);
- set_gedcom_setting($ged_id, 'imported', true);
- print "</td></tr>";
-
- $record_count = 0;
- $_SESSION["resumed"] = 0;
- unset ($_SESSION['import_stats']);
- unset ($_SESSION["TOTAL_BYTES"]);
- unset ($_SESSION["fcontents"]);
-}
-}
-?>
-<tr>
- <td class="topbottombar" colspan="2"><?php
-
- if ($startimport != "true")
- print "<input type=\"submit\" name=\"continue\" value=\"".i18n::translate('Continue')."\" />&nbsp;";
- if ($verify && $startimport != "true")
- print "<input type=\"button\" name=\"cancel\" value=\"".i18n::translate('Cancel')."\" onclick=\"document.configform.override.value='no'; document.configform.no_upload.value='cancel_upload'; document.configform.submit(); \" />";
- ?></td>
-</tr>
-</table>
-</form>
- <?php
-
-WT_DB::exec("COMMIT");
-
- print_footer();
- ?>