int main(int argc, char** argv) { DB_APP app; int retval; int i; char download_dir[256], db_name[256], db_passwd[256]; char db_user[256],db_host[256]; char buf[4096]; JOB_DESC jd; bool show_wu_name = true; bool use_stdin = false; strcpy(app.name, ""); strcpy(db_passwd, ""); const char* config_dir = 0; i = 1; while (i < argc) { if (arg(argv, i, "appname")) { safe_strcpy(app.name, argv[++i]); } else if (arg(argv, i, "d")) { int dl = atoi(argv[++i]); log_messages.set_debug_level(dl); if (dl ==4) g_print_queries = true; } else if (arg(argv, i, "wu_name")) { show_wu_name = false; safe_strcpy(jd.wu.name, argv[++i]); } else if (arg(argv, i, "wu_template")) { safe_strcpy(jd.wu_template_file, argv[++i]); } else if (arg(argv, i, "result_template")) { safe_strcpy(jd.result_template_file, argv[++i]); } else if (arg(argv, i, "config_dir")) { config_dir = argv[++i]; } else if (arg(argv, i, "batch")) { jd.wu.batch = atoi(argv[++i]); } else if (arg(argv, i, "priority")) { jd.wu.priority = atoi(argv[++i]); } else if (arg(argv, i, "credit")) { jd.wu.canonical_credit = atof(argv[++i]); } else if (arg(argv, i, "rsc_fpops_est")) { jd.wu.rsc_fpops_est = atof(argv[++i]); } else if (arg(argv, i, "rsc_fpops_bound")) { jd.wu.rsc_fpops_bound = atof(argv[++i]); } else if (arg(argv, i, "rsc_memory_bound")) { jd.wu.rsc_memory_bound = atof(argv[++i]); } else if (arg(argv, i, "size_class")) { jd.wu.size_class = atoi(argv[++i]); } else if (arg(argv, i, "app_version_num")) { jd.wu.app_version_num = atoi(argv[++i]); } else if (arg(argv, i, "rsc_disk_bound")) { jd.wu.rsc_disk_bound = atof(argv[++i]); } else if (arg(argv, i, "delay_bound")) { jd.wu.delay_bound = atoi(argv[++i]); } else if (arg(argv, i, "hr_class")) { jd.wu.hr_class = atoi(argv[++i]); } else if (arg(argv, i, "min_quorum")) { jd.wu.min_quorum = atoi(argv[++i]); } else if (arg(argv, i, "target_nresults")) { jd.wu.target_nresults = atoi(argv[++i]); } else if (arg(argv, i, "max_error_results")) { jd.wu.max_error_results = atoi(argv[++i]); } else if (arg(argv, i, "max_total_results")) { jd.wu.max_total_results = atoi(argv[++i]); } else if (arg(argv, i, "max_success_results")) { jd.wu.max_success_results = atoi(argv[++i]); } else if (arg(argv, i, "opaque")) { jd.wu.opaque = atoi(argv[++i]); } else if (arg(argv, i, "command_line")) { jd.command_line= argv[++i]; } else if (arg(argv, i, "wu_id")) { jd.wu.id = atoi(argv[++i]); } else if (arg(argv, i, "broadcast")) { jd.assign_multi = true; jd.assign_flag = true; jd.assign_type = ASSIGN_NONE; } else if (arg(argv, i, "broadcast_user")) { jd.assign_flag = true; jd.assign_type = ASSIGN_USER; jd.assign_multi = true; jd.assign_id = atoi(argv[++i]); check_assign_id(jd.assign_id); } else if (arg(argv, i, "broadcast_team")) { jd.assign_flag = true; jd.assign_type = ASSIGN_TEAM; jd.assign_multi = true; jd.assign_id = atoi(argv[++i]); check_assign_id(jd.assign_id); } else if (arg(argv, i, "target_host")) { jd.assign_flag = true; jd.assign_type = ASSIGN_HOST; jd.assign_id = atoi(argv[++i]); check_assign_id(jd.assign_id); } else if (arg(argv, i, "target_user")) { jd.assign_flag = true; jd.assign_type = ASSIGN_USER; jd.assign_id = atoi(argv[++i]); check_assign_id(jd.assign_id); } else if (arg(argv, i, "target_team")) { jd.assign_flag = true; jd.assign_type = ASSIGN_TEAM; jd.assign_id = atoi(argv[++i]); check_assign_id(jd.assign_id); } else if (arg(argv, i, "help")) { usage(); exit(0); } else if (arg(argv, i, "stdin")) { use_stdin = true; } else if (arg(argv, i, (char*)"remote_file")) { INFILE_DESC id; id.is_remote = true; safe_strcpy(id.url, argv[++i]); id.nbytes = atof(argv[++i]); safe_strcpy(id.md5, argv[++i]); jd.infiles.push_back(id); } else if (arg(argv, i, "verbose")) { verbose = true; } else if (arg(argv, i, "continue_on_error")) { continue_on_error = true; } else if (arg(argv, i, "keywords")) { strcpy(jd.wu.keywords, argv[++i]); } else { if (!strncmp("-", argv[i], 1)) { fprintf(stderr, "create_work: bad argument '%s'\n", argv[i]); exit(1); } INFILE_DESC id; id.is_remote = false; safe_strcpy(id.name, argv[i]); jd.infiles.push_back(id); } i++; } if (!strlen(app.name)) { usage(); } if (!strlen(jd.wu.name)) { sprintf(jd.wu.name, "%s_%d_%f", app.name, getpid(), dtime()); } if (!strlen(jd.wu_template_file)) { sprintf(jd.wu_template_file, "templates/%s_in", app.name); } if (!strlen(jd.result_template_file)) { sprintf(jd.result_template_file, "templates/%s_out", app.name); } retval = config.parse_file(config_dir); if (retval) { fprintf(stderr, "Can't parse config file: %s\n", boincerror(retval)); exit(1); } else { strcpy(db_name, config.db_name); strcpy(db_passwd, config.db_passwd); strcpy(db_user, config.db_user); strcpy(db_host, config.db_host); strcpy(download_dir, config.download_dir); } retval = boinc_db.open(db_name, db_host, db_user, db_passwd); if (retval) { fprintf(stderr, "create_work: error opening database: %s\n", boincerror(retval) ); exit(1); } boinc_db.set_isolation_level(READ_UNCOMMITTED); sprintf(buf, "where name='%s'", app.name); retval = app.lookup(buf); if (retval) { fprintf(stderr, "create_work: app not found\n"); exit(1); } // read the WU template file. // this won't get used if we're creating a batch // with job-level WU templates // if (boinc_file_exists(jd.wu_template_file)) { retval = read_filename( jd.wu_template_file, jd.wu_template, sizeof(jd.wu_template) ); if (retval) { fprintf(stderr, "create_work: can't open input template %s\n", jd.wu_template_file ); exit(1); } } jd.wu.appid = app.id; strcpy(jd.result_template_path, "./"); strcat(jd.result_template_path, jd.result_template_file); if (use_stdin) { // clear the WU template name so we'll recognize a job-level one // strcpy(jd.wu_template_file, ""); if (jd.assign_flag) { // if we're doing assignment we can't use the bulk-query method; // create the jobs one at a time. // int _argc; char* _argv[100]; for (int j=0; ; j++) { char* p = fgets(buf, sizeof(buf), stdin); if (p == NULL) break; JOB_DESC jd2 = jd; strcpy(jd2.wu.name, ""); _argc = parse_command_line(buf, _argv); jd2.parse_cmdline(_argc, _argv); if (!strlen(jd2.wu.name)) { sprintf(jd2.wu.name, "%s_%d", jd.wu.name, j); } if (strlen(jd2.wu_template_file)) { get_wu_template(jd2); } if (!strlen(jd2.wu_template)) { fprintf(stderr, "job is missing input template\n"); exit(1); } jd2.create(); } } else { string values; DB_WORKUNIT wu; int _argc; char* _argv[100], value_buf[MAX_QUERY_LEN]; for (int j=0; ; j++) { char* p = fgets(buf, sizeof(buf), stdin); if (p == NULL) break; JOB_DESC jd2 = jd; strcpy(jd2.wu.name, ""); _argc = parse_command_line(buf, _argv); jd2.parse_cmdline(_argc, _argv); if (!strlen(jd2.wu.name)) { sprintf(jd2.wu.name, "%s_%d", jd.wu.name, j); } // if the stdin line specified assignment, // create the job individually // if (jd2.assign_flag) { jd2.create(); continue; } // otherwise accumulate a SQL query so that we can // create jobs en masse // if (strlen(jd2.wu_template_file)) { get_wu_template(jd2); } if (!strlen(jd2.wu_template)) { fprintf(stderr, "job is missing input template\n"); exit(1); } retval = create_work2( jd2.wu, jd2.wu_template, jd2.result_template_file, jd2.result_template_path, jd2.infiles, config, jd2.command_line, NULL, value_buf ); if (retval) { fprintf(stderr, "create_work() failed: %d\n", retval); if (continue_on_error) { continue; } else { exit(1); } } if (values.size()) { values += ","; values += value_buf; } else { values = value_buf; } // MySQL can handles queries at least 1 MB // int n = strlen(value_buf); if (values.size() + 2*n > 1000000) { retval = wu.insert_batch(values); if (retval) { fprintf(stderr, "wu.insert_batch() failed: %d; size %d\n", retval, (int)values.size() ); fprintf(stderr, "MySQL error: %s\n", boinc_db.error_string() ); exit(1); } values.clear(); } } if (values.size()) { retval = wu.insert_batch(values); if (retval) { fprintf(stderr, "wu.insert_batch() failed: %d\n", retval ); fprintf(stderr, "MySQL error: %s\n", boinc_db.error_string() ); exit(1); } } } } else { jd.create(); if (show_wu_name) { printf("workunit name: %s\n", jd.wu.name); } } boinc_db.close(); }
int main(int argc, char** argv) { DB_APP app; int retval; char wu_template_file[256]; int i; char download_dir[256], db_name[256], db_passwd[256]; char db_user[256],db_host[256]; char buf[4096]; JOB_DESC jd; bool show_wu_name = true; bool use_stdin = false; strcpy(wu_template_file, ""); strcpy(app.name, ""); strcpy(db_passwd, ""); const char* config_dir = 0; i = 1; while (i < argc) { if (arg(argv, i, "appname")) { safe_strcpy(app.name, argv[++i]); } else if (arg(argv, i, "d")) { int dl = atoi(argv[++i]); log_messages.set_debug_level(dl); if (dl ==4) g_print_queries = true; } else if (arg(argv, i, "wu_name")) { show_wu_name = false; safe_strcpy(jd.wu.name, argv[++i]); } else if (arg(argv, i, "wu_template")) { safe_strcpy(wu_template_file, argv[++i]); } else if (arg(argv, i, "result_template")) { safe_strcpy(jd.result_template_file, argv[++i]); } else if (arg(argv, i, "config_dir")) { config_dir = argv[++i]; } else if (arg(argv, i, "batch")) { jd.wu.batch = atoi(argv[++i]); } else if (arg(argv, i, "priority")) { jd.wu.priority = atoi(argv[++i]); } else if (arg(argv, i, "rsc_fpops_est")) { jd.wu.rsc_fpops_est = atof(argv[++i]); } else if (arg(argv, i, "rsc_fpops_bound")) { jd.wu.rsc_fpops_bound = atof(argv[++i]); } else if (arg(argv, i, "rsc_memory_bound")) { jd.wu.rsc_memory_bound = atof(argv[++i]); } else if (arg(argv, i, "size_class")) { jd.wu.size_class = atoi(argv[++i]); } else if (arg(argv, i, "rsc_disk_bound")) { jd.wu.rsc_disk_bound = atof(argv[++i]); } else if (arg(argv, i, "delay_bound")) { jd.wu.delay_bound = atoi(argv[++i]); } else if (arg(argv, i, "min_quorum")) { jd.wu.min_quorum = atoi(argv[++i]); } else if (arg(argv, i, "target_nresults")) { jd.wu.target_nresults = atoi(argv[++i]); } else if (arg(argv, i, "max_error_results")) { jd.wu.max_error_results = atoi(argv[++i]); } else if (arg(argv, i, "max_total_results")) { jd.wu.max_total_results = atoi(argv[++i]); } else if (arg(argv, i, "max_success_results")) { jd.wu.max_success_results = atoi(argv[++i]); } else if (arg(argv, i, "opaque")) { jd.wu.opaque = atoi(argv[++i]); } else if (arg(argv, i, "command_line")) { jd.command_line= argv[++i]; } else if (arg(argv, i, "additional_xml")) { strcpy(jd.additional_xml, argv[++i]); } else if (arg(argv, i, "wu_id")) { jd.wu.id = atoi(argv[++i]); } else if (arg(argv, i, "broadcast")) { jd.assign_multi = true; jd.assign_flag = true; jd.assign_type = ASSIGN_NONE; } else if (arg(argv, i, "broadcast_user")) { jd.assign_flag = true; jd.assign_type = ASSIGN_USER; jd.assign_multi = true; jd.assign_id = atoi(argv[++i]); } else if (arg(argv, i, "broadcast_team")) { jd.assign_flag = true; jd.assign_type = ASSIGN_TEAM; jd.assign_multi = true; jd.assign_id = atoi(argv[++i]); } else if (arg(argv, i, "target_host")) { jd.assign_flag = true; jd.assign_type = ASSIGN_HOST; jd.assign_id = atoi(argv[++i]); } else if (arg(argv, i, "target_user")) { jd.assign_flag = true; jd.assign_type = ASSIGN_USER; jd.assign_id = atoi(argv[++i]); } else if (arg(argv, i, "target_team")) { jd.assign_flag = true; jd.assign_type = ASSIGN_TEAM; jd.assign_id = atoi(argv[++i]); } else if (arg(argv, i, "help")) { usage(); exit(0); } else if (arg(argv, i, "stdin")) { use_stdin = true; } else if (arg(argv, i, (char*)"remote_file")) { INFILE_DESC id; id.is_remote = true; strcpy(id.url, argv[++i]); id.nbytes = atof(argv[++i]); strcpy(id.md5, argv[++i]); jd.infiles.push_back(id); } else { if (!strncmp("-", argv[i], 1)) { fprintf(stderr, "create_work: bad argument '%s'\n", argv[i]); exit(1); } INFILE_DESC id; id.is_remote = false; strcpy(id.name, argv[i]); jd.infiles.push_back(id); } i++; } if (!strlen(app.name)) { usage(); } if (!strlen(jd.wu.name)) { sprintf(jd.wu.name, "%s_%d_%f", app.name, getpid(), dtime()); } if (!strlen(wu_template_file)) { sprintf(wu_template_file, "templates/%s_in", app.name); } if (!strlen(jd.result_template_file)) { sprintf(jd.result_template_file, "templates/%s_out", app.name); } retval = config.parse_file(config_dir); if (retval) { fprintf(stderr, "Can't parse config file: %s\n", boincerror(retval)); exit(1); } else { strcpy(db_name, config.db_name); strcpy(db_passwd, config.db_passwd); strcpy(db_user, config.db_user); strcpy(db_host, config.db_host); strcpy(download_dir, config.download_dir); } retval = boinc_db.open(db_name, db_host, db_user, db_passwd); if (retval) { fprintf(stderr, "create_work: error opening database: %s\n", boincerror(retval) ); exit(1); } boinc_db.set_isolation_level(READ_UNCOMMITTED); sprintf(buf, "where name='%s'", app.name); retval = app.lookup(buf); if (retval) { fprintf(stderr, "create_work: app not found\n"); exit(1); } retval = read_filename( wu_template_file, jd.wu_template, sizeof(jd.wu_template) ); if (retval) { fprintf(stderr, "create_work: can't open input template %s\n", wu_template_file ); exit(1); } jd.wu.appid = app.id; strcpy(jd.result_template_path, "./"); strcat(jd.result_template_path, jd.result_template_file); if (use_stdin) { string values; DB_WORKUNIT wu; int _argc; char* _argv[100], value_buf[MAX_QUERY_LEN]; for (int j=0; ; j++) { char* p = fgets(buf, sizeof(buf), stdin); if (p == NULL) break; JOB_DESC jd2 = jd; strcpy(jd2.wu.name, ""); _argc = parse_command_line(buf, _argv); jd2.parse_cmdline(_argc, _argv); if (!strlen(jd2.wu.name)) { sprintf(jd2.wu.name, "%s_%d", jd.wu.name, j); } retval = create_work2( jd2.wu, jd2.wu_template, jd2.result_template_file, jd2.result_template_path, jd2.infiles, config, jd2.command_line, jd2.additional_xml, value_buf ); if (retval) { fprintf(stderr, "create_work() failed: %d\n", retval); exit(1); } if (values.size()) { values += ","; values += value_buf; } else { values = value_buf; } // MySQL can handles queries at least 1 MB // int n = strlen(value_buf); if (values.size() + 2*n > 1000000) { retval = wu.insert_batch(values); if (retval) { fprintf(stderr, "wu.insert_batch() failed: %d\n", retval ); exit(1); } values.clear(); } } if (values.size()) { retval = wu.insert_batch(values); if (retval) { fprintf(stderr, "wu.insert_batch() failed: %d\n", retval ); exit(1); } } } else { jd.create(); if (show_wu_name) { printf("workunit name: %s\n", jd.wu.name); } } boinc_db.close(); }