diff options
author | Alex Gorrod <alexg@wiredtiger.com> | 2016-02-23 16:25:00 +1100 |
---|---|---|
committer | Alex Gorrod <alexg@wiredtiger.com> | 2016-02-23 16:25:00 +1100 |
commit | e5a56007153127bc04a680ffff1d6d98e563c6e2 (patch) | |
tree | 29ff9d018b39001dc3090adba9c304db2ab986d5 /examples | |
parent | 4c1ae0fe240d9cbc8e88c091d292ce8f2f94c924 (diff) | |
download | mongo-e5a56007153127bc04a680ffff1d6d98e563c6e2.tar.gz |
WT-2107 Shuffle changes for event handler example.
Diffstat (limited to 'examples')
-rw-r--r-- | examples/c/Makefile.am | 1 | ||||
-rw-r--r-- | examples/c/ex_all.c | 71 | ||||
-rw-r--r-- | examples/c/ex_event_handler.c | 120 |
3 files changed, 121 insertions, 71 deletions
diff --git a/examples/c/Makefile.am b/examples/c/Makefile.am index 587204efff1..72fd98aff7b 100644 --- a/examples/c/Makefile.am +++ b/examples/c/Makefile.am @@ -12,6 +12,7 @@ noinst_PROGRAMS = \ ex_cursor \ ex_data_source \ ex_encrypt \ + ex_event_handler \ ex_extending \ ex_extractor \ ex_hello \ diff --git a/examples/c/ex_all.c b/examples/c/ex_all.c index 0c33b471843..f9f6292dc86 100644 --- a/examples/c/ex_all.c +++ b/examples/c/ex_all.c @@ -1045,63 +1045,6 @@ backup(WT_SESSION *session) return (ret); } -#define APPLICATION_ERROR 1 -#define APPLICATION_INFO 2 -int application_logging(int, const char *); -int wiredtiger_handle_error( - WT_EVENT_HANDLER *, WT_SESSION *, int, const char *); -int wiredtiger_handle_message(WT_EVENT_HANDLER *, WT_SESSION *, const char *); - -int -application_logging(int which, const char *message) -{ - (void)which; - (void)message; - return (0); -} - -/*! [Function event_handler] */ - -/* - * handle_error -- - * WiredTiger error handler. - */ -int -wiredtiger_handle_error(WT_EVENT_HANDLER *handler, - WT_SESSION *session, int error, const char *message) -{ - int ret; - - (void)(handler); /* Unused variables */ - (void)(error); - - /* Timestamp and log the error message. */ - ret = application_logging(APPLICATION_ERROR, message); - - /* Copy and flush the message to stderr. */ - if (fprintf(stderr, "%p: %s\n", session, message) < 0 && ret == 0) - ret = EIO; - if (fflush(stderr) != 0 && ret == 0) - ret = errno; - return (ret); -} - -/* - * handle_message -- - * WiredTiger message handler. - */ -int -wiredtiger_handle_message( - WT_EVENT_HANDLER *handler, WT_SESSION *session, const char *message) -{ - (void)(handler); /* Unused variables */ - (void)(session); /* Unused variables */ - - /* Timestamp and log the informational message. */ - return (application_logging(APPLICATION_INFO, message)); -} -/*! [Function event_handler] */ - int main(void) { @@ -1171,20 +1114,6 @@ main(void) if (ret == 0) (void)conn->close(conn, NULL); #endif - { - /*! [Configure event_handler] */ - WT_EVENT_HANDLER event_handler; - - event_handler.handle_error = wiredtiger_handle_error; - event_handler.handle_message = wiredtiger_handle_message; - event_handler.handle_progress = NULL; - event_handler.handle_close = NULL; - - ret = wiredtiger_open(home, &event_handler, "create", &conn); - /*! [Configure event_handler] */ - if (ret == 0) - (void)conn->close(conn, NULL); - } /*! [Configure file_extend] */ ret = wiredtiger_open( diff --git a/examples/c/ex_event_handler.c b/examples/c/ex_event_handler.c new file mode 100644 index 00000000000..1e277cab00c --- /dev/null +++ b/examples/c/ex_event_handler.c @@ -0,0 +1,120 @@ +/*- + * Public Domain 2014-2016 MongoDB, Inc. + * Public Domain 2008-2014 WiredTiger, Inc. + * + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * ex_event_handler.c + * Demonstrate how to use the WiredTiger event handler mechanism. + * + */ +#include <stdio.h> +#include <string.h> + +#include <wiredtiger.h> + +static const char * const progname = "ex_event_handler"; +static const char *home; + +int handle_wiredtiger_error( + WT_EVENT_HANDLER *, WT_SESSION *, int, const char *); +int handle_wiredtiger_message(WT_EVENT_HANDLER *, WT_SESSION *, const char *); + +/*! [Function event_handler] */ + +/* + * Setup our own event handler structure to allow us to pass context through + * to event handler callbacks. For this to work the WiredTiger event handler + * must appear first in our custom event handler structure. + */ +typedef struct { + WT_EVENT_HANDLER h; + const char *app_id; +} CUSTOM_EVENT_HANDLER; + +/* + * handle_wiredtiger_error -- + * Function to handle error callbacks from WiredTiger. + */ +int +handle_wiredtiger_error(WT_EVENT_HANDLER *handler, + WT_SESSION *session, int error, const char *message) +{ + CUSTOM_EVENT_HANDLER *custom_handler; + + /* Cast the handler back to our custom handler. */ + custom_handler = (CUSTOM_EVENT_HANDLER *)handler; + + /* Report the error on the console. */ + fprintf(stderr, + "app_id %s, thread context %p, error %d, message %s\n", + custom_handler->app_id, session, error, message); + + return (0); +} + +/* + * handle_wiredtiger_message -- + * Function to handle message callbacks from WiredTiger. + */ +int +handle_wiredtiger_message( + WT_EVENT_HANDLER *handler, WT_SESSION *session, const char *message) +{ + printf("app id %s, thread context %p, message %s\n", + ((CUSTOM_EVENT_HANDLER*)handler)->app_id, session, message); + + return (0); +} +/*! [Function event_handler] */ + +int +main(void) +{ + WT_CONNECTION *conn; + WT_SESSION *session; + int ret; + + /*! [Configure event_handler] */ + CUSTOM_EVENT_HANDLER event_handler; + + event_handler.h.handle_error = handle_wiredtiger_error; + event_handler.h.handle_message = handle_wiredtiger_message; + /* Setup a NULL to use the default handler. */ + event_handler.h.handle_progress = NULL; + event_handler.h.handle_close = NULL; + event_handler.app_id = "example_event_handler"; + + ret = wiredtiger_open(home, + (WT_EVENT_HANDLER*)&event_handler, "create", &conn); + /*! [Configure event_handler] */ + + /* Make an invalid API call, to ensure the event handler works. */ + (void)conn->open_session(conn, NULL, "isolation=invalid", &session); + + if (ret == 0) + (void)conn->close(conn, NULL); + + return (ret); +} |