2003-07-01 20:37:09 +00:00
|
|
|
// The contents of this file are subject to the BOINC Public License
|
|
|
|
// Version 1.0 (the "License"); you may not use this file except in
|
|
|
|
// compliance with the License. You may obtain a copy of the License at
|
|
|
|
// http://boinc.berkeley.edu/license_1.0.txt
|
2003-07-25 20:26:38 +00:00
|
|
|
//
|
2003-07-01 20:37:09 +00:00
|
|
|
// Software distributed under the License is distributed on an "AS IS"
|
|
|
|
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
|
|
|
// License for the specific language governing rights and limitations
|
2003-07-25 20:26:38 +00:00
|
|
|
// under the License.
|
|
|
|
//
|
|
|
|
// The Original Code is the Berkeley Open Infrastructure for Network Computing.
|
|
|
|
//
|
2003-07-01 20:37:09 +00:00
|
|
|
// The Initial Developer of the Original Code is the SETI@home project.
|
|
|
|
// Portions created by the SETI@home project are Copyright (C) 2002
|
2003-07-25 20:26:38 +00:00
|
|
|
// University of California at Berkeley. All Rights Reserved.
|
|
|
|
//
|
2003-07-01 20:37:09 +00:00
|
|
|
// Contributor(s):
|
|
|
|
//
|
2004-01-04 06:48:40 +00:00
|
|
|
|
2003-08-11 04:28:23 +00:00
|
|
|
#include <cstdlib>
|
|
|
|
#include <cstring>
|
|
|
|
#include <ctime>
|
|
|
|
#include <unistd.h>
|
2004-01-19 01:12:53 +00:00
|
|
|
#include <math.h>
|
2004-01-04 06:48:40 +00:00
|
|
|
|
2004-06-09 20:04:09 +00:00
|
|
|
#include "util.h"
|
2003-06-04 17:21:26 +00:00
|
|
|
#include "boinc_db.h"
|
|
|
|
|
2003-09-05 21:26:21 +00:00
|
|
|
DB_CONN boinc_db;
|
|
|
|
|
2003-08-11 04:28:23 +00:00
|
|
|
static struct random_init {
|
2003-11-11 20:49:07 +00:00
|
|
|
random_init() {
|
2003-08-11 04:28:23 +00:00
|
|
|
srand48(getpid() + time(0));
|
|
|
|
}
|
|
|
|
} random_init;
|
|
|
|
|
2004-04-09 23:33:50 +00:00
|
|
|
#define ESCAPE(x) escape_string(x, sizeof(x))
|
|
|
|
#define UNESCAPE(x) unescape_string(x, sizeof(x))
|
|
|
|
|
2003-06-04 17:21:26 +00:00
|
|
|
void PLATFORM::clear() {memset(this, 0, sizeof(*this));}
|
2003-06-05 18:16:37 +00:00
|
|
|
void CORE_VERSION::clear() {memset(this, 0, sizeof(*this));}
|
2003-06-04 17:21:26 +00:00
|
|
|
void APP::clear() {memset(this, 0, sizeof(*this));}
|
|
|
|
void APP_VERSION::clear() {memset(this, 0, sizeof(*this));}
|
|
|
|
void USER::clear() {memset(this, 0, sizeof(*this));}
|
|
|
|
void TEAM::clear() {memset(this, 0, sizeof(*this));}
|
|
|
|
void HOST::clear() {memset(this, 0, sizeof(*this));}
|
|
|
|
void RESULT::clear() {memset(this, 0, sizeof(*this));}
|
|
|
|
void WORKUNIT::clear() {memset(this, 0, sizeof(*this));}
|
2004-06-22 22:56:50 +00:00
|
|
|
void MSG_FROM_HOST::clear() {memset(this, 0, sizeof(*this));}
|
|
|
|
void MSG_TO_HOST::clear() {memset(this, 0, sizeof(*this));}
|
2003-06-04 17:21:26 +00:00
|
|
|
|
2003-09-05 21:26:21 +00:00
|
|
|
DB_PLATFORM::DB_PLATFORM() : DB_BASE(boinc_db, "platform"){}
|
|
|
|
DB_CORE_VERSION::DB_CORE_VERSION() : DB_BASE(boinc_db, "core_version"){}
|
|
|
|
DB_APP::DB_APP() : DB_BASE(boinc_db, "app"){}
|
|
|
|
DB_APP_VERSION::DB_APP_VERSION() : DB_BASE(boinc_db, "app_version"){}
|
|
|
|
DB_USER::DB_USER() : DB_BASE(boinc_db, "user"){}
|
|
|
|
DB_TEAM::DB_TEAM() : DB_BASE(boinc_db, "team"){}
|
|
|
|
DB_HOST::DB_HOST() : DB_BASE(boinc_db, "host"){}
|
|
|
|
DB_WORKUNIT::DB_WORKUNIT() : DB_BASE(boinc_db, "workunit"){}
|
|
|
|
DB_RESULT::DB_RESULT() : DB_BASE(boinc_db, "result"){}
|
2004-06-22 22:56:50 +00:00
|
|
|
DB_MSG_FROM_HOST::DB_MSG_FROM_HOST() : DB_BASE(boinc_db, "msg_from_host"){}
|
2004-07-01 18:43:36 +00:00
|
|
|
DB_TRANSITIONER_QUEUE::DB_TRANSITIONER_QUEUE() : DB_BASE(boinc_db), current_entry_start_position(0), current_entry_workunit_id(0){}
|
2003-06-04 17:21:26 +00:00
|
|
|
|
|
|
|
int DB_PLATFORM::get_id() {return id;}
|
2003-06-05 18:16:37 +00:00
|
|
|
int DB_CORE_VERSION::get_id() {return id;}
|
2003-06-04 17:21:26 +00:00
|
|
|
int DB_APP::get_id() {return id;}
|
|
|
|
int DB_APP_VERSION::get_id() {return id;}
|
|
|
|
int DB_USER::get_id() {return id;}
|
|
|
|
int DB_TEAM::get_id() {return id;}
|
|
|
|
int DB_HOST::get_id() {return id;}
|
|
|
|
int DB_WORKUNIT::get_id() {return id;}
|
|
|
|
int DB_RESULT::get_id() {return id;}
|
2004-06-22 22:56:50 +00:00
|
|
|
int DB_MSG_FROM_HOST::get_id() {return id;}
|
|
|
|
int DB_MSG_TO_HOST::get_id() {return id;}
|
2003-06-04 17:21:26 +00:00
|
|
|
|
|
|
|
void DB_PLATFORM::db_print(char* buf){
|
|
|
|
sprintf(buf,
|
2004-06-16 19:10:24 +00:00
|
|
|
"create_time=%d, name='%s', user_friendly_name='%s', "
|
2003-12-11 19:05:52 +00:00
|
|
|
"deprecated=%d",
|
2004-06-16 19:10:24 +00:00
|
|
|
create_time, name, user_friendly_name,
|
|
|
|
deprecated
|
2003-06-04 17:21:26 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DB_PLATFORM::db_parse(MYSQL_ROW &r) {
|
|
|
|
int i=0;
|
|
|
|
clear();
|
|
|
|
id=atol(r[i++]);
|
|
|
|
create_time=atol(r[i++]);
|
|
|
|
strcpy2(name, r[i++]);
|
|
|
|
strcpy2(user_friendly_name, r[i++]);
|
2003-12-11 19:05:52 +00:00
|
|
|
deprecated=atol(r[i++]);
|
2003-06-04 17:21:26 +00:00
|
|
|
}
|
|
|
|
|
2003-06-05 18:16:37 +00:00
|
|
|
void DB_CORE_VERSION::db_print(char* buf) {
|
|
|
|
sprintf(buf,
|
2004-06-16 19:10:24 +00:00
|
|
|
"create_time=%d, version_num=%d, platformid=%d, "
|
2003-06-05 18:16:37 +00:00
|
|
|
"xml_doc='%s', message='%s', deprecated=%d",
|
2004-06-16 19:10:24 +00:00
|
|
|
create_time, version_num, platformid,
|
2003-06-05 18:16:37 +00:00
|
|
|
xml_doc, message, deprecated?1:0
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DB_CORE_VERSION::db_parse(MYSQL_ROW &r) {
|
|
|
|
int i=0;
|
|
|
|
clear();
|
|
|
|
id=atol(r[i++]);
|
|
|
|
create_time = atoi(r[i++]);
|
|
|
|
version_num = atoi(r[i++]);
|
|
|
|
platformid = atoi(r[i++]);
|
|
|
|
strcpy2(xml_doc, r[i++]);
|
|
|
|
strcpy2(message, r[i++]);
|
|
|
|
deprecated = atoi(r[i++]);
|
|
|
|
}
|
2003-06-04 17:21:26 +00:00
|
|
|
|
|
|
|
void DB_APP::db_print(char* buf){
|
|
|
|
sprintf(buf,
|
2004-06-16 19:10:24 +00:00
|
|
|
"create_time=%d, name='%s', min_version=%d, "
|
2003-12-11 19:05:52 +00:00
|
|
|
"deprecated=%d, user_friendly_name='%s'",
|
2004-06-16 19:10:24 +00:00
|
|
|
create_time, name, min_version,
|
2003-12-11 19:05:52 +00:00
|
|
|
deprecated, user_friendly_name
|
2003-06-04 17:21:26 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DB_APP::db_parse(MYSQL_ROW &r) {
|
|
|
|
int i=0;
|
|
|
|
clear();
|
|
|
|
id=atol(r[i++]);
|
|
|
|
create_time = atoi(r[i++]);
|
|
|
|
strcpy2(name, r[i++]);
|
|
|
|
min_version = atoi(r[i++]);
|
2003-12-11 19:05:52 +00:00
|
|
|
deprecated = atoi(r[i++]);
|
|
|
|
strcpy2(user_friendly_name, r[i++]);
|
2003-06-04 17:21:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void DB_APP_VERSION::db_print(char* buf){
|
|
|
|
sprintf(buf,
|
2004-06-16 19:10:24 +00:00
|
|
|
"create_time=%d, appid=%d, version_num=%d, platformid=%d, "
|
2003-06-04 17:21:26 +00:00
|
|
|
"xml_doc='%s', "
|
2003-12-24 21:49:35 +00:00
|
|
|
"min_core_version=%d, max_core_version=%d, deprecated=%d",
|
2004-06-16 19:10:24 +00:00
|
|
|
create_time, appid, version_num, platformid,
|
2003-06-04 17:21:26 +00:00
|
|
|
xml_doc,
|
2003-12-24 21:49:35 +00:00
|
|
|
min_core_version, max_core_version, deprecated
|
2003-06-04 17:21:26 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DB_APP_VERSION::db_parse(MYSQL_ROW &r) {
|
|
|
|
int i=0;
|
|
|
|
clear();
|
|
|
|
id=atol(r[i++]);
|
|
|
|
create_time = atoi(r[i++]);
|
|
|
|
appid = atoi(r[i++]);
|
|
|
|
version_num = atoi(r[i++]);
|
|
|
|
platformid = atoi(r[i++]);
|
|
|
|
strcpy2(xml_doc, r[i++]);
|
|
|
|
min_core_version = atoi(r[i++]);
|
|
|
|
max_core_version = atoi(r[i++]);
|
2003-12-24 21:49:35 +00:00
|
|
|
deprecated = atoi(r[i++]);
|
2003-06-04 17:21:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void DB_USER::db_print(char* buf){
|
2004-04-09 23:33:50 +00:00
|
|
|
ESCAPE(email_addr);
|
|
|
|
ESCAPE(name);
|
|
|
|
ESCAPE(country);
|
|
|
|
ESCAPE(postal_code);
|
|
|
|
ESCAPE(global_prefs);
|
|
|
|
ESCAPE(project_prefs);
|
|
|
|
ESCAPE(url);
|
|
|
|
ESCAPE(signature);
|
2003-06-04 17:21:26 +00:00
|
|
|
sprintf(buf,
|
2004-06-16 19:10:24 +00:00
|
|
|
"create_time=%d, email_addr='%s', name='%s', "
|
2003-06-04 17:21:26 +00:00
|
|
|
"authenticator='%s', "
|
|
|
|
"country='%s', postal_code='%s', "
|
2003-08-12 20:58:24 +00:00
|
|
|
"total_credit=%.15e, expavg_credit=%.15e, expavg_time=%.15e, "
|
2003-06-04 17:21:26 +00:00
|
|
|
"global_prefs='%s', project_prefs='%s', "
|
2003-08-15 20:35:44 +00:00
|
|
|
"teamid=%d, venue='%s', url='%s', send_email=%d, show_hosts=%d, "
|
2003-10-24 20:13:50 +00:00
|
|
|
"posts=%d, "
|
|
|
|
"seti_id=%d, seti_nresults=%d, seti_last_result_time=%d, "
|
2004-04-18 18:40:13 +00:00
|
|
|
"seti_total_cpu=%.15e, signature='%s', has_profile=%d, "
|
|
|
|
"cross_project_id='%s'",
|
2004-06-16 19:10:24 +00:00
|
|
|
create_time, email_addr, name,
|
2003-06-04 17:21:26 +00:00
|
|
|
authenticator,
|
2003-12-18 00:22:25 +00:00
|
|
|
country, postal_code,
|
|
|
|
total_credit, expavg_credit, expavg_time,
|
|
|
|
global_prefs, project_prefs,
|
|
|
|
teamid, venue, url, send_email, show_hosts,
|
2003-10-24 20:13:50 +00:00
|
|
|
posts,
|
2003-12-18 00:22:25 +00:00
|
|
|
seti_id, seti_nresults, seti_last_result_time,
|
2004-04-18 18:40:13 +00:00
|
|
|
seti_total_cpu, signature, has_profile,
|
|
|
|
cross_project_id
|
2003-06-04 17:21:26 +00:00
|
|
|
);
|
2004-04-09 23:33:50 +00:00
|
|
|
UNESCAPE(email_addr);
|
|
|
|
UNESCAPE(name);
|
|
|
|
UNESCAPE(country);
|
|
|
|
UNESCAPE(postal_code);
|
|
|
|
UNESCAPE(global_prefs);
|
|
|
|
UNESCAPE(project_prefs);
|
|
|
|
UNESCAPE(url);
|
|
|
|
UNESCAPE(signature);
|
2003-06-04 17:21:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void DB_USER::db_parse(MYSQL_ROW &r) {
|
|
|
|
int i=0;
|
|
|
|
clear();
|
|
|
|
id = atoi(r[i++]);
|
|
|
|
create_time = atoi(r[i++]);
|
|
|
|
strcpy2(email_addr, r[i++]);
|
|
|
|
strcpy2(name, r[i++]);
|
|
|
|
strcpy2(authenticator, r[i++]);
|
|
|
|
strcpy2(country, r[i++]);
|
|
|
|
strcpy2(postal_code, r[i++]);
|
|
|
|
total_credit = atof(r[i++]);
|
|
|
|
expavg_credit = atof(r[i++]);
|
|
|
|
expavg_time = atof(r[i++]);
|
|
|
|
strcpy2(global_prefs, r[i++]);
|
|
|
|
strcpy2(project_prefs, r[i++]);
|
|
|
|
teamid = atoi(r[i++]);
|
|
|
|
strcpy2(venue, r[i++]);
|
|
|
|
strcpy2(url, r[i++]);
|
|
|
|
send_email = atoi(r[i++]);
|
|
|
|
show_hosts = atoi(r[i++]);
|
2003-11-25 07:40:45 +00:00
|
|
|
posts = safe_atoi(r[i++]);
|
|
|
|
seti_id = safe_atoi(r[i++]);
|
|
|
|
seti_nresults = safe_atoi(r[i++]);
|
|
|
|
seti_last_result_time = safe_atoi(r[i++]);
|
|
|
|
seti_total_cpu = safe_atof(r[i++]);
|
2003-11-28 23:11:22 +00:00
|
|
|
strcpy2(signature, r[i++]);
|
2003-12-15 02:31:29 +00:00
|
|
|
has_profile = atoi(r[i++]);
|
2004-04-18 18:40:13 +00:00
|
|
|
strcpy2(cross_project_id, r[i++]);
|
2003-06-04 17:21:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void DB_TEAM::db_print(char* buf){
|
2004-04-09 23:33:50 +00:00
|
|
|
ESCAPE(name);
|
|
|
|
ESCAPE(name_lc);
|
|
|
|
ESCAPE(url);
|
|
|
|
ESCAPE(name_html);
|
|
|
|
ESCAPE(description);
|
2003-06-04 17:21:26 +00:00
|
|
|
sprintf(buf,
|
2004-06-16 19:10:24 +00:00
|
|
|
"create_time=%d, userid=%d, name='%s', "
|
2003-06-04 17:21:26 +00:00
|
|
|
"name_lc='%s', url='%s', "
|
|
|
|
"type=%d, name_html='%s', description='%s', nusers=%d, "
|
2004-01-14 20:24:24 +00:00
|
|
|
"country='%s', "
|
|
|
|
"total_credit=%.15e, expavg_credit=%.15e, expavg_time=%.15e, "
|
2003-10-31 21:26:12 +00:00
|
|
|
"seti_id=%d",
|
2003-06-04 17:21:26 +00:00
|
|
|
create_time,
|
|
|
|
userid,
|
|
|
|
name,
|
|
|
|
name_lc,
|
|
|
|
url,
|
|
|
|
type,
|
|
|
|
name_html,
|
|
|
|
description,
|
|
|
|
nusers,
|
|
|
|
country,
|
|
|
|
total_credit,
|
2003-10-24 20:13:50 +00:00
|
|
|
expavg_credit,
|
2004-01-14 20:24:24 +00:00
|
|
|
expavg_time,
|
2003-10-24 20:13:50 +00:00
|
|
|
seti_id
|
2003-06-04 17:21:26 +00:00
|
|
|
);
|
2004-04-09 23:33:50 +00:00
|
|
|
UNESCAPE(name);
|
|
|
|
UNESCAPE(name_lc);
|
|
|
|
UNESCAPE(url);
|
|
|
|
UNESCAPE(name_html);
|
|
|
|
UNESCAPE(description);
|
2003-06-04 17:21:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void DB_TEAM::db_parse(MYSQL_ROW &r) {
|
|
|
|
int i=0;
|
|
|
|
clear();
|
|
|
|
id = atoi(r[i++]);
|
|
|
|
create_time = atoi(r[i++]);
|
|
|
|
userid = atoi(r[i++]);
|
|
|
|
strcpy2(name, r[i++]);
|
|
|
|
strcpy2(name_lc, r[i++]);
|
|
|
|
strcpy2(url, r[i++]);
|
|
|
|
type = atoi(r[i++]);
|
|
|
|
strcpy2(name_html, r[i++]);
|
|
|
|
strcpy2(description, r[i++]);
|
|
|
|
nusers = atoi(r[i++]);
|
|
|
|
strcpy2(country, r[i++]);
|
|
|
|
total_credit = atof(r[i++]);
|
|
|
|
expavg_credit = atof(r[i++]);
|
2004-01-14 20:24:24 +00:00
|
|
|
expavg_time = atof(r[i++]);
|
2003-11-25 07:40:45 +00:00
|
|
|
seti_id = safe_atoi(r[i++]);
|
2003-06-04 17:21:26 +00:00
|
|
|
}
|
|
|
|
|
2004-01-19 01:12:53 +00:00
|
|
|
// set NaNs to a reasonable value
|
|
|
|
void HOST::fix_nans() {
|
|
|
|
if (isnan(p_fpops)) p_fpops = 0;
|
|
|
|
if (isnan(p_iops)) p_iops = 0;
|
|
|
|
if (isnan(p_membw)) p_membw = 0;
|
|
|
|
if (isnan(m_nbytes)) m_nbytes = 0;
|
|
|
|
if (isnan(m_cache)) m_cache = 0;
|
|
|
|
if (isnan(m_swap)) m_swap = 0;
|
|
|
|
if (isnan(d_total)) d_total = 0;
|
|
|
|
if (isnan(d_free)) d_free = 0;
|
|
|
|
if (isnan(d_boinc_used_total)) d_boinc_used_total = 0;
|
|
|
|
if (isnan(d_boinc_used_project)) d_boinc_used_project = 0;
|
|
|
|
if (isnan(d_boinc_max)) d_boinc_max = 0;
|
|
|
|
if (isnan(n_bwup)) n_bwup = 0;
|
|
|
|
if (isnan(n_bwdown)) n_bwdown = 0;
|
|
|
|
}
|
|
|
|
|
2003-06-04 17:21:26 +00:00
|
|
|
void DB_HOST::db_print(char* buf){
|
2004-04-09 23:33:50 +00:00
|
|
|
ESCAPE(domain_name);
|
|
|
|
ESCAPE(serialnum);
|
|
|
|
ESCAPE(last_ip_addr);
|
|
|
|
ESCAPE(p_vendor);
|
|
|
|
ESCAPE(p_model);
|
|
|
|
ESCAPE(os_name);
|
|
|
|
ESCAPE(os_version);
|
2003-06-04 17:21:26 +00:00
|
|
|
sprintf(buf,
|
2004-06-16 19:10:24 +00:00
|
|
|
"create_time=%d, userid=%d, "
|
2003-06-04 17:21:26 +00:00
|
|
|
"rpc_seqno=%d, rpc_time=%d, "
|
2003-08-12 20:58:24 +00:00
|
|
|
"total_credit=%.12e, expavg_credit=%.12e, expavg_time=%.15e, "
|
2003-06-04 17:21:26 +00:00
|
|
|
"timezone=%d, domain_name='%s', serialnum='%s', "
|
|
|
|
"last_ip_addr='%s', nsame_ip_addr=%d, "
|
2003-08-12 20:58:24 +00:00
|
|
|
"on_frac=%.15e, connected_frac=%.15e, active_frac=%.15e, "
|
2003-06-04 17:21:26 +00:00
|
|
|
"p_ncpus=%d, p_vendor='%s', p_model='%s', "
|
2003-08-12 20:58:24 +00:00
|
|
|
"p_fpops=%.15e, p_iops=%.15e, p_membw=%.15e, "
|
2003-06-04 17:21:26 +00:00
|
|
|
"os_name='%s', os_version='%s', "
|
2003-08-12 20:58:24 +00:00
|
|
|
"m_nbytes=%.15e, m_cache=%.15e, m_swap=%.15e, "
|
|
|
|
"d_total=%.15e, d_free=%.15e, "
|
|
|
|
"d_boinc_used_total=%.15e, d_boinc_used_project=%.15e, d_boinc_max=%.15e, "
|
|
|
|
"n_bwup=%.15e, n_bwdown=%.15e, "
|
|
|
|
"credit_per_cpu_sec=%.15e, "
|
2004-05-27 18:13:00 +00:00
|
|
|
"venue='%s', projects='%s', nresults_today=%d",
|
2004-06-16 19:10:24 +00:00
|
|
|
create_time, userid,
|
2003-06-04 17:21:26 +00:00
|
|
|
rpc_seqno, rpc_time,
|
|
|
|
total_credit, expavg_credit, expavg_time,
|
|
|
|
timezone, domain_name, serialnum,
|
|
|
|
last_ip_addr, nsame_ip_addr,
|
|
|
|
on_frac, connected_frac, active_frac,
|
|
|
|
p_ncpus, p_vendor, p_model,
|
|
|
|
p_fpops, p_iops, p_membw,
|
|
|
|
os_name, os_version,
|
|
|
|
m_nbytes, m_cache, m_swap,
|
|
|
|
d_total, d_free,
|
2003-06-17 18:59:36 +00:00
|
|
|
d_boinc_used_total, d_boinc_used_project, d_boinc_max,
|
2003-06-04 17:21:26 +00:00
|
|
|
n_bwup, n_bwdown,
|
|
|
|
credit_per_cpu_sec,
|
2004-05-27 18:13:00 +00:00
|
|
|
venue, projects, nresults_today
|
2003-06-04 17:21:26 +00:00
|
|
|
);
|
2004-04-09 23:33:50 +00:00
|
|
|
UNESCAPE(domain_name);
|
|
|
|
UNESCAPE(serialnum);
|
|
|
|
UNESCAPE(last_ip_addr);
|
|
|
|
UNESCAPE(p_vendor);
|
|
|
|
UNESCAPE(p_model);
|
|
|
|
UNESCAPE(os_name);
|
|
|
|
UNESCAPE(os_version);
|
2003-06-04 17:21:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void DB_HOST::db_parse(MYSQL_ROW &r) {
|
|
|
|
int i=0;
|
|
|
|
clear();
|
|
|
|
id=atol(r[i++]);
|
|
|
|
create_time = atoi(r[i++]);
|
|
|
|
userid = atoi(r[i++]);
|
|
|
|
rpc_seqno = atoi(r[i++]);
|
|
|
|
rpc_time = atoi(r[i++]);
|
|
|
|
total_credit = atof(r[i++]);
|
|
|
|
expavg_credit = atof(r[i++]);
|
|
|
|
expavg_time = atof(r[i++]);
|
|
|
|
timezone = atoi(r[i++]);
|
|
|
|
strcpy2(domain_name, r[i++]);
|
|
|
|
strcpy2(serialnum, r[i++]);
|
|
|
|
strcpy2(last_ip_addr, r[i++]);
|
|
|
|
nsame_ip_addr = atoi(r[i++]);
|
|
|
|
on_frac = atof(r[i++]);
|
|
|
|
connected_frac = atof(r[i++]);
|
|
|
|
active_frac = atof(r[i++]);
|
|
|
|
p_ncpus = atoi(r[i++]);
|
|
|
|
strcpy2(p_vendor, r[i++]);
|
|
|
|
strcpy2(p_model, r[i++]);
|
|
|
|
p_fpops = atof(r[i++]);
|
|
|
|
p_iops = atof(r[i++]);
|
|
|
|
p_membw = atof(r[i++]);
|
|
|
|
strcpy2(os_name, r[i++]);
|
|
|
|
strcpy2(os_version, r[i++]);
|
|
|
|
m_nbytes = atof(r[i++]);
|
|
|
|
m_cache = atof(r[i++]);
|
|
|
|
m_swap = atof(r[i++]);
|
|
|
|
d_total = atof(r[i++]);
|
|
|
|
d_free = atof(r[i++]);
|
2003-06-17 18:59:36 +00:00
|
|
|
d_boinc_used_total = atof(r[i++]);
|
|
|
|
d_boinc_used_project = atof(r[i++]);
|
|
|
|
d_boinc_max = atof(r[i++]);
|
2003-06-04 17:21:26 +00:00
|
|
|
n_bwup = atof(r[i++]);
|
|
|
|
n_bwdown = atof(r[i++]);
|
|
|
|
credit_per_cpu_sec = atof(r[i++]);
|
|
|
|
strcpy2(venue, r[i++]);
|
2003-06-17 18:59:36 +00:00
|
|
|
strcpy2(projects, r[i++]);
|
2004-05-27 18:13:00 +00:00
|
|
|
nresults_today = atoi(r[i++]);
|
2003-06-04 17:21:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void DB_WORKUNIT::db_print(char* buf){
|
|
|
|
sprintf(buf,
|
2004-06-16 19:10:24 +00:00
|
|
|
"create_time=%d, appid=%d, "
|
2003-06-04 17:21:26 +00:00
|
|
|
"name='%s', xml_doc='%s', batch=%d, "
|
2003-09-04 00:41:51 +00:00
|
|
|
"rsc_fpops_est=%.15e, rsc_fpops_bound=%.15e, "
|
|
|
|
"rsc_memory_bound=%.15e, rsc_disk_bound=%.15e, "
|
2003-06-04 17:21:26 +00:00
|
|
|
"need_validate=%d, "
|
2003-08-12 20:58:24 +00:00
|
|
|
"canonical_resultid=%d, canonical_credit=%.15e, "
|
2003-08-15 20:35:44 +00:00
|
|
|
"transition_time=%d, delay_bound=%d, "
|
2003-06-04 17:21:26 +00:00
|
|
|
"error_mask=%d, file_delete_state=%d, assimilate_state=%d, "
|
2003-12-12 21:10:39 +00:00
|
|
|
"workseq_next=%d, opaque=%f, "
|
2003-08-15 20:35:44 +00:00
|
|
|
"min_quorum=%d, target_nresults=%d, max_error_results=%d, "
|
2003-08-15 23:44:28 +00:00
|
|
|
"max_total_results=%d, max_success_results=%d, "
|
|
|
|
"result_template='%s'",
|
2004-06-16 19:10:24 +00:00
|
|
|
create_time, appid,
|
2003-06-04 17:21:26 +00:00
|
|
|
name, xml_doc, batch,
|
2003-09-04 00:41:51 +00:00
|
|
|
rsc_fpops_est, rsc_fpops_bound, rsc_memory_bound, rsc_disk_bound,
|
2003-06-04 17:21:26 +00:00
|
|
|
need_validate,
|
|
|
|
canonical_resultid, canonical_credit,
|
2003-08-15 20:35:44 +00:00
|
|
|
transition_time, delay_bound,
|
2003-06-04 17:21:26 +00:00
|
|
|
error_mask, file_delete_state, assimilate_state,
|
2003-08-15 20:35:44 +00:00
|
|
|
workseq_next, opaque,
|
|
|
|
min_quorum,
|
|
|
|
target_nresults,
|
|
|
|
max_error_results,
|
|
|
|
max_total_results,
|
2003-08-15 23:44:28 +00:00
|
|
|
max_success_results,
|
|
|
|
result_template
|
2003-06-04 17:21:26 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DB_WORKUNIT::db_parse(MYSQL_ROW &r) {
|
|
|
|
int i=0;
|
|
|
|
clear();
|
|
|
|
id=atol(r[i++]);
|
|
|
|
create_time = atoi(r[i++]);
|
|
|
|
appid = atoi(r[i++]);
|
|
|
|
strcpy2(name, r[i++]);
|
|
|
|
strcpy2(xml_doc, r[i++]);
|
|
|
|
batch = atoi(r[i++]);
|
2003-09-04 00:41:51 +00:00
|
|
|
rsc_fpops_est = atof(r[i++]);
|
|
|
|
rsc_fpops_bound = atof(r[i++]);
|
|
|
|
rsc_memory_bound = atof(r[i++]);
|
|
|
|
rsc_disk_bound = atof(r[i++]);
|
2003-06-04 17:21:26 +00:00
|
|
|
need_validate = atoi(r[i++]);
|
|
|
|
canonical_resultid = atoi(r[i++]);
|
|
|
|
canonical_credit = atof(r[i++]);
|
2003-08-15 20:35:44 +00:00
|
|
|
transition_time = atoi(r[i++]);
|
2003-06-04 17:21:26 +00:00
|
|
|
delay_bound = atoi(r[i++]);
|
|
|
|
error_mask = atoi(r[i++]);
|
|
|
|
file_delete_state = atoi(r[i++]);
|
|
|
|
assimilate_state = atoi(r[i++]);
|
|
|
|
workseq_next = atoi(r[i++]);
|
2003-12-12 21:10:39 +00:00
|
|
|
opaque = atof(r[i++]);
|
2003-08-15 20:35:44 +00:00
|
|
|
min_quorum = atoi(r[i++]);
|
|
|
|
target_nresults = atoi(r[i++]);
|
|
|
|
max_error_results = atoi(r[i++]);
|
|
|
|
max_total_results = atoi(r[i++]);
|
|
|
|
max_success_results = atoi(r[i++]);
|
2003-08-15 23:44:28 +00:00
|
|
|
strcpy2(result_template, r[i++]);
|
2003-06-04 17:21:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void DB_RESULT::db_print(char* buf){
|
2004-04-09 23:33:50 +00:00
|
|
|
ESCAPE(xml_doc_out);
|
|
|
|
ESCAPE(stderr_out);
|
2003-07-25 20:26:38 +00:00
|
|
|
sprintf(
|
|
|
|
buf,
|
2004-06-16 19:10:24 +00:00
|
|
|
"create_time=%d, workunitid=%d, "
|
2003-06-04 17:21:26 +00:00
|
|
|
"server_state=%d, outcome=%d, client_state=%d, "
|
2003-10-16 18:10:56 +00:00
|
|
|
"hostid=%d, userid=%d, "
|
|
|
|
"report_deadline=%d, sent_time=%d, received_time=%d, "
|
2003-08-12 20:58:24 +00:00
|
|
|
"name='%s', cpu_time=%.15e, "
|
2003-06-04 17:21:26 +00:00
|
|
|
"xml_doc_in='%s', xml_doc_out='%s', stderr_out='%s', "
|
|
|
|
"batch=%d, file_delete_state=%d, validate_state=%d, "
|
2003-12-12 21:10:39 +00:00
|
|
|
"claimed_credit=%.15e, granted_credit=%.15e, opaque=%f, random=%d, "
|
2004-01-14 20:24:24 +00:00
|
|
|
"app_version_num=%d, appid=%d, exit_status=%d, teamid=%d",
|
2004-06-16 19:10:24 +00:00
|
|
|
create_time, workunitid,
|
2003-06-04 17:21:26 +00:00
|
|
|
server_state, outcome, client_state,
|
2003-10-16 18:10:56 +00:00
|
|
|
hostid, userid,
|
|
|
|
report_deadline, sent_time, received_time,
|
2003-06-04 17:21:26 +00:00
|
|
|
name, cpu_time,
|
|
|
|
xml_doc_in, xml_doc_out, stderr_out,
|
|
|
|
batch, file_delete_state, validate_state,
|
2003-11-11 20:49:07 +00:00
|
|
|
claimed_credit, granted_credit, opaque, random,
|
2004-01-14 20:24:24 +00:00
|
|
|
app_version_num, appid, exit_status, teamid
|
2003-06-04 17:21:26 +00:00
|
|
|
);
|
2004-04-09 23:33:50 +00:00
|
|
|
UNESCAPE(xml_doc_out);
|
|
|
|
UNESCAPE(stderr_out);
|
2003-06-04 17:21:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void DB_RESULT::db_parse(MYSQL_ROW &r) {
|
|
|
|
int i=0;
|
|
|
|
clear();
|
|
|
|
id=atol(r[i++]);
|
|
|
|
create_time = atoi(r[i++]);
|
|
|
|
workunitid = atoi(r[i++]);
|
|
|
|
server_state = atoi(r[i++]);
|
|
|
|
outcome = atoi(r[i++]);
|
|
|
|
client_state = atoi(r[i++]);
|
|
|
|
hostid = atoi(r[i++]);
|
2003-10-16 18:10:56 +00:00
|
|
|
userid = atoi(r[i++]);
|
2003-06-04 17:21:26 +00:00
|
|
|
report_deadline = atoi(r[i++]);
|
|
|
|
sent_time = atoi(r[i++]);
|
|
|
|
received_time = atoi(r[i++]);
|
|
|
|
strcpy2(name, r[i++]);
|
|
|
|
cpu_time = atof(r[i++]);
|
|
|
|
strcpy2(xml_doc_in, r[i++]);
|
|
|
|
strcpy2(xml_doc_out, r[i++]);
|
|
|
|
strcpy2(stderr_out, r[i++]);
|
|
|
|
batch = atoi(r[i++]);
|
|
|
|
file_delete_state = atoi(r[i++]);
|
|
|
|
validate_state = atoi(r[i++]);
|
|
|
|
claimed_credit = atof(r[i++]);
|
|
|
|
granted_credit = atof(r[i++]);
|
2003-12-12 21:10:39 +00:00
|
|
|
opaque = atof(r[i++]);
|
2003-06-04 17:21:26 +00:00
|
|
|
random = atoi(r[i++]);
|
2004-01-14 20:24:24 +00:00
|
|
|
app_version_num = atoi(r[i++]);
|
2003-11-11 20:49:07 +00:00
|
|
|
appid = atoi(r[i++]);
|
2003-12-23 19:21:52 +00:00
|
|
|
exit_status = atoi(r[i++]);
|
2004-01-14 20:24:24 +00:00
|
|
|
teamid = atoi(r[i++]);
|
2003-06-04 17:21:26 +00:00
|
|
|
}
|
|
|
|
|
2003-11-11 20:49:07 +00:00
|
|
|
int DB_RESULT::insert() {
|
2003-08-11 04:28:23 +00:00
|
|
|
random = lrand48();
|
|
|
|
return DB_BASE::insert();
|
|
|
|
}
|
|
|
|
|
2004-06-22 22:56:50 +00:00
|
|
|
void DB_MSG_FROM_HOST::db_print(char* buf) {
|
2004-04-09 23:33:50 +00:00
|
|
|
ESCAPE(xml);
|
2004-01-04 06:48:40 +00:00
|
|
|
sprintf(buf,
|
2004-06-16 19:10:24 +00:00
|
|
|
"create_time=%d, send_time=%d, "
|
2004-06-22 22:56:50 +00:00
|
|
|
"hostid=%d, variety=%d, "
|
2004-03-17 01:26:44 +00:00
|
|
|
"handled=%d, xml='%s'",
|
2004-06-24 21:00:46 +00:00
|
|
|
|
2004-06-16 19:10:24 +00:00
|
|
|
create_time, send_time,
|
2004-06-22 22:56:50 +00:00
|
|
|
hostid, variety,
|
2004-03-17 01:26:44 +00:00
|
|
|
handled, xml
|
2004-06-24 21:00:46 +00:00
|
|
|
|
2004-01-04 06:48:40 +00:00
|
|
|
);
|
2004-04-09 23:33:50 +00:00
|
|
|
UNESCAPE(xml);
|
2004-01-04 06:48:40 +00:00
|
|
|
}
|
|
|
|
|
2004-06-22 22:56:50 +00:00
|
|
|
void DB_MSG_FROM_HOST::db_parse(MYSQL_ROW& r) {
|
2004-01-04 06:48:40 +00:00
|
|
|
int i=0;
|
|
|
|
clear();
|
|
|
|
id = atol(r[i++]);
|
|
|
|
create_time = atol(r[i++]);
|
2004-03-17 01:26:44 +00:00
|
|
|
send_time = atol(r[i++]);
|
2004-05-12 21:21:09 +00:00
|
|
|
hostid = atol(r[i++]);
|
2004-06-22 22:56:50 +00:00
|
|
|
variety = atol(r[i++]);
|
2004-01-04 06:48:40 +00:00
|
|
|
handled = atoi(r[i++]);
|
|
|
|
strcpy2(xml, r[i++]);
|
|
|
|
}
|
|
|
|
|
2004-06-22 22:56:50 +00:00
|
|
|
void DB_MSG_TO_HOST::db_print(char* buf) {
|
2004-04-09 23:33:50 +00:00
|
|
|
ESCAPE(xml);
|
2004-03-17 01:26:44 +00:00
|
|
|
sprintf(buf,
|
2004-06-16 19:10:24 +00:00
|
|
|
"create_time=%d, "
|
2004-06-22 22:56:50 +00:00
|
|
|
"hostid=%d, variety=%d, "
|
2004-03-17 01:26:44 +00:00
|
|
|
"handled=%d, xml='%s'",
|
2004-06-16 19:10:24 +00:00
|
|
|
create_time,
|
2004-06-22 22:56:50 +00:00
|
|
|
hostid, variety,
|
2004-03-17 01:26:44 +00:00
|
|
|
handled, xml
|
|
|
|
);
|
2004-04-09 23:33:50 +00:00
|
|
|
UNESCAPE(xml);
|
2004-03-17 01:26:44 +00:00
|
|
|
}
|
|
|
|
|
2004-06-22 22:56:50 +00:00
|
|
|
void DB_MSG_TO_HOST::db_parse(MYSQL_ROW& r) {
|
2004-03-17 01:26:44 +00:00
|
|
|
int i=0;
|
|
|
|
clear();
|
|
|
|
id = atol(r[i++]);
|
|
|
|
create_time = atol(r[i++]);
|
|
|
|
hostid = atol(r[i++]);
|
2004-06-22 22:56:50 +00:00
|
|
|
variety = atol(r[i++]);
|
2004-03-17 01:26:44 +00:00
|
|
|
handled = atol(r[i++]);
|
|
|
|
strcpy2(xml, r[i++]);
|
|
|
|
}
|
2004-07-01 18:43:36 +00:00
|
|
|
|
|
|
|
int DB_TRANSITIONER_QUEUE::enumerate_queue_entries(int transition_time, int ntotal_transitioners, int ntransitioner, int nresult_limit) {
|
|
|
|
int x;
|
|
|
|
char query[MAX_QUERY_LEN];
|
|
|
|
char priority[16];
|
|
|
|
char mod[64];
|
|
|
|
MYSQL_ROW row;
|
|
|
|
int temp_workunit_id;
|
|
|
|
MYSQL_ROW_OFFSET temp_entry_position;
|
|
|
|
|
|
|
|
if (!cursor.active) {
|
|
|
|
cursor.active = true;
|
|
|
|
|
|
|
|
memset(priority, '\0', sizeof(priority));
|
|
|
|
if (db->mysql) { strcpy(priority, "HIGH_PRIORITY"); }
|
|
|
|
|
|
|
|
memset(mod, '\0', sizeof(mod));
|
|
|
|
if (0 < ntotal_transitioners) { sprintf(mod, "MOD(wu.id, %d) = %d", ntotal_transitioners, ntransitioner); }
|
|
|
|
|
|
|
|
sprintf(query,
|
|
|
|
"SELECT %s "
|
|
|
|
" wu.id, "
|
|
|
|
" wu.name, "
|
|
|
|
" wu.appid, "
|
|
|
|
" wu.min_quorum, "
|
|
|
|
" wu.need_validate, "
|
|
|
|
" wu.canonical_resultid, "
|
|
|
|
" wu.transition_time, "
|
|
|
|
" wu.delay_bound, "
|
|
|
|
" wu.error_mask, "
|
|
|
|
" wu.max_error_results, "
|
|
|
|
" wu.max_total_results, "
|
|
|
|
" wu.file_delete_state, "
|
|
|
|
" wu.assimilate_state, "
|
|
|
|
" wu.target_nresults, "
|
|
|
|
" wu.result_template, "
|
|
|
|
" res.id AS res_id, "
|
|
|
|
" res.report_deadline AS res_report_deadline, "
|
|
|
|
" res.server_state AS res_server_state, "
|
|
|
|
" res.outcome AS res_outcome, "
|
|
|
|
" res.validate_state AS res_validate_state, "
|
|
|
|
" res.file_delete_state AS res_file_delete_state, "
|
|
|
|
" res.sent_time AS res_sent_time "
|
|
|
|
"FROM "
|
|
|
|
" workunit AS wu "
|
|
|
|
" LEFT JOIN result AS res ON wu.id = res.workunitid "
|
|
|
|
"WHERE "
|
|
|
|
" wu.transition_time < %d AND "
|
|
|
|
" %s "
|
|
|
|
"LIMIT "
|
|
|
|
" %d ",
|
|
|
|
priority, transition_time, mod, nresult_limit);
|
|
|
|
|
|
|
|
x = db->do_query(query);
|
|
|
|
if (x) return mysql_errno(db->mysql);
|
|
|
|
cursor.rp = mysql_store_result(db->mysql);
|
|
|
|
if (!cursor.rp) return mysql_errno(db->mysql);
|
|
|
|
|
|
|
|
current_entry_start_position = mysql_row_tell(cursor.rp);
|
|
|
|
}
|
|
|
|
|
|
|
|
mysql_row_seek(current_entry_start_position);
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
temp_entry_position = mysql_row_tell(cursor.rp);
|
|
|
|
row = mysql_fetch_row(cursor.rp);
|
|
|
|
if (!row) {
|
|
|
|
mysql_free_result(cursor.rp);
|
|
|
|
cursor.active = false;
|
|
|
|
return -1;
|
|
|
|
} else {
|
|
|
|
fetch_field_value(cursor.rp, row, "id", temp_workunit_id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
while ( row && ( temp_workunit_id == current_entry_workunit_id ));
|
|
|
|
|
|
|
|
// New Workunit Detected
|
|
|
|
current_entry_workunit_id = temp_workunit_id;
|
|
|
|
current_entry_start_position = temp_entry_position;
|
|
|
|
|
|
|
|
parse_entry(cursor.rp, row);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DB_TRANSITIONER_QUEUE::parse_entry(MYSQL_RES *result, MYSQL_ROW& row) {
|
|
|
|
int temp_need_validate = 0;
|
|
|
|
fetch_field_value(result, row, "id", id);
|
|
|
|
fetch_field_value(result, row, "name", name, sizeof(name));
|
|
|
|
fetch_field_value(result, row, "appid", appid);
|
|
|
|
fetch_field_value(result, row, "min_quorum", min_quorum);
|
|
|
|
fetch_field_value(result, row, "need_validate", temp_need_validate);
|
|
|
|
if (temp_need_validate) { need_validate = true; } else { need_validate = false; }
|
|
|
|
fetch_field_value(result, row, "canonical_resultid", canonical_resultid);
|
|
|
|
fetch_field_value(result, row, "transition_time", transition_time);
|
|
|
|
fetch_field_value(result, row, "delay_bound", delay_bound);
|
|
|
|
fetch_field_value(result, row, "error_mask", error_mask);
|
|
|
|
fetch_field_value(result, row, "max_error_results", max_error_results);
|
|
|
|
fetch_field_value(result, row, "max_total_results", max_total_results);
|
|
|
|
fetch_field_value(result, row, "file_delete_state", file_delete_state);
|
|
|
|
fetch_field_value(result, row, "assimilate_state", assimilate_state);
|
|
|
|
fetch_field_value(result, row, "target_nresults", target_nresults);
|
|
|
|
parse_result(result, row);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DB_TRANSITIONER_QUEUE::parse_result(MYSQL_RES *result, MYSQL_ROW& row) {
|
|
|
|
fetch_field_value(result, row, "res_id", res_id);
|
|
|
|
fetch_field_value(result, row, "res_report_deadline", res_report_deadline);
|
|
|
|
fetch_field_value(result, row, "res_server_state", res_server_state);
|
|
|
|
fetch_field_value(result, row, "res_outcome", res_outcome);
|
|
|
|
fetch_field_value(result, row, "res_validate_state", res_validate_state);
|
|
|
|
fetch_field_value(result, row, "res_file_delete_state", res_file_delete_state);
|
|
|
|
fetch_field_value(result, row, "res_sent_time", res_sent_time);
|
|
|
|
}
|
|
|
|
|
|
|
|
int DB_TRANSITIONER_QUEUE::seek_first_result() {
|
|
|
|
int retval;
|
|
|
|
MYSQL_ROW row;
|
|
|
|
|
|
|
|
mysql_row_seek(current_entry_start_position);
|
|
|
|
row = mysql_fetch_row(cursor.rp);
|
|
|
|
if (!row) {
|
|
|
|
retval = -1;
|
|
|
|
} else {
|
|
|
|
parse_result(cursor.rp, row);
|
|
|
|
retval = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
int DB_TRANSITIONER_QUEUE::seek_next_result() {
|
|
|
|
int retval;
|
|
|
|
MYSQL_ROW row;
|
|
|
|
|
|
|
|
row = mysql_fetch_row(cursor.rp);
|
|
|
|
if (!row) {
|
|
|
|
retval = seek_first_result();
|
|
|
|
} else {
|
|
|
|
parse_result(cursor.rp, row);
|
|
|
|
retval = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|