quick minor path updates (#1968)
[openemr.git] / library / standard_tables_capture.inc
blob65497429b446ee836f9508e9fb983bebae0c4598
1 <?php
2 /**
3  * This library contains functions that implement the database load processing
4  * of external database files into openEMR
5  *
6  * Copyright (C) 2011 Phyaura, LLC <info@phyaura.com>
7  *
8  * LICENSE: This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://opensource.org/licenses/gpl-license.php>;.
18  *
19  * @package OpenEMR
20  * @author  Rohit Kumar <pandit.rohit@netsity.com>
21  * @author  (Mac) Kevin McAloon <mcaloon@patienthealthcareanalytics.com>
22  * @author  Brady Miller <brady.g.miller@gmail.com>
23  * @link    http://www.open-emr.org
24  */
27 // Function to copy a package to temp
28 // $type (RXNORM, SNOMED etc.)
29 function temp_copy($filename, $type)
32     if (!file_exists($filename)) {
33         return false;
34     }
36     if (!file_exists($GLOBALS['temporary_files_dir']."/".$type)) {
37         if (!mkdir($GLOBALS['temporary_files_dir']."/".$type, 0777, true)) {
38                 return false;
39         }
40     }
42     if (copy($filename, $GLOBALS['temporary_files_dir']."/".$type."/".basename($filename))) {
43         return true;
44     } else {
45         return false;
46     }
49 // Function to unarchive a package
50 // $type (RXNORM, SNOMED etc.)
51 function temp_unarchive($filename, $type)
53     $filename = $GLOBALS['temporary_files_dir']."/".$type."/".basename($filename);
54     if (!file_exists($filename)) {
55         return false;
56     } else {
57     // let's uzip the file
58     // use checksums to determine the "version"
59     //
60         $zip = new ZipArchive;
61         if ($zip->open($filename) === true) {
62             if (!($zip->extractTo($GLOBALS['temporary_files_dir']."/".$type))) {
63                 return false;
64             }
66             $zip->close();
67             return true;
68         } else {
69             return false;
70         }
71     }
74 // Function to import the RXNORM tables
75 // $is_windows_flag - pass the IS_WINDOWS constant
76 function rxnorm_import($is_windows_flag)
79     // set paths
80     $dirScripts = $GLOBALS['temporary_files_dir']."/RXNORM/scripts/mysql";
81     $dir = $GLOBALS['temporary_files_dir']."/RXNORM/rrf";
82     $dir=str_replace('\\', '/', $dir);
84     $rx_info = array();
85     $rx_info['rxnatomarchive'] = array('title' => "Archive Data", 'dir' => "$dir", 'origin' => "RXNATOMARCHIVE.RRF", 'filename' => "RXNATOMARCHIVE.RRF", 'table' => "rxnatomarchive", 'required' => 0);
86     $rx_info['rxnconso'] = array('title' => "Concept Names and Sources", 'dir' => "$dir", 'origin' => "RXNCONSO.RRF", 'filename' => "RXNCONSO.RRF", 'table' => "rxnconso",  'required' => 1);
87     $rx_info['rxncui'] = array('title' => "Retired RXCUI Data", 'dir' => "$dir", 'origin' => "RXNCUI.RRF", 'filename' => "RXNCUI.RRF", 'table' => "rxncui", 'required' => 1);
88     $rx_info['rxncuichanges'] = array('title' => "Concept Changes", 'dir' => "$dir", 'origin' => "RXNCUICHANGES.RRF", 'filename' => "RXNCUICHANGES.RRF", 'table' => "rxncuichanges", 'required' => 1);
89     $rx_info['rxndoc'] = array('title' => "Documentation for Abbreviated Values", 'dir' => "$dir", 'origin' => "RXNDOC.RRF", 'filename' => "RXNDOC.RRF", 'table' => "rxndoc", 'required' => 1);
90     $rx_info['rxnrel'] = array('title' => "Relationships", 'dir' => "$dir", 'origin' => "RXNREL.RRF", 'filename' => "RXNREL.RRF", 'table' => "rxnrel", 'required' => 1);
91     $rx_info['rxnsab'] = array('title' => "Source Information", 'dir' => "$dir", 'origin' => "RXNSAB.RRF", 'filename' => "RXNSAB.RRF", 'table' => "rxnsab", 'required' => 0);
92     $rx_info['rxnsat'] = array('title' => "Simple Concept and Atom Attributes", 'dir' => "$dir", 'origin' => "RXNSAT.RRF", 'filename' => "RXNSAT.RRF", 'table' => "rxnsat", 'required' => 0);
93     $rx_info['rxnsty'] = array('title' => "Semantic Types ", 'dir' => "$dir", 'origin' => "RXNSTY.RRF", 'filename' => "RXNSTY.RRF", 'table' => "rxnsty", 'required' => 1);
95     // load scripts
96     $file_load = file_get_contents($dirScripts.'/Table_scripts_mysql_rxn.sql', true);
97     if ($is_windows_flag) {
98         $data_load = file_get_contents($dirScripts.'/Load_scripts_mysql_rxn_win.sql', true);
99     } else {
100         $data_load = file_get_contents($dirScripts.'/Load_scripts_mysql_rxn_unix.sql', true);
101     }
103     $indexes_load = file_get_contents($dirScripts.'/Indexes_mysql_rxn.sql', true);
105     //
106     // Creating the structure for table and applying indexes
107     //
109     $file_array=explode(";", $file_load);
110     foreach ($file_array as $val) {
111         if (trim($val)!='') {
112             sqlStatementNoLog($val);
113         }
114     }
116     $indexes_array=explode(";", $indexes_load);
118     foreach ($indexes_array as $val1) {
119         if (trim($val1)!='') {
120             sqlStatementNoLog($val1);
121         }
122     }
125     // Settings to drastically speed up import with InnoDB
126     sqlStatementNoLog("SET autocommit=0");
127     sqlStatementNoLog("START TRANSACTION");
128     $data=explode(";", $data_load);
129     foreach ($data as $val) {
130         foreach ($rx_info as $key => $value) {
131             $file_name= $value['origin'];
132             $replacement=$dir."/".$file_name;
134             $pattern='/'.$file_name.'/';
135             if (strpos($val, $file_name) !== false) {
136                 $val1 = str_replace($file_name, $replacement, $val);
137                 if (trim($val1)!='') {
138                     sqlStatementNoLog($val1);
139                 }
140             }
141         }
142     }
144     // Settings to drastically speed up import with InnoDB
145     sqlStatementNoLog("COMMIT");
146     sqlStatementNoLog("SET autocommit=1");
148     return true;
151 // Function to import SNOMED tables
152 function snomed_import($us_extension = false)
155     // set up array
156     $table_array_for_snomed=array(
157         "sct_concepts_drop"=>"DROP TABLE IF EXISTS `sct_concepts`",
158         "sct_concepts_structure"=>"CREATE TABLE IF NOT EXISTS `sct_concepts` (
159             `ConceptId` bigint(20) NOT NULL,
160             `ConceptStatus` int(11) NOT NULL,
161             `FullySpecifiedName` varchar(255) NOT NULL,
162             `CTV3ID` varchar(5) NOT NULL,
163             `SNOMEDID` varchar(8) NOT NULL,
164             `IsPrimitive` tinyint(1) NOT NULL,
165             PRIMARY KEY (`ConceptId`)
166             ) ENGINE=InnoDB",
167         "sct_descriptions_drop"=>"DROP TABLE IF EXISTS `sct_descriptions`",
168         "sct_descriptions_structure"=>"CREATE TABLE IF NOT EXISTS `sct_descriptions` (
169             `DescriptionId` bigint(20) NOT NULL,
170             `DescriptionStatus` int(11) NOT NULL,
171             `ConceptId` bigint(20) NOT NULL,
172             `Term` varchar(255) NOT NULL,
173             `InitialCapitalStatus` tinyint(1) NOT NULL,
174             `DescriptionType` int(11) NOT NULL,
175             `LanguageCode` varchar(8) NOT NULL,
176             PRIMARY KEY (`DescriptionId`)
177             ) ENGINE=InnoDB",
178         "sct_relationships_drop"=>"DROP TABLE IF EXISTS `sct_relationships`",
179         "sct_relationships_structure"=>"CREATE TABLE IF NOT EXISTS `sct_relationships` (
180             `RelationshipId` bigint(20) NOT NULL,
181             `ConceptId1` bigint(20) NOT NULL,
182             `RelationshipType` bigint(20) NOT NULL,
183             `ConceptId2` bigint(20) NOT NULL,
184             `CharacteristicType` int(11) NOT NULL,
185             `Refinability` int(11) NOT NULL,
186             `RelationshipGroup` int(11) NOT NULL,
187             PRIMARY KEY (`RelationshipId`)
188             ) ENGINE=InnoDB"
189     );
191     // set up paths
192     $dir_snomed = $GLOBALS['temporary_files_dir']."/SNOMED/";
193     $sub_path="Terminology/Content/";
194     $dir=$dir_snomed;
195     $dir=str_replace('\\', '/', $dir);
197     // executing the create statement for tables, these are defined in snomed_capture.inc file
198     // this is skipped if the US extension is being added
199     if (!$us_extension) {
200         foreach ($table_array_for_snomed as $val) {
201             if (trim($val)!='') {
202                 sqlStatement($val);
203             }
204         }
205     }
207     // reading the SNOMED directory and identifying the files to import and replacing the variables by originals values.
208     if (is_dir($dir) && $handle = opendir($dir)) {
209         while (false !== ($filename = readdir($handle))) {
210             if ($filename != "." && $filename != ".." && !strpos($filename, "zip")) {
211                 $path=$dir."".$filename."/".$sub_path;
212                 if (!(is_dir($path))) {
213                     $path=$dir."".$filename."/RF1Release/".$sub_path;
214                 }
216                 if (is_dir($path) && $handle1 = opendir($path)) {
217                     while (false !== ($filename1 = readdir($handle1))) {
218                         $load_script="Load data local infile '#FILENAME#' into table #TABLE# fields terminated by '\\t' ESCAPED BY '' lines terminated by '\\n' ignore 1 lines   ";
219                         $array_replace=array("#FILENAME#","#TABLE#");
220                         if ($filename1 != "." && $filename1 != "..") {
221                             $file_replace=$path.$filename1;
222                             if (strpos($filename1, "Concepts") !== false) {
223                                 $new_str=str_replace($array_replace, array($file_replace,"sct_concepts"), $load_script);
224                             }
226                             if (strpos($filename1, "Descriptions") !== false) {
227                                 $new_str=str_replace($array_replace, array($file_replace,"sct_descriptions"), $load_script);
228                             }
230                             if (strpos($filename1, "Relationships") !== false) {
231                                 $new_str=str_replace($array_replace, array($file_replace,"sct_relationships"), $load_script);
232                             }
234                             if ($new_str!='') {
235                                 sqlStatement($new_str);
236                             }
237                         }
238                     }
239                 }
241                 closedir($handle1);
242             }
243         }
245         closedir($handle);
246     }
248     return true;
251 // Function to import ICD tables $type differentiates ICD 9, 10 and eventually 11 (circa 2018 :-) etc.
253 function icd_import($type)
256     // set up paths
257     $dir_icd = $GLOBALS['temporary_files_dir']."/".$type."/";
258     $dir=str_replace('\\', '/', $dir_icd);
259     $db_load = '';
260     $db_update = '';
262     // the incoming array is a metadata array containing keys that substr match to the incoming filename
263     // followed by the field name, position and length of each fixed length text record in the incoming
264     // flat files. There are separate definitions for ICD 9 and 10 based on the type passed in
265     $incoming = array();
266     if ($type == 'ICD9') {
267         $incoming['SHORT_DX'] = array('#TABLENAME#' => "icd9_dx_code",
268         '#FLD1#' => "dx_code", '#POS1#' => 1, '#LEN1#' => 5,
269         '#FLD2#' => "short_desc", '#POS2#' => 7, '#LEN2#' => 60);
270         $incoming['SHORT_SG'] = array('#TABLENAME#' => "icd9_sg_code",
271         '#FLD1#' => "sg_code", '#POS1#' => 1, '#LEN1#' => 4,
272         '#FLD2#' => "short_desc", '#POS2#' => 6, '#LEN2#' => 60);
273         $incoming['LONG_SG'] = array('#TABLENAME#' => "icd9_sg_long_code",
274         '#FLD1#' => "sg_code", '#POS1#' => 1, '#LEN1#' => 4,
275         '#FLD2#' => "long_desc", '#POS2#' => 6, '#LEN2#' => 300);
276         $incoming['LONG_DX'] = array('#TABLENAME#' => "icd9_dx_long_code",
277         '#FLD1#' => "dx_code", '#POS1#' => 1, '#LEN1#' => 5,
278         '#FLD2#' => "long_desc", '#POS2#' => 7, '#LEN2#' => 300);
279     } else {
280         $incoming['icd10pcs_order_'] = array('#TABLENAME#' => "icd10_pcs_order_code",
281         '#FLD1#' => "pcs_code", '#POS1#' => 7, '#LEN1#' => 7,
282         '#FLD2#' => "valid_for_coding", '#POS2#' => 15, '#LEN2#' => 1,
283         '#FLD3#' => "short_desc", '#POS3#' => 17, '#LEN3#' => 60,
284         '#FLD4#' => "long_desc", '#POS4#' => 78, '#LEN4#' => 300);
285         $incoming['icd10cm_order_'] = array('#TABLENAME#' => "icd10_dx_order_code",
286         '#FLD1#' => "dx_code", '#POS1#' =>7, '#LEN1#' => 7,
287         '#FLD2#' => "valid_for_coding", '#POS2#' => 15, '#LEN2#' => 1,
288         '#FLD3#' => "short_desc", '#POS3#' => 17, '#LEN3#' => 60,
289         '#FLD4#' => "long_desc", '#POS4#' => 78, '#LEN4#' => 300);
290         $incoming['reimb_map_pr_'] = array('#TABLENAME#' => "icd10_reimbr_pcs_9_10",
291         '#FLD1#' => "code", '#POS1#' => 1, '#LEN1#' => 7,
292         '#FLD2#' => "code_cnt", '#POS2#' => 9, '#LEN2#' => 1,
293         '#FLD3#' => "ICD9_01", '#POS3#' => 11, '#LEN3#' => 5,
294         '#FLD4#' => "ICD9_02", '#POS4#' => 17, '#LEN4#' => 5,
295         '#FLD5#' => "ICD9_03", '#POS5#' => 23, '#LEN5#' => 5,
296         '#FLD6#' => "ICD9_04", '#POS6#' => 29, '#LEN6#' => 5,
297         '#FLD7#' => "ICD9_05", '#POS7#' => 35, '#LEN7#' => 5,
298         '#FLD8#' => "ICD9_06", '#POS8#' => 41, '#LEN8#' => 5);
299         $incoming['reimb_map_dx_'] = array('#TABLENAME#' => "icd10_reimbr_dx_9_10",
300         '#FLD1#' => "code", '#POS1#' => 1, '#LEN1#' => 7,
301         '#FLD2#' => "code_cnt", '#POS2#' => 9, '#LEN2#' => 1,
302         '#FLD3#' => "ICD9_01", '#POS3#' => 11, '#LEN3#' => 5,
303         '#FLD4#' => "ICD9_02", '#POS4#' => 17, '#LEN4#' => 5,
304         '#FLD5#' => "ICD9_03", '#POS5#' => 23, '#LEN5#' => 5,
305         '#FLD6#' => "ICD9_04", '#POS6#' => 29, '#LEN6#' => 5,
306         '#FLD7#' => "ICD9_05", '#POS7#' => 35, '#LEN7#' => 5,
307         '#FLD8#' => "ICD9_06", '#POS8#' => 41, '#LEN8#' => 5);
308         $incoming['I10gem'] = array('#TABLENAME#' => "icd10_gem_dx_10_9",
309         '#FLD1#' => "dx_icd10_source", '#POS1#' => 1, '#LEN1#' => 7,
310         '#FLD2#' => "dx_icd9_target", '#POS2#' => 9, '#LEN2#' => 5,
311         '#FLD3#' => "flags", '#POS3#' => 15, '#LEN3#' => 5);
312         $incoming['I9gem'] = array('#TABLENAME#' => "icd10_gem_dx_9_10",
313         '#FLD1#' => "dx_icd9_source", '#POS1#' => 1, '#LEN1#' => 5,
314         '#FLD2#' => "dx_icd10_target", '#POS2#' => 7, '#LEN2#' => 7,
315         '#FLD3#' => "flags", '#POS3#' => 15, '#LEN3#' => 5);
316         $incoming['gem_pcsi9'] = array('#TABLENAME#' => "icd10_gem_pcs_10_9",
317         '#FLD1#' => "pcs_icd10_source", '#POS1#' => 1, '#LEN1#' => 7,
318         '#FLD2#' => "pcs_icd9_target", '#POS2#' => 9, '#LEN2#' => 5,
319         '#FLD3#' => "flags", '#POS3#' => 15, '#LEN3#' => 5);
320         $incoming['gem_i9pcs'] = array('#TABLENAME#' => "icd10_gem_pcs_9_10",
321         '#FLD1#' => "pcs_icd9_source", '#POS1#' => 1, '#LEN1#' => 5,
322         '#FLD2#' => "pcs_icd10_target", '#POS2#' => 7, '#LEN2#' => 7,
323         '#FLD3#' => "flags", '#POS3#' => 15, '#LEN3#' => 5);
324     }
326     // set up the start of the load script to be appended from the incoming array defined above where incoming
327     // file matches
328     $db_load = "LOAD DATA LOCAL INFILE '#INFILE#' INTO TABLE #TABLENAME# FIELDS TERMINATED BY '\0' (@var) SET revision = 0, ";
329     $col_template = "#FLD# = trim(Substring(@var, #POS#, #LEN#))";
331     // load all data and set active revision
332     if (is_dir($dir) && $handle = opendir($dir)) {
333         while (false !== ($filename = readdir($handle))) {
334         // bypass unwanted entries
335             if (!stripos($filename, ".txt") || stripos($filename, "diff") || stripos($filename, "addenda")) {
336                 continue;
337             }
339         // reset the sql load command and susbtitute the filename
340             $run_sql = $db_load;
341             $run_sql = str_replace("#INFILE#", $dir . $filename, $run_sql);
342             $keys = array_keys($incoming);
343             while ($this_key = array_pop($keys)) {
344                 if (stripos($filename, $this_key) !== false) {
345                     // now substitute the tablename
346                         $run_sql = str_replace("#TABLENAME#", $incoming[$this_key]['#TABLENAME#'], $run_sql);
347     
348                     // the range defines the maximum number of fields contained
349                     // in any of the incoming files
350                     foreach (range(1, 8) as $field) {
351                         $fld = "#FLD" . $field . "#";
352                         $nxtfld = "#FLD" . ($field+1) . "#";
353                         $pos = "#POS" . $field . "#";
354                         $len = "#LEN" . $field . "#";
356                 // concat this fields template in the sql string
357                         $run_sql .= $col_template;
358                         $run_sql = str_replace("#FLD#", $incoming[$this_key][$fld], $run_sql);
359                         $run_sql = str_replace("#POS#", $incoming[$this_key][$pos], $run_sql);
360                         $run_sql = str_replace("#LEN#", $incoming[$this_key][$len], $run_sql);
361                 // at the end of this table's field list
362                         if (!array_key_exists($nxtfld, $incoming[$this_key])) {
363                             break;
364                         }
366                         $run_sql .= ",";
367                     }
369                     sqlStatement($run_sql);
371                     // now update the revision for this load
372                     $res = sqlStatement("SELECT max(revision) rev FROM " . $incoming[$this_key]['#TABLENAME#']);
373                     $row = sqlFetchArray($res);
374                     $next_rev = $row['rev'] + 1;
375                     $run_sql = "UPDATE " . $incoming[$this_key]['#TABLENAME#'] . " SET active = 0";
376                     sqlQuery($run_sql);
377                     $run_sql = "UPDATE " . $incoming[$this_key]['#TABLENAME#'] . " SET active = 1, revision = ? WHERE revision = 0";
378                     sqlQuery($run_sql, array($next_rev));
379                     break;
380                 }
381             }
382         }
384         closedir($handle);
385     } else {
386         echo htmlspecialchars(xl('ERROR: No ICD import directory.'), ENT_NOQUOTES)."<br>";
387         return;
388     }
390     // now update the tables where necessary
391     if ($type == 'ICD9') {
392         sqlStatement("update `icd9_dx_code` SET formatted_dx_code = dx_code");
393         sqlStatement("update `icd9_dx_code` SET formatted_dx_code = concat(concat(left(dx_code, 3), '.'), substr(dx_code, 4)) WHERE dx_code RLIKE '^[V0-9]{1}.*' AND LENGTH(dx_code) > 3");
394         sqlStatement("update `icd9_dx_code` SET formatted_dx_code = concat(concat(left(dx_code, 4), '.'), substr(dx_code, 5)) WHERE dx_code RLIKE '^[E]{1}.*' AND LENGTH(dx_code) > 4");
395         sqlStatement("update `icd9_sg_code` SET formatted_sg_code = concat(concat(left(sg_code, 2), '.'), substr(sg_code, 3))");
396         sqlStatement("update `icd9_dx_code` A, `icd9_dx_long_code` B set A.long_desc = B.long_desc where A.dx_code = B.dx_code and A.active = 1 and A.long_desc is NULL");
397         sqlStatement("update `icd9_sg_code` A, `icd9_sg_long_code` B set A.long_desc = B.long_desc where A.sg_code = B.sg_code and A.active = 1 and A.long_desc is NULL");
398     } else { // ICD 10
399         sqlStatement("update `icd10_dx_order_code` SET formatted_dx_code = dx_code");
400         sqlStatement("update `icd10_dx_order_code` SET formatted_dx_code = concat(concat(left(dx_code, 3), '.'), substr(dx_code, 4)) WHERE LENGTH(dx_code) > 3");
401     }
403     return true;
406 function valueset_import($type)
408     $dir_valueset = $GLOBALS['temporary_files_dir']."/".$type."/";
409         $dir = str_replace('\\', '/', $dir_valueset);
411     // Settings to drastically speed up import with InnoDB
412     sqlStatementNoLog("SET autocommit=0");
413     sqlStatementNoLog("START TRANSACTION");
414     if (is_dir($dir) && $handle = opendir($dir)) {
415         while (false !== ($filename = readdir($handle))) {
416             if (stripos($filename, ".xml")) {
417                     $abs_path = $dir.$filename;
418                     $xml  = simplexml_load_file($abs_path, null, null, 'ns0', true);
419                 foreach ($xml->DescribedValueSet as $vset) {
420                     $vset_attr = $vset->attributes();
421                     $nqf = $vset->xpath('ns0:Group[@displayName="NQF Number"]/ns0:Keyword');
422                     foreach ($vset->ConceptList as $cp) {
423                         foreach ($nqf as $nqf_code) {
424                             foreach ($cp->Concept as $con) {
425                                 $con_attr = $con->attributes();
426                                 sqlStatementNoLog("INSERT INTO valueset values(?,?,?,?,?,?,?) on DUPLICATE KEY UPDATE code_system = values(code_system),description = values(description),valueset_name = values(valueset_name)", array($nqf_code,$con_attr->code,$con_attr->codeSystem,$con_attr->codeSystemName,$vset_attr->ID,$con_attr->displayName,$vset_attr->displayName));
427                             }
428                         }
429                     }
430                 }
431                     
432                     sqlStatementNoLog("UPDATE valueset set code_type='SNOMED CT' where code_type='SNOMEDCT'");
433                     sqlStatementNoLog("UPDATE valueset set code_type='ICD9' where code_type='ICD9CM'");
434                     sqlStatementNoLog("UPDATE valueset set code_type='ICD10' where code_type='ICD10CM'");
435             }
436         }
437     }
439     // Settings to drastically speed up import with InnoDB
440     sqlStatementNoLog("COMMIT");
441     sqlStatementNoLog("SET autocommit=1");
442         return true;
445 // Function to clean up temp files
446 // $type (RXNORM etc.)
447 function temp_dir_cleanup($type)
449     if (is_dir($GLOBALS['temporary_files_dir']."/".$type)) {
450         rmdir_recursive($GLOBALS['temporary_files_dir']."/".$type);
451     }
454 // Function to update version tracker table if successful
455 // $type (RXNORM etc.)
456 function update_tracker_table($type, $revision, $version, $file_checksum)
458     if ($type == 'RXNORM') {
459         sqlStatement("INSERT INTO `standardized_tables_track` (`imported_date`,`name`,`revision_date`, `revision_version`, `file_checksum`) VALUES (NOW(),'RXNORM',?,?,?)", array($revision, $version, $file_checksum));
460         return true;
461     } else if ($type == 'SNOMED') {
462         sqlStatement("INSERT INTO `standardized_tables_track` (`imported_date`,`name`,`revision_date`, `revision_version`, `file_checksum`) VALUES (NOW(),'SNOMED',?,?,?)", array($revision, $version, $file_checksum));
463         return true;
464     } else if ($type == 'ICD9') {
465         sqlStatement("INSERT INTO `standardized_tables_track` (`imported_date`,`name`,`revision_date`, `revision_version`, `file_checksum`) VALUES (NOW(),'ICD9',?,?,?)", array($revision, $version, $file_checksum));
466         return true;
467     } else if ($type == 'CQM_VALUESET') {
468         sqlStatement("INSERT INTO `standardized_tables_track` (`imported_date`,`name`,`revision_date`, `revision_version`, `file_checksum`) VALUES (NOW(),'CQM_VALUESET',?,?,?)", array($revision, $version, $file_checksum));
469         return true;
470     } else { // $type == 'ICD10')
471         sqlStatement("INSERT INTO `standardized_tables_track` (`imported_date`,`name`,`revision_date`, `revision_version`, `file_checksum`) VALUES (NOW(),'ICD10',?,?,?)", array($revision, $version, $file_checksum));
472         return true;
473     }
475     return false;
478 // Function to delete an entire directory
479 function rmdir_recursive($dir)
481     $files = scandir($dir);
482     array_shift($files);    // remove '.' from array
483     array_shift($files);    // remove '..' from array
485     foreach ($files as $file) {
486         $file = $dir . '/' . $file;
487         if (is_dir($file)) {
488             rmdir_recursive($file);
489             continue;
490         }
492         unlink($file);
493     }
495     rmdir($dir);
498 // function to cleanup temp, copy and unarchive the zip file
499 function handle_zip_file($mode, $file)
501         // 1. copy the file to temp directory
502     if (!temp_copy($file, $mode)) {
503         echo htmlspecialchars(xl('ERROR: Unable to copy the file.'), ENT_NOQUOTES)."<br>";
504         temp_dir_cleanup($mode);
505         exit;
506     }
508         // 2. unarchive the file
509     if (!temp_unarchive($file, $mode)) {
510         echo htmlspecialchars(xl('ERROR: Unable to extract the file.'), ENT_NOQUOTES)."<br>";
511         temp_dir_cleanup($mode);
512         exit;
513     }