IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 4649


Ignore:
Timestamp:
Jul 28, 2005, 1:32:57 PM (21 years ago)
Author:
jhoblitt
Message:

add nebObjectInstances
change nebFindInstances() to return a *nebObjectInstances
add nebObjectInstancesFree()

Location:
trunk/Nebulous/nebclient
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Nebulous/nebclient/src/nebclient.c

    r4648 r4649  
    44 * Copyright (C) 2005  Joshua Hoblitt
    55 *
    6  * $Id: nebclient.c,v 1.31 2005-07-28 23:03:45 jhoblitt Exp $
     6 * $Id: nebclient.c,v 1.32 2005-07-28 23:32:57 jhoblitt Exp $
    77 */
    88
     
    182182bool nebCull(nebServer *server, const char *key)
    183183{
    184     char            **locations;
    185     int             instances;
    186 
    187     instances = nebFindInstances(server, key, NULL, &locations);
    188     if (instances < 2) {
     184    nebObjectInstances *locations;
     185
     186    locations = nebFindInstances(server, key, NULL);
     187    if (!locations) {
    189188        nebSetErr(server, "can not cull - not enough instances");
    190         if (instances) {
    191             nebFree(locations);
    192         }
    193 
    194         return false;
    195     }
    196 
    197     if (!nebDeleteInstance(server, locations[0])) {
    198         nebFree(locations);
    199 
    200         return false;
    201     }
    202 
    203     nebFree(locations);
     189
     190        return false;
     191    }
     192
     193    if (!nebDeleteInstance(server, locations->URI[0])) {
     194        nebObjectInstancesFree(locations);
     195
     196        return false;
     197    }
     198
     199    nebObjectInstancesFree(locations);
    204200
    205201    return true;
     
    259255}
    260256
    261 int nebFindInstances(nebServer *server, const char *key, const char *volume, char ***locations)
     257nebObjectInstances *nebFindInstances(nebServer *server, const char *key, const char *volume)
    262258{
    263259    struct ns1__find_USCOREinstancesResponse response;
    264260    int             resultElements = 0;
    265     int             i;
    266261    char            **resultArray;
    267     char            **loc;
     262    nebObjectInstances *locations = NULL;
    268263
    269264    // FIXME is this leaking memory when response goes out of scope?  the gsoap
     
    273268            NULL, (char *)key, (char *)volume, &response) != SOAP_OK) {
    274269        nebSetServerErr(server);
    275         return -1;
     270        return NULL;
    276271    }
    277272
    278273    resultElements = response.result->__size;
    279274
     275    if (resultElements) {
     276        locations = xmalloc(sizeof(nebObjectInstances));
     277        locations->n = resultElements;
     278       
     279        resultArray    = response.result->__ptr;
     280
     281        locations->URI = xmalloc(sizeof(char*) * resultElements);
     282
     283        for (int i = 0; i < resultElements; i++) {
     284            locations->URI[i] = xmalloc(strlen(resultArray[i]) + 1);
     285            strcpy(locations->URI[i], resultArray[i]);
     286        }
     287
     288    }
     289
     290    return locations;
     291}
     292
     293void nebObjectInstancesFree(nebObjectInstances *locations)
     294{
    280295    if (locations) {
    281         if (resultElements) {
    282             resultArray    = response.result->__ptr;
    283 
    284             loc = xmalloc(sizeof(char*) * resultElements);
    285 
    286             for (i = 0; i < resultElements; i++) {
    287                 loc[i] = xmalloc(strlen(resultArray[i]) + 1);
    288 
    289                 strcpy(loc[i], resultArray[i]);
    290             }
    291 
    292             *locations = loc;
    293         } else {
    294             *locations = NULL;
    295         }
    296     }
    297 
    298     return resultElements;
     296        for (int i = 0; i < locations->n; i++) {
     297            nebFree(locations->URI[i]);
     298        }
     299
     300        nebFree(locations);
     301    }
    299302}
    300303
    301304char *nebFind(nebServer *server, const char *key)
    302305{
    303     char            **locations;
     306    nebObjectInstances *locations;
    304307    char            *filename;
    305308   
    306     if (nebFindInstances(server, key, NULL, &locations) < 1) {
     309    locations = nebFindInstances(server, key, NULL);
     310    if (!locations) {
    307311        nebSetErr(server, "no instances found");
    308312
     
    310314    }
    311315
    312     if (!nebParseURI(server, locations[0], &filename)) {
     316    if (!nebParseURI(server, locations->URI[0], &filename)) {
    313317        nebSetErr(server, "can not parse URI");
    314         nebFree(locations);
     318        nebObjectInstancesFree(locations);
    315319
    316320        return NULL;
    317321    }
    318322
    319     nebFree(locations);
     323    nebObjectInstancesFree(locations);
    320324
    321325    return filename;
     
    324328int nebOpen(nebServer *server, const char *key, nebRW flag)
    325329{
    326     char            **locations;
     330    nebObjectInstances *locations;
    327331    char            *filename;
    328332    int             instances;
    329333    int             fh;
    330334
    331     instances = nebFindInstances(server, key, NULL, &locations);
    332     if (instances < 1) {
     335    locations = nebFindInstances(server, key, NULL);
     336    if (!locations) {
    333337        nebSetErr(server, "no instances found");
    334338
     
    336340    }
    337341
    338     if (!nebParseURI(server, locations[0], &filename)) {
     342    if (!nebParseURI(server, locations->URI[0], &filename)) {
    339343        nebSetErr(server, "can not parse URI");
    340         nebFree(locations);
     344        nebObjectInstancesFree(locations);
    341345
    342346        return -1;
     
    347351            nebSetErr(server, "write not allowed with multiple instances");
    348352            nebFree(filename);
    349             nebFree(locations);
     353            nebObjectInstancesFree(locations);
    350354
    351355            return -1;
     
    360364    if (fh < 0) {
    361365        nebSetErr(server, "open: %s", strerror(errno));
    362         nebFree(locations);
    363 
    364         return -1;
    365     }
    366 
    367     nebFree(locations);
     366        nebObjectInstancesFree(locations);
     367
     368        return -1;
     369    }
     370
     371    nebObjectInstancesFree(locations);
    368372
    369373    return fh;
     
    372376bool nebDelete(nebServer *server, const char *key)
    373377{
    374     char            **locations;
    375     int             n;
    376     int             i;
    377 
    378     n = nebFindInstances(server, key, NULL, &locations);
    379 
    380     if (n < 0) {
     378    nebObjectInstances *locations;
     379
     380    locations = nebFindInstances(server, key, NULL);
     381    if (!locations) {
    381382        nebSetErr(server, "no instances found");
    382         nebFree(locations);
    383 
    384         return false;
    385     }
    386 
    387     for (i = 0; i < n; i++) {
    388         if (!nebDeleteInstance(server, locations[i])) {
     383
     384        return false;
     385    }
     386
     387    for (int i = 0; i < locations->n; i++) {
     388        if (!nebDeleteInstance(server, locations->URI[i])) {
    389389            nebSetErr(server, "can not delete instance");
    390             nebFree(locations);
     390            nebObjectInstancesFree(locations);
    391391
    392392            return false;
     
    394394    }
    395395
    396     nebFree(locations);
     396    nebObjectInstancesFree(locations);
    397397
    398398    return true;
  • trunk/Nebulous/nebclient/src/nebclient.h

    r4647 r4649  
    44 * Copyright (C) 2005  Joshua Hoblitt
    55 *
    6  * $Id: nebclient.h,v 1.23 2005-07-28 21:56:34 jhoblitt Exp $
     6 * $Id: nebclient.h,v 1.24 2005-07-28 23:32:57 jhoblitt Exp $
    77 */
    88
     
    3232} nebObjectStat;
    3333
     34typedef struct {
     35    unsigned int    n;
     36    char            **URI;
     37} nebObjectInstances;
     38
    3439nebServer *nebServerAlloc(const char *endpoint);
    3540
     
    4651bool nebUnlock(nebServer *server, const char *key, nebRW flag);
    4752
    48 int nebFindInstances(nebServer *server, const char *key, const char *volume, char ***locations);
     53nebObjectInstances *nebFindInstances(nebServer *server, const char *key, const char *volume);
     54
     55void nebObjectInstancesFree(nebObjectInstances *locations);
    4956
    5057char *nebFind(nebServer *server, const char *key);
  • trunk/Nebulous/nebclient/tests/tests.c

    r4646 r4649  
    6161
    6262    {
    63         char        **locations = NULL;
    64         int         n;
     63        nebObjectInstances *locations = NULL;
    6564
    66         n = nebFindInstances(server, key, NULL, &locations);
     65        locations = nebFindInstances(server, key, NULL);
    6766
    68         OK(n == 1, "find instances");
    6967        OK(locations, "locations not NULL");
     68        OK(locations->n == 1, "find instances");
    7069    }
    7170
Note: See TracChangeset for help on using the changeset viewer.