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 #include "db_headers.h" 30 #include "db_query.h" 31 #include "nisdb_mt.h" 32 #include <string.h> 33 34 /* Returns db_query containing the index values as obtained from 'attrlist.' */ 35 db_query::db_query(db_scheme * scheme, int size, nis_attr* attrlist) 36 { 37 int i; 38 num_components = size; 39 components = new db_qcomp[size]; 40 41 if (components == NULL) { 42 num_components = 0; 43 FATAL( 44 "db_query::db_query: cannot allocate space for components", 45 DB_MEMORY_LIMIT); 46 } 47 48 for (i = 0; i < size; i++) { 49 if (!scheme->find_index(attrlist[i].zattr_ndx, 50 &(components[i].which_index))) { 51 syslog(LOG_ERR, "db_query::db_query: bad index (%s)", 52 attrlist[i].zattr_ndx); 53 clear_components(i); 54 return; 55 } 56 components[i].index_value = new 57 item(attrlist[i].zattr_val.zattr_val_val, 58 attrlist[i].zattr_val.zattr_val_len); 59 if (components[i].index_value == NULL) { 60 clear_components(i); 61 FATAL( 62 "db_query::db_query:cannot allocate space for index", 63 DB_MEMORY_LIMIT); 64 } 65 } 66 } 67 68 /* 69 * Returns a newly db_query containing the index values as 70 * obtained from the given object. The object itself, 71 * along with information on the scheme given, will determine 72 * which values are extracted from the object and placed into the query. 73 * Returns an empty query if 'obj' is not a valid entry. 74 * Note that space is allocated for the query and the index values 75 * (i.e. do not share pointers with strings in 'obj'.) 76 */ 77 db_query::db_query(db_scheme *scheme, entry_object_p obj) 78 { 79 num_components = scheme->numkeys(); // scheme's view of key count 80 db_key_desc *keyinfo = scheme->keyloc(); 81 82 int objsize = obj->en_cols.en_cols_len; // total num columns in obj */ 83 struct entry_col * objcols = obj->en_cols.en_cols_val; 84 85 /* components of query to be returned */ 86 components = new db_qcomp[num_components]; 87 88 int wherein_obj, i; 89 if (components == NULL) { 90 FATAL( 91 "db_query::db_query: cannot allocate space for components", 92 DB_MEMORY_LIMIT); 93 } 94 95 /* fill in each component of query */ 96 for (i = 0; i < num_components; i++) { 97 components[i].which_index = i; // index i 98 wherein_obj = keyinfo[i].column_number; // column in entry obj 99 if (wherein_obj >= objsize) { 100 syslog(LOG_ERR, 101 "db_query::column %d cannot occur in object with %d columns (start counting at 0)\n", 102 wherein_obj, objsize); 103 clear_components(i); // clean up 104 return; 105 } 106 107 components[i].index_value = new 108 item(objcols[wherein_obj].ec_value.ec_value_val, 109 objcols[wherein_obj].ec_value.ec_value_len); 110 if (components[i].index_value == NULL) { 111 clear_components(i); 112 FATAL( 113 "db_query::db_query:cannot allocate space for index", 114 DB_MEMORY_LIMIT); 115 } 116 117 /* do something about null keys? */ 118 } 119 } 120 121 void 122 db_query::clear_components(int how_many) 123 { 124 int i; 125 if (components) { 126 for (i = 0; i < how_many; i++) 127 if (components[i].index_value) 128 delete components[i].index_value; 129 delete components; 130 components = NULL; 131 } 132 num_components = 0; 133 } 134 135 /* destructor */ 136 db_query::~db_query() 137 { 138 clear_components(num_components); 139 } 140 141 /* Print all components of this query to stdout. */ 142 void 143 db_query::print() 144 { 145 int i; 146 for (i = 0; i < num_components; i++) { 147 printf("%d: ", components[i].which_index); 148 components[i].index_value->print(); 149 putchar('\n'); 150 } 151 } 152