"multipart/form-data"); $form['gedcom_file'] = array( '#type' => 'file', '#title' => t('GED file to upload'), '#size' => 40, ); //$form['merge'] = array( // '#type' => 'radios', // '#title' => t('Merge options'), // '#options' => array(t('replace existing data'), t('augment current data'), t('merge individuals by name')), // '#default_value' => variable_get('family_import_replace', 1), //); $form['range'] = array( '#type' => 'fieldset', '#title' => t('Import range'), '#description' => t('Select a range of records (lines staring with 0) to import. This allows breaking very large files into multiple import sessions.'), ); $form['range']['start'] = array( '#type' => 'textfield', '#title' => t('First record to import'), '#size' => 10, '#maxlength' => 10, '#description' => t('Enter the number of the first record in the GEDCOM file to include in this import session'), ); $form['range']['nrecords'] = array( '#type' => 'textfield', '#title' => t('Number of records to import'), '#size' => 10, '#maxlength' => 10, '#description' => t('Enter the number of records to process in this import session'), ); $form['replace'] = array( '#type' => 'checkbox', '#title' => t('Replace existing GED data'), '#default_value' => variable_get('family_import_replace', 1), ); $form['submit'] = array('#type' => 'submit', '#value' => t('Start Import')); $form['#submit'] = array('family_import_submit'); return $form; } // Check the uploaded GEDCOM file function family_import_submit($form, &$form_state) { if (!($file = file_save_upload('gedcom_file'))) { form_set_error('',t("Didn't get GED file")); }else{ if (!($fp = fopen($file->filepath , "r"))) { form_set_error('',t("Couldn't open get GED file")); }else{ // // Empty current content. This is useful for debugging, but more caution should be // done before deleting database in the working version // db_query("CREATE TABLE {family_relations_temp} (`nid` VARCHAR( 128 ) NOT NULL ,`famc_xref` VARCHAR( 128 ) NOT NULL ,`fams_xref` VARCHAR( 128 ) NOT NULL) ENGINE = MYISAM"); if ($form['replace']) { db_query("TRUNCATE {family_individual}"); db_query("TRUNCATE {family_group}"); db_query("TRUNCATE {family_location}"); db_query("TRUNCATE {family_variable}"); $q = db_query("SELECT nid FROM {node} WHERE type = 'family_individual'"); $n = 0; while ($o = db_fetch_array($q)) { node_delete($o->nid); $n++; } drupal_set_message(t('Deleted @n family_individual nodes.', array('@n' => $n))); $q = db_query("SELECT nid FROM {node} WHERE type = 'family_group'"); $n = 0; while ($o = db_fetch_array($q)) { node_delete($o->nid); $n++; } drupal_set_message(t('Deleted @n family_group nodes.', array('@n' => $n))); $q = db_query("SELECT nid FROM {node} WHERE type = 'family_location'"); $n = 0; while ($o = db_fetch_array($q)) { node_delete($o->nid); $n++; } drupal_set_message(t('Deleted @n family_location nodes.', array('@n' => $n))); } $rmin = $form['start']? $form['start']:0; $rcount = $form['nrecords']? $form['nrecords']:99999999; $rmax = $rmin + $rcount - 1; $rnum = 0; $rprocessed = 0; $lprocessed = 0; $lnum = 0; $gedcom_hier=array(); // References to GEDCOM parents on each level //declare variables for evaluation $current0record = NULL; while (!feof ($fp)) { $gedline = fgets( $fp, 1024 ); $lnum++; if (preg_match("/^\s*(\d+)\s*(?:@([^@]+)@)?\s*(\S+)\s*(.*\S)?\s*$/i", $gedline , $matches)) { $level=$matches[1]; if ($level == 0) ++$rnum; if ($rnum < $rmin) continue; if ($rnum > $rmax) break; if ($level == 0) ++$rprocessed; ++$lprocessed; $xref=$matches[2]; $fact_code=$matches[3]; $value=$matches[4]; $gedcom_source=$gedline; $parent=$gedcom_hier[$level-1]; //new ged file evaluation code //next line is debug //echo $level . "
"; switch($level){ case '0': $current0xref = $xref; $current0record = $fact_code; //next line is debug //echo $current0record . "
"; switch($current0record){ case 'INDI': //create title_format variable that has not yet been set. $title_format = $firstname . " " . $middlename . " " . $lastname; //Will change with the implementation of tokens. //next line is debug //echo $title_format . "
"; //Create family_individual node unset($node); $node->type = family_individual; $node->uid = $user->uid; $node->title = $title_format; $node->status = 1; $node->moderate = 0; $node->comment = 2; $node->revision = 0; node_validate($node, $error); if (!node_access("create", $node)) { $error['access'] = message_access(); } if ($error) { drupal_set_message( t('Error at line @lnum of GED (@line): @error.', array('@lnum' => $lnum, '@line' => $gedline, '@error' => print_r($error,true)) ) ); } else { $node->title=$title_format; $node->FORE=$firstname; $node->MIDN=$middlename; $node->SURN=$lastname; $node->SEX=$gender; $node->BIRT_DATE=$birthdate; $node->BIRT_PLAC=$birthplace; $node->DEAT_DATE=$deathdate; $node->DEAT_PLAC=$deathplace; node_save($node); $nid=$node->nid; //Insert relationship variables into temporary database db_query("INSERT INTO {family_relations_temp} (nid, famc_xref, fams_xref) VALUES (%d, '%s', '%s')", $nid, $famc_xref, $fams_xref); //next line is debug } unset($node); //unset all INDI variables unset ($famc_xref); unset ($fams_xref); unset ($vid); unset ($nid); unset ($title_format); unset ($firstname); unset ($middlename); unset ($lastname); unset ($gender); unset ($birthdate); unset ($birthplace); unset ($deathdate); unset ($deathplace); unset ($children_num); break; case 'FAM': //Find the group surname shared by the children of the group. - This may be incorrect in cases where the name has not been passed to the children. $current0xref='@'.$current0xref.'@'; $result = db_query("SELECT r.lastname FROM {family_individual} r INNER JOIN {family_relations_temp} t ON r.nid=t.nid WHERE t.famc_xref = '%s'", $current0xref); $group_surname = db_fetch_object($result); //Debug Line Below //drupal_set_message(t('FAM XREF @n', array('@n' => $current0xref))); //Find Parents of group $result = db_query("SELECT nid FROM {family_relations_temp} WHERE fams_xref = '%s'", $current0xref); while ($parent = db_fetch_array($result)) { //Debug Line Below //drupal_set_message(t('PARENT NID @n', array('@n' => $parent['nid']))); $parents[] = $parent['nid']; } $parent1 = $parents[0]; $parent2 = $parents[1]; //create group node unset($node); $node->type = family_group; $node->uid = $user->uid; $node->title = $title_format; $node->status = 1; $node->moderate = 0; $node->comment = 2; $node->revision = 0; node_validate($node, $error); if (!node_access("create", $node)) { $error['access'] = message_access(); } if ($error) { drupal_set_message( t('Error at line @lnum of GED (@line): @error.', array('@lnum' => $lnum, '@line' => $gedline, '@error' => print_r($error,true)) ) ); } else { $node->title=$title_format; $node->MARR_TYPE=$marr_type; $node->MARR_DATE=$marr_date; $node->MARR_PLAC=$marr_plac; $node->DIV_DATE=$div_date; $node->DIV_PLAC=$div_plac; $node->PAR1=$parent1; $node->PAR2=$parent2; node_save($node); $nid=$node->nid; //insert ancestor group value into INDI nodes related to this group //db_query("UPDATE {family_individual} SET ancestor_group='%d' WHERE lastname='%s'", $nid, $group_surname); //insert variables into family_group table //db_query("INSERT INTO {family_group} (vid, nid, title_format, marr_type, marr_date, marr_plac, div_date, div_plac, parent1, parent2) VALUES (%d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%d', '%d')", $vid, $nid, $title_format, $marr_type, $marr_date, $marr_plac, $div_date, $div_plac, $parent1, $parent2); //unset all FAM variables $result = db_query("SELECT nid FROM {family_relations_temp} WHERE famc_xref = '%s'", $current0xref); while ($child = db_fetch_array($result)) { //Debug Line Below //drupal_set_message(t('CHILD NID @n', array('@n' => $child['nid']))); $childnid = $child['nid']; db_query("UPDATE {family_individual} SET ancestor_group = %d WHERE nid =%d", $nid, $childnid); } } unset($node); unset ($current0xref); unset ($child_ref_nid); unset ($group_surname); unset ($parent_surname); unset ($parent1_firstname); unset ($parent2_firstname); unset ($vid); unset ($nid); unset ($title_format); unset ($marr_type); unset ($marr_date); unset ($marr_plac); unset ($div_date); unset ($div_plac); unset ($parent1); unset ($parent2); unset ($parents); break; } $current0record = NULL; //next line is debug //echo $fact_code . "
"; switch($fact_code){ case 'FAM': case 'INDI': $current0record = $fact_code; $current0xref = $xref; break; } break; case '1': $current1record = $fact_code; //next line is debug //echo $current0record . "
"; switch($current0record){ case 'INDI': //next line is debug //echo $fact_code . "
"; switch($fact_code){ case 'SEX': $gender = $value; $current1record = $fact_code; break; case 'NCHI': $children_num = $value; $current1record = $fact_code; break; case 'NAME': //split name value by / to separate surname $splitName1 = explode("/", $value); $lastname = $splitName1[1]; // split name by spaces $splitName2 = explode(" ", $splitName1[0]); // take the first name to be firstname $firstname = $splitName2[0]; // add all the other names together in a string $middlename = $splitName2[1] . " " . $splitName2[2] . " " . $splitName2[3] . " " . $splitName2[4] . " " . $splitName2[5] . " " . $splitName2[6] . " " . $splitName2[7]; $current1record = $fact_code; break; case 'DEAT': case 'BIRT': $current1record = $fact_code; break; case 'FAMS': $fams_xref = $value; break; case 'FAMC': $famc_xref = $value; break; } break; case 'FAM': //next line is debug //echo $fact_code . "
"; switch($fact_code){ case 'MARR': case 'DIV': $current1record = $fact_code; break; } break; } break; case '2': $current2record = $fact_code; //next line is debug //echo $current1record . "
"; switch($current1record){ case 'BIRT': //next line is debug //echo $fact_code . "
"; switch($fact_code){ case 'DATE': $birthdate = family_changeDateFormat($value); break; case 'PLAC': $birthplace = $value; break; } break; case 'DEAT': //next line is debug //echo $fact_code . "
"; switch($fact_code){ case 'DATE': $deathdate = family_changeDateFormat($value); break; case 'PLAC': $deathplace = $value; break; } break; case 'MARR': //next line is debug //echo $fact_code . "
"; switch($fact_code){ case 'TYPE': $marr_type = $value; break; case 'DATE': $marr_date = family_changeDateFormat($value); break; case 'PLAC': $marr_plac = $value; break; } break; case 'DIV': //next line is debug //echo $fact_code . "
"; switch($fact_code){ case 'DATE': $div_date = family_changeDateFormat($value); break; case 'PLAC': $div_plac = $value; break; } break; } break; } } } fclose ($fp); db_query("DROP TABLE {family_relations_temp}"); drupal_set_message(t('Processed @r records (@n lines) of GED.', array('@r' => $rprocessed, '@n' => $lprocessed))); if ($rnum > $rmax) drupal_set_message(t('Next start record: @r.', array('@r' => $rmax + 1))); else drupal_set_message(t('No more records to process')); }} return; }