Commit 87a1636d authored by Claes Sjofors's avatar Claes Sjofors

Mysql classvolume databases

parent 0bf0dc63
......@@ -151,3 +151,4 @@
091209 cs wb ConnectAttribute method added to SevHist.
091218 cs wb Bugfix for next cix and next oix in ced.
091218 cs wb Bugfix in wb_vrepdb:child().
100111 cs wb Mysql classvolume databases.
\ No newline at end of file
......@@ -2765,7 +2765,7 @@ WttGtk::WttGtk(
wnavnode->volume_attached( wbctx, ldhses, 0);
}
if ( wb_type == wb_eType_Directory || wb_type == wb_eType_Volume) {
if ( (wb_type == wb_eType_Directory || wb_type == wb_eType_Volume) && ldhses) {
// Start configuration wizard if volume is empty
pwr_tOid oid;
......
......@@ -1501,6 +1501,15 @@ int wb_dbms_rbody::ins(wb_dbms_txn *txn)
return m_db->m_t_rbody->ins(txn, &m_key, &m_data);
}
int wb_dbms_rbody::ins(wb_dbms_txn *txn, size_t offset, size_t size, void *p)
{
m_data.bSize(size);
m_data.size(size);
m_data.data(p);
return m_db->m_t_rbody->ins(txn, &m_key, &m_data);
}
int wb_dbms_rbody::upd(wb_dbms_txn *txn, size_t offset, size_t size, void *p)
{
m_data.size(sizeof(m_db->m_buf));
......@@ -1537,6 +1546,7 @@ int wb_dbms_rbody::get(wb_dbms_txn *txn, size_t offset, size_t size, void *p)
memcpy(p, m_db->m_buf + offset, size);
m_size = m_data.size();
return 0;
}
......@@ -1630,6 +1640,15 @@ int wb_dbms_dbody::ins(wb_dbms_txn *txn)
return m_db->m_t_dbody->ins(txn, &m_key, &m_data);
}
int wb_dbms_dbody::ins(wb_dbms_txn *txn, size_t offset, size_t size, void *p)
{
m_data.bSize(size);
m_data.size(size);
m_data.data(p);
return m_db->m_t_rbody->ins(txn, &m_key, &m_data);
}
int wb_dbms_dbody::upd(wb_dbms_txn *txn, size_t offset, size_t size, void *p)
{
m_data.size(sizeof(m_db->m_buf));
......@@ -1663,6 +1682,7 @@ int wb_dbms_dbody::get(wb_dbms_txn *txn, size_t offset, size_t size, void *p)
printf("*** dbody::get(offset %zd, size %zd, oix %d), size: %zd\n", offset, size, m_oid.oix, m_data.size());
memcpy(p, m_db->m_buf + offset, size);
m_size = m_data.size();
return 0;
}
......
......@@ -55,6 +55,12 @@ extern "C" {
pwr_dImport pwr_BindClasses(System);
pwr_dImport pwr_BindClasses(Base);
typedef enum {
eDbType_db,
eDbType_dbms,
eDbType_wbl
} eDbType;
wb_erep::wb_erep( unsigned int options) : m_nRef(0), m_dir_cnt(0), m_volatile_idx(0), m_buffer_max(10),
m_ref_merep_occupied(false), m_options( options)
{
......@@ -535,6 +541,11 @@ void wb_erep::loadMeta( pwr_tStatus *status, char *db)
pwr_tStatus sts;
wb_vrepdbs *vrep;
int vol_cnt = 0;
eDbType db_type;
int is_classvolume = 0;
int load_externvolume;
int load_dbs;
int load_db;
strcpy( fname, load_cNameVolumeList);
dcli_translate_filename( fname, fname);
......@@ -546,19 +557,6 @@ void wb_erep::loadMeta( pwr_tStatus *status, char *db)
*status = LDH__PROJCONFIG;
// Load directory volume
#if 0
strcpy( vname, "$pwrp_db/directory.db");
dcli_translate_filename( vname, vname);
sts = dcli_search_file( vname, found_file, DCLI_DIR_SEARCH_INIT);
dcli_search_file( vname, found_file, DCLI_DIR_SEARCH_END);
if ( ODD(sts)) {
wb_vrepdb *vrepdb = new wb_vrepdb( this, vname);
vrepdb->name("directory");
addDb( &sts, vrepdb);
MsgWindow::message( 'I', "Directory database opened", vname);
}
#endif
strcpy( vname, "$pwrp_db/directory.wb_load");
dcli_translate_filename( vname, vname);
......@@ -590,8 +588,30 @@ void wb_erep::loadMeta( pwr_tStatus *status, char *db)
cdh_StringToVolumeId( vol_array[1], &vid);
if ( cdh_NoCaseStrcmp( vol_array[2], "ExternVolume") == 0) {
if ( j == 1) {
// Find out what to do with this volume
load_externvolume = 0;
load_dbs = 0;
load_db = 0;
if ( cdh_NoCaseStrcmp( vol_array[2], "ExternVolume") == 0 && j == 1)
load_externvolume = 1;
else if ( cdh_NoCaseStrcmp( vol_array[2], "ClassVolume") == 0 ||
cdh_NoCaseStrcmp( vol_array[2], "DetachedClassVolume") == 0 ||
strcmp( vol_array[3], "load") == 0) {
if ( j == 0)
load_dbs = 1;
if ( ((cdh_NoCaseStrcmp( vol_array[2], "ClassVolume") == 0 ||
cdh_NoCaseStrcmp( vol_array[2], "DetachedClassVolume") == 0) &&
( strcmp( vol_array[3], "cnf") == 0 &&
db && cdh_NoCaseStrcmp( db, vol_array[0]) == 0 ))) {
if ( j == 1)
load_db = 1;
}
}
else if ( j == 1)
load_db = 1;
if ( load_externvolume) {
if ( nr != 6)
cout << "Syntax error in file: " << fname << endl;
......@@ -608,11 +628,8 @@ void wb_erep::loadMeta( pwr_tStatus *status, char *db)
MsgWindow::message( 'E', "Unable to open volume", vname, e.what().c_str());
}
}
}
else if ( cdh_NoCaseStrcmp( vol_array[2], "ClassVolume") == 0 ||
cdh_NoCaseStrcmp( vol_array[2], "DetachedClassVolume") == 0 ||
strcmp( vol_array[3], "load") == 0) {
if ( j == 0) {
if ( load_dbs) {
if ( nr < 4)
cout << "Syntax error in file: " << fname << endl;
......@@ -640,21 +657,6 @@ void wb_erep::loadMeta( pwr_tStatus *status, char *db)
else
MsgWindow::message( 'E', "Unable to open volume snapshot file", vname, e.what().c_str());
}
if ( nr >= 5 && vol_array[4][0] == '1') {
// BerkelyDb class volume
strcpy( vname, "$pwrp_db/");
strcat( vname, vol_array[0]);
strcat( vname, ".db");
dcli_translate_filename( vname, vname);
wb_vrepdb *vrepdb = new wb_vrepdb( this, vname);
wb_vrepced *vrepced = new wb_vrepced( this, vrepdb);
vrepced->name(vol_array[0]);
addDb( &sts, vrepced);
MsgWindow::message( 'I', "Classvolume Database opened", vname);
vol_cnt++;
}
}
else {
// Imported loadfile
......@@ -688,9 +690,8 @@ void wb_erep::loadMeta( pwr_tStatus *status, char *db)
MsgWindow::message( 'E', "Volume snapshotfile not found", vname);
}
}
}
else {
if ( j == 1) {
if ( load_db) {
// Load db for this volume
char uname[80];
......@@ -728,10 +729,31 @@ void wb_erep::loadMeta( pwr_tStatus *status, char *db)
strcpy( vname, "$pwrp_db/");
strcat( vname, vol_array[0]);
cdh_ToLower( vname, vname);
if ( cdh_NoCaseStrcmp( vol_array[2], "ClassVolume") == 0) {
is_classvolume = 1;
if ( nr >= 5 && vol_array[4][0] == '2')
db_type = eDbType_dbms;
else if ( nr >= 5 && vol_array[4][0] == '1')
db_type = eDbType_db;
else
db_type = eDbType_wbl;
}
else {
if ( nr >= 5 && vol_array[4][0] == '1')
strcat( vname, ".dbms");
db_type = eDbType_dbms;
else
db_type = eDbType_db;
}
switch ( db_type) {
case eDbType_dbms:
strcat( vname, ".dbms");
break;
case eDbType_db:
strcat( vname, ".db");
break;
default:
strcat( vname, ".dbxx");
}
dcli_translate_filename( vname, vname);
sts = dcli_search_file( vname, found_file, DCLI_DIR_SEARCH_INIT);
......@@ -795,15 +817,38 @@ void wb_erep::loadMeta( pwr_tStatus *status, char *db)
}
else {
// Open db
if ( nr >= 5 && vol_array[4][0] == '1') {
if ( nr >= 5 && db_type == eDbType_dbms) {
#if defined PWRE_CONF_MYSQL
if ( is_classvolume) {
wb_vrepdbms *vrepdbms = new wb_vrepdbms( this, vname);
wb_vrepced *vrepced = new wb_vrepced( this, vrepdbms);
vrepced->name(vol_array[0]);
addDb( &sts, vrepced);
MsgWindow::message( 'I', "Classvolume Database opened", vname);
vol_cnt++;
}
else {
wb_vrepdbms *vrepdbms = new wb_vrepdbms( this, vname);
vrepdbms->name(vol_array[0]);
addDb( &sts, vrepdbms);
MsgWindow::message( 'I', "Database opened", vname);
vol_cnt++;
}
#endif
}
else {
if ( is_classvolume) {
wb_vrepdb *vrepdb = new wb_vrepdb( this, vname);
wb_vrepced *vrepced = new wb_vrepced( this, vrepdb);
vrepced->name(vol_array[0]);
addDb( &sts, vrepced);
MsgWindow::message( 'I', "Classvolume Database opened", vname);
vol_cnt++;
}
else {
wb_vrepdb *vrepdb = new wb_vrepdb( this, vname);
vrepdb->name(vol_array[0]);
......@@ -834,48 +879,6 @@ void wb_erep::loadMeta( pwr_tStatus *status, char *db)
if ( !db || (db && cdh_NoCaseStrcmp( "directory", db) == 0)) {
char uname[80];
#if 0
strcpy( vname, "$pwrp_db/directory.db");
dcli_translate_filename( vname, vname);
sts = dcli_search_file( vname, found_file, DCLI_DIR_SEARCH_INIT);
dcli_search_file( vname, found_file, DCLI_DIR_SEARCH_END);
if ( EVEN(sts)) {
*status = LDH__PROJCONFIG;
return;
}
if ( wb_dblock::is_locked(vname, uname)) {
char msg[120];
sprintf( msg, "Database directory.db is locked by user %s", uname);
MsgWindow::message( 'E', msg, msgw_ePop_No);
CoWow *wow = MsgWindow::get_wow();
if ( wow) {
int res = wow->CreateModalDialog( "Database Locked", msg, "Exit", 0, "Remove lock", "$pwr_exe/wtt_padlock.png");
switch( res) {
case wow_eModalDialogReturn_NYI:
case wow_eModalDialogReturn_Button2:
case wow_eModalDialogReturn_Button1:
case wow_eModalDialogReturn_Deleted:
exit(0);
case wow_eModalDialogReturn_Button3:
// Remove lock
wb_dblock::dbunlock(vname);
break;
}
}
else
exit(0);
}
wb_vrepdb *vrepdb = new wb_vrepdb( this, vname);
vrepdb->name("directory");
addDb( &sts, vrepdb);
MsgWindow::message( 'I', "Database opened", vname);
#endif
strcpy( vname, "$pwrp_db/directory.wb_load");
dcli_translate_filename( vname, vname);
......
......@@ -886,8 +886,10 @@ pwr_tStatus lfu_SaveDirectoryVolume(
"Database", (char **) &dbenum, &size);
if ( EVEN(sts)) return sts;
if (( cdh_isClassVolumeClass(cid) && *dbenum == 2) ||
( !cdh_isClassVolumeClass(cid) && *dbenum == 1)) {
if (( (cid == pwr_cClass_ClassVolumeConfig ||
cid == pwr_cClass_DetachedClassVolumeConfig) && *dbenum == 2) ||
( !(cid == pwr_cClass_ClassVolumeConfig ||
cid == pwr_cClass_DetachedClassVolumeConfig) && *dbenum == 1)) {
sts = ldh_GetObjectPar( ldhses, envobjid, "RtBody",
"Server", (char **) &server, &size);
if ( EVEN(sts)) return sts;
......@@ -2635,6 +2637,8 @@ pwr_tStatus lfu_GetVolumeCnf( char *name, pwr_tVid *vid, pwr_tCid *cid, ldh_eVol
*volrep = ldh_eVolRep_Dbms;
if ( nr > 5)
strcpy( server, vol_array[5]);
else
strcpy( server, "");
}
}
break;
......@@ -2648,6 +2652,8 @@ pwr_tStatus lfu_GetVolumeCnf( char *name, pwr_tVid *vid, pwr_tCid *cid, ldh_eVol
*volrep = ldh_eVolRep_Dbms;
if ( nr > 5)
strcpy( server, vol_array[5]);
else
strcpy( server, "");
}
}
break;
......
......@@ -2558,7 +2558,7 @@ void wb_vrepced::printStructFile( bool hpp)
if ( !body_found) {
fp <<
"#ifndef pwr_cClass_" << pgmname << endl <<
"#define pwr_cClass_" << pgmname << " " << o_cdef->cid() << "UL" << endl << endl;
"#define pwr_cClass_" << pgmname << " " << cdh_ClassObjidToId( o_cdef->oid()) << "UL" << endl << endl;
body_found = true;
}
......
......@@ -300,7 +300,7 @@ wb_orep* wb_vrepdbms::object(pwr_tStatus *sts, pwr_tOid oid)
}
catch (wb_dbms_error &e) {
*sts = LDH__NOSUCHOBJ;
printf("vrepdbms: %s\n", e.what().c_str());
// printf("vrepdbms: %s\n", e.what().c_str());
return 0;
}
}
......@@ -329,7 +329,7 @@ wb_orep* wb_vrepdbms::object(pwr_tStatus *sts, wb_name &name)
}
catch (wb_dbms_error &e) {
*sts = LDH__NOSUCHOBJ;
printf("vrepdbms: %s\n", e.what().c_str());
// printf("vrepdbms: %s\n", e.what().c_str());
return 0;
}
}
......@@ -344,7 +344,7 @@ wb_orep* wb_vrepdbms::object(pwr_tStatus *sts, const wb_orep *parent, wb_name &n
}
catch (wb_dbms_error &e) {
*sts = LDH__NOSUCHOBJ;
printf("vrepdbms: %s\n", e.what().c_str());
// printf("vrepdbms: %s\n", e.what().c_str());
return 0;
}
}
......@@ -706,7 +706,6 @@ bool wb_vrepdbms::renameObject(pwr_tStatus *sts, wb_orep *orp, wb_name &name)
n.name(name);
rc = n.ins(txn);
if (rc) {
printf("wb_vrepdbms::renameObject, n.ins rc %d\n", rc);
*sts = LDH__NAMALREXI;
txn->abort();
m_ohead.clear();
......@@ -721,9 +720,9 @@ bool wb_vrepdbms::renameObject(pwr_tStatus *sts, wb_orep *orp, wb_name &name)
}
catch (wb_dbms_error &e) {
txn->subAbort();
printf("wb_vrepdbms::renameObject, exception %s\n", e.what().c_str());
// printf("wb_vrepdbms::renameObject, exception %s\n", e.what().c_str());
m_ohead.clear();
*sts = LDH__DBERROR;
*sts = LDH__NAMALREXI;
return false;
}
}
......@@ -2239,6 +2238,11 @@ wb_vrepdbms::updateObject(pwr_tOid oid, pwr_tCid cid)
time_GetTime( &time);
if (rbody) {
if ( rsize != rb.m_size) {
rc = rb.del(m_db->m_txn);
rc = rb.ins(m_db->m_txn, 0, rsize, rbody);
}
else
rc = rb.upd(m_db->m_txn, 0, rsize, rbody);
if (rc)
printf("wb_vrepdbms:writeBody rb.upd rc %d\n", rc);
......@@ -2249,6 +2253,11 @@ wb_vrepdbms::updateObject(pwr_tOid oid, pwr_tCid cid)
}
if (dbody) {
if ( dsize != db.m_size) {
rc = db.del(m_db->m_txn);
rc = db.ins(m_db->m_txn, 0, dsize, dbody);
}
else
rc = db.upd(m_db->m_txn, 0, dsize, dbody);
if (rc)
printf("wb_vrepdbms:writeBody db.upd rc %d\n", rc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment