summaryrefslogtreecommitdiffstats
path: root/plugin/daemon_example
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/daemon_example')
-rw-r--r--plugin/daemon_example/AUTHORS1
-rw-r--r--plugin/daemon_example/CMakeLists.txt20
-rw-r--r--plugin/daemon_example/ChangeLog2
-rw-r--r--plugin/daemon_example/NEWS2
-rw-r--r--plugin/daemon_example/README8
-rw-r--r--plugin/daemon_example/daemon_example.cc214
-rw-r--r--plugin/daemon_example/daemon_example.ini9
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