Files
cdesktop/cde/programs/dtinfo/DtMmdb/storage/page_storage.h
2018-04-28 12:30:20 -06:00

254 lines
6.7 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: page_storage.h /main/7 1996/07/18 14:55:30 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
*
*/
#ifndef _page_storage_h
#define _page_storage_h 1
#define NUM_PAGES 10
#include "utility/pm_random.h"
#include "dstr/heap.h"
#include "dstr/void_ptr_array.h"
#include "dynhash/imp_die.h"
#include "storage/unixf_storage.h"
#include "storage/heap_comp_funcs.h"
#include "storage/page_cache.h"
#include "storage/spointer.h"
enum direction { positive, negative };
class page;
class str_index_record_t : public root
{
public:
int str_offset;
mmdb_pos_t loc;
str_index_record_t(int offset, mmdb_pos_t lc = 0);
virtual ~str_index_record_t() {};
};
void delete_str_index_record(const void* str_index_record_ptr);
typedef str_index_record_t* str_index_record_tPtr;
////////////////////////////////////////////
////////////////////////////////////////////
class store_trans
{
protected:
enum trans_t { ENABLED, DISABLED };
char* path;
char* name;
trans_t status;
unixf_storage* log_store;
imp_die* log_index;
int max_pages;
int page_sz;
public:
store_trans(char* path, char*name, int page_sz);
~store_trans();
void init(rep_policy*);
void quit();
void set_max_pages(int max_pgs) {
max_pages = max_pgs;
};
friend class page_storage;
};
/******************************************************/
// cached page storage. Implemented on Unix file class.
/******************************************************/
#ifdef C_API
#define f_global_pcache (*f_global_pcache_ptr)
#endif
class page_storage : public abs_storage
{
protected:
store_trans trans_info;
int page_sz ; // page size
static int dv_sz ;
static int abs_off ;
#ifndef C_API
static page_cache_global_part f_global_pcache;
#else
static page_cache_global_part* f_global_pcache_ptr;
#endif
page_cache_local_part f_local_pcache;
int total_pages;
// byte order
int v_server_order;
int v_db_order;
buffer* v_buf; // aux. buf.
int pagings ;
int total_page_access;
protected:
Boolean seek_loc_negative(mmdb_pos_t& loc, int smd);
Boolean seek_loc_positive(mmdb_pos_t& loc, int smd);
public:
page_storage(char* path, char* name,
unixf_storage* store,
int page_sz = PAGSIZ,
int num_cached_pages = NUM_PAGES,
mmdb_byte_order_t db_order_when_create_store = mmdb_big_endian
);
virtual ~page_storage();
void remove(); // remove all pages in the store
void sync();
void sync(int pagenum);
void sync(page*);
void begin_trans();
void commit_trans();
void roll_back();
void save_to_log(page* page_ptr);
// get server and db order
int server_order() { return v_server_order; } ;
int db_order() { return v_db_order; };
// i/o functions
int readString (mmdb_pos_t loc, char* base, int len, int str_offset = 0);
int get_str_ptr(mmdb_pos_t loc, char*&, int& len) ;
int updateString(mmdb_pos_t loc, const char* base, int len, int string_ofst = 0, Boolean flush = false);
int deleteString (mmdb_pos_t loc, Boolean flush = false);
int insertString(mmdb_pos_t& loc, const char* base, int len, Boolean flush = false);
int allocString (mmdb_pos_t& loc, int len, char*&, int mode = 0);
int appendString(mmdb_pos_t loc, const char*, int len, Boolean flush_opt = false);
int set_page_dirty(mmdb_pos_t loc);
// iteration functions
typedef enum access { READ, WRITE } access_t;
int first() const; // first page's index in the store
page* operator()(int page_num, enum access intent) ; //get the page
void next(int&) const; // next page's index.
// format the store to contain extra empty 'pages' pages
int add_page_frames(int pages);
// get locs of the pieces that a long string is broken into
// The array should be deleted after use.
int get_str_locs(mmdb_pos_t str_loc, str_index_record_tPtr*& locs, int& vector_leng);
// seek loc to (loc +/- 1) position
Boolean seek_loc(mmdb_pos_t& loc, const direction = positive, int = spointer_t::FIRST_RECD );
mmdb_pos_t first_loc(); // return first loc in the store
mmdb_pos_t last_loc(); // return last loc in the store
// store status query functions
int page_size() { return page_sz; };
//
void set_page_size(int pgsz) { page_sz = pgsz; };
// how many pages in total in the store
int pages() const { return total_pages; };
// paging counting function
void reset_paging_count();
int paging_count() const;
Boolean io_mode(int mode) ;
// return an aux. buf.
buffer& aux_buf();
// printing functions
virtual io_status asciiOut(ostream&) ;
friend void close_file(const void*);
friend void remove_from_global_cache(const void*);
friend class storage_mgr_t;
friend class handler;
friend class page_cache_local_part;
friend class page_cache_global_part;
#ifdef C_API
friend void initialize_MMDB();
friend void quit_MMDB();
#endif
};
typedef page_storage* page_storagePtr;
#endif