/* Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2 of the License.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software Foundation,
   51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */

/* support for Services */
#include <service_versions.h>
#include "mysql/services.h"

struct st_service_ref {
  const char *name;
  uint version;
  void *service;
};

#ifndef EMBEDDED_LIBRARY
static struct srv_session_service_st srv_session_service_handler= {
  srv_session_init_thread,
  srv_session_deinit_thread,
  srv_session_open,
  srv_session_detach,
  srv_session_close,
  srv_session_server_is_available
};

static struct command_service_st command_handler= {
  command_service_run_command,
};

static struct srv_session_info_service_st srv_session_info_handler= {
  srv_session_info_get_thd,
  srv_session_info_get_session_id,
  srv_session_info_get_current_db,
  srv_session_info_get_client_port,
  srv_session_info_set_client_port,
  srv_session_info_set_connection_type,
  srv_session_info_killed,
  srv_session_info_session_count,
  srv_session_info_thread_count
};
#endif

static struct my_snprintf_service_st my_snprintf_handler = {
  my_snprintf,
  my_vsnprintf
};

static struct thd_alloc_service_st thd_alloc_handler= {
  thd_alloc,
  thd_calloc,
  thd_strdup,
  thd_strmake,
  thd_memdup,
  thd_make_lex_string
};

static struct thd_wait_service_st thd_wait_handler= {
  thd_wait_begin,
  thd_wait_end
};

static struct my_thread_scheduler_service my_thread_scheduler_handler= {
  my_connection_handler_set,
  my_connection_handler_reset
};

static struct my_plugin_log_service my_plugin_log_handler= {
  my_plugin_log_message
};

static struct mysql_string_service_st mysql_string_handler= {
  mysql_string_convert_to_char_ptr,
  mysql_string_get_iterator,
  mysql_string_iterator_next,
  mysql_string_iterator_isupper,
  mysql_string_iterator_islower,
  mysql_string_iterator_isdigit,
  mysql_string_to_lowercase,
  mysql_string_free,
  mysql_string_iterator_free,
};

static struct mysql_malloc_service_st mysql_malloc_handler=
{
  my_malloc,
  my_realloc,
  my_claim,
  my_free,
  my_memdup,
  my_strdup,
  my_strndup
};


static struct mysql_password_policy_service_st mysql_password_policy_handler= {
  my_validate_password_policy,
  my_calculate_password_strength
};

static struct mysql_parser_service_st parser_handler=
{
  mysql_parser_current_session,
  mysql_parser_open_session,
  mysql_parser_start_thread,
  mysql_parser_join_thread,
  mysql_parser_set_current_database,
  mysql_parser_parse,
  mysql_parser_get_statement_type,
  mysql_parser_get_statement_digest,
  mysql_parser_get_number_params,
  mysql_parser_extract_prepared_params,
  mysql_parser_visit_tree,
  mysql_parser_item_string,
  mysql_parser_free_string,
  mysql_parser_get_query,
  mysql_parser_get_normalized_query
};

static struct rpl_transaction_ctx_service_st rpl_transaction_ctx_handler= {
  set_transaction_ctx,
};

static struct transaction_write_set_service_st transaction_write_set_handler= {
  get_transaction_write_set,
};

static struct mysql_locking_service_st locking_service_handler=
{
  mysql_acquire_locking_service_locks,
  mysql_release_locking_service_locks
};

#ifndef NO_EMBEDDED_ACCESS_CHECKS
static struct security_context_service_st security_context_handler={
  thd_get_security_context,
  thd_set_security_context,
  security_context_create,
  security_context_destroy,
  security_context_copy,
  security_context_lookup,
  security_context_get_option,
  security_context_set_option
};
#endif

static struct mysql_keyring_file_service_st mysql_keyring_file_handler= {
  my_key_store,
  my_key_fetch,
  my_key_remove,
  my_key_generate
};

static struct st_service_ref list_of_services[]=
{
#ifndef EMBEDDED_LIBRARY
  { "srv_session_service",
    VERSION_srv_session_service,&srv_session_service_handler },
  { "command_service",     VERSION_command, &command_handler },
  { "srv_session_info_service",
     VERSION_srv_session_info_service, &srv_session_info_handler },
#endif
  { "my_snprintf_service", VERSION_my_snprintf, &my_snprintf_handler },
  { "thd_alloc_service",   VERSION_thd_alloc,   &thd_alloc_handler },
  { "thd_wait_service",    VERSION_thd_wait,    &thd_wait_handler },
  { "my_thread_scheduler_service",
    VERSION_my_thread_scheduler, &my_thread_scheduler_handler },
  { "my_plugin_log_service", VERSION_my_plugin_log, &my_plugin_log_handler },
  { "mysql_string_service",
    VERSION_mysql_string, &mysql_string_handler },
  { "mysql_malloc_service", VERSION_mysql_malloc, &mysql_malloc_handler },
  { "mysql_password_policy_service", VERSION_mysql_password_policy, &mysql_password_policy_handler },
  { "mysql_parser_service", VERSION_parser, &parser_handler },
  { "rpl_transaction_ctx_service",
    VERSION_rpl_transaction_ctx_service, &rpl_transaction_ctx_handler },
  { "transaction_write_set_service",
    VERSION_transaction_write_set_service, &transaction_write_set_handler },
#ifndef NO_EMBEDDED_ACCESS_CHECKS
  { "security_context_service",
    VERSION_security_context_service, &security_context_handler },
#endif
  { "mysql_locking_service", VERSION_locking_service, &locking_service_handler },
  { "mysql_keyring_service", VERSION_mysql_keyring_file_service, &mysql_keyring_file_handler}
};

