kdbhighlevel.c

00001 /***************************************************************************
00002             libkdb.c  -  Interfaces for accessing the Key Database
00003                              -------------------
00004     begin                : Mon Dec 29 2003
00005     copyright            : (C) 2003 by Avi Alkalay
00006     email                : avi@unix.sh
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the BSD License (revised).                      *
00013  *                                                                         *
00014  ***************************************************************************/
00015 
00016 
00017 
00018 
00019 /* Subversion stuff
00020 
00021 $Id: libkdb.c 752 2006-04-24 12:55:12Z aviram $
00022 
00023 */
00024 
00025 
00026 
00027 
00048 #ifdef HAVE_CONFIG_H
00049 #include "config.h"
00050 #endif
00051 
00052 #ifdef HAVE_UNISTD_H
00053 #include <unistd.h>
00054 #endif
00055 
00056 #ifdef HAVE_ICONV
00057 #include <iconv.h>
00058 #endif
00059 
00060 #ifdef HAVE_LOCALE_H
00061 #include <locale.h>
00062 #endif
00063 
00064 #ifdef HAVE_LANGINFO_H
00065 #include <langinfo.h>
00066 #endif
00067 
00068 #ifdef HAVE_SYS_TYPES_H
00069 #include <sys/types.h>
00070 #endif
00071 
00072 #ifdef HAVE_SYS_STAT_H
00073 #include <sys/stat.h>
00074 #endif
00075 
00076 
00077 #include <stdlib.h>
00078 #include <stdarg.h>
00079 #include <ctype.h>
00080 #include <string.h>
00081 #include <errno.h>
00082 #include <stdio.h>
00083 #include <pthread.h>
00084 
00085 
00086 /* kdbbackend.h will include kdb.h and kdbprivate.h */
00087 #include "kdbbackend.h"
00088 #include "kdbLibLoader.h"
00089 
00090 /* usleep doesn't exist on win32, so we use Sleep() */
00091 #ifdef WIN32
00092 #define usleep(x) Sleep(x)
00093 #endif
00094 
00095 
00096 
00097 
00098 
00099 
00114 int kdbGetValue(KDBHandle handle,const char *keyname,
00115         char *returned,size_t maxSize) {
00116     Key *key;
00117     int rc=0;
00118 
00119     key=keyNew(keyname,KEY_SWITCH_END);
00120     rc=kdbGetKey(handle, key);
00121     if (rc == 0) keyGetString(key,returned,maxSize);
00122     else rc=errno; /* store errno before a possible change */
00123     keyDel(key);
00124     errno=rc;
00125     return rc;
00126 }
00127 
00128 
00129 
00145 int kdbSetValue(KDBHandle handle, const char *keyname, const char *value) {
00146     Key *key;
00147     int rc;
00148 
00149     key=keyNew(keyname,KEY_SWITCH_END);
00150     rc=kdbGetKey(handle,key);
00151     if (! keyIsDir (key))
00152     {
00153         keySetString(key,value);
00154     } else {
00155         errno = KDB_RET_TYPEMISMATCH;
00156         keyDel(key);
00157         return -1;
00158     }
00159     rc=kdbSetKey(handle,key);
00160     keyDel(key);
00161     return rc;
00162 }
00163 
00164 
00165 
00193 int kdbGetValueByParent(KDBHandle handle, const char *parentName, const char *baseName, char *returned, size_t maxSize) {
00194     char *name;
00195     int retval=0;
00196     name = (char *)malloc(sizeof(char)*(strblen(parentName)+strblen(baseName)));
00197 
00198     sprintf(name,"%s/%s",parentName,baseName);
00199     retval = kdbGetValue(handle,name,returned,maxSize);
00200     free(name);
00201     return retval;
00202 }
00203 
00204 
00205 
00217 int kdbSetValueByParent(KDBHandle handle, const char *parentName, const char *baseName, const char *value) {
00218     char *name;
00219     int retval=0;
00220     name = (char *)malloc(sizeof(char)*(strblen(parentName)+strblen(baseName)));
00221 
00222     sprintf(name,"%s/%s",parentName,baseName);
00223     retval = kdbSetValue(handle,name,value);
00224     free(name);
00225     return retval;
00226 }
00227 
00228 
00229 
00245 int kdbGetKeyByParent(KDBHandle handle, const char *parentName, const char *baseName, Key *returned) {
00246     char *name;
00247     name = (char *)malloc(sizeof(char) * (strblen(parentName)+strblen(baseName)));
00248 
00249     sprintf(name,"%s/%s",parentName,baseName);  
00250     keySetName(returned,name);
00251     free(name);
00252     return kdbGetKey(handle,returned);
00253 }
00254 
00255 
00263 int kdbGetKeyByParentKey(KDBHandle handle, const Key *parent, const char *baseName, Key *returned) {
00264     size_t size=keyGetFullNameSize(parent);
00265     char *name;
00266     name = (char *)malloc(sizeof(char) * (size+strblen(baseName)));
00267 
00268     keyGetFullName(parent,name,size);
00269     name[size-1]='/';
00270     strcpy((char *)(name+size),baseName);
00271 
00272     keySetName(returned,name);
00273     free(name);
00274     return kdbGetKey(handle,returned);
00275 }
00276 
00277 
00290 ssize_t kdbGetChildKeys(KDBHandle handle, const char *parentName, KeySet *returned, unsigned long options) {
00291     /*TODO: make this a non helper, but kdbGetKeyChildKeys a helper*/
00292     Key *parentKey;
00293     ssize_t rc;
00294     
00295     parentKey=keyNew(parentName,KEY_SWITCH_END);
00296     rc=kdbGetKeyChildKeys(handle,parentKey,returned,options);
00297     
00298     keyDel(parentKey);
00299     
00300     return rc;
00301 }
00302 
00303 
00304 
00318 ssize_t kdbGetRootKeys(KDBHandle handle, KeySet *returned) {
00319     Key *system=0,*user=0;
00320 
00321     user=keyNew("user",KEY_SWITCH_NEEDSYNC,handle,
00322         KEY_SWITCH_END);
00323     if (user->flags & KEY_SWITCH_FLAG) {
00324         keyDel(user);
00325         user=0;
00326     } else ksInsert(returned,user);
00327 
00328     system=keyNew("system",KEY_SWITCH_NEEDSYNC,handle,
00329         KEY_SWITCH_END);
00330     if (system->flags & KEY_SWITCH_FLAG) {
00331         keyDel(system);
00332         system=0;
00333     } else ksInsert(returned,system);
00334 
00335     return returned->size;
00336 }
00337 
00338 
00350 int kdbRemove(KDBHandle handle, const char *keyName) {
00351     /*TODO: make this a non helper, but kdbGetKeyChildKeys a helper*/
00352     int rc=0;
00353     Key *key=0;
00354     
00355     key=keyNew(KEY_SWITCH_END);
00356     rc=keySetName(key,keyName);
00357     if (rc == 0) {
00358         keyDel(key);
00359         return -1; /* propagate errno */
00360     }
00361     
00362     rc=kdbRemoveKey(handle,key);
00363     keyDel(key);
00364     
00365     return rc;
00366 }
00367 

Generated on Sun Mar 25 21:39:55 2007 for Elektra Project by  doxygen 1.5.1