1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00
cde/cde/lib/DtMmdb/object/oid_list.C
2024-07-16 09:05:46 +00:00

513 lines
11 KiB
C

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/*
* $XConsortium: oid_list.cc /main/5 1996/07/18 14:43:28 drk $
*
* Copyright (c) 1993 HAL Computer Systems International, Ltd.
* All rights reserved. Unpublished -- rights reserved under
* the Copyright Laws of the United States. USE OF A COPYRIGHT
* NOTICE IS PRECAUTIONARY ONLY AND DOES NOT IMPLY PUBLICATION
* OR DISCLOSURE.
*
* THIS SOFTWARE CONTAINS CONFIDENTIAL INFORMATION AND TRADE
* SECRETS OF HAL COMPUTER SYSTEMS INTERNATIONAL, LTD. USE,
* DISCLOSURE, OR REPRODUCTION IS PROHIBITED WITHOUT THE
* PRIOR EXPRESS WRITTEN PERMISSION OF HAL COMPUTER SYSTEMS
* INTERNATIONAL, LTD.
*
* RESTRICTED RIGHTS LEGEND
* Use, duplication, or disclosure by the Government is subject
* to the restrictions as set forth in subparagraph (c)(l)(ii)
* of the Rights in Technical Data and Computer Software clause
* at DFARS 252.227-7013.
*
* HAL COMPUTER SYSTEMS INTERNATIONAL, LTD.
* 1315 Dell Avenue
* Campbell, CA 95008
*
*/
#include "object/oid_list.h"
void oid_list::init_persistent_info(persistent_info* x)
{
string* u = list_ptr.p;
root::init_persistent_info(x);
if ( get_mode(OLD_OBJECT) == false ) {
//MESSAGE(cerr, "oid_list::init_persistent_info");
//debug(cerr, (void*)this);
//debug(cerr, my_oid());
const char* w = 0;
int v= 0;
//MESSAGE(cerr, "oid_list::init_persistent_info(), new object case");
//debug(cerr, (void*)this);
//debug(cerr, (void*)list_ptr.p);
if (u) {
w = u -> c_str();
v = u -> size();
}
if ( storage_ptr )
storage_ptr -> insertString(list_ptr.loc, w, v);
//debug(cerr, list_ptr.loc);
//debug(cerr, v_sz);
}
delete u;
}
oid_list::oid_list(c_code_t c_id) : composite(c_id),
f_internal_index(false), chk_index(0)
{
list_ptr.loc = 0;
init_data_member(0);
}
oid_list::oid_list(int num_oids, c_code_t c_id) : composite(c_id),
f_internal_index(false), chk_index(0)
{
list_ptr.loc = 0;
init_data_member(num_oids);
}
oid_list::oid_list(oid_list& x) :
composite(x), chk_index(0)
{
list_ptr.loc = 0;
init_data_member(x.v_sz);
for ( unsigned int i=1; i<=v_sz; i++ )
update_component(i, x(i));
}
oid_list::~oid_list()
{
if ( get_mode(PERSISTENT) == false ) {
delete list_ptr.p;
}
delete chk_index;
}
void oid_list::init_data_member(int leng)
{
int char_leng = leng * OID_T_SZ ;
char* ptr = new char[char_leng];
oid_t x(ground);
char* y = ptr;
for ( int i=0; i<leng; i++ ) {
x.to_char_string(y, false);
y += OID_T_SZ;
}
list_ptr.loc = 0; // to please purify
list_ptr.p = new string(ptr, char_leng);
//MESSAGE(cerr, "oid_list::init_data_member(int leng)");
//debug(cerr, (void*)this);
//debug(cerr, (void*)list_ptr.p);
delete [] ptr;
v_sz = leng;
set_mode(UPDATE, true);
}
void oid_list::build_internal_index()
{
if ( get_mode(OLD_OBJECT) == true &&
get_mode(PERSISTENT) == true &&
v_sz > 1000
)
chk_index = new chunks_index(storage_ptr, list_ptr.loc);
else
chk_index = 0;
}
void oid_list::reqest_build_internal_index()
{
f_internal_index = true;
}
Boolean oid_list::expand_space(int extra_oids)
{
/*
MESSAGE(cerr, "in expand_space()");
debug(cerr, my_oid());
debug(cerr, extra_oids);
debug(cerr, v_sz);
debug(cerr, int(list_ptr.loc));
debug(cerr, int(&list_ptr.loc));
*/
int extra_char_leng = extra_oids * OID_T_SZ;
if ( get_mode(PERSISTENT) == true ) {
int total_char_leng = extra_char_leng + v_sz * OID_T_SZ;
char* ptr = new char[total_char_leng];
memset(ptr, (char)0, total_char_leng);
if ( list_ptr.loc == 0 ) {
storage_ptr -> insertString(list_ptr.loc, ptr, total_char_leng);
} else {
storage_ptr -> appendString(list_ptr.loc, ptr, total_char_leng);
}
delete [] ptr;
} else {
list_ptr.p -> resize( extra_char_leng );
}
v_sz += extra_oids;
set_mode(UPDATE, true);
return true;
}
io_status oid_list::asciiOut(ostream& out)
{
if ( !out )
return fail;
out << v_sz << '\n';
int ind = first();
while (ind ) {
oid_t x = (*this)(ind);
if ( x.eq(ground) == false ) {
x.asciiOut(out);
out << "\n";
}
next(ind);
}
return done;
}
oid_t oid_list::operator()(int ind)
{
/*
MESSAGE(cerr, "oid_list::operator()");
debug(cerr, my_oid());
debug(cerr, ind);
debug(cerr, v_sz);
debug(cerr, int(this));
debug(cerr, int(list_ptr.p));
*/
if ( !INRANGE(ind, 1, (int) v_sz) ) {
MESSAGE(cerr, "oid_list::opeartor(): out of range");
throw(boundaryException(1, v_sz, ind));
}
char z[OID_T_SZ];
int offset = (ind - 1) * OID_T_SZ;
if ( get_mode(PERSISTENT) == true )
{
if ( list_ptr.loc == 0 )
throw(stringException("zero loc value"));
if ( f_internal_index == true && chk_index == 0 ) {
build_internal_index();
}
if ( chk_index ) {
str_index_record_t* anchor =
chk_index -> chunk_location(offset);
storage_ptr ->
readString(anchor -> loc, z, OID_T_SZ,
offset - anchor -> str_offset);
} else
storage_ptr ->
readString(list_ptr.loc, z, OID_T_SZ, offset);
} else {
if ( list_ptr.p == 0 )
throw(stringException("zero list_ptr.p value"));
memcpy(z, list_ptr.p -> c_str() + offset, OID_T_SZ);
}
//MESSAGE(cerr, "oid_list::operator() done");
#ifdef PORTABLE_DB
return oid_t(z, false, swap_order());
#else
return oid_t(z, false, false);
#endif
}
Boolean
oid_list::insert_component(const oid_t& new_comp_oid)
{
/*
MESSAGE(cerr, "oid_list::insert_component");
debug(cerr, v_sz);
debug(cerr, (void*)this);
debug(cerr, int(list_ptr.p));
new_comp_oid.asciiOut(cerr); cerr << "\n";
*/
char z[OID_T_SZ];
new_comp_oid.to_char_string(z, swap_order());
if ( get_mode(PERSISTENT) == true ) {
if ( list_ptr.loc == 0 ) {
storage_ptr ->
insertString(list_ptr.loc, z, OID_T_SZ);
} else {
storage_ptr ->
appendString(list_ptr.loc, z, OID_T_SZ);
}
} else {
list_ptr.p -> append(z, OID_T_SZ);
}
v_sz++;
set_mode(UPDATE, true);
return true;
}
Boolean
oid_list::update_component(int index, const oid_t& new_oid)
{
//MESSAGE(cerr, "oid_list::update_component()");
//debug(cerr, my_oid());
if ( !INRANGE(index, 1, (int) v_sz) ) {
MESSAGE(cerr, "oid_list update(): out of range");
throw(boundaryException(1, v_sz, index));
}
char z[OID_T_SZ];
Boolean swap;
if ( get_mode(PERSISTENT) == true && swap_order() == true )
swap = true;
else
swap = false;
new_oid.to_char_string(z, swap);
if ( get_mode(PERSISTENT) == true ) {
if ( list_ptr.loc == 0 )
throw(stringException("zero list_ptr.p value"));
storage_ptr ->
updateString(list_ptr.loc, z,
OID_T_SZ, (index-1) * OID_T_SZ
);
} else {
//MESSAGE(cerr, "oid_list::update_component(): vm update");
if ( list_ptr.p == 0 )
throw(stringException("zero list_ptr.p value"));
list_ptr.p -> replace((index-1)*OID_T_SZ, OID_T_SZ, z);
}
//MESSAGE(cerr, "oid_list::update_component() done");
return true;
}
io_status oid_list::asciiIn(istream& in)
{
//MESSAGE(cerr, "oid_list::asciiIn()");
if ( in.get() != LIST_MARK_CHAR )
throw(formatException("should be a LIST_MARK_CHAR"));
if ( in.get() != '\n' )
throw(formatException("should be a \n"));
dlist temp_list;
dlist_void_ptr_cell* y = 0;
char c;
while ( (c = in.get()) != LIST_MARK_CHAR ) {
in.putback(c);
oid_t *x = new oid_t(ground);
x -> asciiIn(in);
y = new dlist_void_ptr_cell(x);
temp_list.insert_as_tail(y);
v_sz++;
}
if ( in.get() != '\n' ) {
throw(formatException("bad oid_list input stream"));
}
int oid_array_sz = v_sz * OID_T_SZ;
char *oid_array = new char[oid_array_sz];
long ind = temp_list.first();
int i = 0;
char z[OID_T_SZ];
while ( ind ) {
y = (dlist_void_ptr_cell*)(ind);
((oid_t*)(y -> void_ptr())) ->
to_char_string(z, swap_order());
delete ((oid_t*)(y -> void_ptr()));
memcpy(oid_array + i * OID_T_SZ, z, OID_T_SZ);
i++;
temp_list.next(ind);
}
// save the list
if ( get_mode(PERSISTENT) == true ) {
if ( list_ptr.loc == 0 )
storage_ptr -> insertString(list_ptr.loc, oid_array, oid_array_sz);
else
storage_ptr -> updateString(list_ptr.loc, oid_array, oid_array_sz);
set_mode(UPDATE, true);
} else {
delete list_ptr.p;
list_ptr.p = new string(0);
list_ptr.p -> assign(oid_array, v_sz);
}
delete [] oid_array;
return done;
}
Boolean oid_list::remove_component(const oid_t& x)
{
int ind = first();
while ( ind ) {
if ( (*this)(ind).eq(x) == true ) {
update_component(ind, ground);
set_mode(UPDATE, true);
return true;
}
next(ind);
}
return false;
}
int oid_list::cdr_sizeof()
{
return composite::cdr_sizeof() + sizeof(list_ptr.loc);
}
io_status oid_list::cdrOut(buffer& buf)
{
/*
MESSAGE(cerr, "oid_list::cdrOut()");
debug(cerr, (void*)this);
debug(cerr, (void*)list_ptr.loc);
debug(cerr, my_oid());
*/
composite::cdrOut(buf);
buf.put(list_ptr.loc);
return done;
}
io_status oid_list::cdrIn(buffer& buf)
{
//MESSAGE(cerr, "oid_list::cdrIn()");
//debug(cerr, (void*)this);
composite::cdrIn(buf);
buf.get(list_ptr.loc);
//debug(cerr, (void*)list_ptr.loc);
//debug(cerr, my_oid());
return done;
}
MMDB_BODIES(oid_list)
oid_list_handler::oid_list_handler(int num_oids, storagePtr store):
handler(OID_LIST_CODE, store)
{
((oid_list*)obj_ptr) -> init_data_member(num_oids);
}
oid_list_handler::oid_list_handler(const oid_t& v_oid, storagePtr store):
handler(v_oid, store)
{
}
oid_list_handler::~oid_list_handler()
{
}
oid_list* oid_list_handler::operator ->()
{
return (oid_list*)handler::operator->();
}