1 /*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2  *
3  *  Gearmand client and server library.
4  *
5  *  Copyright (C) 2011 Data Differential, http://datadifferential.com/
6  *  All rights reserved.
7  *
8  *  Redistribution and use in source and binary forms, with or without
9  *  modification, are permitted provided that the following conditions are
10  *  met:
11  *
12  *      * Redistributions of source code must retain the above copyright
13  *  notice, this list of conditions and the following disclaimer.
14  *
15  *      * Redistributions in binary form must reproduce the above
16  *  copyright notice, this list of conditions and the following disclaimer
17  *  in the documentation and/or other materials provided with the
18  *  distribution.
19  *
20  *      * The names of its contributors may not be used to endorse or
21  *  promote products derived from this software without specific prior
22  *  written permission.
23  *
24  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35  *
36  */
37 
38 #include "gear_config.h"
39 #include <libgearman/common.h>
40 
41 #include <libgearman/packet.hpp>
42 #include <libgearman/function/base.hpp>
43 #include <libgearman/function/function_v2.hpp>
44 
45 /*
46   FunctionV2 function
47 */
callback(gearman_job_st * job,void * context_arg)48 gearman_function_error_t FunctionV2::callback(gearman_job_st* job, void *context_arg)
49 {
50   if (gearman_job_is_map(job))
51   {
52     gearman_job_build_reducer(job, NULL);
53   }
54 
55   gearman_return_t error= _function(job, context_arg);
56   switch (error)
57   {
58   case GEARMAN_SHUTDOWN:
59     job->error_code= GEARMAN_SUCCESS;
60     return GEARMAN_FUNCTION_SHUTDOWN;
61 
62   case GEARMAN_FATAL:
63     job->error_code= GEARMAN_FATAL;
64     return GEARMAN_FUNCTION_FATAL;
65 
66   case GEARMAN_ERROR:
67     job->error_code= GEARMAN_ERROR;
68     return GEARMAN_FUNCTION_ERROR;
69 
70   case GEARMAN_SUCCESS:
71     job->error_code= GEARMAN_SUCCESS;
72     return GEARMAN_FUNCTION_SUCCESS;
73 
74   case GEARMAN_IO_WAIT:
75   case GEARMAN_SHUTDOWN_GRACEFUL:
76   case GEARMAN_ERRNO:
77   case GEARMAN_EVENT:
78   case GEARMAN_TOO_MANY_ARGS:
79   case GEARMAN_NO_ACTIVE_FDS:
80   case GEARMAN_INVALID_MAGIC:
81   case GEARMAN_INVALID_COMMAND:
82   case GEARMAN_INVALID_PACKET:
83   case GEARMAN_UNEXPECTED_PACKET:
84   case GEARMAN_GETADDRINFO:
85   case GEARMAN_NO_SERVERS:
86   case GEARMAN_LOST_CONNECTION:
87   case GEARMAN_MEMORY_ALLOCATION_FAILURE:
88   case GEARMAN_JOB_EXISTS:
89   case GEARMAN_JOB_QUEUE_FULL:
90   case GEARMAN_SERVER_ERROR:
91   case GEARMAN_WORK_DATA:
92   case GEARMAN_WORK_WARNING:
93   case GEARMAN_WORK_STATUS:
94   case GEARMAN_WORK_EXCEPTION:
95   case GEARMAN_NOT_CONNECTED:
96   case GEARMAN_COULD_NOT_CONNECT:
97   case GEARMAN_SEND_IN_PROGRESS:
98   case GEARMAN_RECV_IN_PROGRESS:
99   case GEARMAN_NOT_FLUSHING:
100   case GEARMAN_DATA_TOO_LARGE:
101   case GEARMAN_INVALID_FUNCTION_NAME:
102   case GEARMAN_INVALID_WORKER_FUNCTION:
103   case GEARMAN_NO_REGISTERED_FUNCTION:
104   case GEARMAN_NO_REGISTERED_FUNCTIONS:
105   case GEARMAN_NO_JOBS:
106   case GEARMAN_ECHO_DATA_CORRUPTION:
107   case GEARMAN_NEED_WORKLOAD_FN:
108   case GEARMAN_PAUSE:
109   case GEARMAN_UNKNOWN_STATE:
110   case GEARMAN_PTHREAD:
111   case GEARMAN_PIPE_EOF:
112   case GEARMAN_QUEUE_ERROR:
113   case GEARMAN_FLUSH_DATA:
114   case GEARMAN_SEND_BUFFER_TOO_SMALL:
115   case GEARMAN_IGNORE_PACKET:
116   case GEARMAN_UNKNOWN_OPTION:
117   case GEARMAN_TIMEOUT:
118   case GEARMAN_ARGUMENT_TOO_LARGE:
119   case GEARMAN_INVALID_ARGUMENT:
120   case GEARMAN_IN_PROGRESS:
121   case GEARMAN_INVALID_SERVER_OPTION:
122   case GEARMAN_MAX_RETURN:
123     break;
124   }
125 
126   return GEARMAN_FUNCTION_INVALID_ARGUMENT;
127 }
128