Home | History | Annotate | Download | only in libnisdb
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*
     23  *	db_query.cc
     24  *
     25  *	Copyright (c) 1988-2000 by Sun Microsystems, Inc.
     26  *	All Rights Reserved.
     27  */
     28 
     29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     30 
     31 #include "db_headers.h"
     32 #include "db_query.h"
     33 #include "nisdb_mt.h"
     34 #include <string.h>
     35 
     36 /* Returns db_query containing the index values as obtained from 'attrlist.' */
     37 db_query::db_query(db_scheme * scheme, int size, nis_attr* attrlist)
     38 {
     39 	int i;
     40 	num_components = size;
     41 	components = new db_qcomp[size];
     42 
     43 	if (components == NULL) {
     44 		num_components = 0;
     45 		FATAL(
     46 		    "db_query::db_query: cannot allocate space for components",
     47 		    DB_MEMORY_LIMIT);
     48 	}
     49 
     50 	for (i = 0; i < size; i++) {
     51 		if (!scheme->find_index(attrlist[i].zattr_ndx,
     52 					&(components[i].which_index))) {
     53 			syslog(LOG_ERR, "db_query::db_query: bad index (%s)",
     54 				attrlist[i].zattr_ndx);
     55 			clear_components(i);
     56 			return;
     57 		}
     58 		components[i].index_value = new
     59 				item(attrlist[i].zattr_val.zattr_val_val,
     60 					attrlist[i].zattr_val.zattr_val_len);
     61 		if (components[i].index_value  == NULL) {
     62 			clear_components(i);
     63 			FATAL(
     64 			"db_query::db_query:cannot allocate space for index",
     65 			DB_MEMORY_LIMIT);
     66 		}
     67 	}
     68 }
     69 
     70 /*
     71  * Returns a newly db_query containing the index values as
     72  * obtained from the given object.  The object itself,
     73  * along with information on the scheme given, will determine
     74  * which values are extracted from the object and placed into the query.
     75  * Returns an empty query if 'obj' is not a valid entry.
     76  * Note that space is allocated for the query and the index values
     77  * (i.e. do not share pointers with strings in 'obj'.)
     78 */
     79 db_query::db_query(db_scheme *scheme, entry_object_p obj)
     80 {
     81 	num_components = scheme->numkeys();	// scheme's view of key count
     82 	db_key_desc *keyinfo = scheme->keyloc();
     83 
     84 	int objsize = obj->en_cols.en_cols_len;	// total num columns in obj */
     85 	struct entry_col * objcols = obj->en_cols.en_cols_val;
     86 
     87 	/* components of query to be returned */
     88 	components = new db_qcomp[num_components];
     89 
     90 	int wherein_obj, i;
     91 	if (components == NULL) {
     92 		FATAL(
     93 		    "db_query::db_query: cannot allocate space for components",
     94 		    DB_MEMORY_LIMIT);
     95 	}
     96 
     97 	/* fill in each component of query */
     98 	for (i = 0; i < num_components; i++) {
     99 		components[i].which_index = i;		// index i
    100 		wherein_obj = keyinfo[i].column_number; // column in entry obj
    101 		if (wherein_obj >= objsize) {
    102 			syslog(LOG_ERR,
    103 "db_query::column %d cannot occur in object with %d columns (start counting at 0)\n",
    104 				wherein_obj, objsize);
    105 			clear_components(i);		// clean up
    106 			return;
    107 		}
    108 
    109 		components[i].index_value = new
    110 			item(objcols[wherein_obj].ec_value.ec_value_val,
    111 				objcols[wherein_obj].ec_value.ec_value_len);
    112 		if (components[i].index_value  == NULL) {
    113 			clear_components(i);
    114 			FATAL(
    115 			"db_query::db_query:cannot allocate space for index",
    116 			DB_MEMORY_LIMIT);
    117 		}
    118 
    119 		/* do something about null keys? */
    120 	}
    121 }
    122 
    123 void
    124 db_query::clear_components(int how_many)
    125 {
    126 	int i;
    127 	if (components) {
    128 		for (i = 0; i < how_many; i++)
    129 			if (components[i].index_value)
    130 				delete components[i].index_value;
    131 		delete components;
    132 		components = NULL;
    133 	}
    134 	num_components = 0;
    135 }
    136 
    137 /* destructor */
    138 db_query::~db_query()
    139 {
    140 	clear_components(num_components);
    141 }
    142 
    143 /* Print all components of this query to stdout. */
    144 void
    145 db_query::print()
    146 {
    147 	int i;
    148 	for (i = 0; i < num_components; i++) {
    149 		printf("%d: ", components[i].which_index);
    150 		components[i].index_value->print();
    151 		putchar('\n');
    152 	}
    153 }
    154