diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 18:07:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 18:07:14 +0000 |
commit | a175314c3e5827eb193872241446f2f8f5c9d33c (patch) | |
tree | cd3d60ca99ae00829c52a6ca79150a5b6e62528b /plugin/daemon_example | |
parent | Initial commit. (diff) | |
download | mariadb-10.5-a175314c3e5827eb193872241446f2f8f5c9d33c.tar.xz mariadb-10.5-a175314c3e5827eb193872241446f2f8f5c9d33c.zip |
Adding upstream version 1:10.5.12.upstream/1%10.5.12upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'plugin/daemon_example')
-rw-r--r-- | plugin/daemon_example/AUTHORS | 1 | ||||
-rw-r--r-- | plugin/daemon_example/CMakeLists.txt | 20 | ||||
-rw-r--r-- | plugin/daemon_example/ChangeLog | 2 | ||||
-rw-r--r-- | plugin/daemon_example/NEWS | 2 | ||||
-rw-r--r-- | plugin/daemon_example/README | 8 | ||||
-rw-r--r-- | plugin/daemon_example/daemon_example.cc | 214 | ||||
-rw-r--r-- | plugin/daemon_example/daemon_example.ini | 9 |
7 files changed, 256 insertions, 0 deletions
diff --git a/plugin/daemon_example/AUTHORS b/plugin/daemon_example/AUTHORS new file mode 100644 index 00000000..fe992df1 --- /dev/null +++ b/plugin/daemon_example/AUTHORS @@ -0,0 +1 @@ +Brian Aker <brian@mysql.com> diff --git a/plugin/daemon_example/CMakeLists.txt b/plugin/daemon_example/CMakeLists.txt new file mode 100644 index 00000000..57a1135e --- /dev/null +++ b/plugin/daemon_example/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2006, 2011, 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, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA + +MYSQL_ADD_PLUGIN(daemon_example daemon_example.cc RECOMPILE_FOR_EMBEDDED + MODULE_ONLY MODULE_OUTPUT_NAME "libdaemon_example" COMPONENT Test) + +INSTALL(FILES daemon_example.ini DESTINATION ${INSTALL_PLUGINDIR} + COMPONENT Test) diff --git a/plugin/daemon_example/ChangeLog b/plugin/daemon_example/ChangeLog new file mode 100644 index 00000000..c4b09806 --- /dev/null +++ b/plugin/daemon_example/ChangeLog @@ -0,0 +1,2 @@ +0.1 + - Added diff --git a/plugin/daemon_example/NEWS b/plugin/daemon_example/NEWS new file mode 100644 index 00000000..ddae9fc3 --- /dev/null +++ b/plugin/daemon_example/NEWS @@ -0,0 +1,2 @@ +0.1 - Tue Nov 7 12:08:03 PST 2006 + * Added Example to test interface diff --git a/plugin/daemon_example/README b/plugin/daemon_example/README new file mode 100644 index 00000000..d3c67be6 --- /dev/null +++ b/plugin/daemon_example/README @@ -0,0 +1,8 @@ +Hi! + +This is an example of a daemon plugin. These are generic plugins that +only hook ino the startup and shutdown of the database. + +Cheers, + -Brian + Seattle, WA diff --git a/plugin/daemon_example/daemon_example.cc b/plugin/daemon_example/daemon_example.cc new file mode 100644 index 00000000..50026e92 --- /dev/null +++ b/plugin/daemon_example/daemon_example.cc @@ -0,0 +1,214 @@ +/* Copyright (c) 2006, 2015, 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, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ + +#include <my_global.h> +#include <sql_priv.h> +#include <stdlib.h> +#include <ctype.h> +#include <mysql_version.h> +#include <mysql/plugin.h> +#include <my_dir.h> +#include "my_pthread.h" // pthread_handler_t +#include "my_sys.h" // my_write, my_malloc +#include "m_string.h" // strlen +#include "sql_plugin.h" // st_plugin_int + +/* + Disable __attribute__() on non-gcc compilers. +*/ +#if !defined(__attribute__) && !defined(__GNUC__) +#define __attribute__(A) +#endif + + +#define HEART_STRING_BUFFER 100 + +struct mysql_heartbeat_context +{ + pthread_t heartbeat_thread; + File heartbeat_file; +}; + +pthread_handler_t mysql_heartbeat(void *p) +{ + DBUG_ENTER("mysql_heartbeat"); + struct mysql_heartbeat_context *con= (struct mysql_heartbeat_context *)p; + char buffer[HEART_STRING_BUFFER]; + time_t result; + struct tm tm_tmp; + + while(1) + { + sleep(5); + + result= time(NULL); + localtime_r(&result, &tm_tmp); + my_snprintf(buffer, sizeof(buffer), + "Heartbeat at %02d%02d%02d %2d:%02d:%02d\n", + tm_tmp.tm_year % 100, + tm_tmp.tm_mon+1, + tm_tmp.tm_mday, + tm_tmp.tm_hour, + tm_tmp.tm_min, + tm_tmp.tm_sec); + my_write(con->heartbeat_file, (uchar*) buffer, strlen(buffer), MYF(0)); + } + + DBUG_RETURN(0); +} + +/* + Initialize the daemon example at server start or plugin installation. + + SYNOPSIS + daemon_example_plugin_init() + + DESCRIPTION + Starts up heartbeatbeat thread + + RETURN VALUE + 0 success + 1 failure (cannot happen) +*/ + +static int daemon_example_plugin_init(void *p __attribute__ ((unused))) +{ + + DBUG_ENTER("daemon_example_plugin_init"); + struct mysql_heartbeat_context *con; + pthread_attr_t attr; /* Thread attributes */ + char heartbeat_filename[FN_REFLEN]; + char buffer[HEART_STRING_BUFFER]; + time_t result= time(NULL); + struct tm tm_tmp; + + struct st_plugin_int *plugin= (struct st_plugin_int *)p; + + con= (struct mysql_heartbeat_context *) + my_malloc(PSI_NOT_INSTRUMENTED, sizeof(struct mysql_heartbeat_context), MYF(0)); + + fn_format(heartbeat_filename, "mysql-heartbeat", "", ".log", + MY_REPLACE_EXT | MY_UNPACK_FILENAME); + unlink(heartbeat_filename); + con->heartbeat_file= my_open(heartbeat_filename, O_CREAT|O_RDWR, MYF(0)); + + /* + No threads exist at this point in time, so this is thread safe. + */ + localtime_r(&result, &tm_tmp); + my_snprintf(buffer, sizeof(buffer), + "Starting up at %02d%02d%02d %2d:%02d:%02d\n", + tm_tmp.tm_year % 100, + tm_tmp.tm_mon+1, + tm_tmp.tm_mday, + tm_tmp.tm_hour, + tm_tmp.tm_min, + tm_tmp.tm_sec); + my_write(con->heartbeat_file, (uchar*) buffer, strlen(buffer), MYF(0)); + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, + PTHREAD_CREATE_JOINABLE); + + + /* now create the thread */ + if (pthread_create(&con->heartbeat_thread, &attr, mysql_heartbeat, + (void *)con) != 0) + { + fprintf(stderr,"Could not create heartbeat thread!\n"); + DBUG_RETURN(1); + } + plugin->data= (void *)con; + + DBUG_RETURN(0); +} + + +/* + Terminate the daemon example at server shutdown or plugin deinstallation. + + SYNOPSIS + daemon_example_plugin_deinit() + Does nothing. + + RETURN VALUE + 0 success + 1 failure (cannot happen) + +*/ + +static int daemon_example_plugin_deinit(void *p __attribute__ ((unused))) +{ + DBUG_ENTER("daemon_example_plugin_deinit"); + char buffer[HEART_STRING_BUFFER]; + struct st_plugin_int *plugin= (struct st_plugin_int *)p; + struct mysql_heartbeat_context *con= + (struct mysql_heartbeat_context *)plugin->data; + time_t result= time(NULL); + struct tm tm_tmp; + + pthread_cancel(con->heartbeat_thread); + pthread_join(con->heartbeat_thread, NULL); + + localtime_r(&result, &tm_tmp); + my_snprintf(buffer, sizeof(buffer), + "Shutting down at %02d%02d%02d %2d:%02d:%02d\n", + tm_tmp.tm_year % 100, + tm_tmp.tm_mon+1, + tm_tmp.tm_mday, + tm_tmp.tm_hour, + tm_tmp.tm_min, + tm_tmp.tm_sec); + my_write(con->heartbeat_file, (uchar*) buffer, strlen(buffer), MYF(0)); + + /* + Need to wait for the hearbeat thread to terminate before closing + the file it writes to and freeing the memory it uses. + */ + pthread_join(con->heartbeat_thread, NULL); + + my_close(con->heartbeat_file, MYF(0)); + + my_free(con); + + DBUG_RETURN(0); +} + + +struct st_mysql_daemon daemon_example_plugin= +{ MYSQL_DAEMON_INTERFACE_VERSION }; + +/* + Plugin library descriptor +*/ + +maria_declare_plugin(daemon_example) +{ + MYSQL_DAEMON_PLUGIN, + &daemon_example_plugin, + "daemon_example", + "Brian Aker", + "Daemon example, creates a heartbeat beat file in mysql-heartbeat.log", + PLUGIN_LICENSE_GPL, + daemon_example_plugin_init, /* Plugin Init */ + daemon_example_plugin_deinit, /* Plugin Deinit */ + 0x0100 /* 1.0 */, + NULL, /* status variables */ + NULL, /* system variables */ + "1.0", /* string version */ + MariaDB_PLUGIN_MATURITY_EXPERIMENTAL /* maturity */ +} +maria_declare_plugin_end; diff --git a/plugin/daemon_example/daemon_example.ini b/plugin/daemon_example/daemon_example.ini new file mode 100644 index 00000000..7c6d4d14 --- /dev/null +++ b/plugin/daemon_example/daemon_example.ini @@ -0,0 +1,9 @@ +# +# Plugin configuration file. Place the following on a separate line: +# +# library binary file name (without .so or .dll) +# component_name +# [component_name] - additional components in plugin +# +libdaemon_example +daemon_example |