2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
24 * (c) Copyright 1993, 1994 Hewlett-Packard Company *
25 * (c) Copyright 1993, 1994 International Business Machines Corp. *
26 * (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
27 * (c) Copyright 1993, 1994 Novell, Inc. *
32 * $TOG: DtsDb.c /main/10 1998/10/23 13:48:04 mgreess $
34 * RESTRICTED CONFIDENTIAL INFORMATION:
36 * The information in this document is subject to special
37 * restrictions in a confidential disclosure agreement bertween
38 * HP, IBM, Sun, USL, SCO and Univel. Do not distribute this
39 * document outside HP, IBM, Sun, USL, SCO, or Univel wihtout
40 * Sun's specific written approval. This documment and all copies
41 * and derivative works thereof must be returned or destroyed at
44 * Copyright 1993 Sun Microsystems, Inc. All rights reserved.
51 #include <sys/types.h>
58 #include <Dt/DbReader.h>
60 #include <Dt/UserMsg.h>
61 #include "DtSvcLock.h"
63 extern int _MMWriteDb(DtDirPaths *dirs, int num_db, DtDtsDbDatabase **db_list,
64 const char *CacheFile);
70 typedef int (*genfunc)(const void *, const void *);
72 static DtDtsDbDatabase **db_list;
73 static int num_db = 0;
76 _DtDtsDbPrintFields(DtDtsDbRecord *rec_ptr, FILE *fd)
79 DtDtsDbField *fld_ptr;
81 for(fld = 0; fld < rec_ptr->fieldCount; fld++)
83 fld_ptr = rec_ptr->fieldList[fld];
84 fprintf(fd, "\t\t[%d]\t%s\t%s\n", fld,
85 XrmQuarkToString(fld_ptr->fieldName),
87 fld_ptr->fieldValue:"(NULL)");
92 _DtDtsDbPrintRecords(DtDtsDbDatabase *db_ptr, FILE *fd)
95 DtDtsDbRecord *rec_ptr;
98 fprintf(fd, "%d Records\n", db_ptr->recordCount);
99 for(rec = 0; rec < db_ptr->recordCount; rec++)
101 rec_ptr = db_ptr->recordList[rec];
102 fprintf(fd, "\tRec[%d] name = %s\n\t%d Fields\n", rec,
103 XrmQuarkToString(rec_ptr->recordName),
104 rec_ptr->fieldCount);
105 _DtDtsDbPrintFields(rec_ptr, fd);
107 _DtSvcProcessUnlock();
111 _DtDtsDbPrint(FILE *org_fd)
115 DtDtsDbDatabase *db_ptr;
116 DtDtsDbRecord *rec_ptr;
120 for(db = 0; db < num_db; db++)
126 db_ptr = db_list[db];
130 if((fd = fopen(db_ptr->databaseName, "w")) == NULL)
133 DtProgName, DtError, NULL,
134 db_ptr->databaseName, NULL);
138 fprintf(fd, "DB[%d] ", db);
139 fprintf(fd, "name = %s\n", db_ptr->databaseName);
140 _DtDtsDbPrintRecords(db_ptr, fd);
147 _DtSvcProcessUnlock();
151 _DtDtsDbCompareRecordNames(DtDtsDbRecord **a, DtDtsDbRecord **b)
153 return ((*a)->recordName - (*b)->recordName);
157 _DtDtsDbCompareFieldNames(DtDtsDbField **a, DtDtsDbField **b)
159 return ((*a)->fieldName - (*b)->fieldName);
167 DtDtsDbDatabase **db;
171 db = db_list = (DtDtsDbDatabase **)calloc(num_db+3, sizeof(DtDtsDbDatabase *));
172 db_list[0] = (DtDtsDbDatabase *)calloc(1, sizeof(DtDtsDbDatabase));
173 db_list[0]->databaseName = (char *)strdup(DtDTS_DC_NAME);
174 db_list[0]->ActionSequenceNumber = 0;
177 db_list[1] = (DtDtsDbDatabase *)calloc(1, sizeof(DtDtsDbDatabase));
178 db_list[1]->databaseName = (char *)strdup(DtDTS_DA_NAME);
179 db_list[1]->ActionSequenceNumber = 0;
182 _DtSvcProcessUnlock();
193 for ( i = 0; db_list[i]; i++ );
197 list = (char **)calloc(i+1, sizeof(char *));
198 for ( i = 0; db_list[i]; i++ )
200 list[i] = (char *)strdup(db_list[i]->databaseName);
203 _DtSvcProcessUnlock();
208 _DtDtsDbAddDatabase( char *db_name )
211 DtDtsDbDatabase **new_db_list;
212 DtDtsDbDatabase *ret_db;
219 for ( i = 0; db_list[i]; i++ )
221 if ( !strcmp(db_list[i]->databaseName,db_name) )
224 * A database with the given name already exists.
225 * return a pointer to the existing database.
228 _DtSvcProcessUnlock();
234 * We now have a count of the existing databases.
235 * allocate enough space for the existing databases + the new one
236 * + a NULL pointer to terminate the vector.
239 new_db_list = (DtDtsDbDatabase **)calloc(i+2,sizeof(DtDtsDbDatabase *));
241 memmove(new_db_list,db_list,sizeof(DtDtsDbDatabase *) * i );
242 new_db_list[i] = (DtDtsDbDatabase *)calloc(1, sizeof(DtDtsDbDatabase));
243 new_db_list[i]->databaseName = strdup(db_name);
244 new_db_list[i]->ActionSequenceNumber = 0;
246 db_list = new_db_list;
250 _DtSvcProcessUnlock();
256 _DtDtsDbDeleteDb(DtDtsDbDatabase *db)
262 _DtDtsDbDeleteRecords(db);
263 free(db->databaseName);
266 for(i = 0; db_list[i]; i++)
275 db_list[i] = db_list[i+1];
283 _DtSvcProcessUnlock();
289 _DtDtsDbGet(char *name)
291 DtDtsDbDatabase *ret_db;
299 for(i = 0; db_list && db_list[i] && db_list[i]->databaseName; i++)
301 if(strcmp(db_list[i]->databaseName, name) == 0)
304 _DtSvcProcessUnlock();
309 _DtSvcProcessUnlock();
314 _DtDtsDbFieldSort(DtDtsDbRecord *rec, _DtDtsDbFieldCompare compare)
318 compare = _DtDtsDbCompareFieldNames;
320 qsort(rec->fieldList,
322 sizeof(DtDtsDbField *),
324 rec->compare = compare;
328 _DtDtsDbRecordSort(DtDtsDbDatabase *db, _DtDtsDbRecordCompare compare)
332 compare = _DtDtsDbCompareRecordNames;
334 qsort(db->recordList,
336 sizeof(DtDtsDbRecord *),
338 db->compare = compare;
342 _DtDtsDbGetField(DtDtsDbRecord *rec, char *name)
347 * Field names have been quarked so quark 'name' and
348 * do a linear search for the quark'ed field name.
350 XrmQuark tmp = XrmStringToQuark (name);
352 for (i = 0; i < rec->fieldCount; i++)
354 if (rec->fieldList[i]->fieldName == tmp)
356 return (rec->fieldList[i]);
363 _DtDtsDbGetFieldByName(DtDtsDbRecord *rec, char *name)
365 DtDtsDbField *result;
367 result = _DtDtsDbGetField(rec, name);
370 return(result->fieldValue);
380 _DtDtsDbGetRecordByName(DtDtsDbDatabase *db, char *name)
383 DtDtsDbRecord **result;
384 DtDtsDbRecord *s = &srch;
386 XrmQuark name_quark = XrmStringToQuark(name);
389 * If the fields are not sorted in alphanumeric order
390 * by name a binary search will fail. So do the slow but
391 * sure linear search.
393 if(db->compare != _DtDtsDbCompareRecordNames)
396 for (i = 0; i < db->recordCount; i++)
398 if (db->recordList[i]->recordName == name_quark)
400 return (db->recordList[i]);
406 srch.recordName = name_quark;
408 if(db->recordCount == 0 || db->recordList == NULL)
414 result = (DtDtsDbRecord **)bsearch(&s,
417 sizeof(DtDtsDbRecord *),
418 (genfunc)_DtDtsDbCompareRecordNames);
433 _DtDtsDbAddRecord(DtDtsDbDatabase *db)
435 DtDtsDbRecord **newlist;
436 int rec = db->recordCount;
438 db->compare = (_DtDtsDbRecordCompare)NULL;
441 newlist = (DtDtsDbRecord **)calloc(rec+PADMEM,
442 sizeof(DtDtsDbRecord *));
445 memmove(newlist, db->recordList,
446 rec*sizeof(DtDtsDbRecord *));
447 free(db->recordList);
449 db->recordList = newlist;
451 db->recordList[rec] = (DtDtsDbRecord *)calloc(1, sizeof(DtDtsDbRecord));
454 return(db->recordList[rec]);
458 _DtDtsDbDeleteRecord(DtDtsDbRecord *rec, DtDtsDbDatabase *db)
462 _DtDtsDbDeleteFields(rec);
465 for(i = 0; i < db->recordCount; i++)
467 if(db->recordList[i] == rec)
469 memmove( &(db->recordList[i]),
470 &(db->recordList[i+1]),
471 (db->recordCount - i - 1)*
472 sizeof(DtDtsDbRecord *));
482 _DtDtsDbDeleteRecords(DtDtsDbDatabase *db)
486 for(i = 0; i < db->recordCount; i++)
488 _DtDtsDbDeleteFields(db->recordList[i]);
489 free(db->recordList[i]);
491 free(db->recordList);
497 _DtDtsDbAddField(DtDtsDbRecord *rec)
499 DtDtsDbField **newlist;
500 int flds = rec->fieldCount;
504 newlist = (DtDtsDbField **)calloc(flds+PADMEM,
505 sizeof(DtDtsDbField *));
508 memmove(newlist, rec->fieldList,
509 flds*sizeof(DtDtsDbField *));
510 free(rec->fieldList);
512 rec->fieldList = newlist;
514 rec->fieldList[flds] = (DtDtsDbField *)calloc(1, sizeof(DtDtsDbField));
517 return(rec->fieldList[flds]);
521 _DtDtsDbDeleteField(DtDtsDbField *fld, DtDtsDbRecord *rec)
526 for(i = 0; i < rec->fieldCount; i++)
528 if(rec->fieldList[i] == fld)
530 memmove( &(rec->fieldList[i]),
531 &(rec->fieldList[i+1]),
532 (rec->fieldCount - i - 1)*
533 sizeof(DtDtsDbField *));
543 _DtDtsDbDeleteFields(DtDtsDbRecord *rec)
547 for(i = 0; i < rec->fieldCount; i++)
549 free(rec->fieldList[i]->fieldValue);
550 free(rec->fieldList[i]);
552 free(rec->fieldList);
558 _DtDtsMMCreateFile(DtDirPaths *dirs, const char *CacheFile)
560 return _MMWriteDb(dirs, num_db, db_list, CacheFile);