Current section

Files

Jump to
myxql lib myxql protocol flags.ex
Raw

lib/myxql/protocol/flags.ex

defmodule MyXQL.Protocol.Flags do
@moduledoc false
use Bitwise
# https://dev.mysql.com/doc/internals/en/capability-flags.html
@capability_flags [
client_long_password: 0x00000001,
client_found_rows: 0x00000002,
client_long_flag: 0x00000004,
client_connect_with_db: 0x00000008,
client_no_schema: 0x00000010,
client_compress: 0x00000020,
client_odbc: 0x00000040,
client_local_files: 0x00000080,
client_ignore_space: 0x00000100,
client_protocol_41: 0x00000200,
client_interactive: 0x00000400,
client_ssl: 0x00000800,
client_ignore_sigpipe: 0x00001000,
client_transactions: 0x00002000,
client_reserved: 0x00004000,
client_secure_connection: 0x00008000,
client_multi_statements: 0x00010000,
client_multi_results: 0x00020000,
client_ps_multi_results: 0x00040000,
client_plugin_auth: 0x00080000,
client_connect_attrs: 0x00100000,
client_plugin_auth_lenenc_client_data: 0x00200000,
client_can_handle_expired_passwords: 0x00400000,
client_session_track: 0x00800000,
client_deprecate_eof: 0x01000000
]
def has_capability_flag?(flags, name), do: has_flag?(@capability_flags, flags, name)
def put_capability_flags(flags \\ 0, names), do: put_flags(@capability_flags, flags, names)
def list_capability_flags(flags), do: list_flags(@capability_flags, flags)
# https://dev.mysql.com/doc/internals/en/status-flags.html
@status_flags [
server_status_in_trans: 0x0001,
server_status_autocommit: 0x0002,
server_more_results_exists: 0x0008,
server_status_no_good_index_used: 0x0010,
server_status_no_index_used: 0x0020,
server_status_cursor_exists: 0x0040,
server_status_last_row_sent: 0x0080,
server_status_db_dropped: 0x0100,
server_status_no_backslash_escapes: 0x0200,
server_status_metadata_changed: 0x0400,
server_query_was_slow: 0x0800,
server_ps_out_params: 0x1000,
server_status_in_trans_readonly: 0x2000,
server_session_state_changed: 0x4000
]
def has_status_flag?(flags, name), do: has_flag?(@status_flags, flags, name)
def list_status_flags(flags), do: list_flags(@status_flags, flags)
# Column flags (non-internal)
# https://dev.mysql.com/doc/dev/mysql-server/8.0.11/group__group__cs__column__definition__flags.html
@column_flags [
not_null_flag: 0x0001,
pri_key_flag: 0x0002,
unique_key_flag: 0x0004,
multiple_key_flag: 0x0008,
blob_flag: 0x0010,
unsigned_flag: 0x0020,
zerofill_flag: 0x0040,
binary_flag: 0x0080,
enum_flag: 0x0100,
auto_increment_flag: 0x0200,
timestamp_flag: 0x0400,
set_flag: 0x0800,
no_default_value_flag: 0x1000,
on_update_now_flag: 0x2000,
num_flag: 0x4000
]
def has_column_flag?(flags, name), do: has_flag?(@column_flags, flags, name)
def list_column_flags(flags), do: list_flags(@column_flags, flags)
defp has_flag?(all_flags, flags, name) do
value = Keyword.fetch!(all_flags, name)
(flags &&& value) == value
end
defp put_flags(all_flags, flags, names) do
Enum.reduce(names, flags, &(&2 ||| Keyword.fetch!(all_flags, &1)))
end
def list_flags(all_flags, flags) do
all_flags
|> Keyword.keys()
|> Enum.filter(&has_flag?(all_flags, flags, &1))
end
end