db_multi_table_query.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. /* vim: set expandtab sw=4 ts=4 sts=4: */
  2. /**
  3. * @fileoverview function used in QBE for DB
  4. * @name Database Operations
  5. *
  6. * @requires jQuery
  7. * @requires jQueryUI
  8. * @requires js/functions.js
  9. *
  10. */
  11. /**
  12. * js file for handling AJAX and other events in db_multi_table_query.php
  13. */
  14. /**
  15. * Unbind all event handlers before tearing down a page
  16. */
  17. AJAX.registerTeardown('db_multi_table_query.js', function () {
  18. $('.tableNameSelect').each(function () {
  19. $(this).off('change');
  20. });
  21. $('#update_query_button').off('click');
  22. $('#add_column_button').off('click');
  23. });
  24. AJAX.registerOnload('db_multi_table_query.js', function () {
  25. var editor = PMA_getSQLEditor($('#MultiSqlquery'), {}, 'both');
  26. $('.CodeMirror-line').css('text-align', 'left');
  27. editor.setSize(-1, 50);
  28. var column_count = 3;
  29. PMA_init_slider();
  30. addNewColumnCallbacks();
  31. function escapeBacktick (s) {
  32. return s.replace('`', '``');
  33. }
  34. function escapeSingleQuote (s) {
  35. return s.replace('\\', '\\\\').replace('\'', '\\\'');
  36. }
  37. $('#update_query_button').on('click', function () {
  38. var columns = [];
  39. var table_aliases = {};
  40. $('.tableNameSelect').each(function () {
  41. $show = $(this).siblings('.show_col').first();
  42. if ($(this).val() !== '' && $show.prop('checked')) {
  43. var table_alias = $(this).siblings('.table_alias').first().val();
  44. var column_alias = $(this).siblings('.col_alias').first().val();
  45. if (table_alias !== '') {
  46. columns.push([table_alias, $(this).siblings('.columnNameSelect').first().val()]);
  47. } else {
  48. columns.push([$(this).val(), $(this).siblings('.columnNameSelect').first().val()]);
  49. }
  50. columns[columns.length - 1].push(column_alias);
  51. if ($(this).val() in table_aliases) {
  52. if (!(table_aliases[$(this).val()].includes(table_alias))) {
  53. table_aliases[$(this).val()].push(table_alias);
  54. }
  55. } else {
  56. table_aliases[$(this).val()] = [table_alias];
  57. }
  58. }
  59. });
  60. if (Object.keys(table_aliases).length === 0) {
  61. PMA_ajaxShowMessage('Nothing selected', false, 'error');
  62. return;
  63. }
  64. query = 'SELECT ';
  65. if(columns[0][1] == '*')
  66. query += '`' + escapeBacktick(columns[0][0]) + '`.' + escapeBacktick(columns[0][1]) + '';
  67. else
  68. query += '`' + escapeBacktick(columns[0][0]) + '`.`' + escapeBacktick(columns[0][1]) + '`';
  69. if (columns[0][2] !== '') {
  70. query += ' AS ' + columns[0][2];
  71. }
  72. for (var i = 1; i < columns.length; i++) {
  73. if(columns[i][1] == '*')
  74. query += ', `' + escapeBacktick(columns[i][0]) + '`.' + escapeBacktick(columns[i][1]) + '';
  75. else
  76. query += ', `' + escapeBacktick(columns[i][0]) + '`.`' + escapeBacktick(columns[i][1]) + '`';
  77. if (columns[i][2] !== '') {
  78. query += ' AS `' + escapeBacktick(columns[0][2]) + '`';
  79. }
  80. }
  81. query += '\nFROM ';
  82. var table_count = 0;
  83. for (var table in table_aliases) {
  84. for (var i = 0; i < table_aliases[table].length; i++) {
  85. if (table_count > 0) {
  86. query += ', ';
  87. }
  88. query += '`' + escapeBacktick(table) + '`';
  89. if (table_aliases[table][i] !== '') {
  90. query += ' AS `' + escapeBacktick(table_aliases[table][i]) + '`';
  91. }
  92. table_count++;
  93. }
  94. }
  95. $criteria_col_count = $('.criteria_col:checked').length;
  96. if ($criteria_col_count > 0) {
  97. query += '\nWHERE ';
  98. var logical_ops = [];
  99. var count = 0;
  100. $('.tableNameSelect').each(function () {
  101. $criteria_div = $(this).siblings('.slide-wrapper').first();
  102. $use_criteria = $(this).siblings('.criteria_col').first();
  103. if ($(this).val() !== '' && $use_criteria.prop('checked')) {
  104. if (count > 0) {
  105. $criteria_div.find('input.logical_op').each(function () {
  106. if ($(this).prop('checked')) {
  107. query += ' ' + $(this).val() + ' ';
  108. }
  109. });
  110. }
  111. formats_text = {
  112. '=' : ' = \'%s\'',
  113. '>' : ' > \'%s\'',
  114. '>=' : ' >= \'%s\'',
  115. '<' : ' < \'%s\'',
  116. '<=' : ' <= \'%s\'',
  117. '!=' : ' != \'%s\'',
  118. 'LIKE' : ' LIKE \'%s\'',
  119. 'LIKE \%...\%' : ' LIKE \'%%%s%%\'',
  120. 'NOT LIKE' : ' NOT LIKE \'%s\'',
  121. 'BETWEEN' : ' BETWEEN \'%s\'',
  122. 'NOT BETWEEN' : ' NOT BETWEEN \'%s\'',
  123. 'IS NULL' : ' \'%s\' IS NULL',
  124. 'IS NOT NULL' : ' \'%s\' IS NOT NULL',
  125. 'REGEXP' : ' REGEXP \'%s\'',
  126. 'REGEXP ^...$' : ' REGEXP \'^%s$\'',
  127. 'NOT REGEXP' : ' NOT REGEXP \'%s\''
  128. };
  129. query += '`' + escapeBacktick($(this).val()) + '`.';
  130. query += '`' + escapeBacktick($(this).siblings('.columnNameSelect').first().val()) + '`';
  131. if ($criteria_div.find('.criteria_rhs').first().val() === 'text') {
  132. // query += " '" + $criteria_div.find('.rhs_text_val').first().val() + "'";
  133. query += sprintf(formats_text[$criteria_div.find('.criteria_op').first().val()], escapeSingleQuote($criteria_div.find('.rhs_text_val').first().val()));
  134. } else {
  135. query += ' ' + $criteria_div.find('.criteria_op').first().val();
  136. query += ' `' + escapeBacktick($criteria_div.find('.tableNameSelect').first().val()) + '`.';
  137. query += '`' + escapeBacktick($criteria_div.find('.columnNameSelect').first().val()) + '`';
  138. }
  139. count++;
  140. }
  141. });
  142. }
  143. query += ';';
  144. editor.getDoc().setValue(query);
  145. });
  146. $('#submit_query').on('click', function () {
  147. var query = editor.getDoc().getValue();
  148. var data = {
  149. 'db': $('#db_name').val(),
  150. 'sql_query': query,
  151. 'ajax_request': '1',
  152. 'token': PMA_commonParams.get('token')
  153. };
  154. $.ajax({
  155. type: 'POST',
  156. url: 'db_multi_table_query.php',
  157. data: data,
  158. success: function (data) {
  159. $results_dom = $(data.message);
  160. $results_dom.find('.ajax:not(.pageselector)').each(function () {
  161. $(this).on('click', function (event) {
  162. event.preventDefault();
  163. });
  164. });
  165. $results_dom.find('.autosubmit, .pageselector, .showAllRows, .filter_rows').each(function () {
  166. $(this).on('change click select focus', function (event) {
  167. event.preventDefault();
  168. });
  169. });
  170. $('#sql_results').html($results_dom);
  171. $('#page_content').find('a').first().click();
  172. }
  173. });
  174. });
  175. $('#add_column_button').on('click', function () {
  176. column_count++;
  177. $new_column_dom = $($('#new_column_layout').html()).clone();
  178. $new_column_dom.find('div').first().find('div').first().attr('id', column_count.toString());
  179. $new_column_dom.find('a').first().remove();
  180. $new_column_dom.find('.pma_auto_slider').first().unwrap();
  181. $new_column_dom.find('.pma_auto_slider').first().attr('title', 'criteria');
  182. $('#add_column_button').parent().before($new_column_dom);
  183. PMA_init_slider();
  184. addNewColumnCallbacks();
  185. });
  186. function addNewColumnCallbacks () {
  187. $('.tableNameSelect').each(function () {
  188. $(this).on('change', function () {
  189. $sibs = $(this).siblings('.columnNameSelect');
  190. if ($sibs.length === 0) {
  191. $sibs = $(this).parent().parent().find('.columnNameSelect');
  192. }
  193. $sibs.first().html($('#' + $.md5($(this).val())).html());
  194. });
  195. });
  196. $('.removeColumn').each(function () {
  197. $(this).on('click', function () {
  198. $(this).parent().remove();
  199. });
  200. });
  201. $('a.ajax').each(function () {
  202. $(this).on('click', function (event, from) {
  203. if (from === null) {
  204. $checkbox = $(this).siblings('.criteria_col').first();
  205. $checkbox.prop('checked', !$checkbox.prop('checked'));
  206. }
  207. $criteria_col_count = $('.criteria_col:checked').length;
  208. if ($criteria_col_count > 1) {
  209. $(this).siblings('.slide-wrapper').first().find('.logical_operator').first().css('display','table-row');
  210. }
  211. });
  212. });
  213. $('.criteria_col').each(function () {
  214. $(this).on('change', function () {
  215. $anchor = $(this).siblings('a.ajax').first();
  216. $anchor.trigger('click', ['Trigger']);
  217. });
  218. });
  219. $('.criteria_rhs').each(function () {
  220. $(this).on('change', function () {
  221. $rhs_col = $(this).parent().parent().siblings('.rhs_table').first();
  222. $rhs_text = $(this).parent().parent().siblings('.rhs_text').first();
  223. if ($(this).val() === 'text') {
  224. $rhs_col.css('display', 'none');
  225. $rhs_text.css('display', 'table-row');
  226. } else if ($(this).val() === 'anotherColumn') {
  227. $rhs_text.css('display', 'none');
  228. $rhs_col.css('display', 'table-row');
  229. } else {
  230. $rhs_text.css('display', 'none');
  231. $rhs_col.css('display', 'none');
  232. }
  233. });
  234. });
  235. }
  236. });