pgsql.patch
one/include/History.h 2010-10-14 09:32:47.596176002 +0200 | ||
---|---|---|
189 | 189 |
int drop(SqlDB * db); |
190 | 190 | |
191 | 191 |
/** |
192 |
* Execute an INSERT or REPLACE Sql query.
|
|
192 |
* Execute an INSERT or UPDATE Sql query.
|
|
193 | 193 |
* @param db The SQL DB |
194 |
* @param replace Execute an INSERT or a REPLACE
|
|
194 |
* @param update Execute an INSERT or a UPDATE
|
|
195 | 195 |
* @return 0 on success |
196 | 196 |
*/ |
197 |
int insert_replace(SqlDB *db, bool replace);
|
|
197 |
int insert_update(SqlDB *db, bool update);
|
|
198 | 198 | |
199 | 199 |
/** |
200 | 200 |
* Callback function to unmarshall a history object (History::select) |
one/include/Host.h 2010-10-14 09:33:44.786176002 +0200 | ||
---|---|---|
431 | 431 |
// ************************************************************************* |
432 | 432 | |
433 | 433 |
/** |
434 |
* Execute an INSERT or REPLACE Sql query.
|
|
434 |
* Execute an INSERT or UPDATE Sql query.
|
|
435 | 435 |
* @param db The SQL DB |
436 |
* @param replace Execute an INSERT or a REPLACE
|
|
436 |
* @param update Execute an INSERT or a UPDATE
|
|
437 | 437 |
* @return 0 one success |
438 | 438 |
*/ |
439 |
int insert_replace(SqlDB *db, bool replace);
|
|
439 |
int insert_update(SqlDB *db, bool update);
|
|
440 | 440 | |
441 | 441 |
/** |
442 | 442 |
* Callback function to unmarshall a Host object (Host::select) |
one/include/HostShare.h 2010-10-14 09:32:30.856176002 +0200 | ||
---|---|---|
199 | 199 |
int drop(SqlDB * db); |
200 | 200 | |
201 | 201 |
/** |
202 |
* Execute an INSERT or REPLACE Sql query.
|
|
202 |
* Execute an INSERT or UPDATE Sql query.
|
|
203 | 203 |
* @param db The SQL DB |
204 |
* @param replace Execute an INSERT or a REPLACE
|
|
204 |
* @param update Execute an INSERT or a UPDATE
|
|
205 | 205 |
* @return 0 one success |
206 | 206 |
*/ |
207 |
int insert_replace(SqlDB *db, bool replace);
|
|
207 |
int insert_update(SqlDB *db, bool update);
|
|
208 | 208 | |
209 | 209 |
/** |
210 | 210 |
* Callback function to unmarshall a HostShare object (HostShare::select) |
one/include/Image.h 2010-10-14 09:35:13.596176001 +0200 | ||
---|---|---|
415 | 415 |
// ************************************************************************* |
416 | 416 | |
417 | 417 |
/** |
418 |
* Execute an INSERT or REPLACE Sql query.
|
|
418 |
* Execute an INSERT or UPDATE Sql query.
|
|
419 | 419 |
* @param db The SQL DB |
420 |
* @param replace Execute an INSERT or a REPLACE
|
|
420 |
* @param update Execute an INSERT or a UPDATE
|
|
421 | 421 |
* @return 0 on success |
422 | 422 |
*/ |
423 |
int insert_replace(SqlDB *db, bool replace);
|
|
423 |
int insert_update(SqlDB *db, bool update);
|
|
424 | 424 | |
425 | 425 |
/** |
426 | 426 |
* Callback function to unmarshall a Image object (Image::select) |
one/include/PGSqlDB.h 2010-10-14 09:18:05.126176001 +0200 | ||
---|---|---|
1 |
/* -------------------------------------------------------------------------- */ |
|
2 |
/* Copyright 2002-2010, OpenNebula Project Leads (OpenNebula.org) */ |
|
3 |
/* */ |
|
4 |
/* Licensed under the Apache License, Version 2.0 (the "License"); you may */ |
|
5 |
/* not use this file except in compliance with the License. You may obtain */ |
|
6 |
/* a copy of the License at */ |
|
7 |
/* */ |
|
8 |
/* http://www.apache.org/licenses/LICENSE-2.0 */ |
|
9 |
/* */ |
|
10 |
/* Unless required by applicable law or agreed to in writing, software */ |
|
11 |
/* distributed under the License is distributed on an "AS IS" BASIS, */ |
|
12 |
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ |
|
13 |
/* See the License for the specific language governing permissions and */ |
|
14 |
/* limitations under the License. */ |
|
15 |
/* -------------------------------------------------------------------------- */ |
|
16 | ||
17 |
#ifndef PGSQL_DB_H_ |
|
18 |
#define PGSQL_DB_H_ |
|
19 | ||
20 |
#include <string> |
|
21 |
#include <sstream> |
|
22 |
#include <stdexcept> |
|
23 | ||
24 |
#include <sys/time.h> |
|
25 |
#include <sys/types.h> |
|
26 |
#include <unistd.h> |
|
27 | ||
28 |
#include "NebulaLog.h" |
|
29 |
#include "SqlDB.h" |
|
30 |
#include "ObjectSQL.h" |
|
31 | ||
32 | ||
33 |
using namespace std; |
|
34 | ||
35 |
#ifdef PGSQL_DB |
|
36 | ||
37 |
#include <libpq-fe.h> |
|
38 | ||
39 |
/** |
|
40 |
* PQDB class. Provides a wrapper to the postgresql database interface. |
|
41 |
*/ |
|
42 |
class PGSqlDB : public SqlDB |
|
43 |
{ |
|
44 |
public: |
|
45 | ||
46 |
PGSqlDB(const string& server, |
|
47 |
const string& user, |
|
48 |
const string& password, |
|
49 |
const string& database); |
|
50 | ||
51 |
~PGSqlDB(); |
|
52 | ||
53 |
/** |
|
54 |
* Wraps the PQexec function call |
|
55 |
* @param cmd the SQL command |
|
56 |
* @param obj Callbackable obj to call if the query succeeds |
|
57 |
* @return 0 on success |
|
58 |
*/ |
|
59 |
int exec(ostringstream& cmd, Callbackable* obj=0); |
|
60 | ||
61 |
/** |
|
62 |
* This function returns a legal SQL string that can be used in an SQL |
|
63 |
* statement. The string is encoded to an escaped SQL string, taking into |
|
64 |
* account the current character set of the connection. |
|
65 |
* @param str the string to be escaped |
|
66 |
* @return a valid SQL string or NULL in case of failure |
|
67 |
*/ |
|
68 |
char * escape_str(const string& str); |
|
69 | ||
70 |
/** |
|
71 |
* Frees a previously scaped string |
|
72 |
* @param str pointer to the str |
|
73 |
*/ |
|
74 |
void free_str(char * str); |
|
75 | ||
76 |
private: |
|
77 | ||
78 |
/** |
|
79 |
* The PostgreSQL connection handler |
|
80 |
*/ |
|
81 |
PGconn * db; |
|
82 | ||
83 |
/** |
|
84 |
* Fine-grain mutex for DB access |
|
85 |
*/ |
|
86 |
pthread_mutex_t mutex; |
|
87 | ||
88 |
/** |
|
89 |
* Function to lock the DB |
|
90 |
*/ |
|
91 |
void lock() |
|
92 |
{ |
|
93 |
pthread_mutex_lock(&mutex); |
|
94 |
}; |
|
95 | ||
96 |
/** |
|
97 |
* Function to unlock the DB |
|
98 |
*/ |
|
99 |
void unlock() |
|
100 |
{ |
|
101 |
pthread_mutex_unlock(&mutex); |
|
102 |
}; |
|
103 |
}; |
|
104 |
#else |
|
105 |
//CLass stub |
|
106 |
class PGSqlDB : public SqlDB |
|
107 |
{ |
|
108 |
public: |
|
109 | ||
110 |
PGSqlDB( |
|
111 |
string server, |
|
112 |
string user, |
|
113 |
string password, |
|
114 |
char * database) |
|
115 |
{ |
|
116 |
throw runtime_error("Aborting oned, PostgreSQL support not compiled!"); |
|
117 |
}; |
|
118 | ||
119 |
~PGSqlDB(){}; |
|
120 | ||
121 |
int exec(ostringstream& cmd, Callbackable* obj=0){return -1;}; |
|
122 | ||
123 |
char * escape_str(const string& str){return 0;}; |
|
124 | ||
125 |
void free_str(char * str){}; |
|
126 |
}; |
|
127 |
#endif |
|
128 | ||
129 |
#endif /*PGSQL_DB_H_*/ |
|
130 |
one/include/User.h 2010-10-14 09:34:36.536176001 +0200 | ||
---|---|---|
165 | 165 |
// ************************************************************************* |
166 | 166 | |
167 | 167 |
/** |
168 |
* Execute an INSERT or REPLACE Sql query.
|
|
168 |
* Execute an INSERT or UPDATE Sql query.
|
|
169 | 169 |
* @param db The SQL DB |
170 |
* @param replace Execute an INSERT or a REPLACE
|
|
170 |
* @param update Execute an INSERT or a UPDATE
|
|
171 | 171 |
* @return 0 one success |
172 | 172 |
*/ |
173 |
int insert_replace(SqlDB *db, bool replace);
|
|
173 |
int insert_update(SqlDB *db, bool update);
|
|
174 | 174 | |
175 | 175 |
/** |
176 | 176 |
* Callback function to unmarshall a User object (User::select) |
one/include/VirtualMachine.h 2010-10-14 09:34:14.356176002 +0200 | ||
---|---|---|
908 | 908 |
int select_cb(void *nil, int num, char **names, char ** values); |
909 | 909 | |
910 | 910 |
/** |
911 |
* Execute an INSERT or REPLACE Sql query.
|
|
911 |
* Execute an INSERT or UPDATE Sql query.
|
|
912 | 912 |
* @param db The SQL DB |
913 |
* @param replace Execute an INSERT or a REPLACE
|
|
913 |
* @param update Execute an INSERT or a UPDATE
|
|
914 | 914 |
* @return 0 one success |
915 | 915 |
*/ |
916 |
int insert_replace(SqlDB *db, bool replace);
|
|
916 |
int insert_update(SqlDB *db, bool update);
|
|
917 | 917 | |
918 | 918 |
/** |
919 | 919 |
* Updates the VM history record |
one/include/VirtualNetwork.h 2010-10-14 09:35:33.226176002 +0200 | ||
---|---|---|
300 | 300 |
// ************************************************************************* |
301 | 301 | |
302 | 302 |
/** |
303 |
* Execute an INSERT or REPLACE Sql query.
|
|
303 |
* Execute an INSERT or UPDATE Sql query.
|
|
304 | 304 |
* @param db The SQL DB |
305 |
* @param replace Execute an INSERT or a REPLACE
|
|
305 |
* @param update Execute an INSERT or a UPDATE
|
|
306 | 306 |
* @return 0 on success |
307 | 307 |
*/ |
308 |
int insert_replace(SqlDB *db, bool replace);
|
|
308 |
int insert_update(SqlDB *db, bool update);
|
|
309 | 309 | |
310 | 310 |
/** |
311 | 311 |
* Bootstraps the database table(s) associated to the Virtual Network |
one/SConstruct 2010-10-14 09:18:17.816176001 +0200 | ||
---|---|---|
108 | 108 |
else: |
109 | 109 |
main_env.Append(mysql='no') |
110 | 110 | |
111 |
# PostgreSQL |
|
112 |
pgsql=ARGUMENTS.get('pgsql', 'no') |
|
113 |
if pgsql=='yes': |
|
114 |
main_env.Append(pgsql='yes') |
|
115 |
main_env.Append(CPPFLAGS=["-DPGSQL_DB"]) |
|
116 |
main_env.Append(CPPPATH=["/usr/include/postgresql"]) |
|
117 |
else: |
|
118 |
main_env.Append(pgsql='no') |
|
119 | ||
111 | 120 | |
112 | 121 |
# xmlrpc |
113 | 122 |
xmlrpc_dir=ARGUMENTS.get('xmlrpc', 'none') |
one/share/etc/oned.conf 2010-10-14 09:18:23.086176002 +0200 | ||
---|---|---|
45 | 45 |
# user = "oneadmin", |
46 | 46 |
# passwd = "oneadmin", |
47 | 47 |
# db_name = "opennebula" ] |
48 |
# |
|
49 |
# Sample configuration for PostgreSQL |
|
50 |
# DB = [ backend = "pgsql", |
|
51 |
# server = "localhost", |
|
52 |
# user = "oneadmin", |
|
53 |
# passwd = "oneadmin", |
|
54 |
# db_name = "opennebula" ] |
|
48 | 55 | |
49 | 56 |
VNC_BASE_PORT = 5000 |
50 | 57 |
one/src/host/ClusterPool.cc 2010-10-13 15:30:14.876176002 +0200 | ||
---|---|---|
22 | 22 |
const char * ClusterPool::db_names = "oid, cluster_name"; |
23 | 23 | |
24 | 24 |
const char * ClusterPool::db_bootstrap = |
25 |
"CREATE TABLE IF NOT EXISTS cluster_pool ("
|
|
25 |
"CREATE TABLE cluster_pool (" |
|
26 | 26 |
"oid INTEGER PRIMARY KEY, cluster_name VARCHAR(128), " |
27 | 27 |
"UNIQUE(cluster_name) )"; |
28 | 28 |
one/src/host/Host.cc 2010-10-14 10:38:14.096176002 +0200 | ||
---|---|---|
55 | 55 |
const char * Host::db_names = "(oid,host_name,state,im_mad,vm_mad," |
56 | 56 |
"tm_mad,last_mon_time, cluster, template)"; |
57 | 57 | |
58 |
const char * Host::db_bootstrap = "CREATE TABLE IF NOT EXISTS host_pool ("
|
|
58 |
const char * Host::db_bootstrap = "CREATE TABLE host_pool (" |
|
59 | 59 |
"oid INTEGER PRIMARY KEY,host_name VARCHAR(256), state INTEGER," |
60 | 60 |
"im_mad VARCHAR(128),vm_mad VARCHAR(128),tm_mad VARCHAR(128)," |
61 | 61 |
"last_mon_time INTEGER, cluster VARCHAR(128), template TEXT, " |
... | ... | |
162 | 162 |
} |
163 | 163 | |
164 | 164 |
//Insert the Host |
165 |
rc = insert_replace(db, false);
|
|
165 |
rc = insert_update(db, false);
|
|
166 | 166 | |
167 | 167 |
if ( rc != 0 ) |
168 | 168 |
{ |
... | ... | |
190 | 190 |
return rc; |
191 | 191 |
} |
192 | 192 | |
193 |
rc = insert_replace(db, true);
|
|
193 |
rc = insert_update(db, true);
|
|
194 | 194 | |
195 | 195 |
if ( rc != 0 ) |
196 | 196 |
{ |
... | ... | |
205 | 205 |
/* ------------------------------------------------------------------------ */ |
206 | 206 |
/* ------------------------------------------------------------------------ */ |
207 | 207 | |
208 |
int Host::insert_replace(SqlDB *db, bool replace)
|
|
208 |
int Host::insert_update(SqlDB *db, bool update)
|
|
209 | 209 |
{ |
210 | 210 |
ostringstream oss; |
211 | 211 | |
... | ... | |
264 | 264 |
goto error_template; |
265 | 265 |
} |
266 | 266 | |
267 |
if(replace)
|
|
267 |
if(update)
|
|
268 | 268 |
{ |
269 |
oss << "REPLACE"; |
|
269 |
oss << "UPDATE " << table << " SET " |
|
270 |
<< "host_name='" << sql_hostname << "'," |
|
271 |
<< "state=" << state << "," |
|
272 |
<< "im_mad='" << sql_im_mad_name << "'," |
|
273 |
<< "vm_mad='" << sql_vmm_mad_name << "'," |
|
274 |
<< "tm_mad='" << sql_tm_mad_name << "'," |
|
275 |
<< "last_mon_time=" << last_monitored << "," |
|
276 |
<< "cluster='" << sql_cluster << "'," |
|
277 |
<< "template='" << sql_template << "' " |
|
278 |
<< "WHERE oid=" << oid; |
|
270 | 279 |
} |
271 | 280 |
else |
272 | 281 |
{ |
273 |
oss << "INSERT"; |
|
282 |
oss << "INSERT" |
|
283 |
<< " INTO " << table << " " << db_names << " VALUES (" |
|
284 |
<< oid << "," |
|
285 |
<< "'" << sql_hostname << "'," |
|
286 |
<< state << "," |
|
287 |
<< "'" << sql_im_mad_name << "'," |
|
288 |
<< "'" << sql_vmm_mad_name << "'," |
|
289 |
<< "'" << sql_tm_mad_name << "'," |
|
290 |
<< last_monitored << "," |
|
291 |
<< "'" << sql_cluster << "'," |
|
292 |
<< "'" << sql_template << "')"; |
|
274 | 293 |
} |
275 | 294 | |
276 |
// Construct the SQL statement to Insert or Replace |
|
277 | ||
278 |
oss <<" INTO "<< table <<" "<< db_names <<" VALUES (" |
|
279 |
<< oid << "," |
|
280 |
<< "'" << sql_hostname << "'," |
|
281 |
<< state << "," |
|
282 |
<< "'" << sql_im_mad_name << "'," |
|
283 |
<< "'" << sql_vmm_mad_name << "'," |
|
284 |
<< "'" << sql_tm_mad_name << "'," |
|
285 |
<< last_monitored << "," |
|
286 |
<< "'" << sql_cluster << "'," |
|
287 |
<< "'" << sql_template << "')"; |
|
288 | ||
289 | 295 |
rc = db->exec(oss); |
290 | 296 | |
291 | 297 |
db->free_str(sql_hostname); |
one/src/host/HostShare.cc 2010-10-14 10:43:12.896176002 +0200 | ||
---|---|---|
63 | 63 |
"used_disk, used_mem, used_cpu," |
64 | 64 |
"running_vms)"; |
65 | 65 | |
66 |
const char * HostShare::db_bootstrap = "CREATE TABLE IF NOT EXISTS host_shares("
|
|
66 |
const char * HostShare::db_bootstrap = "CREATE TABLE host_shares(" |
|
67 | 67 |
"hid INTEGER PRIMARY KEY," |
68 | 68 |
"disk_usage INTEGER, mem_usage INTEGER, cpu_usage INTEGER," |
69 | 69 |
"max_disk INTEGER, max_mem INTEGER, max_cpu INTEGER," |
... | ... | |
201 | 201 |
{ |
202 | 202 |
int rc; |
203 | 203 | |
204 |
rc = insert_replace(db, false);
|
|
204 |
rc = insert_update(db, false);
|
|
205 | 205 | |
206 | 206 |
if ( rc == -1 ) |
207 | 207 |
{ |
... | ... | |
218 | 218 |
{ |
219 | 219 |
int rc; |
220 | 220 | |
221 |
rc = insert_replace(db, true);
|
|
221 |
rc = insert_update(db, true);
|
|
222 | 222 | |
223 | 223 |
return rc; |
224 | 224 |
} |
... | ... | |
226 | 226 |
/* ------------------------------------------------------------------------ */ |
227 | 227 |
/* ------------------------------------------------------------------------ */ |
228 | 228 | |
229 |
int HostShare::insert_replace(SqlDB *db, bool replace)
|
|
229 |
int HostShare::insert_update(SqlDB *db, bool update)
|
|
230 | 230 |
{ |
231 | 231 |
ostringstream oss; |
232 | 232 |
int rc; |
233 | 233 | |
234 |
if(replace)
|
|
234 |
if(update)
|
|
235 | 235 |
{ |
236 |
oss << "REPLACE"; |
|
236 |
oss << "UPDATE " << table << " SET " |
|
237 |
<< "disk_usage=" << disk_usage << "," |
|
238 |
<< "mem_usage=" << mem_usage << "," |
|
239 |
<< "cpu_usage=" << cpu_usage << "," |
|
240 |
<< "max_disk=" << max_disk << "," |
|
241 |
<< "max_mem=" << max_mem << "," |
|
242 |
<< "max_cpu=" << max_cpu << "," |
|
243 |
<< "free_disk=" << free_disk << "," |
|
244 |
<< "free_mem=" << free_mem << "," |
|
245 |
<< "free_cpu=" << free_cpu << "," |
|
246 |
<< "used_disk=" << used_disk << "," |
|
247 |
<< "used_mem=" << used_mem << "," |
|
248 |
<< "used_cpu=" << used_cpu << " " |
|
249 |
<< "WHERE hid=" << hsid; |
|
237 | 250 |
} |
238 | 251 |
else |
239 | 252 |
{ |
240 |
oss << "INSERT"; |
|
241 |
} |
|
242 | ||
243 |
oss << " INTO " << table << " "<< db_names <<" VALUES (" |
|
253 |
oss << "INSERT" |
|
254 |
<< " INTO " << table << " "<< db_names <<" VALUES (" |
|
244 | 255 |
<< hsid << "," |
245 | 256 |
<< disk_usage <<","<< mem_usage <<","<< cpu_usage<< "," |
246 | 257 |
<< max_disk <<","<< max_mem <<","<< max_cpu << "," |
247 | 258 |
<< free_disk <<","<< free_mem <<","<< free_cpu << "," |
248 | 259 |
<< used_disk <<","<< used_mem <<","<< used_cpu << "," |
249 | 260 |
<< running_vms<< ")"; |
261 |
} |
|
250 | 262 | |
251 | 263 |
rc = db->exec(oss); |
252 | 264 |
one/src/image/Image.cc 2010-10-14 10:34:32.296176001 +0200 | ||
---|---|---|
69 | 69 |
const char * Image::db_names = "(oid, uid, name, type, public, persistent, regtime, " |
70 | 70 |
"source, state, running_vms, template)"; |
71 | 71 | |
72 |
const char * Image::db_bootstrap = "CREATE TABLE IF NOT EXISTS image_pool ("
|
|
72 |
const char * Image::db_bootstrap = "CREATE TABLE image_pool (" |
|
73 | 73 |
"oid INTEGER PRIMARY KEY, uid INTEGER, name VARCHAR(128), " |
74 | 74 |
"type INTEGER, public INTEGER, persistent INTEGER, regtime INTEGER, source TEXT, state INTEGER, " |
75 | 75 |
"running_vms INTEGER, template TEXT, UNIQUE(name) )"; |
... | ... | |
244 | 244 |
// Insert the Image |
245 | 245 |
//-------------------------------------------------------------------------- |
246 | 246 | |
247 |
rc = insert_replace(db, false);
|
|
247 |
rc = insert_update(db, false);
|
|
248 | 248 | |
249 | 249 |
if ( rc == -1 ) |
250 | 250 |
{ |
... | ... | |
275 | 275 | |
276 | 276 |
int Image::update(SqlDB *db) |
277 | 277 |
{ |
278 |
return insert_replace(db, true);;
|
|
278 |
return insert_update(db, true);;
|
|
279 | 279 |
} |
280 | 280 | |
281 | 281 |
/* ------------------------------------------------------------------------ */ |
282 | 282 |
/* ------------------------------------------------------------------------ */ |
283 | 283 | |
284 |
int Image::insert_replace(SqlDB *db, bool replace)
|
|
284 |
int Image::insert_update(SqlDB *db, bool update)
|
|
285 | 285 |
{ |
286 | 286 |
ostringstream oss; |
287 | 287 | |
... | ... | |
317 | 317 |
goto error_template; |
318 | 318 |
} |
319 | 319 | |
320 |
if(replace)
|
|
320 |
if(update)
|
|
321 | 321 |
{ |
322 |
oss << "REPLACE"; |
|
322 |
oss << "UPDATE " << table << " SET " |
|
323 |
<< "uid=" << uid << "," |
|
324 |
<< "name='" << sql_name << "'," |
|
325 |
<< "type=" << type << "," |
|
326 |
<< "public=" << public_img << "," |
|
327 |
<< "persistent=" << persistent_img << "," |
|
328 |
<< "regtime=" << regtime << "," |
|
329 |
<< "source='" << sql_source << "'," |
|
330 |
<< "state=" << state << "," |
|
331 |
<< "running_vms=" << running_vms << "," |
|
332 |
<< "template='" << sql_template << "' " |
|
333 |
<< "WHERE oid=" << oid; |
|
323 | 334 |
} |
324 | 335 |
else |
325 | 336 |
{ |
326 |
oss << "INSERT"; |
|
337 |
oss << "INSERT" |
|
338 |
<<" INTO " << table << " " << db_names << " VALUES (" |
|
339 |
<< oid << "," |
|
340 |
<< uid << "," |
|
341 |
<< "'" << sql_name << "'," |
|
342 |
<< type << "," |
|
343 |
<< public_img << "," |
|
344 |
<< persistent_img << "," |
|
345 |
<< regtime << "," |
|
346 |
<< "'" << sql_source << "'," |
|
347 |
<< state << "," |
|
348 |
<< running_vms << "," |
|
349 |
<< "'" << sql_template << "')"; |
|
327 | 350 |
} |
328 | 351 | |
329 |
// Construct the SQL statement to Insert or Replace |
|
330 | ||
331 |
oss <<" INTO "<< table <<" "<< db_names <<" VALUES (" |
|
332 |
<< oid << "," |
|
333 |
<< uid << "," |
|
334 |
<< "'" << sql_name << "'," |
|
335 |
<< type << "," |
|
336 |
<< public_img << "," |
|
337 |
<< persistent_img << "," |
|
338 |
<< regtime << "," |
|
339 |
<< "'" << sql_source << "'," |
|
340 |
<< state << "," |
|
341 |
<< running_vms << "," |
|
342 |
<< "'" << sql_template << "')"; |
|
343 | ||
344 | 352 |
rc = db->exec(oss); |
345 | 353 | |
346 | 354 |
db->free_str(sql_name); |
one/src/nebula/Nebula.cc 2010-10-14 10:51:44.986176001 +0200 | ||
---|---|---|
19 | 19 |
#include "VirtualMachine.h" |
20 | 20 |
#include "SqliteDB.h" |
21 | 21 |
#include "MySqlDB.h" |
22 |
#include "PGSqlDB.h" |
|
22 | 23 | |
23 | 24 |
#include <stdlib.h> |
24 | 25 |
#include <stdexcept> |
... | ... | |
139 | 140 |
int rc; |
140 | 141 | |
141 | 142 |
bool db_is_sqlite = true; |
143 |
bool db_is_mysql = false; |
|
144 |
bool db_is_pgsql = false; |
|
142 | 145 | |
143 | 146 |
string server = "localhost"; |
144 | 147 |
string user = "oneadmin"; |
... | ... | |
154 | 157 |
(dbs[0]); |
155 | 158 |
value = db->vector_value("BACKEND"); |
156 | 159 | |
157 |
if (value == "mysql") |
|
160 |
if (value == "mysql"||value == "pgsql")
|
|
158 | 161 |
{ |
159 | 162 |
db_is_sqlite = false; |
163 |
if (value == "mysql") |
|
164 |
db_is_mysql = true; |
|
165 |
if (value == "pgsql") |
|
166 |
db_is_pgsql = true; |
|
160 | 167 | |
161 | 168 |
value = db->vector_value("SERVER"); |
162 | 169 |
if (!value.empty()) |
... | ... | |
186 | 193 | |
187 | 194 |
if ( db_is_sqlite ) |
188 | 195 |
{ |
189 |
string db_name = var_location + "one.db";
|
|
196 |
string db_name = var_location + "one.db"; |
|
190 | 197 | |
191 | 198 |
db = new SqliteDB(db_name); |
192 | 199 |
} |
193 |
else
|
|
200 |
if ( db_is_mysql )
|
|
194 | 201 |
{ |
195 | 202 |
ostringstream oss; |
196 | 203 | |
... | ... | |
212 | 219 |
throw runtime_error("Could not open database."); |
213 | 220 |
} |
214 | 221 |
} |
222 |
if ( db_is_pgsql ) |
|
223 |
{ |
|
224 |
db = new PGSqlDB(server,user,passwd,db_name); |
|
225 |
} |
|
215 | 226 | |
216 |
NebulaLog::log("ONE",Log::INFO,"Bootstraping OpenNebula database."); |
|
227 |
ostringstream oss; |
|
228 |
oss << "SELECT oid FROM vm_pool"; |
|
229 |
rc = db->exec(oss); |
|
230 |
if ( rc != 0 ) |
|
231 |
{ |
|
232 |
NebulaLog::log("ONE",Log::INFO,"Table not found, running for the first time?"); |
|
233 |
NebulaLog::log("ONE",Log::INFO,"Bootstraping OpenNebula database."); |
|
217 | 234 | |
218 |
VirtualMachinePool::bootstrap(db); |
|
219 |
HostPool::bootstrap(db); |
|
220 |
VirtualNetworkPool::bootstrap(db); |
|
221 |
UserPool::bootstrap(db); |
|
222 |
ImagePool::bootstrap(db); |
|
235 |
VirtualMachinePool::bootstrap(db); |
|
236 |
HostPool::bootstrap(db); |
|
237 |
VirtualNetworkPool::bootstrap(db); |
|
238 |
UserPool::bootstrap(db); |
|
239 |
ImagePool::bootstrap(db); |
|
240 |
} |
|
223 | 241 |
} |
224 | 242 |
catch (exception&) |
225 | 243 |
{ |
one/src/nebula/SConstruct 2010-10-13 15:26:57.396176002 +0200 | ||
---|---|---|
61 | 61 |
if env['mysql']=='yes': |
62 | 62 |
env.Append(LIBS=['mysqlclient']) |
63 | 63 | |
64 |
if env['pgsql']=='yes': |
|
65 |
env.Append(LIBS=['pq']) |
|
66 | ||
64 | 67 | |
65 | 68 |
if not env.GetOption('clean'): |
66 | 69 |
env.ParseConfig('../../share/scons/get_xmlrpc_config server') |
one/src/pool/PoolSQL.cc 2010-10-13 18:17:19.946176002 +0200 | ||
---|---|---|
23 | 23 |
#include "PoolSQL.h" |
24 | 24 | |
25 | 25 |
#include <errno.h> |
26 |
#include <cstring> |
|
26 | 27 | |
27 | 28 |
/* ************************************************************************** */ |
28 | 29 |
/* PoolSQL constructor/destructor */ |
... | ... | |
40 | 41 |
{ |
41 | 42 |
lastOID = -1; |
42 | 43 | |
43 |
if ( values[0] != 0 ) |
|
44 |
if ( values[0] != 0 && strcmp(values[0], "") != 0)
|
|
44 | 45 |
{ |
45 | 46 |
lastOID = atoi(values[0]); |
46 | 47 |
} |
one/src/pool/test/TestPoolSQL.cc 2010-10-14 10:32:31.166176001 +0200 | ||
---|---|---|
117 | 117 | |
118 | 118 |
sql_text = db->escape_str(text.c_str()); |
119 | 119 | |
120 |
oss << "REPLACE INTO " << table << " "<< db_names <<" VALUES ("
|
|
121 |
<< oid << ","
|
|
122 |
<< number << ","
|
|
123 |
<< "'" << sql_text << "')";
|
|
120 |
oss << "UPDATE " << table << " SET "
|
|
121 |
<< "number="<< number << ","
|
|
122 |
<< "text='" << sql_text << "' "
|
|
123 |
<< "WHERE oid=" << oid;
|
|
124 | 124 | |
125 | 125 |
rc = db->exec(oss); |
126 | 126 |
one/src/sql/PGSqlDB.cc 2010-10-14 09:18:30.976176002 +0200 | ||
---|---|---|
1 |
/* -------------------------------------------------------------------------- */ |
|
2 |
/* Copyright 2002-2010, OpenNebula Project Leads (OpenNebula.org) */ |
|
3 |
/* */ |
|
4 |
/* Licensed under the Apache License, Version 2.0 (the "License"); you may */ |
|
5 |
/* not use this file except in compliance with the License. You may obtain */ |
|
6 |
/* a copy of the License at */ |
|
7 |
/* */ |
|
8 |
/* http://www.apache.org/licenses/LICENSE-2.0 */ |
|
9 |
/* */ |
|
10 |
/* Unless required by applicable law or agreed to in writing, software */ |
|
11 |
/* distributed under the License is distributed on an "AS IS" BASIS, */ |
|
12 |
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ |
|
13 |
/* See the License for the specific language governing permissions and */ |
|
14 |
/* limitations under the License. */ |
|
15 |
/* -------------------------------------------------------------------------- */ |
|
16 | ||
17 |
#include "PGSqlDB.h" |
|
18 | ||
19 |
/********* |
|
20 |
* Doc: http://www.postgresql.org/docs/8.3/static/libpq.html |
|
21 |
********/ |
|
22 | ||
23 |
/* -------------------------------------------------------------------------- */ |
|
24 | ||
25 |
PGSqlDB::PGSqlDB( |
|
26 |
const string& server, |
|
27 |
const string& user, |
|
28 |
const string& password, |
|
29 |
const string& database) |
|
30 |
{ |
|
31 | ||
32 |
// Initialize a connection handler and connect to the server |
|
33 |
ostringstream oss; |
|
34 |
oss << "dbname=" << database << " host=" << server.c_str() |
|
35 |
<< " user=" << user.c_str() << " password=" << password.c_str(); |
|
36 | ||
37 |
string str = oss.str(); |
|
38 |
const char *conninfo = str.c_str(); |
|
39 | ||
40 |
db = PQconnectdb(conninfo); |
|
41 | ||
42 |
// Connect to the server |
|
43 |
if (PQstatus(db) != CONNECTION_OK) |
|
44 |
{ |
|
45 |
PQfinish(db); |
|
46 |
throw runtime_error("Could not open database."); |
|
47 |
} |
|
48 | ||
49 |
pthread_mutex_init(&mutex,0); |
|
50 |
} |
|
51 | ||
52 |
/* -------------------------------------------------------------------------- */ |
|
53 | ||
54 |
PGSqlDB::~PGSqlDB() |
|
55 |
{ |
|
56 |
// Close the connection to the PostgreSQL server |
|
57 |
PQfinish(db); |
|
58 | ||
59 |
pthread_mutex_destroy(&mutex); |
|
60 |
} |
|
61 | ||
62 |
/* -------------------------------------------------------------------------- */ |
|
63 | ||
64 |
int PGSqlDB::exec(ostringstream& cmd, Callbackable* obj) |
|
65 |
{ |
|
66 |
PGresult * res; |
|
67 |
ExecStatusType status; |
|
68 | ||
69 |
const char * c_str; |
|
70 |
string str; |
|
71 | ||
72 | ||
73 |
int (*callback)(void*,int,char**,char**); |
|
74 |
void * arg; |
|
75 | ||
76 |
str = cmd.str(); |
|
77 |
c_str = str.c_str(); |
|
78 | ||
79 |
callback = 0; |
|
80 |
arg = 0; |
|
81 | ||
82 |
lock(); |
|
83 | ||
84 |
res = PQexec(db, c_str); |
|
85 |
status = PQresultStatus(res); |
|
86 | ||
87 |
if (status != PGRES_COMMAND_OK && status != PGRES_TUPLES_OK) |
|
88 |
{ |
|
89 |
ostringstream oss; |
|
90 |
const char * err_msg = PQerrorMessage(db); |
|
91 | ||
92 |
oss << "SQL command was: " << c_str; |
|
93 |
oss << ", error " << err_msg; |
|
94 | ||
95 |
NebulaLog::log("ONE",Log::ERROR,oss); |
|
96 | ||
97 |
PQclear(res); |
|
98 | ||
99 |
unlock(); |
|
100 | ||
101 |
return -1; |
|
102 |
} |
|
103 | ||
104 | ||
105 |
if ( (obj != 0) && (obj->isCallBackSet()) ) |
|
106 |
{ |
|
107 |
int num_fields; |
|
108 | ||
109 |
if (status != PGRES_TUPLES_OK) |
|
110 |
{ |
|
111 |
ostringstream oss; |
|
112 |
const char * err_msg = PQerrorMessage(db); |
|
113 | ||
114 |
oss << "SQL command was: " << c_str; |
|
115 |
oss << ", error " << err_msg; |
|
116 | ||
117 |
NebulaLog::log("ONE",Log::ERROR,oss); |
|
118 | ||
119 |
PQclear(res); |
|
120 | ||
121 |
unlock(); |
|
122 | ||
123 |
return -1; |
|
124 |
} |
|
125 | ||
126 |
// Fetch the names of the fields |
|
127 |
num_fields = PQnfields(res); |
|
128 |
char ** names = new char*[num_fields]; |
|
129 | ||
130 |
for(int i = 0; i < num_fields; i++) |
|
131 |
{ |
|
132 |
names[i] = PQfname(res, i); |
|
133 |
} |
|
134 | ||
135 |
// Fetch each row, and call-back the object waiting for them |
|
136 |
char ** row = new char*[num_fields]; |
|
137 | ||
138 |
for (int r = 0; r < PQntuples(res); r++) |
|
139 |
{ |
|
140 |
for (int i = 0; i < num_fields; i++) |
|
141 |
row[i] = PQgetvalue(res, r, i); |
|
142 |
obj->do_callback(num_fields, row, names); |
|
143 |
} |
|
144 | ||
145 |
// Free the result object |
|
146 |
PQclear(res); |
|
147 | ||
148 |
delete[] names; |
|
149 |
} |
|
150 | ||
151 |
unlock(); |
|
152 | ||
153 |
return 0; |
|
154 |
} |
|
155 | ||
156 |
/* -------------------------------------------------------------------------- */ |
|
157 | ||
158 |
char * PGSqlDB::escape_str(const string& str) |
|
159 |
{ |
|
160 |
char * result = new char[str.size()*2+1]; |
|
161 | ||
162 |
PQescapeStringConn(db, result, str.c_str(), str.size(), NULL); |
|
163 | ||
164 |
return result; |
|
165 |
} |
|
166 | ||
167 |
/* -------------------------------------------------------------------------- */ |
|
168 | ||
169 |
void PGSqlDB::free_str(char * str) |
|
170 |
{ |
|
171 |
delete[] str; |
|
172 |
} |
|
173 | ||
174 |
/* -------------------------------------------------------------------------- */ |
one/src/sql/SConstruct 2010-10-13 15:22:18.356176001 +0200 | ||
---|---|---|
29 | 29 |
if env['mysql']=='yes': |
30 | 30 |
source_files.append('MySqlDB.cc') |
31 | 31 | |
32 |
if env['pgsql']=='yes': |
|
33 |
source_files.append('PGSqlDB.cc') |
|
34 | ||
32 | 35 |
# Build library |
33 |
env.StaticLibrary(lib_name, source_files) |
|
36 |
env.StaticLibrary(lib_name, source_files) |
one/src/um/User.cc 2010-10-14 10:30:11.926176001 +0200 | ||
---|---|---|
52 | 52 | |
53 | 53 |
const char * User::db_names = "(oid,user_name,password,enabled)"; |
54 | 54 | |
55 |
const char * User::db_bootstrap = "CREATE TABLE IF NOT EXISTS user_pool ("
|
|
55 |
const char * User::db_bootstrap = "CREATE TABLE user_pool (" |
|
56 | 56 |
"oid INTEGER PRIMARY KEY, user_name VARCHAR(256), password TEXT," |
57 | 57 |
"enabled INTEGER, UNIQUE(user_name))"; |
58 | 58 | |
... | ... | |
115 | 115 |
{ |
116 | 116 |
int rc; |
117 | 117 | |
118 |
rc = insert_replace(db, false);
|
|
118 |
rc = insert_update(db, false);
|
|
119 | 119 | |
120 | 120 |
if ( rc != 0 ) |
121 | 121 |
{ |
... | ... | |
133 | 133 |
{ |
134 | 134 |
int rc; |
135 | 135 | |
136 |
rc = insert_replace(db, true);
|
|
136 |
rc = insert_update(db, true);
|
|
137 | 137 | |
138 | 138 |
if ( rc != 0 ) |
139 | 139 |
{ |
... | ... | |
146 | 146 |
/* -------------------------------------------------------------------------- */ |
147 | 147 |
/* -------------------------------------------------------------------------- */ |
148 | 148 | |
149 |
int User::insert_replace(SqlDB *db, bool replace)
|
|
149 |
int User::insert_update(SqlDB *db, bool update)
|
|
150 | 150 |
{ |
151 | 151 |
ostringstream oss; |
152 | 152 | |
... | ... | |
174 | 174 |
} |
175 | 175 | |
176 | 176 |
// Construct the SQL statement to Insert or Replace |
177 |
if(replace)
|
|
177 |
if(update)
|
|
178 | 178 |
{ |
179 |
oss << "REPLACE"; |
|
179 |
oss << "UPDATE " << table << " SET " |
|
180 |
<< "user_name='" << sql_username << "'," |
|
181 |
<< "password='" << sql_password << "'," |
|
182 |
<< "enabled='" << str_enabled << "' " |
|
183 |
<< "WHERE oid=" << oid; |
|
180 | 184 |
} |
181 | 185 |
else |
182 | 186 |
{ |
183 |
oss << "INSERT"; |
|
184 |
} |
|
185 | ||
186 |
oss << " INTO " << table << " "<< db_names <<" VALUES (" |
|
187 |
oss << "INSERT" |
|
188 |
<< " INTO " << table << " "<< db_names <<" VALUES (" |
|
187 | 189 |
<< oid << "," |
188 | 190 |
<< "'" << sql_username << "'," |
189 | 191 |
<< "'" << sql_password << "'," |
190 | 192 |
<< str_enabled << ")"; |
193 |
} |
|
191 | 194 | |
192 | 195 |
rc = db->exec(oss); |
193 | 196 |
one/src/vm/History.cc 2010-10-14 10:23:46.276176002 +0200 | ||
---|---|---|
28 | 28 |
const char * History::db_names = "(vid,seq,host_name,vm_dir,hid,vm_mad,tm_mad,stime," |
29 | 29 |
"etime,pstime,petime,rstime,retime,estime,eetime,reason)"; |
30 | 30 | |
31 |
const char * History::db_bootstrap = "CREATE TABLE IF NOT EXISTS "
|
|
31 |
const char * History::db_bootstrap = "CREATE TABLE " |
|
32 | 32 |
"history (vid INTEGER," |
33 | 33 |
"seq INTEGER,host_name TEXT,vm_dir TEXT,hid INTEGER,vm_mad TEXT,tm_mad TEXT," |
34 | 34 |
"stime INTEGER,etime INTEGER,pstime INTEGER,petime INTEGER,rstime INTEGER," |
... | ... | |
139 | 139 |
{ |
140 | 140 |
int rc; |
141 | 141 | |
142 |
rc = insert_replace(db, false);
|
|
142 |
rc = insert_update(db, false);
|
|
143 | 143 | |
144 | 144 |
return rc; |
145 | 145 |
} |
... | ... | |
151 | 151 |
{ |
152 | 152 |
int rc; |
153 | 153 | |
154 |
rc = insert_replace(db, true);
|
|
154 |
rc = insert_update(db, true);
|
|
155 | 155 | |
156 | 156 |
return rc; |
157 | 157 |
} |
... | ... | |
159 | 159 |
/* -------------------------------------------------------------------------- */ |
160 | 160 |
/* -------------------------------------------------------------------------- */ |
161 | 161 | |
162 |
int History::insert_replace(SqlDB *db, bool replace)
|
|
162 |
int History::insert_update(SqlDB *db, bool update)
|
|
163 | 163 |
{ |
164 | 164 |
ostringstream oss; |
165 | 165 | |
... | ... | |
203 | 203 |
goto error_tm; |
204 | 204 |
} |
205 | 205 | |
206 |
if(replace)
|
|
206 |
if(update)
|
|
207 | 207 |
{ |
208 |
oss << "REPLACE"; |
|
208 |
oss << "UPDATE " << table << " SET " |
|
209 |
<< "seq=" << seq << "," |
|
210 |
<< "host_name='" << sql_hostname << "'," |
|
211 |
<< "vm_dir='" << sql_vm_dir << "'," |
|
212 |
<< "hid=" << hid << "," |
|
213 |
<< "vm_mad='" << sql_vmm_mad_name << "'," |
|
214 |
<< "tm_mad='" << sql_tm_mad_name << "'," |
|
215 |
<< "stime=" << stime << "," |
|
216 |
<< "etime=" << etime << "," |
|
217 |
<< "pstime=" << prolog_stime << "," |
|
218 |
<< "petime=" << prolog_etime << "," |
|
219 |
<< "rstime=" << running_stime << "," |
|
220 |
<< "retime=" << running_etime << "," |
|
221 |
<< "estime=" << epilog_stime << "," |
|
222 |
<< "eetime=" << epilog_etime << "," |
|
223 |
<< "reason=" << reason << " " |
|
224 |
<< "WHERE vid=" << oid; |
|
209 | 225 |
} |
210 | 226 |
else |
211 | 227 |
{ |
212 |
oss << "INSERT"; |
|
228 |
oss << "INSERT" |
|
229 |
<< " INTO " << table << " "<< db_names <<" VALUES (" |
|
230 |
<< oid << "," |
|
231 |
<< seq << "," |
|
232 |
<< "'" << sql_hostname << "'," |
|
233 |
<< "'" << sql_vm_dir << "'," |
|
234 |
<< hid << "," |
|
235 |
<< "'" << sql_vmm_mad_name << "'," |
|
236 |
<< "'" << sql_tm_mad_name << "'," |
|
237 |
<< stime << "," |
|
238 |
<< etime << "," |
|
239 |
<< prolog_stime << "," |
|
240 |
<< prolog_etime << "," |
|
241 |
<< running_stime << "," |
|
242 |
<< running_etime << "," |
|
243 |
<< epilog_stime << "," |
|
244 |
<< epilog_etime << "," |
|
245 |
<< reason << ")"; |
|
213 | 246 |
} |
214 | 247 | |
215 |
oss << " INTO " << table << " "<< db_names <<" VALUES ("<< |
|
216 |
oid << "," << |
|
217 |
seq << "," << |
|
218 |
"'" << sql_hostname << "',"<< |
|
219 |
"'" << sql_vm_dir << "'," << |
|
220 |
hid << "," << |
|
221 |
"'" << sql_vmm_mad_name << "'," << |
|
222 |
"'" << sql_tm_mad_name << "'," << |
|
223 |
stime << "," << |
|
224 |
etime << "," << |
|
225 |
prolog_stime << "," << |
|
226 |
prolog_etime << "," << |
|
227 |
running_stime << "," << |
|
228 |
running_etime << "," << |
|
229 |
epilog_stime << "," << |
|
230 |
epilog_etime << "," << |
|
231 |
reason << ")"; |
|
232 | ||
233 | 248 |
rc = db->exec(oss); |
234 | 249 | |
235 | 250 |
db->free_str(sql_hostname); |
one/src/vm/VirtualMachine.cc 2010-10-14 10:39:44.286176001 +0200 | ||
---|---|---|
98 | 98 |
"(oid,uid,name,last_poll, state,lcm_state,stime,etime,deploy_id" |
99 | 99 |
",memory,cpu,net_tx,net_rx,last_seq, template)"; |
100 | 100 | |
101 |
const char * VirtualMachine::db_bootstrap = "CREATE TABLE IF NOT EXISTS "
|
|
101 |
const char * VirtualMachine::db_bootstrap = "CREATE TABLE " |
|
102 | 102 |
"vm_pool (" |
103 | 103 |
"oid INTEGER PRIMARY KEY,uid INTEGER,name TEXT," |
104 | 104 |
"last_poll INTEGER, state INTEGER,lcm_state INTEGER," |
... | ... | |
338 | 338 |
// Insert the VM |
339 | 339 |
// ------------------------------------------------------------------------ |
340 | 340 | |
341 |
rc = insert_replace(db, false);
|
|
341 |
rc = insert_update(db, false);
|
|
342 | 342 | |
343 | 343 |
if ( rc != 0 ) |
344 | 344 |
{ |
... | ... | |
550 | 550 | |
551 | 551 |
int VirtualMachine::update(SqlDB * db) |
552 | 552 |
{ |
553 |
return insert_replace(db, true);
|
|
553 |
return insert_update(db, true);
|
|
554 | 554 |
} |
555 | 555 | |
556 | 556 |
/* ------------------------------------------------------------------------ */ |
557 | 557 |
/* ------------------------------------------------------------------------ */ |
558 | 558 | |
559 |
int VirtualMachine::insert_replace(SqlDB *db, bool replace)
|
|
559 |
int VirtualMachine::insert_update(SqlDB *db, bool update)
|
|
560 | 560 |
{ |
561 | 561 |
ostringstream oss; |
562 | 562 |
int rc; |
... | ... | |
589 | 589 |
} |
590 | 590 | |
591 | 591 | |
592 |
if(replace)
|
|
592 |
if(update)
|
|
593 | 593 |
{ |
594 |
oss << "REPLACE"; |
|
594 |
oss << "UPDATE " << table << " SET " |
|
595 |
<< "uid=" << uid << "," |
|
596 |
<< "name='" << sql_name << "'," |
|
597 |
<< "last_poll=" << last_poll << "," |
|
598 |
<< "state=" << state << "," |
|
599 |
<< "lcm_state=" << lcm_state << "," |
|
600 |
<< "stime=" << stime << "," |
|
601 |
<< "etime=" << etime << "," |
|
602 |
<< "deploy_id='" << sql_deploy_id << "'," |
|
603 |
<< "memory=" << memory << "," |
|
604 |
<< "cpu=" << cpu << "," |
|
605 |
<< "net_tx=" << net_tx << "," |
|
606 |
<< "net_rx=" << net_rx << "," |
|
607 |
<< "last_seq=" << last_seq << "," |
|
608 |
<< "template='" << sql_template << "' " |
|
609 |
<< "WHERE oid=" << oid; |
|
595 | 610 |
} |
596 | 611 |
else |
597 | 612 |
{ |
598 |
oss << "INSERT"; |
|
613 |
oss << "INSERT" |
|
614 |
<< " INTO " << table << " " << db_names << " VALUES (" |
|
615 |
<< oid << "," |
|
616 |
<< uid << "," |
|
617 |
<< "'" << sql_name << "'," |
|
618 |
<< last_poll << "," |
|
619 |
<< state << "," |
|
620 |
<< lcm_state << "," |
|
621 |
<< stime << "," |
|
622 |
<< etime << "," |
|
623 |
<< "'" << sql_deploy_id << "'," |
|
624 |
<< memory << "," |
|
625 |
<< cpu << "," |
|
626 |
<< net_tx << "," |
|
627 |
<< net_rx << "," |
|
628 |
<< last_seq << "," |
|
629 |
<< "'" << sql_template << "')"; |
|
599 | 630 |
} |
600 | 631 | |
601 |
oss << " INTO " << table << " "<< db_names <<" VALUES (" |
|
602 |
<< oid << "," |
|
603 |
<< uid << "," |
|
604 |
<< "'" << sql_name << "'," |
|
605 |
<< last_poll << "," |
|
606 |
<< state << "," |
|
607 |
<< lcm_state << "," |
|
608 |
<< stime << "," |
|
609 |
<< etime << "," |
|
610 |
<< "'" << sql_deploy_id << "'," |
|
611 |
<< memory << "," |
|
612 |
<< cpu << "," |
|
613 |
<< net_tx << "," |
|
614 |
<< net_rx << "," |
|
615 |
<< last_seq << "," |
|
616 |
<< "'" << sql_template << "')"; |
|
617 | ||
618 | 632 |
db->free_str(sql_deploy_id); |
619 | 633 |
db->free_str(sql_name); |
620 | 634 |
db->free_str(sql_template); |
one/src/vnm/Leases.cc 2010-10-13 15:29:33.916176001 +0200 | ||
---|---|---|
250 | 250 | |
251 | 251 |
const char * Leases::db_names = "(oid,ip,mac_prefix,mac_suffix,vid,used)"; |
252 | 252 | |
253 |
const char * Leases::db_bootstrap = "CREATE TABLE IF NOT EXISTS leases ("
|
|
253 |
const char * Leases::db_bootstrap = "CREATE TABLE leases (" |
|
254 | 254 |
"oid INTEGER, ip BIGINT, mac_prefix BIGINT, mac_suffix BIGINT," |
255 | 255 |
"vid INTEGER, used INTEGER, PRIMARY KEY(oid,ip))"; |
256 | 256 |
one/src/vnm/VirtualNetwork.cc 2010-10-14 10:32:12.656176002 +0200 | ||
---|---|---|
72 | 72 |
const char * VirtualNetwork::db_names = |
73 | 73 |
"(oid,uid,name,type,bridge,public,template)"; |
74 | 74 | |
75 |
const char * VirtualNetwork::db_bootstrap = "CREATE TABLE IF NOT EXISTS"
|
|
76 |
" network_pool ("
|
|
77 |
"oid INTEGER PRIMARY KEY, uid INTEGER, name VARCHAR(256), type INTEGER, "
|
|
78 |
"bridge TEXT, public INTEGER, template TEXT, UNIQUE(name))";
|
|
75 |
const char * VirtualNetwork::db_bootstrap = "CREATE TABLE " |
|
76 |
"network_pool (" |
|
77 |
"oid INTEGER PRIMARY KEY, uid INTEGER, name VARCHAR(256), type INTEGER, " |
|
78 |
"bridge TEXT, public INTEGER, template TEXT, UNIQUE(name))"; |
|
79 | 79 | |
80 | 80 |
/* -------------------------------------------------------------------------- */ |
81 | 81 |
/* -------------------------------------------------------------------------- */ |
... | ... | |
397 | 397 |
//-------------------------------------------------------------------------- |
398 | 398 |
// Insert the Virtual Network |
399 | 399 |
//-------------------------------------------------------------------------- |
400 |
rc = insert_replace(db, false);
|
|
400 |
rc = insert_update(db, false);
|
|
401 | 401 | |
402 | 402 |
if ( rc != 0 ) |
403 | 403 |
{ |
... | ... | |
443 | 443 | |
444 | 444 |
int VirtualNetwork::update(SqlDB * db) |
445 | 445 |
{ |
446 |
return insert_replace(db, true);
|
|
446 |
return insert_update(db, true);
|
|
447 | 447 |
} |
448 | 448 | |
449 |
int VirtualNetwork::insert_replace(SqlDB *db, bool replace)
|
|
449 |
int VirtualNetwork::insert_update(SqlDB *db, bool update)
|
|
450 | 450 |
{ |
451 | 451 |
ostringstream oss; |
452 | 452 |
int rc; |
... | ... | |
483 | 483 | |
484 | 484 | |
485 | 485 |
// Construct the SQL statement to Insert or Replace |
486 |
if(replace)
|
|
486 |
if(update)
|
|
487 | 487 |
{ |
488 |
oss << "REPLACE"; |
|
488 |
oss << "UPDATE " << table << " SET " |
|
489 |
<< "uid=" << uid << "," |
|
490 |
<< "name='" << sql_name << "'," |
|
491 |
<< "type=" << type << "," |
|
492 |
<< "bridge='" << sql_bridge << "'," |
|
493 |
<< "public=" << public_vnet << "," |
|
494 |
<< "template='" << sql_template << "' " |
|
495 |
<< "WHERE oid=" << oid; |
|
489 | 496 |
} |
490 | 497 |
else |
491 | 498 |
{ |
492 |
oss << "INSERT"; |
|
499 |
oss << "INSERT" |
|
500 |
<< " INTO " << table << " " << db_names << " VALUES (" |
|
501 |
<< oid << "," |
|
502 |
<< uid << "," |
|
503 |
<< "'" << sql_name << "'," |
|
504 |
<< type << "," |
|
505 |
<< "'" << sql_bridge << "'," |
|
506 |
<< public_vnet << "," |
|
507 |
<< "'" << sql_template << "')"; |
|
493 | 508 |
} |
494 | 509 | |
495 |
oss << " INTO " << table << " "<< db_names <<" VALUES (" |
|
496 |
<< oid << "," |
|
497 |
<< uid << "," |
|
498 |
<< "'" << sql_name << "'," |
|
499 |
<< type << "," |
|
500 |
<< "'" << sql_bridge << "'," |
|
501 |
<< public_vnet << "," |
|
502 |
<< "'" << sql_template<< "')"; |
|
503 | ||
504 | 510 |
rc = db->exec(oss); |
505 | 511 | |
506 | 512 |
db->free_str(sql_name); |
one/src/vnm/VirtualNetworkPool.cc 2010-10-13 22:07:29.006176001 +0200 | ||
---|---|---|
187 | 187 |
} |
188 | 188 | |
189 | 189 |
cmd << " GROUP BY " << VirtualNetwork::table << ".oid"; |
190 |
cmd << "," << VirtualNetwork::table << ".uid"; |
|
191 |
cmd << "," << VirtualNetwork::table << ".name"; |
|
192 |
cmd << "," << VirtualNetwork::table << ".type"; |
|
193 |
cmd << "," << VirtualNetwork::table << ".bridge"; |
|
194 |
cmd << "," << VirtualNetwork::table << ".public"; |
|
195 |
cmd << "," << VirtualNetwork::table << ".template"; |
|
196 |
cmd << ",user_pool.user_name"; |
|
190 | 197 | |
191 | 198 |
rc = db->exec(cmd,this); |
192 | 199 |