Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F88169081
pusher.cc
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Thu, Oct 17, 04:53
Size
8 KB
Mime Type
text/x-c
Expires
Sat, Oct 19, 04:53 (1 d, 23 h)
Engine
blob
Format
Raw Data
Handle
21728314
Attached To
R3127 blackdynamite
pusher.cc
View Options
/*
author : Guillaume ANCIAUX (anciaux@labri.fr, g.anciaux@laposte.net)
author : Till JUNGE <till.junge@epfl.ch>
*/
/* -------------------------------------------------------------------------- */
#include "pusher.hh"
#include "sql_pusher.hh"
#include "sql_state_updater.hh"
#include <sstream>
#include <cmath>
/* -------------------------------------------------------------------------- */
namespace
BlackDynamite
{
Pusher
::
Pusher
()
{
this
->
connection_counter
++
;
this
->
run_id
=
0
;
this
->
sql_mode
=
false
;
}
/* -------------------------------------------------------------------------- */
Pusher
::~
Pusher
()
{
this
->
connection_counter
--
;
if
(
this
->
connection_counter
==
0
)
{
delete
this
->
sql_connection
;
this
->
sql_connection
=
NULL
;
}
}
/* -------------------------------------------------------------------------- */
inline
std
::
string
Pusher
::
request_increment
(
std
::
string
keyword
,
std
::
string
parameter
)
{
if
(
!
keyword
.
empty
())
return
keyword
+
"="
+
parameter
+
" "
;
return
""
;
}
/* -------------------------------------------------------------------------- */
void
Pusher
::
init
()
{
char
*
ptr
=
NULL
;
ptr
=
getenv
(
"USER"
);
if
(
!
ptr
)
FATAL
(
"undefined env var"
);
std
::
string
user
=
ptr
;
ptr
=
getenv
(
"DBNAME"
);
std
::
string
dbname
;
if
(
!
ptr
)
dbname
=
user
;
else
dbname
=
ptr
;
ptr
=
getenv
(
"HOST"
);
if
(
!
ptr
)
FATAL
(
"undefined env var"
);
std
::
string
host
=
ptr
;
ptr
=
getenv
(
"SCHEMA"
);
if
(
!
ptr
)
FATAL
(
"undefined env var"
);
std
::
string
schema
=
ptr
;
ptr
=
getenv
(
"RUN_ID"
);
if
(
!
ptr
)
FATAL
(
"undefined env var"
);
UInt
run_id
=
atoi
(
ptr
);
// ptr = getenv("HOSTADDR");if (!ptr) FATAL("undefined env var");
// std::string hostaddr = ptr;
// ptr = getenv("PORT");if (!ptr) FATAL("undefined env var");
// std::string port = ptr;
// ptr = getenv("CONNECT_TIMEOUT");if (!ptr) FATAL("undefined env var");
// std::string connect_timeout = ptr;
// ptr = getenv("SLMODE");if (!ptr) FATAL("undefined env var");
// std::string slmode = ptr;
// ptr = getenv("SERVICE");if (!ptr) FATAL("undefined env var");
// std::string service = ptr;
// init(dbname,user,host,hostaddr,port,connect_timeout,slmode,service);
init
(
dbname
,
user
,
host
,
schema
,
run_id
);
}
/* -------------------------------------------------------------------------- */
void
Pusher
::
init
(
const
std
::
string
&
dbname
,
const
std
::
string
&
user
,
const
std
::
string
&
host
,
const
std
::
string
&
schema
,
UInt
run_id
//const std::string & hostaddr,
//const std::string & port,
//const std::string & connect_timeout,
//const std::string & slmode,
//const std::string & service
)
{
std
::
string
options
(
""
);
if
(
this
->
sql_connection
==
NULL
)
{
options
+=
request_increment
(
"dbname"
,
dbname
);
options
+=
request_increment
(
"user"
,
user
);
options
+=
request_increment
(
"host"
,
host
);
// options += request_increment("hostaddr" , hostaddr );
// options += request_increment("port" , port );
//options += request_increment("connect_timeout", connect_timeout);
//options += request_increment("slmode" , slmode );
//options += request_increment("service" , service );
try
{
this
->
sql_connection
=
new
pqxx
::
connection
(
options
);
this
->
sql_connection
->
activate
();
}
catch
(
std
::
runtime_error
&
e
)
{
FATAL
(
"Database connection failed : "
<<
e
.
what
());
}
catch
(
std
::
exception
&
e
)
{
FATAL
(
e
.
what
());
}
catch
(...)
{
FATAL
(
"Unknown exception during connection to database"
);
}
}
this
->
sql_schema
=
schema
;
if
(
this
->
sql_schema
.
empty
())
{
this
->
scalar_integer
.
tablename
=
"scalar_integer"
;
this
->
scalar_real
.
tablename
=
"scalar_real"
;
this
->
vector_real
.
tablename
=
"vector_real"
;
this
->
vector_integer
.
tablename
=
"vector_integer"
;
this
->
quantities_tablename
=
"quantities"
;
}
else
{
this
->
scalar_integer
.
tablename
=
this
->
sql_schema
+
"."
+
"scalar_integer"
;
this
->
scalar_real
.
tablename
=
this
->
sql_schema
+
"."
+
"scalar_real"
;
this
->
vector_real
.
tablename
=
this
->
sql_schema
+
"."
+
"vector_real"
;
this
->
vector_integer
.
tablename
=
this
->
sql_schema
+
"."
+
"vector_integer"
;
this
->
quantities_tablename
=
this
->
sql_schema
+
".quantities"
;
}
this
->
run_id
=
run_id
;
if
(
this
->
run_id
<
1
)
{
FATAL
(
"The run id required for the sql dumps has not been specified"
);
}
this
->
scalar_integer
.
run_id
=
this
->
run_id
;
this
->
scalar_real
.
run_id
=
this
->
run_id
;
this
->
vector_real
.
run_id
=
this
->
run_id
;
this
->
vector_integer
.
run_id
=
this
->
run_id
;
state_updater
=
new
SqlStateUpdater
(
this
->
sql_schema
,
this
->
run_id
);
state_updater
->
changeState
(
STARTED
);
this
->
sql_connection
->
perform
(
*
state_updater
);
}
/* -------------------------------------------------------------------------- */
void
Pusher
::
endRun
(){
state_updater
->
changeState
(
ENDED
);
this
->
sql_connection
->
perform
(
*
state_updater
);
}
/* -------------------------------------------------------------------------- */
void
Pusher
::
push
(
const
int
&
value
,
const
UInt
&
quantity_id
,
const
UInt
&
step
)
{
this
->
scalar_integer
.
value
=
&
value
;
this
->
scalar_integer
.
run_id
=
this
->
run_id
;
this
->
scalar_integer
.
quantity_id
=
quantity_id
;
this
->
scalar_integer
.
step
=
step
;
this
->
sql_connection
->
perform
(
SqlPusher
<
int
,
true
>
(
this
->
scalar_integer
));
}
/* -------------------------------------------------------------------------- */
void
Pusher
::
push
(
const
Real
&
value
,
const
UInt
&
quantity_id
,
const
UInt
&
step
)
{
this
->
scalar_real
.
value
=
&
value
;
this
->
scalar_real
.
run_id
=
this
->
run_id
;
this
->
scalar_real
.
quantity_id
=
quantity_id
;
this
->
scalar_real
.
step
=
step
;
this
->
sql_connection
->
perform
(
SqlPusher
<
Real
,
true
>
(
this
->
scalar_real
));
}
/* -------------------------------------------------------------------------- */
void
Pusher
::
push
(
const
std
::
vector
<
Real
>
&
values
,
const
UInt
&
quantity_id
,
const
UInt
&
step
)
{
this
->
vector_real
.
value
=
&
values
;
this
->
vector_real
.
run_id
=
this
->
run_id
;
this
->
vector_real
.
quantity_id
=
quantity_id
;
this
->
vector_real
.
step
=
step
;
this
->
sql_connection
->
perform
(
SqlPusher
<
Real
,
false
>
(
this
->
vector_real
));
}
/* -------------------------------------------------------------------------- */
void
Pusher
::
push
(
const
std
::
vector
<
int
>
&
values
,
const
UInt
&
quantity_id
,
const
UInt
&
step
)
{
this
->
vector_integer
.
value
=
&
values
;
this
->
vector_integer
.
run_id
=
this
->
run_id
;
this
->
vector_integer
.
quantity_id
=
quantity_id
;
this
->
vector_integer
.
step
=
step
;
this
->
sql_connection
->
perform
(
SqlPusher
<
int
,
false
>
(
this
->
vector_integer
));
}
/* -------------------------------------------------------------------------- */
UInt
Pusher
::
getQuantityID
(
const
std
::
string
&
name
)
{
UInt
return_id
=
0
;
std
::
stringstream
command
;
command
<<
"SELECT id FROM "
<<
this
->
quantities_tablename
<<
" WHERE name = '"
<<
pqxx
::
to_string
(
name
)
<<
"';"
;
pqxx
::
transaction
<
pqxx
::
serializable
>
transaction
(
*
this
->
sql_connection
);
try
{
pqxx
::
result
result
=
transaction
.
exec
(
command
);
if
(
result
.
size
()
==
0
)
{
FATAL
(
"There is no quantity named '"
<<
name
<<
" defined in the database. ( The failed query was "
<<
command
.
str
()
<<
")"
);
}
return_id
=
result
.
at
(
0
).
at
(
0
).
as
<
UInt
>
(
UInt
(
0
));
if
(
return_id
==
0
)
{
FATAL
(
"There appears to be a problem, query for quantity id of "
<<
name
);
}
}
catch
(
std
::
runtime_error
&
e
)
{
FATAL
(
"Connection failed with "
<<
e
.
what
());
}
catch
(
std
::
exception
&
e
)
{
FATAL
(
"exception occured when executing sql request: "
<<
command
.
str
()
<<
std
::
endl
<<
e
.
what
());
}
catch
(...)
{
FATAL
(
"Unknown error occured while trying to query quantity_id for "
<<
name
);
}
return
return_id
;
}
/* -------------------------------------------------------------------------- */
UInt
Pusher
::
connection_counter
=
0
;
pqxx
::
connection
*
Pusher
::
sql_connection
=
NULL
;
/* -------------------------------------------------------------------------- */
}
Event Timeline
Log In to Comment