Changeset 4649
- Timestamp:
- Jul 28, 2005, 1:32:57 PM (21 years ago)
- Location:
- trunk/Nebulous/nebclient
- Files:
-
- 3 edited
-
src/nebclient.c (modified) (11 diffs)
-
src/nebclient.h (modified) (3 diffs)
-
tests/tests.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Nebulous/nebclient/src/nebclient.c
r4648 r4649 4 4 * Copyright (C) 2005 Joshua Hoblitt 5 5 * 6 * $Id: nebclient.c,v 1.3 1 2005-07-28 23:03:45jhoblitt Exp $6 * $Id: nebclient.c,v 1.32 2005-07-28 23:32:57 jhoblitt Exp $ 7 7 */ 8 8 … … 182 182 bool nebCull(nebServer *server, const char *key) 183 183 { 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) { 189 188 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); 204 200 205 201 return true; … … 259 255 } 260 256 261 int nebFindInstances(nebServer *server, const char *key, const char *volume, char ***locations)257 nebObjectInstances *nebFindInstances(nebServer *server, const char *key, const char *volume) 262 258 { 263 259 struct ns1__find_USCOREinstancesResponse response; 264 260 int resultElements = 0; 265 int i;266 261 char **resultArray; 267 char **loc;262 nebObjectInstances *locations = NULL; 268 263 269 264 // FIXME is this leaking memory when response goes out of scope? the gsoap … … 273 268 NULL, (char *)key, (char *)volume, &response) != SOAP_OK) { 274 269 nebSetServerErr(server); 275 return -1;270 return NULL; 276 271 } 277 272 278 273 resultElements = response.result->__size; 279 274 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 293 void nebObjectInstancesFree(nebObjectInstances *locations) 294 { 280 295 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 } 299 302 } 300 303 301 304 char *nebFind(nebServer *server, const char *key) 302 305 { 303 char **locations;306 nebObjectInstances *locations; 304 307 char *filename; 305 308 306 if (nebFindInstances(server, key, NULL, &locations) < 1) { 309 locations = nebFindInstances(server, key, NULL); 310 if (!locations) { 307 311 nebSetErr(server, "no instances found"); 308 312 … … 310 314 } 311 315 312 if (!nebParseURI(server, locations [0], &filename)) {316 if (!nebParseURI(server, locations->URI[0], &filename)) { 313 317 nebSetErr(server, "can not parse URI"); 314 neb Free(locations);318 nebObjectInstancesFree(locations); 315 319 316 320 return NULL; 317 321 } 318 322 319 neb Free(locations);323 nebObjectInstancesFree(locations); 320 324 321 325 return filename; … … 324 328 int nebOpen(nebServer *server, const char *key, nebRW flag) 325 329 { 326 char **locations;330 nebObjectInstances *locations; 327 331 char *filename; 328 332 int instances; 329 333 int fh; 330 334 331 instances = nebFindInstances(server, key, NULL, &locations);332 if ( instances < 1) {335 locations = nebFindInstances(server, key, NULL); 336 if (!locations) { 333 337 nebSetErr(server, "no instances found"); 334 338 … … 336 340 } 337 341 338 if (!nebParseURI(server, locations [0], &filename)) {342 if (!nebParseURI(server, locations->URI[0], &filename)) { 339 343 nebSetErr(server, "can not parse URI"); 340 neb Free(locations);344 nebObjectInstancesFree(locations); 341 345 342 346 return -1; … … 347 351 nebSetErr(server, "write not allowed with multiple instances"); 348 352 nebFree(filename); 349 neb Free(locations);353 nebObjectInstancesFree(locations); 350 354 351 355 return -1; … … 360 364 if (fh < 0) { 361 365 nebSetErr(server, "open: %s", strerror(errno)); 362 neb Free(locations);363 364 return -1; 365 } 366 367 neb Free(locations);366 nebObjectInstancesFree(locations); 367 368 return -1; 369 } 370 371 nebObjectInstancesFree(locations); 368 372 369 373 return fh; … … 372 376 bool nebDelete(nebServer *server, const char *key) 373 377 { 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) { 381 382 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])) { 389 389 nebSetErr(server, "can not delete instance"); 390 neb Free(locations);390 nebObjectInstancesFree(locations); 391 391 392 392 return false; … … 394 394 } 395 395 396 neb Free(locations);396 nebObjectInstancesFree(locations); 397 397 398 398 return true; -
trunk/Nebulous/nebclient/src/nebclient.h
r4647 r4649 4 4 * Copyright (C) 2005 Joshua Hoblitt 5 5 * 6 * $Id: nebclient.h,v 1.2 3 2005-07-28 21:56:34jhoblitt Exp $6 * $Id: nebclient.h,v 1.24 2005-07-28 23:32:57 jhoblitt Exp $ 7 7 */ 8 8 … … 32 32 } nebObjectStat; 33 33 34 typedef struct { 35 unsigned int n; 36 char **URI; 37 } nebObjectInstances; 38 34 39 nebServer *nebServerAlloc(const char *endpoint); 35 40 … … 46 51 bool nebUnlock(nebServer *server, const char *key, nebRW flag); 47 52 48 int nebFindInstances(nebServer *server, const char *key, const char *volume, char ***locations); 53 nebObjectInstances *nebFindInstances(nebServer *server, const char *key, const char *volume); 54 55 void nebObjectInstancesFree(nebObjectInstances *locations); 49 56 50 57 char *nebFind(nebServer *server, const char *key); -
trunk/Nebulous/nebclient/tests/tests.c
r4646 r4649 61 61 62 62 { 63 char **locations = NULL; 64 int n; 63 nebObjectInstances *locations = NULL; 65 64 66 n = nebFindInstances(server, key, NULL, &locations);65 locations = nebFindInstances(server, key, NULL); 67 66 68 OK(n == 1, "find instances");69 67 OK(locations, "locations not NULL"); 68 OK(locations->n == 1, "find instances"); 70 69 } 71 70
Note:
See TracChangeset
for help on using the changeset viewer.
