PageRenderTime 69ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 2ms

/local/adminer/lib/adminer.php

https://github.com/thepurpleblob/gumoodle
PHP | 2283 lines | 2035 code | 73 blank | 175 comment | 205 complexity | b5b333ce52464e21e3b692f007c23d6a MD5 | raw file
Possible License(s): Apache-2.0, GPL-3.0, BSD-3-Clause, LGPL-2.1, AGPL-3.0, MPL-2.0-no-copyleft-exception, LGPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. <?php
  2. /** Adminer - Compact database management
  3. * @link http://www.adminer.org/
  4. * @author Jakub Vrana, http://www.vrana.cz/
  5. * @copyright 2007 Jakub Vrana
  6. * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
  7. * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
  8. * @version 3.4.0-dev
  9. */error_reporting(6135);$hc=!ereg('^(unsafe_raw)?$',ini_get("filter.default"));if($hc||ini_get("filter.default_flags")){foreach(array('_GET','_POST','_COOKIE','_SERVER')as$W){$Zf=filter_input_array(constant("INPUT$W"),FILTER_UNSAFE_RAW);if($Zf)$$W=$Zf;}}if(isset($_GET["file"])){header("Expires: ".gmdate("D, d M Y H:i:s",time()+365*24*60*60)." GMT");if($_GET["file"]=="favicon.ico"){header("Content-Type: image/x-icon");echo
  10. base64_decode("AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA/wBhTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAERERAAAAAAETMzEQAAAAATERExAAAAABMRETEAAAAAExERMQAAAAATERExAAAAABMRETEAAAAAEzMzMREREQATERExEhEhABEzMxEhEREAAREREhERIRAAAAARIRESEAAAAAESEiEQAAAAABEREQAAAAAAAAAAD//9UAwP/VAIB/AACAf/AAgH+kAIB/gACAfwAAgH8AAIABAACAAf8AgAH/AMAA/wD+AP8A/wAIAf+B1QD//9UA");}elseif($_GET["file"]=="default.css"){header("Content-Type: text/css; charset=utf-8");echo'body{color:#000;background:#fff;font:90%/1.25 Verdana,Arial,Helvetica,sans-serif;margin:0;}a{color:blue;}a:visited{color:navy;}a:hover{color:red;}a.text{text-decoration:none;}h1{font-size:150%;margin:0;padding:.8em 1em;border-bottom:1px solid #999;font-weight:normal;color:#777;background:#eee;}h2{font-size:150%;margin:0 0 20px -18px;padding:.8em 1em;border-bottom:1px solid #000;color:#000;font-weight:normal;background:#ddf;}h3{font-weight:normal;font-size:130%;margin:1em 0 0;}form{margin:0;}table{margin:1em 20px 0 0;border:0;border-top:1px solid #999;border-left:1px solid #999;font-size:90%;}td,th{border:0;border-right:1px solid #999;border-bottom:1px solid #999;padding:.2em .3em;}th{background:#eee;text-align:left;}thead th{text-align:center;}thead td,thead th{background:#ddf;}fieldset{display:inline;vertical-align:top;padding:.5em .8em;margin:.8em .5em 0 0;border:1px solid #999;}p{margin:.8em 20px 0 0;}img{vertical-align:middle;border:0;}td img{max-width:200px;max-height:200px;}code{background:#eee;}tbody tr:hover td,tbody tr:hover th{background:#eee;}pre{margin:1em 0 0;}input[type=image]{vertical-align:middle;}.version{color:#777;font-size:67%;}.js .hidden,.nojs .jsonly{display:none;}.nowrap td,.nowrap th,td.nowrap{white-space:pre;}.wrap td{white-space:normal;}.error{color:red;background:#fee;}.error b{background:#fff;font-weight:normal;}.message{color:green;background:#efe;}.error,.message{padding:.5em .8em;margin:1em 20px 0 0;}.char{color:#007F00;}.date{color:#7F007F;}.enum{color:#007F7F;}.binary{color:red;}.odd td{background:#F5F5F5;}.js .checked td,.js .checked th{background:#ddf;}.time{color:silver;font-size:70%;}.function{text-align:right;}.number{text-align:right;}.datetime{text-align:right;}.type{width:15ex;width:auto\\9;}.options select{width:20ex;width:auto\\9;}.active{font-weight:bold;}.sqlarea{width:98%;}#menu{position:absolute;margin:10px 0 0;padding:0 0 30px 0;top:2em;left:0;width:19em;overflow:auto;overflow-y:hidden;white-space:nowrap;}#menu p{padding:.8em 1em;margin:0;border-bottom:1px solid #ccc;}#content{margin:2em 0 0 21em;padding:10px 20px 20px 0;}#lang{position:absolute;top:0;left:0;line-height:1.8em;padding:.3em 1em;}#breadcrumb{white-space:nowrap;position:absolute;top:0;left:21em;background:#eee;height:2em;line-height:1.8em;padding:0 1em;margin:0 0 0 -18px;}#h1{color:#777;text-decoration:none;font-style:italic;}#version{font-size:67%;color:red;}#schema{margin-left:60px;position:relative;-moz-user-select:none;-webkit-user-select:none;}#schema .table{border:1px solid silver;padding:0 2px;cursor:move;position:absolute;}#schema .references{position:absolute;}.rtl h2{margin:0 -18px 20px 0;}.rtl p,.rtl table,.rtl .error,.rtl .message{margin:1em 0 0 20px;}.rtl #content{margin:2em 21em 0 0;padding:10px 0 20px 20px;}.rtl #breadcrumb{left:auto;right:21em;margin:0 -18px 0 0;}.rtl #lang,.rtl #menu{left:auto;right:0;}.CodeMirror{border:1px inset #777;}.CodeMirror .error{background:#fee;}@media print{#lang,#menu{display:none;}#content{margin-left:1em;}#breadcrumb{left:1em;}.nowrap td,.nowrap th,td.nowrap{white-space:normal;}}';}elseif($_GET["file"]=="functions.js"){header("Content-Type: text/javascript; charset=utf-8");?>
  11. /** Toggle visibility
  12. * @param string
  13. * @return boolean
  14. */
  15. function toggle(id) {
  16. var el = document.getElementById(id);
  17. el.className = (el.className == 'hidden' ? '' : 'hidden');
  18. return true;
  19. }
  20. /** Set permanent cookie
  21. * @param string
  22. * @param number
  23. * @param string optional
  24. */
  25. function cookie(assign, days) {
  26. var date = new Date();
  27. date.setDate(date.getDate() + days);
  28. document.cookie = assign + '; expires=' + date;
  29. }
  30. /** Verify current Adminer version
  31. */
  32. function verifyVersion() {
  33. cookie('adminer_version=0', 1);
  34. var script = document.createElement('script');
  35. script.src = location.protocol + '//www.adminer.org/version.php';
  36. document.body.appendChild(script);
  37. }
  38. /** Get value of select
  39. * @param HTMLSelectElement
  40. * @return string
  41. */
  42. function selectValue(select) {
  43. var selected = select.options[select.selectedIndex];
  44. return ((selected.attributes.value || {}).specified ? selected.value : selected.text);
  45. }
  46. /** Set checked class
  47. * @param HTMLInputElement
  48. */
  49. function trCheck(el) {
  50. var tr = el.parentNode.parentNode;
  51. tr.className = tr.className.replace(/(^|\s)checked(\s|$)/, '$2') + (el.checked ? ' checked' : '');
  52. }
  53. /** Check all elements matching given name
  54. * @param HTMLInputElement
  55. * @param RegExp
  56. */
  57. function formCheck(el, name) {
  58. var elems = el.form.elements;
  59. for (var i=0; i < elems.length; i++) {
  60. if (name.test(elems[i].name)) {
  61. elems[i].checked = el.checked;
  62. trCheck(elems[i]);
  63. }
  64. }
  65. }
  66. /** Check all rows in <table class="checkable">
  67. */
  68. function tableCheck() {
  69. var tables = document.getElementsByTagName('table');
  70. for (var i=0; i < tables.length; i++) {
  71. if (/(^|\s)checkable(\s|$)/.test(tables[i].className)) {
  72. var trs = tables[i].getElementsByTagName('tr');
  73. for (var j=0; j < trs.length; j++) {
  74. trCheck(trs[j].firstChild.firstChild);
  75. }
  76. }
  77. }
  78. }
  79. /** Uncheck single element
  80. * @param string
  81. */
  82. function formUncheck(id) {
  83. var el = document.getElementById(id);
  84. el.checked = false;
  85. trCheck(el);
  86. }
  87. /** Get number of checked elements matching given name
  88. * @param HTMLInputElement
  89. * @param RegExp
  90. * @return number
  91. */
  92. function formChecked(el, name) {
  93. var checked = 0;
  94. var elems = el.form.elements;
  95. for (var i=0; i < elems.length; i++) {
  96. if (name.test(elems[i].name) && elems[i].checked) {
  97. checked++;
  98. }
  99. }
  100. return checked;
  101. }
  102. /** Select clicked row
  103. * @param MouseEvent
  104. */
  105. function tableClick(event) {
  106. var click = (!window.getSelection || getSelection().isCollapsed);
  107. var el = event.target || event.srcElement;
  108. while (!/^tr$/i.test(el.tagName)) {
  109. if (/^table$/i.test(el.tagName)) {
  110. return;
  111. }
  112. if (/^(a|input|textarea)$/i.test(el.tagName)) {
  113. click = false;
  114. }
  115. el = el.parentNode;
  116. }
  117. el = el.firstChild.firstChild;
  118. if (click) {
  119. el.click && el.click();
  120. el.onclick && el.onclick();
  121. }
  122. trCheck(el);
  123. }
  124. /** Set HTML code of an element
  125. * @param string
  126. * @param string undefined to set parentNode to &nbsp;
  127. */
  128. function setHtml(id, html) {
  129. var el = document.getElementById(id);
  130. if (el) {
  131. if (html == undefined) {
  132. el.parentNode.innerHTML = '&nbsp;';
  133. } else {
  134. el.innerHTML = html;
  135. }
  136. }
  137. }
  138. /** Find node position
  139. * @param Node
  140. * @return number
  141. */
  142. function nodePosition(el) {
  143. var pos = 0;
  144. while (el = el.previousSibling) {
  145. pos++;
  146. }
  147. return pos;
  148. }
  149. /** Go to the specified page
  150. * @param string
  151. * @param string
  152. * @param [MouseEvent]
  153. */
  154. function pageClick(href, page, event) {
  155. if (!isNaN(page) && page) {
  156. href += (page != 1 ? '&page=' + (page - 1) : '');
  157. location.href = href;
  158. }
  159. }
  160. /** Add row in select fieldset
  161. * @param HTMLSelectElement
  162. */
  163. function selectAddRow(field) {
  164. field.onchange = function () {
  165. selectFieldChange(field.form);
  166. };
  167. field.onchange();
  168. var row = field.parentNode.cloneNode(true);
  169. var selects = row.getElementsByTagName('select');
  170. for (var i=0; i < selects.length; i++) {
  171. selects[i].name = selects[i].name.replace(/[a-z]\[\d+/, '$&1');
  172. selects[i].selectedIndex = 0;
  173. }
  174. var inputs = row.getElementsByTagName('input');
  175. if (inputs.length) {
  176. inputs[0].name = inputs[0].name.replace(/[a-z]\[\d+/, '$&1');
  177. inputs[0].value = '';
  178. inputs[0].className = '';
  179. }
  180. field.parentNode.parentNode.appendChild(row);
  181. }
  182. /** Check whether the query will be executed with index
  183. * @param HTMLFormElement
  184. */
  185. function selectFieldChange(form) {
  186. var ok = (function () {
  187. var inputs = form.getElementsByTagName('input');
  188. for (var i=0; i < inputs.length; i++) {
  189. var input = inputs[i];
  190. if (/^fulltext/.test(input.name) && input.value) {
  191. return true;
  192. }
  193. }
  194. var ok = true;
  195. var selects = form.getElementsByTagName('select');
  196. for (var i=0; i < selects.length; i++) {
  197. var select = selects[i];
  198. var col = selectValue(select);
  199. var match = /^(where.+)col\]/.exec(select.name);
  200. if (match) {
  201. var op = selectValue(form[match[1] + 'op]']);
  202. var val = form[match[1] + 'val]'].value;
  203. if (col in indexColumns && (!/LIKE|REGEXP/.test(op) || (op == 'LIKE' && val.charAt(0) != '%'))) {
  204. return true;
  205. } else if (col || val) {
  206. ok = false;
  207. }
  208. }
  209. if (col && /^order/.test(select.name)) {
  210. if (!(col in indexColumns)) {
  211. ok = false;
  212. }
  213. break;
  214. }
  215. }
  216. return ok;
  217. })();
  218. setHtml('noindex', (ok ? '' : '!'));
  219. }
  220. /** Send form by Ctrl+Enter on <select> and <textarea>
  221. * @param KeyboardEvent
  222. * @param [string]
  223. * @return boolean
  224. */
  225. function bodyKeydown(event, button) {
  226. var target = event.target || event.srcElement;
  227. if (event.ctrlKey && (event.keyCode == 13 || event.keyCode == 10) && !event.altKey && !event.metaKey && /select|textarea|input/i.test(target.tagName)) { // 13|10 - Enter, shiftKey allowed
  228. target.blur();
  229. if (button) {
  230. target.form[button].click();
  231. } else {
  232. target.form.submit();
  233. }
  234. return false;
  235. }
  236. return true;
  237. }
  238. /** Change focus by Ctrl+Up or Ctrl+Down
  239. * @param KeyboardEvent
  240. * @return boolean
  241. */
  242. function editingKeydown(event) {
  243. if ((event.keyCode == 40 || event.keyCode == 38) && event.ctrlKey && !event.altKey && !event.metaKey) { // 40 - Down, 38 - Up, shiftKey allowed
  244. var target = event.target || event.srcElement;
  245. var sibling = (event.keyCode == 40 ? 'nextSibling' : 'previousSibling');
  246. var el = target.parentNode.parentNode[sibling];
  247. if (el && (/^tr$/i.test(el.tagName) || (el = el[sibling])) && /^tr$/i.test(el.tagName) && (el = el.childNodes[nodePosition(target.parentNode)]) && (el = el.childNodes[nodePosition(target)])) {
  248. el.focus();
  249. }
  250. return false;
  251. }
  252. if (event.shiftKey && !bodyKeydown(event, 'insert')) {
  253. eventStop(event);
  254. return false;
  255. }
  256. return true;
  257. }
  258. /** Disable maxlength for functions
  259. * @param HTMLSelectElement
  260. */
  261. function functionChange(select) {
  262. var input = select.form[select.name.replace(/^function/, 'fields')];
  263. if (selectValue(select)) {
  264. if (input.origMaxLength === undefined) {
  265. input.origMaxLength = input.maxLength;
  266. }
  267. input.removeAttribute('maxlength');
  268. } else if (input.origMaxLength >= 0) {
  269. input.maxLength = input.origMaxLength;
  270. }
  271. }
  272. /** Create AJAX request
  273. * @param string
  274. * @param function (XMLHttpRequest)
  275. * @param [string]
  276. * @return XMLHttpRequest or false in case of an error
  277. */
  278. function ajax(url, callback, data) {
  279. var request = (window.XMLHttpRequest ? new XMLHttpRequest() : (window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : false));
  280. if (request) {
  281. request.open((data ? 'POST' : 'GET'), url);
  282. if (data) {
  283. request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  284. }
  285. request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
  286. request.onreadystatechange = function () {
  287. if (request.readyState == 4) {
  288. callback(request);
  289. }
  290. };
  291. request.send(data);
  292. }
  293. return request;
  294. }
  295. /** Use setHtml(key, value) for JSON response
  296. * @param string
  297. * @return XMLHttpRequest or false in case of an error
  298. */
  299. function ajaxSetHtml(url) {
  300. return ajax(url, function (request) {
  301. if (request.status) {
  302. var data = eval('(' + request.responseText + ')');
  303. for (var key in data) {
  304. setHtml(key, data[key]);
  305. }
  306. }
  307. });
  308. }
  309. /** Display edit field
  310. * @param HTMLElement
  311. * @param MouseEvent
  312. * @param number display textarea instead of input, 2 - load long text
  313. */
  314. function selectDblClick(td, event, text) {
  315. if (/input|textarea/i.test(td.firstChild.tagName)) {
  316. return;
  317. }
  318. var original = td.innerHTML;
  319. var input = document.createElement(text ? 'textarea' : 'input');
  320. input.onkeydown = function (event) {
  321. if (!event) {
  322. event = window.event;
  323. }
  324. if (event.keyCode == 27 && !(event.ctrlKey || event.shiftKey || event.altKey || event.metaKey)) { // 27 - Esc
  325. td.innerHTML = original;
  326. }
  327. };
  328. var pos = event.rangeOffset;
  329. var value = td.firstChild.alt || td.textContent || td.innerText;
  330. input.style.width = Math.max(td.clientWidth - 14, 20) + 'px'; // 14 = 2 * (td.border + td.padding + input.border)
  331. if (text) {
  332. var rows = 1;
  333. value.replace(/\n/g, function () {
  334. rows++;
  335. });
  336. input.rows = rows;
  337. }
  338. if (value == '\u00A0' || td.getElementsByTagName('i').length) { // &nbsp; or i - NULL
  339. value = '';
  340. }
  341. if (document.selection) {
  342. var range = document.selection.createRange();
  343. range.moveToPoint(event.clientX, event.clientY);
  344. var range2 = range.duplicate();
  345. range2.moveToElementText(td);
  346. range2.setEndPoint('EndToEnd', range);
  347. pos = range2.text.length;
  348. }
  349. td.innerHTML = '';
  350. td.appendChild(input);
  351. input.focus();
  352. if (text == 2) { // long text
  353. return ajax(location.href + '&' + encodeURIComponent(td.id) + '=', function (request) {
  354. if (request.status) {
  355. input.value = request.responseText;
  356. input.name = td.id;
  357. }
  358. });
  359. }
  360. input.value = value;
  361. input.name = td.id;
  362. input.selectionStart = pos;
  363. input.selectionEnd = pos;
  364. if (document.selection) {
  365. var range = document.selection.createRange();
  366. range.moveEnd('character', -input.value.length + pos);
  367. range.select();
  368. }
  369. }
  370. /** Stop event propagation
  371. * @param Event
  372. */
  373. function eventStop(event) {
  374. if (event.stopPropagation) {
  375. event.stopPropagation();
  376. } else {
  377. event.cancelBubble = true;
  378. }
  379. }
  380. // Adminer specific functions
  381. var jushRoot = location.protocol + '//www.adminer.org/static/'; // global variable to allow simple customization
  382. /** Load syntax highlighting
  383. * @param string first three characters of database system version
  384. */
  385. function bodyLoad(version) {
  386. if (jushRoot) {
  387. var script = document.createElement('script');
  388. script.src = jushRoot + 'jush.js';
  389. script.onload = function () {
  390. if (window.jush) { // IE runs in case of an error too
  391. jush.create_links = ' target="_blank" rel="noreferrer"';
  392. jush.urls.sql_sqlset = jush.urls.sql[0] = jush.urls.sqlset[0] = jush.urls.sqlstatus[0] = 'http://dev.mysql.com/doc/refman/' + version + '/en/$key';
  393. var pgsql = 'http://www.postgresql.org/docs/' + version + '/static/';
  394. jush.urls.pgsql_pgsqlset = jush.urls.pgsql[0] = pgsql + '$key';
  395. jush.urls.pgsqlset[0] = pgsql + 'runtime-config-$key.html#GUC-$1';
  396. jush.style(jushRoot + 'jush.css');
  397. if (window.jushLinks) {
  398. jush.custom_links = jushLinks;
  399. }
  400. jush.highlight_tag('code', 0);
  401. }
  402. };
  403. script.onreadystatechange = function () {
  404. if (/^(loaded|complete)$/.test(script.readyState)) {
  405. script.onload();
  406. }
  407. };
  408. document.body.appendChild(script);
  409. }
  410. }
  411. /** Get value of dynamically created form field
  412. * @param HTMLFormElement
  413. * @param string
  414. * @return HTMLElement
  415. */
  416. function formField(form, name) {
  417. // required in IE < 8, form.elements[name] doesn't work
  418. for (var i=0; i < form.length; i++) {
  419. if (form[i].name == name) {
  420. return form[i];
  421. }
  422. }
  423. }
  424. /** Try to change input type to password or to text
  425. * @param HTMLInputElement
  426. * @param boolean
  427. */
  428. function typePassword(el, disable) {
  429. try {
  430. el.type = (disable ? 'text' : 'password');
  431. } catch (e) {
  432. }
  433. }
  434. function loginDriver(driver) {
  435. var trs = driver.parentNode.parentNode.parentNode.rows;
  436. for (var i=1; i < trs.length - 1; i++) {
  437. trs[i].className = (/sqlite/.test(driver.value) ? 'hidden' : '');
  438. }
  439. }
  440. /** Handle Tab and Esc in textarea
  441. * @param HTMLTextAreaElement
  442. * @param KeyboardEvent
  443. * @return boolean
  444. */
  445. function textareaKeydown(target, event) {
  446. if (!event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey) {
  447. if (event.keyCode == 9) { // 9 - Tab
  448. // inspired by http://pallieter.org/Projects/insertTab/
  449. if (target.setSelectionRange) {
  450. var start = target.selectionStart;
  451. var scrolled = target.scrollTop;
  452. target.value = target.value.substr(0, start) + '\t' + target.value.substr(target.selectionEnd);
  453. target.setSelectionRange(start + 1, start + 1);
  454. target.scrollTop = scrolled;
  455. return false; //! still loses focus in Opera, can be solved by handling onblur
  456. } else if (target.createTextRange) {
  457. document.selection.createRange().text = '\t';
  458. return false;
  459. }
  460. }
  461. if (event.keyCode == 27) { // 27 - Esc
  462. var els = target.form.elements;
  463. for (var i=1; i < els.length; i++) {
  464. if (els[i-1] == target) {
  465. els[i].focus();
  466. break;
  467. }
  468. }
  469. return false;
  470. }
  471. }
  472. return true;
  473. }
  474. var added = '.', rowCount;
  475. /** Check if val is equal to a-delimiter-b where delimiter is '_', '' or big letter
  476. * @param string
  477. * @param string
  478. * @param string
  479. * @return boolean
  480. */
  481. function delimiterEqual(val, a, b) {
  482. return (val == a + '_' + b || val == a + b || val == a + b.charAt(0).toUpperCase() + b.substr(1));
  483. }
  484. /** Escape string to use as identifier
  485. * @param string
  486. * @return string
  487. */
  488. function idfEscape(s) {
  489. return s.replace(/`/, '``');
  490. }
  491. /** Detect foreign key
  492. * @param HTMLInputElement
  493. */
  494. function editingNameChange(field) {
  495. var name = field.name.substr(0, field.name.length - 7);
  496. var type = formField(field.form, name + '[type]');
  497. var opts = type.options;
  498. var candidate; // don't select anything with ambiguous match (like column `id`)
  499. var val = field.value;
  500. for (var i = opts.length; i--; ) {
  501. var match = /(.+)`(.+)/.exec(opts[i].value);
  502. if (!match) { // common type
  503. if (candidate && i == opts.length - 2 && val == opts[candidate].value.replace(/.+`/, '') && name == 'fields[1]') { // single target table, link to column, first field - probably `id`
  504. return;
  505. }
  506. break;
  507. }
  508. var table = match[1];
  509. var column = match[2];
  510. var tables = [ table, table.replace(/s$/, ''), table.replace(/es$/, '') ];
  511. for (var j=0; j < tables.length; j++) {
  512. table = tables[j];
  513. if (val == column || val == table || delimiterEqual(val, table, column) || delimiterEqual(val, column, table)) {
  514. if (candidate) {
  515. return;
  516. }
  517. candidate = i;
  518. break;
  519. }
  520. }
  521. }
  522. if (candidate) {
  523. type.selectedIndex = candidate;
  524. type.onchange();
  525. }
  526. }
  527. /** Add table row for next field
  528. * @param HTMLInputElement
  529. * @param boolean
  530. * @param boolean
  531. * @return boolean
  532. */
  533. function editingAddRow(button, allowed, focus) {
  534. if (allowed && rowCount >= allowed) {
  535. return false;
  536. }
  537. var match = /(\d+)(\.\d+)?/.exec(button.name);
  538. var x = match[0] + (match[2] ? added.substr(match[2].length) : added) + '1';
  539. var row = button.parentNode.parentNode;
  540. var row2 = row.cloneNode(true);
  541. var tags = row.getElementsByTagName('select');
  542. var tags2 = row2.getElementsByTagName('select');
  543. for (var i=0; i < tags.length; i++) {
  544. tags2[i].name = tags[i].name.replace(/([0-9.]+)/, x);
  545. tags2[i].selectedIndex = tags[i].selectedIndex;
  546. }
  547. tags = row.getElementsByTagName('input');
  548. tags2 = row2.getElementsByTagName('input');
  549. var input = tags2[0]; // IE loose tags2 after insertBefore()
  550. for (var i=0; i < tags.length; i++) {
  551. if (tags[i].name == 'auto_increment_col') {
  552. tags2[i].value = x;
  553. tags2[i].checked = false;
  554. }
  555. tags2[i].name = tags[i].name.replace(/([0-9.]+)/, x);
  556. if (/\[(orig|field|comment|default)/.test(tags[i].name)) {
  557. tags2[i].value = '';
  558. }
  559. if (/\[(has_default)/.test(tags[i].name)) {
  560. tags2[i].checked = false;
  561. }
  562. }
  563. tags[0].onchange = function () {
  564. editingNameChange(tags[0]);
  565. };
  566. row.parentNode.insertBefore(row2, row.nextSibling);
  567. if (focus) {
  568. input.onchange = function () {
  569. editingNameChange(input);
  570. };
  571. input.focus();
  572. }
  573. added += '0';
  574. rowCount++;
  575. return true;
  576. }
  577. /** Remove table row for field
  578. * @param HTMLInputElement
  579. * @return boolean
  580. */
  581. function editingRemoveRow(button) {
  582. var field = formField(button.form, button.name.replace(/drop_col(.+)/, 'fields$1[field]'));
  583. field.parentNode.removeChild(field);
  584. button.parentNode.parentNode.style.display = 'none';
  585. return true;
  586. }
  587. var lastType = '';
  588. /** Clear length and hide collation or unsigned
  589. * @param HTMLSelectElement
  590. */
  591. function editingTypeChange(type) {
  592. var name = type.name.substr(0, type.name.length - 6);
  593. var text = selectValue(type);
  594. for (var i=0; i < type.form.elements.length; i++) {
  595. var el = type.form.elements[i];
  596. if (el.name == name + '[length]' && !(
  597. (/(char|binary)$/.test(lastType) && /(char|binary)$/.test(text))
  598. || (/(enum|set)$/.test(lastType) && /(enum|set)$/.test(text))
  599. )) {
  600. el.value = '';
  601. }
  602. if (lastType == 'timestamp' && el.name == name + '[has_default]' && /timestamp/i.test(formField(type.form, name + '[default]').value)) {
  603. el.checked = false;
  604. }
  605. if (el.name == name + '[collation]') {
  606. el.className = (/(char|text|enum|set)$/.test(text) ? '' : 'hidden');
  607. }
  608. if (el.name == name + '[unsigned]') {
  609. el.className = (/(int|float|double|decimal)$/.test(text) ? '' : 'hidden');
  610. }
  611. if (el.name == name + '[on_delete]') {
  612. el.className = (/`/.test(text) ? '' : 'hidden');
  613. }
  614. }
  615. }
  616. /** Edit enum or set
  617. * @param HTMLInputElement
  618. */
  619. function editingLengthFocus(field) {
  620. var td = field.parentNode;
  621. if (/(enum|set)$/.test(selectValue(td.previousSibling.firstChild))) {
  622. var edit = document.getElementById('enum-edit');
  623. var val = field.value;
  624. edit.value = (/^'.+','.+'$/.test(val) ? val.substr(1, val.length - 2).replace(/','/g, "\n").replace(/''/g, "'") : val);
  625. td.appendChild(edit);
  626. field.style.display = 'none';
  627. edit.style.display = 'inline';
  628. edit.focus();
  629. }
  630. }
  631. /** Finish editing of enum or set
  632. * @param HTMLTextAreaElement
  633. */
  634. function editingLengthBlur(edit) {
  635. var field = edit.parentNode.firstChild;
  636. var val = edit.value;
  637. field.value = (/\n/.test(val) ? "'" + val.replace(/\n+$/, '').replace(/'/g, "''").replace(/\n/g, "','") + "'" : val);
  638. field.style.display = 'inline';
  639. edit.style.display = 'none';
  640. }
  641. /** Show or hide selected table column
  642. * @param boolean
  643. * @param number
  644. */
  645. function columnShow(checked, column) {
  646. var trs = document.getElementById('edit-fields').getElementsByTagName('tr');
  647. for (var i=0; i < trs.length; i++) {
  648. trs[i].getElementsByTagName('td')[column].className = (checked ? '' : 'hidden');
  649. }
  650. }
  651. /** Display partition options
  652. * @param HTMLSelectElement
  653. */
  654. function partitionByChange(el) {
  655. var partitionTable = /RANGE|LIST/.test(selectValue(el));
  656. el.form['partitions'].className = (partitionTable || !el.selectedIndex ? 'hidden' : '');
  657. document.getElementById('partition-table').className = (partitionTable ? '' : 'hidden');
  658. }
  659. /** Add next partition row
  660. * @param HTMLInputElement
  661. */
  662. function partitionNameChange(el) {
  663. var row = el.parentNode.parentNode.cloneNode(true);
  664. row.firstChild.firstChild.value = '';
  665. el.parentNode.parentNode.parentNode.appendChild(row);
  666. el.onchange = function () {};
  667. }
  668. /** Add row for foreign key
  669. * @param HTMLSelectElement
  670. */
  671. function foreignAddRow(field) {
  672. field.onchange = function () { };
  673. var row = field.parentNode.parentNode.cloneNode(true);
  674. var selects = row.getElementsByTagName('select');
  675. for (var i=0; i < selects.length; i++) {
  676. selects[i].name = selects[i].name.replace(/\]/, '1$&');
  677. selects[i].selectedIndex = 0;
  678. }
  679. field.parentNode.parentNode.parentNode.appendChild(row);
  680. }
  681. /** Add row for indexes
  682. * @param HTMLSelectElement
  683. */
  684. function indexesAddRow(field) {
  685. field.onchange = function () { };
  686. var parent = field.parentNode.parentNode;
  687. var row = parent.cloneNode(true);
  688. var selects = row.getElementsByTagName('select');
  689. for (var i=0; i < selects.length; i++) {
  690. selects[i].name = selects[i].name.replace(/indexes\[\d+/, '$&1');
  691. selects[i].selectedIndex = 0;
  692. }
  693. var inputs = row.getElementsByTagName('input');
  694. for (var i=0; i < inputs.length; i++) {
  695. inputs[i].name = inputs[i].name.replace(/indexes\[\d+/, '$&1');
  696. inputs[i].value = '';
  697. }
  698. parent.parentNode.appendChild(row);
  699. }
  700. /** Change column in index
  701. * @param HTMLSelectElement
  702. * @param string name prefix
  703. */
  704. function indexesChangeColumn(field, prefix) {
  705. var columns = field.parentNode.parentNode.getElementsByTagName('select');
  706. var names = [];
  707. for (var i=0; i < columns.length; i++) {
  708. var value = selectValue(columns[i]);
  709. if (value) {
  710. names.push(value);
  711. }
  712. }
  713. field.form[field.name.replace(/\].*/, '][name]')].value = prefix + names.join('_');
  714. }
  715. /** Add column for index
  716. * @param HTMLSelectElement
  717. * @param string name prefix
  718. */
  719. function indexesAddColumn(field, prefix) {
  720. field.onchange = function () {
  721. indexesChangeColumn(field, prefix);
  722. };
  723. var select = field.form[field.name.replace(/\].*/, '][type]')];
  724. if (!select.selectedIndex) {
  725. select.selectedIndex = 3;
  726. select.onchange();
  727. }
  728. var column = field.parentNode.cloneNode(true);
  729. select = column.getElementsByTagName('select')[0];
  730. select.name = select.name.replace(/\]\[\d+/, '$&1');
  731. select.selectedIndex = 0;
  732. var input = column.getElementsByTagName('input')[0];
  733. input.name = input.name.replace(/\]\[\d+/, '$&1');
  734. input.value = '';
  735. field.parentNode.parentNode.appendChild(column);
  736. field.onchange();
  737. }
  738. var that, x, y; // em and tablePos defined in schema.inc.php
  739. /** Get mouse position
  740. * @param HTMLElement
  741. * @param MouseEvent
  742. */
  743. function schemaMousedown(el, event) {
  744. if ((event.which ? event.which : event.button) == 1) {
  745. that = el;
  746. x = event.clientX - el.offsetLeft;
  747. y = event.clientY - el.offsetTop;
  748. }
  749. }
  750. /** Move object
  751. * @param MouseEvent
  752. */
  753. function schemaMousemove(ev) {
  754. if (that !== undefined) {
  755. ev = ev || event;
  756. var left = (ev.clientX - x) / em;
  757. var top = (ev.clientY - y) / em;
  758. var divs = that.getElementsByTagName('div');
  759. var lineSet = { };
  760. for (var i=0; i < divs.length; i++) {
  761. if (divs[i].className == 'references') {
  762. var div2 = document.getElementById((/^refs/.test(divs[i].id) ? 'refd' : 'refs') + divs[i].id.substr(4));
  763. var ref = (tablePos[divs[i].title] ? tablePos[divs[i].title] : [ div2.parentNode.offsetTop / em, 0 ]);
  764. var left1 = -1;
  765. var id = divs[i].id.replace(/^ref.(.+)-.+/, '$1');
  766. if (divs[i].parentNode != div2.parentNode) {
  767. left1 = Math.min(0, ref[1] - left) - 1;
  768. divs[i].style.left = left1 + 'em';
  769. divs[i].getElementsByTagName('div')[0].style.width = -left1 + 'em';
  770. var left2 = Math.min(0, left - ref[1]) - 1;
  771. div2.style.left = left2 + 'em';
  772. div2.getElementsByTagName('div')[0].style.width = -left2 + 'em';
  773. }
  774. if (!lineSet[id]) {
  775. var line = document.getElementById(divs[i].id.replace(/^....(.+)-.+$/, 'refl$1'));
  776. var top1 = top + divs[i].offsetTop / em;
  777. var top2 = top + div2.offsetTop / em;
  778. if (divs[i].parentNode != div2.parentNode) {
  779. top2 += ref[0] - top;
  780. line.getElementsByTagName('div')[0].style.height = Math.abs(top1 - top2) + 'em';
  781. }
  782. line.style.left = (left + left1) + 'em';
  783. line.style.top = Math.min(top1, top2) + 'em';
  784. lineSet[id] = true;
  785. }
  786. }
  787. }
  788. that.style.left = left + 'em';
  789. that.style.top = top + 'em';
  790. }
  791. }
  792. /** Finish move
  793. * @param MouseEvent
  794. * @param string
  795. */
  796. function schemaMouseup(ev, db) {
  797. if (that !== undefined) {
  798. ev = ev || event;
  799. tablePos[that.firstChild.firstChild.firstChild.data] = [ (ev.clientY - y) / em, (ev.clientX - x) / em ];
  800. that = undefined;
  801. var s = '';
  802. for (var key in tablePos) {
  803. s += '_' + key + ':' + Math.round(tablePos[key][0] * 10000) / 10000 + 'x' + Math.round(tablePos[key][1] * 10000) / 10000;
  804. }
  805. s = encodeURIComponent(s.substr(1));
  806. var link = document.getElementById('schema-link');
  807. link.href = link.href.replace(/[^=]+$/, '') + s;
  808. cookie('adminer_schema-' + db + '=' + s, 30); //! special chars in db
  809. }
  810. }
  811. <?php
  812. }else{header("Content-Type: image/gif");switch($_GET["file"]){case"plus.gif":echo
  813. base64_decode("R0lGODdhEgASAKEAAO7u7gAAAJmZmQAAACwAAAAAEgASAAACIYSPqcvtD00I8cwqKb5v+q8pIAhxlRmhZYi17iPE8kzLBQA7");break;case"cross.gif":echo
  814. base64_decode("R0lGODdhEgASAKEAAO7u7gAAAJmZmQAAACwAAAAAEgASAAACI4SPqcvtDyMKYdZGb355wy6BX3dhlOEx57FK7gtHwkzXNl0AADs=");break;case"up.gif":echo
  815. base64_decode("R0lGODdhEgASAKEAAO7u7gAAAJmZmQAAACwAAAAAEgASAAACIISPqcvtD00IUU4K730T9J5hFTiKEXmaYcW2rgDH8hwXADs=");break;case"down.gif":echo
  816. base64_decode("R0lGODdhEgASAKEAAO7u7gAAAJmZmQAAACwAAAAAEgASAAACIISPqcvtD00I8cwqKb5bV/5cosdMJtmcHca2lQDH8hwXADs=");break;case"arrow.gif":echo
  817. base64_decode("R0lGODlhCAAKAIAAAICAgP///yH5BAEAAAEALAAAAAAIAAoAAAIPBIJplrGLnpQRqtOy3rsAADs=");break;}}exit;}function
  818. connection(){global$g;return$g;}function
  819. adminer(){global$b;return$b;}function
  820. idf_unescape($r){$Xc=substr($r,-1);return
  821. str_replace($Xc.$Xc,$Xc,substr($r,1,-1));}function
  822. escape_string($W){return
  823. substr(q($W),1,-1);}function
  824. remove_slashes($Ae,$hc=false){if(get_magic_quotes_gpc()){while(list($v,$W)=each($Ae)){foreach($W
  825. as$Tc=>$V){unset($Ae[$v][$Tc]);if(is_array($V)){$Ae[$v][stripslashes($Tc)]=$V;$Ae[]=&$Ae[$v][stripslashes($Tc)];}else$Ae[$v][stripslashes($Tc)]=($hc?$V:stripslashes($V));}}}}function
  826. bracket_escape($r,$Ca=false){static$Of=array(':'=>':1',']'=>':2','['=>':3');return
  827. strtr($r,($Ca?array_flip($Of):$Of));}function
  828. h($L){return
  829. htmlspecialchars(str_replace("\0","",$L),ENT_QUOTES);}function
  830. nbsp($L){return(trim($L)!=""?h($L):"&nbsp;");}function
  831. nl_br($L){return
  832. str_replace("\n","<br>",$L);}function
  833. checkbox($_,$X,$Na,$Vc="",$Nd="",$Sc=false){static$q=0;$q++;$F="<input type='checkbox' name='$_' value='".h($X)."'".($Na?" checked":"").($Nd?' onclick="'.h($Nd).'"':'').($Sc?" class='jsonly'":"")." id='checkbox-$q'>";return($Vc!=""?"<label for='checkbox-$q'>$F".h($Vc)."</label>":$F);}function
  834. optionlist($Rd,$af=null,$eg=false){$F="";foreach($Rd
  835. as$Tc=>$V){$Sd=array($Tc=>$V);if(is_array($V)){$F.='<optgroup label="'.h($Tc).'">';$Sd=$V;}foreach($Sd
  836. as$v=>$W)$F.='<option'.($eg||is_string($v)?' value="'.h($v).'"':'').(($eg||is_string($v)?(string)$v:$W)===$af?' selected':'').'>'.h($W);if(is_array($V))$F.='</optgroup>';}return$F;}function
  837. html_select($_,$Rd,$X="",$Md=true){if($Md)return"<select name='".h($_)."'".(is_string($Md)?' onchange="'.h($Md).'"':"").">".optionlist($Rd,$X)."</select>";$F="";foreach($Rd
  838. as$v=>$W)$F.="<label><input type='radio' name='".h($_)."' value='".h($v)."'".($v==$X?" checked":"").">".h($W)."</label>";return$F;}function
  839. confirm($gb=""){return" onclick=\"return confirm('".lang(0).($gb?" (' + $gb + ')":"")."');\"";}function
  840. print_fieldset($q,$cd,$kg=false,$Nd=""){echo"<fieldset><legend><a href='#fieldset-$q' onclick=\"".h($Nd)."return !toggle('fieldset-$q');\">$cd</a></legend><div id='fieldset-$q'".($kg?"":" class='hidden'").">\n";}function
  841. bold($Ha){return($Ha?" class='active'":"");}function
  842. odd($F=' class="odd"'){static$p=0;if(!$F)$p=-1;return($p++%
  843. 2?$F:'');}function
  844. js_escape($L){return
  845. addcslashes($L,"\r\n'\\/");}function
  846. json_row($v,$W=null){static$ic=true;if($ic)echo"{";if($v!=""){echo($ic?"":",")."\n\t\"".addcslashes($v,"\r\n\"\\").'": '.($W!==null?'"'.addcslashes($W,"\r\n\"\\").'"':'undefined');$ic=false;}else{echo"\n}\n";$ic=true;}}function
  847. ini_bool($Kc){$W=ini_get($Kc);return(eregi('^(on|true|yes)$',$W)||(int)$W);}function
  848. sid(){static$F;if($F===null)$F=(SID&&!($_COOKIE&&ini_bool("session.use_cookies")));return$F;}function
  849. q($L){global$g;return$g->quote($L);}function
  850. get_vals($D,$e=0){global$g;$F=array();$E=$g->query($D);if(is_object($E)){while($G=$E->fetch_row())$F[]=$G[$e];}return$F;}function
  851. get_key_vals($D,$h=null){global$g;if(!is_object($h))$h=$g;$F=array();$E=$h->query($D);if(is_object($E)){while($G=$E->fetch_row())$F[$G[0]]=$G[1];}return$F;}function
  852. get_rows($D,$h=null,$k="<p class='error'>"){global$g;$cb=(is_object($h)?$h:$g);$F=array();$E=$cb->query($D);if(is_object($E)){while($G=$E->fetch_assoc())$F[]=$G;}elseif(!$E&&!is_object($h)&&$k&&defined("PAGE_HEADER"))echo$k.adminer_error()."\n";return$F;}function
  853. unique_array($G,$t){foreach($t
  854. as$s){if(ereg("PRIMARY|UNIQUE",$s["type"])){$F=array();foreach($s["columns"]as$v){if(!isset($G[$v]))continue
  855. 2;$F[$v]=$G[$v];}return$F;}}$F=array();foreach($G
  856. as$v=>$W){if(!preg_match('~^(COUNT\\((\\*|(DISTINCT )?`(?:[^`]|``)+`)\\)|(AVG|GROUP_CONCAT|MAX|MIN|SUM)\\(`(?:[^`]|``)+`\\))$~',$v))$F[$v]=$W;}return$F;}function
  857. where($Z){global$u;$F=array();foreach((array)$Z["where"]as$v=>$W)$F[]=idf_escape(bracket_escape($v,1)).(($u=="sql"&&ereg('\\.',$W))||$u=="mssql"?" LIKE ".exact_value(addcslashes($W,"%_\\")):" = ".exact_value($W));foreach((array)$Z["null"]as$v)$F[]=idf_escape($v)." IS NULL";return
  858. implode(" AND ",$F);}function
  859. where_check($W){parse_str($W,$Ma);remove_slashes(array(&$Ma));return
  860. where($Ma);}function
  861. where_link($p,$e,$X,$Od="="){return"&where%5B$p%5D%5Bcol%5D=".urlencode($e)."&where%5B$p%5D%5Bop%5D=".urlencode(($X!==null?$Od:"IS NULL"))."&where%5B$p%5D%5Bval%5D=".urlencode($X);}function
  862. cookie($_,$X){global$ba;$ge=array($_,(ereg("\n",$X)?"":$X),time()+2592000,preg_replace('~\\?.*~','',$_SERVER["REQUEST_URI"]),"",$ba);if(version_compare(PHP_VERSION,'5.2.0')>=0)$ge[]=true;return
  863. call_user_func_array('setcookie',$ge);}function
  864. restart_session(){if(!ini_bool("session.use_cookies"))session_start();}function&get_session($v){return$_SESSION[$v][DRIVER][SERVER][$_GET["username"]];}function
  865. set_session($v,$W){$_SESSION[$v][DRIVER][SERVER][$_GET["username"]]=$W;}function
  866. auth_url($xb,$J,$U,$j=null){global$yb;preg_match('~([^?]*)\\??(.*)~',remove_from_uri(implode("|",array_keys($yb))."|username|".($j!==null?"db|":"").session_name()),$z);return"$z[1]?".(sid()?SID."&":"").($xb!="server"||$J!=""?urlencode($xb)."=".urlencode($J)."&":"")."username=".urlencode($U).($j!=""?"&db=".urlencode($j):"").($z[2]?"&$z[2]":"");}function
  867. is_ajax(){return($_SERVER["HTTP_X_REQUESTED_WITH"]=="XMLHttpRequest");}function
  868. adminer_redirect($gd,$rd=null){if($rd!==null){restart_session();$_SESSION["messages"][preg_replace('~^[^?]*~','',($gd!==null?$gd:$_SERVER["REQUEST_URI"]))][]=$rd;}if($gd!==null){if($gd=="")$gd=".";header("Location: $gd");exit;}}function
  869. query_redirect($D,$gd,$rd,$Fe=true,$Wb=true,$dc=false){global$g,$k,$b;if($Wb)$dc=!$g->query($D);$jf="";if($D)$jf=$b->messageQuery("$D;");if($dc){$k=adminer_error().$jf;return
  870. false;}if($Fe)adminer_redirect($gd,$rd.$jf);return
  871. true;}function
  872. queries($D=null){global$g;static$De=array();if($D===null)return
  873. implode(";\n",$De);$De[]=(ereg(';$',$D)?"DELIMITER ;;\n$D;\nDELIMITER ":$D);return$g->query($D);}function
  874. apply_queries($D,$P,$Rb='table'){foreach($P
  875. as$N){if(!queries("$D ".$Rb($N)))return
  876. false;}return
  877. true;}function
  878. queries_redirect($gd,$rd,$Fe){return
  879. query_redirect(queries(),$gd,$rd,$Fe,false,!$Fe);}function
  880. remove_from_uri($fe=""){return
  881. substr(preg_replace("~(?<=[?&])($fe".(SID?"":"|".session_name()).")=[^&]*&~",'',"$_SERVER[REQUEST_URI]&"),0,-1);}function
  882. pagination($ee,$lb){return" ".($ee==$lb?$ee+1:'<a href="'.h(remove_from_uri("page").($ee?"&page=$ee":"")).'">'.($ee+1)."</a>");}function
  883. get_file($v,$qb=false){$fc=$_FILES[$v];if(!$fc||$fc["error"])return$fc["error"];$F=file_get_contents($qb&&ereg('\\.gz$',$fc["name"])?"compress.zlib://$fc[tmp_name]":($qb&&ereg('\\.bz2$',$fc["name"])?"compress.bzip2://$fc[tmp_name]":$fc["tmp_name"]));if($qb){$kf=substr($F,0,3);if(function_exists("iconv")&&ereg("^\xFE\xFF|^\xFF\xFE",$kf,$Le))$F=iconv("utf-16","utf-8",$F);elseif($kf=="\xEF\xBB\xBF")$F=substr($F,3);}return$F;}function
  884. upload_error($k){$pd=($k==UPLOAD_ERR_INI_SIZE?ini_get("upload_max_filesize"):0);return($k?lang(1).($pd?" ".lang(2,$pd):""):lang(3));}function
  885. repeat_pattern($ne,$w){return
  886. str_repeat("$ne{0,65535}",$w/65535)."$ne{0,".($w
  887. %
  888. 65535)."}";}function
  889. is_utf8($W){return(preg_match('~~u',$W)&&!preg_match('~[\\0-\\x8\\xB\\xC\\xE-\\x1F]~',$W));}function
  890. shorten_utf8($L,$w=80,$qf=""){if(!preg_match("(^(".repeat_pattern("[\t\r\n -\x{FFFF}]",$w).")($)?)u",$L,$z))preg_match("(^(".repeat_pattern("[\t\r\n -~]",$w).")($)?)",$L,$z);return
  891. h($z[1]).$qf.(isset($z[2])?"":"<i>...</i>");}function
  892. friendly_url($W){return
  893. preg_replace('~[^a-z0-9_]~i','-',$W);}function
  894. hidden_fields($Ae,$Fc=array()){while(list($v,$W)=each($Ae)){if(is_array($W)){foreach($W
  895. as$Tc=>$V)$Ae[$v."[$Tc]"]=$V;}elseif(!in_array($v,$Fc))echo'<input type="hidden" name="'.h($v).'" value="'.h($W).'">';}}function
  896. hidden_fields_get(){echo(sid()?'<input type="hidden" name="'.session_name().'" value="'.h(session_id()).'">':''),(SERVER!==null?'<input type="hidden" name="'.DRIVER.'" value="'.h(SERVER).'">':""),'<input type="hidden" name="username" value="'.h($_GET["username"]).'">';}function
  897. column_foreign_keys($N){global$b;$F=array();foreach($b->foreignKeys($N)as$n){foreach($n["source"]as$W)$F[$W][]=$n;}return$F;}function
  898. enum_input($S,$za,$l,$X,$Ib=null){global$b;preg_match_all("~'((?:[^']|'')*)'~",$l["length"],$kd);$F=($Ib!==null?"<label><input type='$S'$za value='$Ib'".((is_array($X)?in_array($Ib,$X):$X===0)?" checked":"")."><i>".lang(4)."</i></label>":"");foreach($kd[1]as$p=>$W){$W=stripcslashes(str_replace("''","'",$W));$Na=(is_int($X)?$X==$p+1:(is_array($X)?in_array($p+1,$X):$X===$W));$F.=" <label><input type='$S'$za value='".($p+1)."'".($Na?' checked':'').'>'.h($b->editVal($W,$l)).'</label>';}return$F;}function
  899. input($l,$X,$o){global$T,$b,$u;$_=h(bracket_escape($l["field"]));echo"<td class='function'>";$Ne=($u=="mssql"&&$l["auto_increment"]);if($Ne&&!$_POST["save"])$o=null;$tc=(isset($_GET["select"])||$Ne?array("orig"=>lang(5)):array())+$b->editFunctions($l);$za=" name='fields[$_]'";if($l["type"]=="enum")echo
  900. nbsp($tc[""])."<td>".$b->editInput($_GET["edit"],$l,$za,$X);else{$ic=0;foreach($tc
  901. as$v=>$W){if($v===""||!$W)break;$ic++;}$Md=($ic?" onchange=\"var f = this.form['function[".h(js_escape(bracket_escape($l["field"])))."]']; if ($ic > f.selectedIndex) f.selectedIndex = $ic;\"":"");$za.=$Md;echo(count($tc)>1?html_select("function[$_]",$tc,$o===null||in_array($o,$tc)||isset($tc[$o])?$o:"","functionChange(this);"):nbsp(reset($tc))).'<td>';$Mc=$b->editInput($_GET["edit"],$l,$za,$X);if($Mc!="")echo$Mc;elseif($l["type"]=="set"){preg_match_all("~'((?:[^']|'')*)'~",$l["length"],$kd);foreach($kd[1]as$p=>$W){$W=stripcslashes(str_replace("''","'",$W));$Na=(is_int($X)?($X>>$p)&1:in_array($W,explode(",",$X),true));echo" <label><input type='checkbox' name='fields[$_][$p]' value='".(1<<$p)."'".($Na?' checked':'')."$Md>".h($b->editVal($W,$l)).'</label>';}}elseif(ereg('blob|bytea|raw|file',$l["type"])&&ini_bool("file_uploads"))echo"<input type='file' name='fields-$_'$Md>";elseif(ereg('text|lob',$l["type"]))echo"<textarea ".($u!="sqlite"||ereg("\n",$X)?"cols='50' rows='12'":"cols='30' rows='1' style='height: 1.2em;'")."$za>".h($X).'</textarea>';else{$qd=(!ereg('int',$l["type"])&&preg_match('~^(\\d+)(,(\\d+))?$~',$l["length"],$z)?((ereg("binary",$l["type"])?2:1)*$z[1]+($z[3]?1:0)+($z[2]&&!$l["unsigned"]?1:0)):($T[$l["type"]]?$T[$l["type"]]+($l["unsigned"]?0:1):0));echo"<input value='".h($X)."'".($qd?" maxlength='$qd'":"").(ereg('char|binary',$l["type"])&&$qd>20?" size='40'":"")."$za>";}}}function
  902. process_input($l){global$b;$r=bracket_escape($l["field"]);$o=$_POST["function"][$r];$X=$_POST["fields"][$r];if($l["type"]=="enum"){if($X==-1)return
  903. false;if($X=="")return"NULL";return+$X;}if($l["auto_increment"]&&$X=="")return
  904. null;if($o=="orig")return($l["on_update"]=="CURRENT_TIMESTAMP"?idf_escape($l["field"]):false);if($o=="NULL")return"NULL";if($l["type"]=="set")return
  905. array_sum((array)$X);if(ereg('blob|bytea|raw|file',$l["type"])&&ini_bool("file_uploads")){$fc=get_file("fields-$r");if(!is_string($fc))return
  906. false;return
  907. q($fc);}return$b->processInput($l,$X,$o);}function
  908. search_tables(){global$b,$g;$_GET["where"][0]["op"]="LIKE %%";$_GET["where"][0]["val"]=$_POST["query"];$oc=false;foreach(table_status()as$N=>$O){$_=$b->tableName($O);if(isset($O["Engine"])&&$_!=""&&(!$_POST["tables"]||in_array($N,$_POST["tables"]))){$E=$g->query("SELECT".limit("1 FROM ".table($N)," WHERE ".implode(" AND ",$b->selectSearchProcess(fields($N),array())),1));if($E->fetch_row()){if(!$oc){echo"<ul>\n";$oc=true;}echo"<li><a href='".h(ME."select=".urlencode($N)."&where[0][op]=".urlencode($_GET["where"][0]["op"])."&where[0][val]=".urlencode($_GET["where"][0]["val"]))."'>$_</a>\n";}}}echo($oc?"</ul>":"<p class='message'>".lang(6))."\n";}function
  909. dump_headers($Ec,$zd=false){global$b;$F=$b->dumpHeaders($Ec,$zd);$ce=$_POST["output"];if($ce!="text")header("Content-Disposition: attachment; filename=".friendly_url($Ec!=""?$Ec:(SERVER!=""?SERVER:"localhost")).".$F".($ce!="file"&&!ereg('[^0-9a-z]',$ce)?".$ce":""));session_write_close();return$F;}function
  910. dump_csv($G){foreach($G
  911. as$v=>$W){if(preg_match("~[\"\n,;\t]~",$W)||$W==="")$G[$v]='"'.str_replace('"','""',$W).'"';}echo
  912. implode(($_POST["format"]=="csv"?",":($_POST["format"]=="tsv"?"\t":";")),$G)."\r\n";}function
  913. apply_sql_function($o,$e){return($o?($o=="unixepoch"?"DATETIME($e, '$o')":($o=="count distinct"?"COUNT(DISTINCT ":strtoupper("$o("))."$e)"):$e);}function
  914. password_file(){$ub=ini_get("upload_tmp_dir");if(!$ub){if(function_exists('sys_get_temp_dir'))$ub=sys_get_temp_dir();else{$gc=@tempnam("","");if(!$gc)return
  915. false;$ub=dirname($gc);unlink($gc);}}$gc="$ub/adminer.key";$F=@file_get_contents($gc);if($F)return$F;$qc=@fopen($gc,"w");if($qc){$F=md5(uniqid(mt_rand(),true));fwrite($qc,$F);fclose($qc);}return$F;}function
  916. is_mail($Fb){$ya='[-a-z0-9!#$%&\'*+/=?^_`{|}~]';$wb='[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])';$ne="$ya+(\\.$ya+)*@($wb?\\.)+$wb";return
  917. preg_match("(^$ne(,\\s*$ne)*\$)i",$Fb);}function
  918. is_url($L){$wb='[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])';return(preg_match("~^(https?)://($wb?\\.)+$wb(:\\d+)?(/.*)?(\\?.*)?(#.*)?\$~i",$L,$z)?strtolower($z[1]):"");}global$b,$g,$yb,$Db,$Mb,$k,$tc,$yc,$ba,$Lc,$u,$ca,$Wc,$Ld,$of,$Q,$R,$T,$bg,$ia;if(!$_SERVER["REQUEST_URI"])$_SERVER["REQUEST_URI"]=$_SERVER["ORIG_PATH_INFO"];if(!strpos($_SERVER["REQUEST_URI"],'?')&&$_SERVER["QUERY_STRING"]!="")$_SERVER["REQUEST_URI"].="?$_SERVER[QUERY_STRING]";$ba=$_SERVER["HTTPS"]&&strcasecmp($_SERVER["HTTPS"],"off");@ini_set("session.use_trans_sid",false);if(!defined("SID")){session_name("adminer_sid");$ge=array(0,preg_replace('~\\?.*~','',$_SERVER["REQUEST_URI"]),"",$ba);if(version_compare(PHP_VERSION,'5.2.0')>=0)$ge[]=true;call_user_func_array('session_set_cookie_params',$ge);session_start();}remove_slashes(array(&$_GET,&$_POST,&$_COOKIE),$hc);if(function_exists("set_magic_quotes_runtime"))set_magic_quotes_runtime(false);@set_time_limit(0);@ini_set("zend.ze1_compatibility_mode",false);@ini_set("precision",20);$Wc=array('en'=>'English','cs'=>'Čeština','sk'=>'Slovenčina','nl'=>'Nederlands','es'=>'Español','de'=>'Deutsch','fr'=>'Français','it'=>'Italiano','et'=>'Eesti','hu'=>'Magyar','pl'=>'Polski','ca'=>'Català','pt'=>'Português','sl'=>'Slovenski','lt'=>'Lietuvių','tr'=>'Türkçe','ro'=>'Limba Română','ru'=>'Русский язык','uk'=>'Українська','zh'=>'简体中文','zh-tw'=>'繁體中文','ja'=>'日本語','ta'=>'த‌மிழ்','ar'=>'العربية','fa'=>'فارسی','bn'=>'বাংলা',);function
  919. get_lang(){global$ca;return$ca;}function
  920. lang($r,$Fd=null){global$ca,$R;$Pf=$R[$r];if(is_array($Pf)){$qe=($Fd==1?0:($ca=='cs'||$ca=='sk'?($Fd&&$Fd<5?1:2):($ca=='fr'?(!$Fd?0:1):($ca=='pl'?($Fd
  921. %
  922. 10>1&&$Fd
  923. %
  924. 10<5&&$Fd/10
  925. %
  926. 10!=1?1:2):($ca=='sl'?($Fd
  927. %
  928. 100==1?0:($Fd
  929. %
  930. 100==2?1:($Fd
  931. %
  932. 100==3||$Fd
  933. %
  934. 100==4?2:3))):($ca=='lt'?($Fd
  935. %
  936. 10==1&&$Fd
  937. %
  938. 100!=11?0:($Fd
  939. %
  940. 10>1&&$Fd/10
  941. %
  942. 10!=1?1:2)):($ca=='ru'||$ca=='uk'?($Fd
  943. %
  944. 10==1&&$Fd
  945. %
  946. 100!=11?0:($Fd
  947. %
  948. 10>1&&$Fd
  949. %
  950. 10<5&&$Fd/10
  951. %
  952. 10!=1?1:2)):1)))))));$Pf=$Pf[$qe];}$xa=func_get_args();array_shift($xa);return
  953. vsprintf(($Pf!==null?$Pf:$r),$xa);}function
  954. switch_lang(){global$ca,$Wc;echo"<form action=''>\n<div id='lang'>";hidden_fields($_GET,array('lang'));echo
  955. lang(7).": ".html_select("lang",$Wc,$ca,"var loc = location.search.replace(/[?&]lang=[^&]*/, ''); location.search = loc + (loc ? '&' : '') + 'lang=' + this.value;")," <input type='submit' value='".lang(8)."' class='hidden'>\n","</div>\n</form>\n";}if(isset($_GET["lang"])){$_COOKIE["adminer_lang"]=$_GET["lang"];$_SESSION["lang"]=$_GET["lang"];}$ca="en";if(isset($Wc[$_COOKIE["adminer_lang"]])){cookie("adminer_lang",$_COOKIE["adminer_lang"]);$ca=$_COOKIE["adminer_lang"];}elseif(isset($Wc[$_SESSION["lang"]]))$ca=$_SESSION["lang"];else{$pa=array();preg_match_all('~([-a-z]+)(;q=([0-9.]+))?~',str_replace("_","-",strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"])),$kd,PREG_SET_ORDER);foreach($kd
  956. as$z)$pa[$z[1]]=(isset($z[3])?$z[3]:1);arsort($pa);foreach($pa
  957. as$v=>$C){if(isset($Wc[$v])){$ca=$v;break;}$v=preg_replace('~-.*~','',$v);if(!isset($pa[$v])&&isset($Wc[$v])){$ca=$v;break;}}}switch($ca){case"en":$R=array('Are you sure?','Unable to upload a file.','Maximum allowed file size is %sB.','File does not exist.','empty','original','No tables.','Language','Use','Please use one of the extensions %s.','File exists.','User types','Numbers','Date and time','Strings','Binary','Network','Geometry','Lists','System','Server','Username','Password','Database','Login','Permanent login','Select data','Show structure','Alter view','Alter table','New item','Last page','Edit',array('%d byte','%d bytes'),'Select','Functions','Aggregation','Search','anywhere','Sort','descending','Limit','Text length','Action','Full table scan','SQL command','open','save','Alter database','Alter schema','Create schema','Database schema','Privileges','Dump','Logout','database','schema','Create new table','select','ltr','Invalid CSRF token. Send the form again.','Logout successful.','Session support must be enabled.','Session expired, please login again.','Invalid credentials.','No extension','None of the supported PHP extensions (%s) are available.','Too big POST data. Reduce the data or increase the %s configuration directive.','Invalid database.','Databases have been dropped.','Select database','Create new database','Process list','Variables','Status','%s version: %s through PHP extension %s','Logged as: %s','Collation','Tables','Drop','Refresh','Schema','Invalid schema.','No rows.','%.3f s','Foreign keys','collation','ON DELETE','Column name','Parameter name','Type','Length','Options','Auto Increment','Default values','Comment','Add next','Move up','Move down','Remove','View','Table','Column','Indexes','Alter indexes','Source','Target','ON UPDATE','Alter','Add foreign key','Triggers','Add trigger','Permanent link','Export','Output','Format','Routines','Events','Data','Create user','Error in query',array('%d row','%d rows'),array('Query executed OK, %d row affected.','Query executed OK, %d rows affected.'),'No commands to execute.',array('%d query executed OK.','%d queries executed OK.'),'File upload','File uploads are disabled.','Execute','Stop on error','Show only errors','From server','Webserver file %s','Run file','History','Clear','Edit all','Item has been deleted.','Item has been updated.','Item%s has been inserted.','Insert','Save','Save and continue edit','Save and insert next','Delete','Table has been dropped.','Table has been altered.','Table has been created.','Create table','Maximum number of allowed fields exceeded. Please increase %s and %s.','Table name','engine','Partition by','Partitions','Partition name','Values','Indexes have been altered.','Index Type','Column (length)','Name','Database has been dropped.','Database has been renamed.','Database has been created.','Database has been altered.','Create database','Schema has been dropped.','Schema has been created.','Schema has been altered.','Call',array('Routine has been called, %d row affected.','Routine has been called, %d rows affected.'),'Foreign key has been dropped.','Foreign key has been altered.','Foreign key has been created.','Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.','Foreign key','Target table','Change','Add column','View has been dropped.','View has been altered.','View has been created.','Create view','Event has been dropped.','Event has been altered.','Event has been created.','Alter event','Create event','Start','End','Every','On completion preserve','Routine has been dropped.','Routine has been altered.','Routine has been created.','Alter function','Alter procedure','Create function','Create procedure','Return type','Sequence has been dropped.','Sequence has been created.','Sequence has been altered.','Alter sequence','Create sequence','Type has been dropped.','Type has been created.','Alter type','Create type','Trigger has been dropped.','Trigger has been altered.','Trigger has been created.','Alter trigger','Create trigger','Time','Event','User has been dropped.','User has been altered.','User has been created.','Hashed','Routine','Grant','Revoke',array('%d process has been killed.','%d processes have been killed.'),'%d in total','Kill',array('%d item has been affected.','%d items have been affected.'),'Double click on a value to modify it.',array('%d row has been imported.','%d rows have been imported.'),'Unable to select the table','edit','Relations','Use edit link to modify this value.','Page','last','whole result','Clone','Import',',','Tables have been truncated.','Tables have been moved.','Tables have been copied.','Tables have been dropped.','Tables have been optimized.','Tables and views','Search data in tables','Engine','Data Length','Index Length','Data Free','Rows','Analyze','Optimize','Check','Repair','Truncate','Move to other database','Move','Copy','Sequences','Schedule','At given time',array('%d e-mail has been sent.','%d e-mails have been sent.'));break;case"cs":$R=array('Opravdu?','Nepodařilo se nahr…

Large files files are truncated, but you can click here to view the full file