1<?php 2 /* Utility function for mysqli_set_local_infile*.phpt tests */ 3 function shutdown_clean($file) { 4 if ($file) { 5 unlink($file); 6 } 7 } 8 9 function check_local_infile_support($link, $engine, $table_name = 'test') { 10 11 if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) 12 return "Cannot check if Server variable 'local_infile' is set to 'ON'"; 13 14 $row = mysqli_fetch_assoc($res); 15 mysqli_free_result($res); 16 if ('ON' != $row['Value']) 17 return sprintf("Server variable 'local_infile' seems not set to 'ON', found '%s'", $row['Value']); 18 19 if (!mysqli_query($link, sprintf('DROP TABLE IF EXISTS %s', $table_name))) { 20 return "Failed to drop old test table"; 21 } 22 23 if (!mysqli_query($link, $sql = sprintf('CREATE TABLE %s(id INT, label CHAR(1), PRIMARY KEY(id)) ENGINE=%s', 24 $table_name, $engine))) 25 return "Failed to create test table: $sql"; 26 27 $file = create_standard_csv(1, false); 28 if (!$file) { 29 mysqli_query($link, sprintf('DROP TABLE IF EXISTS %s', $table_name)); 30 return "Cannot create CSV file"; 31 } 32 33 if (!@mysqli_query($link, sprintf("LOAD DATA LOCAL INFILE '%s' 34 INTO TABLE %s 35 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\'' 36 LINES TERMINATED BY '\n'", 37 mysqli_real_escape_string($link, $file), 38 $table_name))) { 39 if (1148 == mysqli_errno($link)) { 40 mysqli_query($link, sprintf('DROP TABLE IF EXISTS %s', $table_name)); 41 return "Cannot test LOAD DATA LOCAL INFILE, [1148] The used command is not allowed with this MySQL version"; 42 } else if ($link->errno) { 43 return $link->error; 44 } 45 } 46 mysqli_query($link, sprintf('DROP TABLE IF EXISTS %s', $table_name)); 47 return ""; 48 } 49 50 function create_standard_csv($offset, $verbose = true) { 51 // create a CVS file 52 $file = tempnam(sys_get_temp_dir(), 'mysqli_test'); 53 if (!$fp = fopen($file, 'w')) { 54 if ($verbose) 55 printf("[%03d + 1] Cannot create CVS file '%s'\n", $offset, $file); 56 return NULL; 57 } else { 58 /* Looks ugly? No, handy if you have crashes... */ 59 register_shutdown_function("shutdown_clean", $file); 60 } 61 62 if ((version_compare(PHP_VERSION, '6.0', '==') == 1)) { 63 if (!fwrite($fp, (binary)"'97';'x';\n") || 64 !fwrite($fp, (binary)"'98';'y';\n") || 65 !fwrite($fp, (binary)"99;'z';\n")) { 66 if ($verbose) 67 printf("[%03d + 2] Cannot write CVS file '%s'\n", $offset, $file); 68 return NULL; 69 } 70 } else { 71 if (!fwrite($fp, "97;'x';\n") || 72 !fwrite($fp, "98;'y';\n") || 73 !fwrite($fp, "99;'z';\n")) { 74 if ($verbose) 75 printf("[%03d + 3] Cannot write CVS file '%s'\n", $offset, $file); 76 return NULL; 77 } 78 } 79 80 fclose($fp); 81 82 if (!chmod($file, 0644)) { 83 if ($verbose) 84 printf("[%03d + 4] Cannot change the file perms of '%s' from 0600 to 0644, MySQL might not be able to read it\n", 85 $offset, $file); 86 return NULL; 87 } 88 return $file; 89 } 90 91 function try_handler($offset, $link, $file, $handler, $expected = null) { 92 93 if ('default' == $handler) { 94 mysqli_set_local_infile_default($link); 95 } else if (!mysqli_set_local_infile_handler($link, $handler)) { 96 printf("[%03d] Cannot set infile handler to '%s'\n", $offset, $handler); 97 return false; 98 } 99 printf("Callback set to '%s'\n", $handler); 100 101 if (!mysqli_query($link, sprintf("DELETE FROM test"))) { 102 printf("[%03d] Cannot remove records, [%d] %s\n", $offset + 1, mysqli_errno($link), mysqli_error($link)); 103 return false; 104 } 105 106 if (!@mysqli_query($link, sprintf("LOAD DATA LOCAL INFILE '%s' 107 INTO TABLE test 108 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\'' 109 LINES TERMINATED BY '\n'", 110 mysqli_real_escape_string($link, $file)))) { 111 printf("[%03d] LOAD DATA failed, [%d] %s\n", 112 $offset + 2, 113 mysqli_errno($link), mysqli_error($link)); 114 } 115 116 if (!$res = mysqli_query($link, "SELECT id, label FROM test ORDER BY id")) { 117 printf("[%03d] [%d] %s\n", $offset + 3, mysqli_errno($link), mysqli_error($link)); 118 return false; 119 } 120 121 if (!is_array($expected)) 122 return true; 123 124 foreach ($expected as $k => $values) { 125 if (!$tmp = mysqli_fetch_assoc($res)) { 126 printf("[%03d/%d] [%d] '%s'\n", $offset + 4, $k, mysqli_errno($link), mysqli_error($link)); 127 return false; 128 } 129 if ($values['id'] != $tmp['id']) { 130 printf("[%03d/%d] Expecting %s got %s\n", 131 $offset + 5, $k, 132 $values['id'], $tmp['id']); 133 return false; 134 } 135 if ($values['label'] != $tmp['label']) { 136 printf("[%03d/%d] Expecting %s got %s\n", 137 $offset + 6, $k, 138 $values['label'], $tmp['label']); 139 return false; 140 } 141 } 142 143 if ($res && $tmp = mysqli_fetch_assoc($res)) { 144 printf("[%03d] More results than expected!\n", $offset + 7); 145 do { 146 var_dump($tmp); 147 } while ($tmp = mysqli_fetch_assoc($res)); 148 return false; 149 } 150 151 if ($res) 152 mysqli_free_result($res); 153 154 return true; 155 } 156?> 157