gl-website-deployer/admin/phpMyAdmin/templates/table/operations/index.twig
2024-11-19 08:02:04 +01:00

527 lines
23 KiB
Twig

<div class="container-fluid">
{% if not hide_order_table %}
<form method="post" id="alterTableOrderby" action="{{ url('/table/operations') }}">
{{ get_hidden_inputs(db, table) }}
<input type="hidden" name="submitorderby" value="1">
<div class="card mb-2">
<div class="card-header">{% trans 'Alter table order by' %}</div>
<div class="card-body">
<div class="row g-3">
<div class="col-auto">
<label class="visually-hidden" for="tableOrderFieldSelect">{% trans 'Column' %}</label>
<select id="tableOrderFieldSelect" class="form-select" name="order_field" aria-describedby="tableOrderFieldSelectHelp">
{% for column in columns %}
<option value="{{ column.Field }}">{{ column.Field }}</option>
{% endfor %}
</select>
<small id="tableOrderFieldSelectHelp" class="form-text text-muted">
{% trans %}(singly){% context %}Alter table order by a single field.{% endtrans %}
</small>
</div>
<div class="col-auto">
<div class="form-check">
<input class="form-check-input" id="tableOrderAscRadio" name="order_order" type="radio" value="asc" checked>
<label class="form-check-label" for="tableOrderAscRadio">{% trans 'Ascending' %}</label>
</div>
<div class="form-check">
<input class="form-check-input" id="tableOrderDescRadio" name="order_order" type="radio" value="desc">
<label class="form-check-label" for="tableOrderDescRadio">{% trans 'Descending' %}</label>
</div>
</div>
</div>
</div>
<div class="card-footer text-end">
<input class="btn btn-primary" type="submit" value="{% trans 'Go' %}">
</div>
</div>
</form>
{% endif %}
<form method="post" action="{{ url('/table/operations') }}" id="moveTableForm" class="ajax" onsubmit="return Functions.emptyCheckTheField(this, 'new_name')">
{{ get_hidden_inputs(db, table) }}
<input type="hidden" name="reload" value="1">
<input type="hidden" name="what" value="data">
<div class="card mb-2">
<div class="card-header">{% trans 'Move table to (database.table)' %}</div>
<div class="card-body">
<div class="mb-3 row g-3">
<div class="col-auto">
<div class="input-group">
{% if database_list is not empty %}
<select id="moveTableDatabaseInput" class="form-select" name="target_db" aria-label="{% trans 'Database' %}">
{% for each_db in database_list %}
<option value="{{ each_db.name }}"{{ each_db.is_selected ? ' selected' }}>{{ each_db.name }}</option>
{% endfor %}
</select>
{% else %}
<input id="moveTableDatabaseInput" class="form-control" type="text" maxlength="100" name="target_db" value="{{ db }}" aria-label="{% trans 'Database' %}">
{% endif %}
<span class="input-group-text">.</span>
<input class="form-control" type="text" required="required" name="new_name" maxlength="64" value="{{ table }}" aria-label="{% trans 'Table' %}">
</div>
</div>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="sql_auto_increment" value="1" id="checkbox_auto_increment_mv">
<label class="form-check-label" for="checkbox_auto_increment_mv">{% trans 'Add AUTO_INCREMENT value' %}</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="adjust_privileges" value="1" id="checkbox_privileges_tables_move"
{%- if has_privileges %} checked{% else %} title="
{%- trans 'You don\'t have sufficient privileges to perform this operation; Please refer to the documentation for more details.' %}" disabled{% endif %}>
<label class="form-check-label" for="checkbox_privileges_tables_move">
{% trans 'Adjust privileges' %}
{{ show_docu('faq', 'faq6-39') }}
</label>
</div>
</div>
<div class="card-footer text-end">
<input class="btn btn-primary" type="submit" name="submit_move" value="{% trans 'Go' %}">
</div>
</div>
</form>
<form method="post" action="{{ url('/table/operations') }}" id="tableOptionsForm" class="ajax">
{{ get_hidden_inputs(db, table) }}
<input type="hidden" name="reload" value="1">
<input type="hidden" name="submitoptions" value="1">
<input type="hidden" name="prev_comment" value="{{ table_comment }}">
{% if has_auto_increment %}
<input type="hidden" name="hidden_auto_increment" value="{{ auto_increment }}">
{% endif %}
<div class="card mb-2">
<div class="card-header">{% trans 'Table options' %}</div>
<div class="card-body">
<div class="mb-3 row row-cols-lg-auto g-3 align-items-center">
<div class="col-6">
<label for="renameTableInput">{% trans 'Rename table to' %}</label>
</div>
<div class="col-6">
<input class="form-control" id="renameTableInput" type="text" name="new_name" maxlength="64" value="{{ table }}" required>
</div>
<div class="form-check col-12">
<input class="form-check-input" type="checkbox" name="adjust_privileges" value="1" id="checkbox_privileges_table_options"
{%- if has_privileges %} checked{% else %} title="
{%- trans 'You don\'t have sufficient privileges to perform this operation; Please refer to the documentation for more details.' %}" disabled{% endif %}>
<label class="form-check-label" for="checkbox_privileges_table_options">
{% trans 'Adjust privileges' %}
{{ show_docu('faq', 'faq6-39') }}
</label>
</div>
</div>
<div class="mb-3 row row-cols-lg-auto g-3 align-items-center">
<div class="col-6">
<label for="tableCommentsInput">{% trans 'Table comments' %}</label>
</div>
<div class="col-6">
<input class="form-control" id="tableCommentsInput" type="text" name="comment" maxlength="2048" value="{{ table_comment }}">
</div>
</div>
<div class="mb-3 row row-cols-lg-auto g-3 align-items-center">
<div class="col-6">
<label class="text-nowrap" for="newTableStorageEngineSelect">
{% trans 'Storage engine' %}
{{ show_mysql_docu('Storage_engines') }}
</label>
</div>
<div class="col-6">
<select class="form-select" name="new_tbl_storage_engine" id="newTableStorageEngineSelect">
{% for engine in storage_engines %}
<option value="{{ engine.name }}"{% if engine.comment is not empty %} title="{{ engine.comment }}"{% endif %}
{{- engine.name|lower == storage_engine|lower or (storage_engine is empty and engine.is_default) ? ' selected' }}>
{{- engine.name -}}
</option>
{% endfor %}
</select>
</div>
</div>
<div class="mb-3 row row-cols-lg-auto g-3 align-items-center">
<div class="col-6">
<label for="collationSelect">{% trans 'Collation' %}</label>
</div>
<div class="col-6">
<select class="form-select" id="collationSelect" lang="en" dir="ltr" name="tbl_collation">
<option value=""></option>
{% for charset in charsets %}
<optgroup label="{{ charset.getName() }}" title="{{ charset.getDescription() }}">
{% for collation in collations[charset.getName()] %}
<option value="{{ collation.getName() }}" title="{{ collation.getDescription() }}"{{ tbl_collation == collation.getName() ? ' selected' }}>
{{ collation.getName() }}
</option>
{% endfor %}
</optgroup>
{% endfor %}
</select>
</div>
<div class="form-check col-12 ms-3">
<input class="form-check-input" type="checkbox" name="change_all_collations" value="1" id="checkbox_change_all_collations">
<label class="form-check-label" for="checkbox_change_all_collations">{% trans 'Change all column collations' %}</label>
</div>
</div>
{% if has_pack_keys %}
<div class="mb-3 row row-cols-lg-auto g-3 align-items-center">
<div class="col-6">
<label for="new_pack_keys">PACK_KEYS</label>
</div>
<div class="col-6">
<select class="form-select" name="new_pack_keys" id="new_pack_keys">
<option value="DEFAULT"{{ pack_keys == 'DEFAULT' ? ' selected' }}>DEFAULT</option>
<option value="0"{{ pack_keys == '0' ? ' selected' }}>0</option>
<option value="1"{{ pack_keys == '1' ? ' selected' }}>1</option>
</select>
</div>
</div>
{% endif %}
{% if has_checksum_and_delay_key_write %}
<div class="mb-3 form-check">
<input class="form-check-input" type="checkbox" name="new_checksum" id="new_checksum" value="1"{{ checksum == '1' ? ' checked' }}>
<label class="form-check-label" for="new_checksum">CHECKSUM</label>
</div>
<div class="mb-3 form-check">
<input class="form-check-input" type="checkbox" name="new_delay_key_write" id="new_delay_key_write" value="1"{{ delay_key_write == '1' ? ' checked' }}>
<label class="form-check-label" for="new_delay_key_write">DELAY_KEY_WRITE</label>
</div>
{% endif %}
{% if has_transactional_and_page_checksum %}
<div class="mb-3 form-check">
<input class="form-check-input" type="checkbox" name="new_transactional" id="new_transactional" value="1"{{ transactional == '1' ? ' checked' }}>
<label class="form-check-label" for="new_transactional">TRANSACTIONAL</label>
</div>
<div class="mb-3 form-check">
<input class="form-check-input" type="checkbox" name="new_page_checksum" id="new_page_checksum" value="1"{{ page_checksum == '1' ? ' checked' }}>
<label class="form-check-label" for="new_page_checksum">PAGE_CHECKSUM</label>
</div>
{% endif %}
{% if has_auto_increment %}
<div class="mb-3 row row-cols-lg-auto g-3 align-items-center">
<div class="col-12">
<label for="auto_increment_opt">AUTO_INCREMENT</label>
</div>
<div class="col-12">
<input class="form-control" id="auto_increment_opt" type="number" name="new_auto_increment" value="{{ auto_increment }}">
</div>
</div>
{% endif %}
{% if row_formats is not empty %}
<div class="mb-3 row row-cols-lg-auto g-3 align-items-center">
<div class="col-12">
<label for="new_row_format">ROW_FORMAT</label>
</div>
<div class="col-12">
<select class="form-select" id="new_row_format" name="new_row_format">
{% for row_format in row_formats %}
<option value="{{ row_format }}"{{ row_format == row_format_current|upper ? ' selected' }}>{{ row_format }}</option>
{% endfor %}
</select>
</div>
</div>
{% endif %}
</div>
<div class="card-footer text-end">
<input class="btn btn-primary" type="submit" value="{% trans 'Go' %}">
</div>
</div>
</form>
<form method="post" action="{{ url('/table/operations') }}" name="copyTable" id="copyTable" class="ajax" onsubmit="return Functions.emptyCheckTheField(this, 'new_name')">
{{ get_hidden_inputs(db, table) }}
<input type="hidden" name="reload" value="1">
<div class="card mb-2">
<div class="card-header">{% trans 'Copy table to (database.table)' %}</div>
<div class="card-body">
<div class="mb-3 row g-3">
<div class="col-auto">
<div class="input-group">
{% if database_list is not empty %}
<select class="form-select" name="target_db" aria-label="{% trans 'Database' %}">
{% for each_db in database_list %}
<option value="{{ each_db.name }}"{{ each_db.is_selected ? ' selected' }}>{{ each_db.name }}</option>
{% endfor %}
</select>
{% else %}
<input class="form-control" type="text" maxlength="100" name="target_db" value="{{ db }}" aria-label="{% trans 'Database' %}">
{% endif %}
<span class="input-group-text">.</span>
<input class="form-control" type="text" name="new_name" maxlength="64" value="{{ table }}" aria-label="{% trans 'Table' %}" required>
</div>
</div>
</div>
<div class="mb-3">
<div class="form-check">
<input class="form-check-input" type="radio" name="what" id="whatRadio1" value="structure">
<label class="form-check-label" for="whatRadio1">
{% trans 'Structure only' %}
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="what" id="whatRadio2" value="data" checked>
<label class="form-check-label" for="whatRadio2">
{% trans 'Structure and data' %}
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="what" id="whatRadio3" value="dataonly">
<label class="form-check-label" for="whatRadio3">
{% trans 'Data only' %}
</label>
</div>
</div>
<div class="mb-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" name="drop_if_exists" value="true" id="checkbox_drop">
<label class="form-check-label" for="checkbox_drop">{{ 'Add %s'|trans|format('DROP TABLE') }}</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="sql_auto_increment" value="1" id="checkbox_auto_increment_cp">
<label class="form-check-label" for="checkbox_auto_increment_cp">{% trans 'Add AUTO_INCREMENT value' %}</label>
</div>
{% if has_foreign_keys %}
<div class="form-check">
<input class="form-check-input" type="checkbox" name="add_constraints" value="1" id="checkbox_constraints" checked>
<label class="form-check-label" for="checkbox_constraints">{% trans 'Add constraints' %}</label>
</div>
{% endif %}
<div class="form-check">
<input class="form-check-input" type="checkbox" name="adjust_privileges" value="1" id="checkbox_adjust_privileges"
{%- if has_privileges %} checked{% else %} title="
{%- trans 'You don\'t have sufficient privileges to perform this operation; Please refer to the documentation for more details.' %}" disabled{% endif %}>
<label class="form-check-label" for="checkbox_adjust_privileges">
{% trans 'Adjust privileges' %}
{{ show_docu('faq', 'faq6-39') }}
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="switch_to_new" value="true" id="checkbox_switch"{{ switch_to_new ? ' checked' }}>
<label class="form-check-label" for="checkbox_switch">{% trans 'Switch to copied table' %}</label>
</div>
</div>
</div>
<div class="card-footer text-end">
<input class="btn btn-primary" type="submit" name="submit_copy" value="{% trans 'Go' %}">
</div>
</div>
</form>
<div class="card mb-2">
<div class="card-header">{% trans 'Table maintenance' %}</div>
<ul class="list-group list-group-flush" id="tbl_maintenance">
{% if storage_engine in ['MYISAM', 'ARIA', 'INNODB', 'BERKELEYDB', 'TOKUDB'] %}
<li class="list-group-item">
<a href="{{ url('/table/maintenance/analyze') }}" data-post="{{ get_common({'db': db, 'table': table, 'selected_tbl': [table]}, '', false) }}">
{% trans 'Analyze table' %}
</a>
{{ show_mysql_docu('ANALYZE_TABLE') }}
</li>
{% endif %}
{% if storage_engine in ['MYISAM', 'ARIA', 'INNODB', 'TOKUDB'] %}
<li class="list-group-item">
<a href="{{ url('/table/maintenance/check') }}" data-post="{{ get_common({'db': db, 'table': table, 'selected_tbl': [table]}, '', false) }}">
{% trans 'Check table' %}
</a>
{{ show_mysql_docu('CHECK_TABLE') }}
</li>
{% endif %}
<li class="list-group-item">
<a href="{{ url('/table/maintenance/checksum') }}" data-post="{{ get_common({'db': db, 'table': table, 'selected_tbl': [table]}, '', false) }}">
{% trans 'Checksum table' %}
</a>
{{ show_mysql_docu('CHECKSUM_TABLE') }}
</li>
{% if storage_engine == 'INNODB' %}
<li class="list-group-item">
<a class="maintain_action ajax" href="{{ url('/sql') }}" data-post="{{ get_common(url_params|merge({'sql_query': 'ALTER TABLE ' ~ backquote(table) ~ ' ENGINE = InnoDB;'}), '', false) }}">
{% trans 'Defragment table' %}
</a>
{{ show_mysql_docu('InnoDB_File_Defragmenting') }}
</li>
{% endif %}
<li class="list-group-item">
<a class="maintain_action ajax" href="{{ url('/sql') }}" data-post="{{ get_common(url_params|merge({
'sql_query': 'FLUSH TABLE ' ~ backquote(table),
'message_to_show': 'Table %s has been flushed.'|trans|format(table|e),
'reload': true
}), '', false) }}">
{% trans 'Flush the table (FLUSH)' %}
</a>
{{ show_mysql_docu('FLUSH') }}
</li>
{% if storage_engine in ['MYISAM', 'ARIA', 'INNODB', 'BERKELEYDB', 'TOKUDB'] %}
<li class="list-group-item">
<a href="{{ url('/table/maintenance/optimize') }}" data-post="{{ get_common({'db': db, 'table': table, 'selected_tbl': [table]}, '', false) }}">
{% trans 'Optimize table' %}
</a>
{{ show_mysql_docu('OPTIMIZE_TABLE') }}
</li>
{% endif %}
{% if storage_engine in ['MYISAM', 'ARIA'] %}
<li class="list-group-item">
<a href="{{ url('/table/maintenance/repair') }}" data-post="{{ get_common({'db': db, 'table': table, 'selected_tbl': [table]}, '', false) }}">
{% trans 'Repair table' %}
</a>
{{ show_mysql_docu('REPAIR_TABLE') }}
</li>
{% endif %}
</ul>
</div>
{% if not is_system_schema %}
<div class="card mb-2">
<div class="card-header">{% trans 'Delete data or table' %}</div>
<ul class="list-group list-group-flush">
{% if not is_view %}
<li class="list-group-item">
{{ link_or_button(
url('/sql'),
url_params|merge({
'sql_query': 'TRUNCATE TABLE ' ~ backquote(db) ~ '.' ~ backquote(table),
'goto': url('/table/structure'),
'reload': true,
'message_to_show': 'Table %s has been emptied.'|trans|format(table)|e
}),
'Empty the table (TRUNCATE)'|trans,
{
'id': 'truncate_tbl_anchor',
'class': 'text-danger ajax',
'data-query': 'TRUNCATE TABLE ' ~ backquote(db) ~ '.' ~ backquote(table)
}
) }}
{{ show_mysql_docu('TRUNCATE_TABLE') }}
</li>
<li class="list-group-item">
{{ link_or_button(
url('/sql'),
url_params|merge({
'sql_query': 'DELETE FROM ' ~ backquote(db) ~ '.' ~ backquote(table),
'goto': url('/table/structure'),
'reload': true,
'message_to_show': 'Table %s has been emptied.'|trans|format(table)|e
}),
'Empty the table (DELETE FROM)'|trans,
{
'id': 'delete_tbl_anchor',
'class': 'text-danger ajax',
'data-query': 'DELETE FROM ' ~ backquote(db) ~ '.' ~ backquote(table)
}
) }}
{{ show_mysql_docu('DELETE') }}
</li>
{% endif %}
<li class="list-group-item">
{{ link_or_button(
url('/sql'),
url_params|merge({
'sql_query': 'DROP TABLE ' ~ backquote(db) ~ '.' ~ backquote(table),
'goto': url('/database/operations'),
'reload': true,
'purge': true,
'message_to_show': is_view ? 'View %s has been dropped.'|trans|format(table)|e : 'Table %s has been dropped.'|trans|format(table)|e,
'table': table
}),
'Delete the table (DROP)'|trans,
{
'id': 'drop_tbl_anchor',
'class': 'text-danger ajax',
'data-query': 'DROP TABLE ' ~ backquote(db) ~ '.' ~ backquote(table)
}
) }}
{{ show_mysql_docu('DROP_TABLE') }}
</li>
</ul>
</div>
{% endif %}
{% if partitions is not empty %}
<form id="partitionsForm" class="ajax" method="post" action="{{ url('/table/operations') }}">
{{ get_hidden_inputs(db, table) }}
<input type="hidden" name="submit_partition" value="1">
<div class="card mb-2">
<div class="card-header">
{% trans 'Partition maintenance' %}
{{ show_mysql_docu('partitioning_maintenance') }}
</div>
<div class="card-body">
<div class="mb-3">
<label for="partition_name">{% trans 'Partition' %}</label>
<select class="form-select resize-vertical" id="partition_name" name="partition_name[]" multiple required>
{% for partition in partitions %}
<option value="{{ partition }}"{{ loop.first ? ' selected' }}>{{ partition }}</option>
{% endfor %}
</select>
</div>
<div class="mb-3 form-check-inline">
{% for value, description in partitions_choices %}
<div class="form-check">
<input class="form-check-input" type="radio" name="partition_operation" id="partitionOperationRadio{{ value|capitalize }}" value="{{ value }}"{{ value == 'ANALYZE' ? ' checked' }}>
<label class="form-check-label" for="partitionOperationRadio{{ value|capitalize }}">{{ description }}</label>
</div>
{% endfor %}
</div>
<div class="form-text">
<a href="{{ url('/sql', url_params|merge({
'sql_query': 'ALTER TABLE ' ~ backquote(table) ~ ' REMOVE PARTITIONING;'
})) }}">{% trans 'Remove partitioning' %}</a>
</div>
</div>
<div class="card-footer text-end">
<input class="btn btn-primary" type="submit" value="{% trans 'Go' %}">
</div>
</div>
</form>
{% endif %}
{% if foreigners is not empty %}
<div class="card mb-2">
<div class="card-header">{% trans 'Check referential integrity' %}</div>
<ul class="list-group list-group-flush">
{% for foreign in foreigners %}
<li class="list-group-item">
<a class="text-nowrap" href="{{ url('/sql', foreign.params) }}">
{{ foreign.master }} -> {{ foreign.db }}.{{ foreign.table }}.{{ foreign.field }}
</a>
</li>
{% endfor %}
</ul>
</div>
{% endif %}
</div>