Gearman Study

view imgsize/imgsizeWorker.cpp @ 12:3a774a6d883d

imgsize fix gethostbyname()
author shokai <hashimoto@shokai.org>
date Sun Jan 03 12:22:20 2010 +0900 (2 months ago)
parents 59ab80f07b9b
children f473ac7a3b7a
line source
1 // 画像サイズを返すgearman worker
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <string>
6 #include <iostream>
7 #include <cv.h>
8 #include <highgui.h>
9 #include <boost/program_options.hpp>
10 #include <boost/regex.hpp>
11 #include <boost/format.hpp>
12 #include <boost/tuple/tuple.hpp>
13 #include <boost/tuple/tuple_io.hpp>
14 #include <libgearman/gearman.h>
16 using namespace boost;
17 using namespace std;
19 tuple<int, int> get_size(string fileName); // 画像のwidth,heightを返す
20 string imgsize(string fileName); // gearman workerとしてclientに返すstringに整形する
21 void *job_imgsize(gearman_job_st *job, void *cb_arg, size_t *result_size, gearman_return_t *ret_ptr);
23 int main(int argc, char* argv[]) {
24 program_options::options_description opts("options");
25 opts.add_options()
26 ("help,h", "helpを表示")
27 ("server,s", program_options::value<string>(), "gearmanサーバーのアドレス")
28 ("port,p", program_options::value<int>(), "gearmanサーバーのport番号")
29 ("test,t", program_options::value<string>(), "gearman worker単体テスト用query");
30 program_options::variables_map argmap;
31 program_options::store(parse_command_line(argc, argv, opts), argmap);
32 program_options::notify(argmap);
34 if(!argmap.count("help")){
35 if(argmap.count("test")){
36 cout << "---test---" << endl;
37 string gearman_param = argmap["test"].as<string>();
38 imgsize(gearman_param); // 単体でclientとしてのテスト
39 return 0;
40 }else if(argmap.count("server") && argmap.count("port")){
41 gearman_worker_st worker;
42 gearman_worker_create(&worker);
43 string g_server = argmap["server"].as<string>();
44 int g_port = argmap["port"].as<int>();
46 struct hostent *g_host = gethostbyname((char*)g_server.c_str());
47 string g_server_addr = str(format("%d.%d.%d.%d") %
48 (uint)(uchar)g_host->h_addr[0] %
49 (uint)(uchar)g_host->h_addr[1] %
50 (uint)(uchar)g_host->h_addr[2] %
51 (uint)(uchar)g_host->h_addr[3]);
53 gearman_worker_add_server(&worker, g_server_addr.c_str(), g_port);
54 gearman_worker_add_function(&worker, "img_size", 0, job_imgsize, NULL);
55 cout << str(format("---start worker (%s:%d)---") %
56 g_server_addr % g_port) << endl;
57 while(true) gearman_worker_work(&worker); // workerとして待機
58 return 0;
59 }
60 }
61 cerr << "server,portが必要です" << endl;
62 cerr << opts << endl;
63 return 1;
65 }
67 // opencvで画像サイズを取得
68 tuple<int, int> get_size(string fileName){
69 IplImage *img = cvLoadImage(fileName.c_str());
70 if(!img){
71 return make_tuple(-1, -1);
72 }
73 else{
74 return make_tuple(img->width, img->height);
75 cvReleaseImage(&img);
76 }
77 }
79 // 画像サイズを取得してgearman serverに返すstringに整形する
80 string imgsize(string fileName){
81 string result_str = "";
82 int width, height;
83 tie(width, height) = get_size(fileName);
84 if(width > 0 && height > 0){
85 result_str += str(format("{\"width\":%d, \"height\":%d}")
86 % width % height);
87 }
88 else{
89 result_str = "error : image load error";
90 }
91 cout << fileName << " => " << result_str << endl;
92 return result_str;
93 }
95 // gearman worker job
96 void *job_imgsize(gearman_job_st *job, void *cb_arg, size_t *result_size, gearman_return_t *ret_ptr){
97 string fileName = (char*)gearman_job_workload(job);
98 string result_str = imgsize(fileName);
100 char *result = (char*)strdup(result_str.c_str());
101 *result_size = result_str.size();
102 *ret_ptr = GEARMAN_SUCCESS;
103 return result;
104 }