Changeset 388 for python/vendor/current/Modules/bsddbmodule.c
- Timestamp:
- Mar 19, 2014, 11:11:30 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
python/vendor/current/Modules/bsddbmodule.c
r2 r388 31 31 32 32 typedef struct { 33 34 35 int di_size;/* -1 means recompute */36 37 #ifdef WITH_THREAD 38 33 PyObject_HEAD 34 DB *di_bsddb; 35 int di_size; /* -1 means recompute */ 36 int di_type; 37 #ifdef WITH_THREAD 38 PyThread_type_lock di_lock; 39 39 #endif 40 40 } bsddbobject; … … 45 45 #define check_bsddbobject_open(v, r) if ((v)->di_bsddb == NULL) \ 46 46 { PyErr_SetString(BsddbError, \ 47 47 "BSDDB object has already been closed"); \ 48 48 return r; } 49 49 … … 52 52 static PyObject * 53 53 newdbhashobject(char *file, int flags, int mode, 54 55 56 { 57 58 59 60 61 62 63 64 65 66 67 68 54 int bsize, int ffactor, int nelem, int cachesize, 55 int hash, int lorder) 56 { 57 bsddbobject *dp; 58 HASHINFO info; 59 60 if ((dp = PyObject_New(bsddbobject, &Bsddbtype)) == NULL) 61 return NULL; 62 63 info.bsize = bsize; 64 info.ffactor = ffactor; 65 info.nelem = nelem; 66 info.cachesize = cachesize; 67 info.hash = NULL; /* XXX should derive from hash argument */ 68 info.lorder = lorder; 69 69 70 70 #ifdef O_BINARY 71 72 #endif 73 74 75 76 77 78 #ifdef WITH_THREAD 79 80 #endif 81 82 83 84 85 86 87 88 #ifdef WITH_THREAD 89 90 91 92 93 94 95 #endif 96 97 71 flags |= O_BINARY; 72 #endif 73 Py_BEGIN_ALLOW_THREADS 74 dp->di_bsddb = dbopen(file, flags, mode, DB_HASH, &info); 75 Py_END_ALLOW_THREADS 76 if (dp->di_bsddb == NULL) { 77 PyErr_SetFromErrno(BsddbError); 78 #ifdef WITH_THREAD 79 dp->di_lock = NULL; 80 #endif 81 Py_DECREF(dp); 82 return NULL; 83 } 84 85 dp->di_size = -1; 86 dp->di_type = DB_HASH; 87 88 #ifdef WITH_THREAD 89 dp->di_lock = PyThread_allocate_lock(); 90 if (dp->di_lock == NULL) { 91 PyErr_SetString(BsddbError, "can't allocate lock"); 92 Py_DECREF(dp); 93 return NULL; 94 } 95 #endif 96 97 return (PyObject *)dp; 98 98 } 99 99 100 100 static PyObject * 101 101 newdbbtobject(char *file, int flags, int mode, 102 103 104 { 105 106 107 108 109 110 111 112 113 114 115 116 117 118 102 int btflags, int cachesize, int maxkeypage, 103 int minkeypage, int psize, int lorder) 104 { 105 bsddbobject *dp; 106 BTREEINFO info; 107 108 if ((dp = PyObject_New(bsddbobject, &Bsddbtype)) == NULL) 109 return NULL; 110 111 info.flags = btflags; 112 info.cachesize = cachesize; 113 info.maxkeypage = maxkeypage; 114 info.minkeypage = minkeypage; 115 info.psize = psize; 116 info.lorder = lorder; 117 info.compare = 0; /* Use default comparison functions, for now..*/ 118 info.prefix = 0; 119 119 120 120 #ifdef O_BINARY 121 122 #endif 123 124 125 126 127 128 #ifdef WITH_THREAD 129 130 #endif 131 132 133 134 135 136 137 138 #ifdef WITH_THREAD 139 140 141 142 143 144 145 #endif 146 147 121 flags |= O_BINARY; 122 #endif 123 Py_BEGIN_ALLOW_THREADS 124 dp->di_bsddb = dbopen(file, flags, mode, DB_BTREE, &info); 125 Py_END_ALLOW_THREADS 126 if (dp->di_bsddb == NULL) { 127 PyErr_SetFromErrno(BsddbError); 128 #ifdef WITH_THREAD 129 dp->di_lock = NULL; 130 #endif 131 Py_DECREF(dp); 132 return NULL; 133 } 134 135 dp->di_size = -1; 136 dp->di_type = DB_BTREE; 137 138 #ifdef WITH_THREAD 139 dp->di_lock = PyThread_allocate_lock(); 140 if (dp->di_lock == NULL) { 141 PyErr_SetString(BsddbError, "can't allocate lock"); 142 Py_DECREF(dp); 143 return NULL; 144 } 145 #endif 146 147 return (PyObject *)dp; 148 148 } 149 149 150 150 static PyObject * 151 151 newdbrnobject(char *file, int flags, int mode, 152 153 154 { 155 156 157 158 159 160 161 162 163 164 165 166 167 168 152 int rnflags, int cachesize, int psize, int lorder, 153 size_t reclen, u_char bval, char *bfname) 154 { 155 bsddbobject *dp; 156 RECNOINFO info; 157 int fd; 158 159 if ((dp = PyObject_New(bsddbobject, &Bsddbtype)) == NULL) 160 return NULL; 161 162 info.flags = rnflags; 163 info.cachesize = cachesize; 164 info.psize = psize; 165 info.lorder = lorder; 166 info.reclen = reclen; 167 info.bval = bval; 168 info.bfname = bfname; 169 169 170 170 #ifdef O_BINARY 171 172 #endif 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 #ifdef WITH_THREAD 188 189 #endif 190 191 192 193 194 195 196 197 #ifdef WITH_THREAD 198 199 200 201 202 203 204 #endif 205 206 171 flags |= O_BINARY; 172 #endif 173 /* This is a hack to avoid a dbopen() bug that happens when 174 * it fails. */ 175 fd = open(file, flags); 176 if (fd == -1) { 177 dp->di_bsddb = NULL; 178 } 179 else { 180 close(fd); 181 Py_BEGIN_ALLOW_THREADS 182 dp->di_bsddb = dbopen(file, flags, mode, DB_RECNO, &info); 183 Py_END_ALLOW_THREADS 184 } 185 if (dp->di_bsddb == NULL) { 186 PyErr_SetFromErrno(BsddbError); 187 #ifdef WITH_THREAD 188 dp->di_lock = NULL; 189 #endif 190 Py_DECREF(dp); 191 return NULL; 192 } 193 194 dp->di_size = -1; 195 dp->di_type = DB_RECNO; 196 197 #ifdef WITH_THREAD 198 dp->di_lock = PyThread_allocate_lock(); 199 if (dp->di_lock == NULL) { 200 PyErr_SetString(BsddbError, "can't allocate lock"); 201 Py_DECREF(dp); 202 return NULL; 203 } 204 #endif 205 206 return (PyObject *)dp; 207 207 } 208 208 … … 211 211 { 212 212 #ifdef WITH_THREAD 213 214 215 216 217 218 219 #endif 220 221 222 223 224 225 226 227 228 229 230 213 if (dp->di_lock) { 214 PyThread_acquire_lock(dp->di_lock, 0); 215 PyThread_release_lock(dp->di_lock); 216 PyThread_free_lock(dp->di_lock); 217 dp->di_lock = NULL; 218 } 219 #endif 220 if (dp->di_bsddb != NULL) { 221 int status; 222 Py_BEGIN_ALLOW_THREADS 223 status = (dp->di_bsddb->close)(dp->di_bsddb); 224 Py_END_ALLOW_THREADS 225 if (status != 0) 226 fprintf(stderr, 227 "Python bsddb: close errno %d in dealloc\n", 228 errno); 229 } 230 PyObject_Del(dp); 231 231 } 232 232 233 233 #ifdef WITH_THREAD 234 234 #define BSDDB_BGN_SAVE(_dp) \ 235 235 Py_BEGIN_ALLOW_THREADS PyThread_acquire_lock(_dp->di_lock,1); 236 236 #define BSDDB_END_SAVE(_dp) \ 237 237 PyThread_release_lock(_dp->di_lock); Py_END_ALLOW_THREADS 238 238 #else 239 #define BSDDB_BGN_SAVE(_dp) Py_BEGIN_ALLOW_THREADS 239 #define BSDDB_BGN_SAVE(_dp) Py_BEGIN_ALLOW_THREADS 240 240 #define BSDDB_END_SAVE(_dp) Py_END_ALLOW_THREADS 241 241 #endif … … 244 244 bsddb_length(bsddbobject *dp) 245 245 { 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 246 check_bsddbobject_open(dp, -1); 247 if (dp->di_size < 0) { 248 DBT krec, drec; 249 int status; 250 int size = 0; 251 BSDDB_BGN_SAVE(dp) 252 for (status = (dp->di_bsddb->seq)(dp->di_bsddb, 253 &krec, &drec,R_FIRST); 254 status == 0; 255 status = (dp->di_bsddb->seq)(dp->di_bsddb, 256 &krec, &drec, R_NEXT)) 257 size++; 258 BSDDB_END_SAVE(dp) 259 if (status < 0) { 260 PyErr_SetFromErrno(BsddbError); 261 return -1; 262 } 263 dp->di_size = size; 264 } 265 return dp->di_size; 266 266 } 267 267 … … 269 269 bsddb_subscript(bsddbobject *dp, PyObject *key) 270 270 { 271 int status; 272 DBT krec, drec; 273 char *data,buf[4096]; 274 int size; 275 PyObject *result; 276 recno_t recno; 277 278 if (dp->di_type == DB_RECNO) { 279 if (!PyArg_Parse(key, "i", &recno)) { 280 PyErr_SetString(PyExc_TypeError, 281 "key type must be integer"); 282 return NULL; 283 } 284 krec.data = &recno; 285 krec.size = sizeof(recno); 286 } 287 else { 288 if (!PyArg_Parse(key, "s#", &data, &size)) { 289 PyErr_SetString(PyExc_TypeError, 290 "key type must be string"); 291 return NULL; 292 } 293 krec.data = data; 294 krec.size = size; 295 } 296 check_bsddbobject_open(dp, NULL); 297 298 BSDDB_BGN_SAVE(dp) 299 status = (dp->di_bsddb->get)(dp->di_bsddb, &krec, &drec, 0); 300 if (status == 0) { 301 if (drec.size > sizeof(buf)) data = malloc(drec.size); 302 else data = buf; 303 if (data!=NULL) memcpy(data,drec.data,drec.size); 304 } 305 BSDDB_END_SAVE(dp) 306 if (data==NULL) return PyErr_NoMemory(); 307 if (status != 0) { 308 if (status < 0) 309 PyErr_SetFromErrno(BsddbError); 310 else 311 PyErr_SetObject(PyExc_KeyError, key); 312 return NULL; 313 } 314 315 result = PyString_FromStringAndSize(data, (int)drec.size); 316 if (data != buf) free(data); 317 return result; 271 int status; 272 DBT krec, drec; 273 char *data = NULL; 274 char buf[4096]; 275 int size; 276 PyObject *result; 277 recno_t recno; 278 279 if (dp->di_type == DB_RECNO) { 280 if (!PyArg_Parse(key, "i", &recno)) { 281 PyErr_SetString(PyExc_TypeError, 282 "key type must be integer"); 283 return NULL; 284 } 285 krec.data = &recno; 286 krec.size = sizeof(recno); 287 } 288 else { 289 if (!PyArg_Parse(key, "s#", &data, &size)) { 290 PyErr_SetString(PyExc_TypeError, 291 "key type must be string"); 292 return NULL; 293 } 294 krec.data = data; 295 krec.size = size; 296 } 297 check_bsddbobject_open(dp, NULL); 298 299 BSDDB_BGN_SAVE(dp) 300 status = (dp->di_bsddb->get)(dp->di_bsddb, &krec, &drec, 0); 301 if (status == 0) { 302 if (drec.size > sizeof(buf)) data = malloc(drec.size); 303 else data = buf; 304 if (data!=NULL) memcpy(data,drec.data,drec.size); 305 } 306 BSDDB_END_SAVE(dp) 307 if (data==NULL) return PyErr_NoMemory(); 308 if (status != 0) { 309 if (status < 0) 310 PyErr_SetFromErrno(BsddbError); 311 else 312 PyErr_SetObject(PyExc_KeyError, key); 313 return NULL; 314 } 315 316 result = PyString_FromStringAndSize(data, (int)drec.size); 317 if (data != buf) free(data); 318 return result; 318 319 } 319 320 … … 321 322 bsddb_ass_sub(bsddbobject *dp, PyObject *key, PyObject *value) 322 323 { 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 324 int status; 325 DBT krec, drec; 326 char *data; 327 int size; 328 recno_t recno; 329 330 if (dp->di_type == DB_RECNO) { 331 if (!PyArg_Parse(key, "i", &recno)) { 332 PyErr_SetString(PyExc_TypeError, 333 "bsddb key type must be integer"); 334 return -1; 335 } 336 krec.data = &recno; 337 krec.size = sizeof(recno); 338 } 339 else { 340 if (!PyArg_Parse(key, "s#", &data, &size)) { 341 PyErr_SetString(PyExc_TypeError, 342 "bsddb key type must be string"); 343 return -1; 344 } 345 krec.data = data; 346 krec.size = size; 347 } 348 check_bsddbobject_open(dp, -1); 349 dp->di_size = -1; 350 if (value == NULL) { 351 BSDDB_BGN_SAVE(dp) 352 status = (dp->di_bsddb->del)(dp->di_bsddb, &krec, 0); 353 BSDDB_END_SAVE(dp) 354 } 355 else { 356 if (!PyArg_Parse(value, "s#", &data, &size)) { 357 PyErr_SetString(PyExc_TypeError, 358 "bsddb value type must be string"); 359 return -1; 360 } 361 drec.data = data; 362 drec.size = size; 363 BSDDB_BGN_SAVE(dp) 364 status = (dp->di_bsddb->put)(dp->di_bsddb, &krec, &drec, 0); 365 BSDDB_END_SAVE(dp) 366 } 367 if (status != 0) { 368 if (status < 0) 369 PyErr_SetFromErrno(BsddbError); 370 else 371 PyErr_SetObject(PyExc_KeyError, key); 372 return -1; 373 } 374 return 0; 374 375 } 375 376 376 377 static PyMappingMethods bsddb_as_mapping = { 377 (lenfunc)bsddb_length,/*mp_length*/378 (binaryfunc)bsddb_subscript,/*mp_subscript*/379 (objobjargproc)bsddb_ass_sub,/*mp_ass_subscript*/378 (lenfunc)bsddb_length, /*mp_length*/ 379 (binaryfunc)bsddb_subscript, /*mp_subscript*/ 380 (objobjargproc)bsddb_ass_sub, /*mp_ass_subscript*/ 380 381 }; 381 382 … … 383 384 bsddb_close(bsddbobject *dp) 384 385 { 385 386 387 388 389 390 391 392 393 394 395 396 397 398 386 if (dp->di_bsddb != NULL) { 387 int status; 388 BSDDB_BGN_SAVE(dp) 389 status = (dp->di_bsddb->close)(dp->di_bsddb); 390 BSDDB_END_SAVE(dp) 391 if (status != 0) { 392 dp->di_bsddb = NULL; 393 PyErr_SetFromErrno(BsddbError); 394 return NULL; 395 } 396 } 397 dp->di_bsddb = NULL; 398 Py_INCREF(Py_None); 399 return Py_None; 399 400 } 400 401 … … 402 403 bsddb_keys(bsddbobject *dp) 403 404 { 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 405 PyObject *list, *item=NULL; 406 DBT krec, drec; 407 char *data=NULL,buf[4096]; 408 int status; 409 int err; 410 411 check_bsddbobject_open(dp, NULL); 412 list = PyList_New(0); 413 if (list == NULL) 414 return NULL; 415 BSDDB_BGN_SAVE(dp) 416 status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, &drec, R_FIRST); 417 if (status == 0) { 418 if (krec.size > sizeof(buf)) data = malloc(krec.size); 419 else data = buf; 420 if (data != NULL) memcpy(data,krec.data,krec.size); 421 } 422 BSDDB_END_SAVE(dp) 423 if (status == 0 && data==NULL) return PyErr_NoMemory(); 424 while (status == 0) { 425 if (dp->di_type == DB_RECNO) 426 item = PyInt_FromLong(*((int*)data)); 427 else 428 item = PyString_FromStringAndSize(data, 429 (int)krec.size); 430 if (data != buf) free(data); 431 if (item == NULL) { 432 Py_DECREF(list); 433 return NULL; 434 } 435 err = PyList_Append(list, item); 436 Py_DECREF(item); 437 if (err != 0) { 438 Py_DECREF(list); 439 return NULL; 440 } 441 BSDDB_BGN_SAVE(dp) 442 status = (dp->di_bsddb->seq) 443 (dp->di_bsddb, &krec, &drec, R_NEXT); 444 if (status == 0) { 445 if (krec.size > sizeof(buf)) 446 data = malloc(krec.size); 447 else data = buf; 448 if (data != NULL) 449 memcpy(data,krec.data,krec.size); 450 } 451 BSDDB_END_SAVE(dp) 452 if (data == NULL) return PyErr_NoMemory(); 453 } 454 if (status < 0) { 455 PyErr_SetFromErrno(BsddbError); 456 Py_DECREF(list); 457 return NULL; 458 } 459 if (dp->di_size < 0) 460 dp->di_size = PyList_Size(list); /* We just did the work */ 461 return list; 461 462 } 462 463 … … 464 465 bsddb_has_key(bsddbobject *dp, PyObject *args) 465 466 { 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 467 DBT krec, drec; 468 int status; 469 char *data; 470 int size; 471 recno_t recno; 472 473 if (dp->di_type == DB_RECNO) { 474 if (!PyArg_ParseTuple(args, "i;key type must be integer", 475 &recno)) { 476 return NULL; 477 } 478 krec.data = &recno; 479 krec.size = sizeof(recno); 480 } 481 else { 482 if (!PyArg_ParseTuple(args, "s#;key type must be string", 483 &data, &size)) { 484 return NULL; 485 } 486 krec.data = data; 487 krec.size = size; 488 } 489 check_bsddbobject_open(dp, NULL); 490 491 BSDDB_BGN_SAVE(dp) 492 status = (dp->di_bsddb->get)(dp->di_bsddb, &krec, &drec, 0); 493 BSDDB_END_SAVE(dp) 494 if (status < 0) { 495 PyErr_SetFromErrno(BsddbError); 496 return NULL; 497 } 498 499 return PyInt_FromLong(status == 0); 499 500 } 500 501 … … 502 503 bsddb_set_location(bsddbobject *dp, PyObject *key) 503 504 { 504 int status; 505 DBT krec, drec; 506 char *data,buf[4096]; 507 int size; 508 PyObject *result; 509 recno_t recno; 510 511 if (dp->di_type == DB_RECNO) { 512 if (!PyArg_ParseTuple(key, "i;key type must be integer", 513 &recno)) { 514 return NULL; 515 } 516 krec.data = &recno; 517 krec.size = sizeof(recno); 518 } 519 else { 520 if (!PyArg_ParseTuple(key, "s#;key type must be string", 521 &data, &size)) { 522 return NULL; 523 } 524 krec.data = data; 525 krec.size = size; 526 } 527 check_bsddbobject_open(dp, NULL); 528 529 BSDDB_BGN_SAVE(dp) 530 status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, &drec, R_CURSOR); 531 if (status == 0) { 532 if (drec.size > sizeof(buf)) data = malloc(drec.size); 533 else data = buf; 534 if (data!=NULL) memcpy(data,drec.data,drec.size); 535 } 536 BSDDB_END_SAVE(dp) 537 if (data==NULL) return PyErr_NoMemory(); 538 if (status != 0) { 539 if (status < 0) 540 PyErr_SetFromErrno(BsddbError); 541 else 542 PyErr_SetObject(PyExc_KeyError, key); 543 return NULL; 544 } 545 546 if (dp->di_type == DB_RECNO) 547 result = Py_BuildValue("is#", *((int*)krec.data), 548 data, drec.size); 549 else 550 result = Py_BuildValue("s#s#", krec.data, krec.size, 551 data, drec.size); 552 if (data != buf) free(data); 553 return result; 505 int status; 506 DBT krec, drec; 507 char *data = NULL; 508 char buf[4096]; 509 int size; 510 PyObject *result; 511 recno_t recno; 512 513 if (dp->di_type == DB_RECNO) { 514 if (!PyArg_ParseTuple(key, "i;key type must be integer", 515 &recno)) { 516 return NULL; 517 } 518 krec.data = &recno; 519 krec.size = sizeof(recno); 520 } 521 else { 522 if (!PyArg_ParseTuple(key, "s#;key type must be string", 523 &data, &size)) { 524 return NULL; 525 } 526 krec.data = data; 527 krec.size = size; 528 } 529 check_bsddbobject_open(dp, NULL); 530 531 BSDDB_BGN_SAVE(dp) 532 status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, &drec, R_CURSOR); 533 if (status == 0) { 534 if (drec.size > sizeof(buf)) data = malloc(drec.size); 535 else data = buf; 536 if (data!=NULL) memcpy(data,drec.data,drec.size); 537 } 538 BSDDB_END_SAVE(dp) 539 if (data==NULL) return PyErr_NoMemory(); 540 if (status != 0) { 541 if (status < 0) 542 PyErr_SetFromErrno(BsddbError); 543 else 544 PyErr_SetObject(PyExc_KeyError, key); 545 return NULL; 546 } 547 548 if (dp->di_type == DB_RECNO) 549 result = Py_BuildValue("is#", *((int*)krec.data), 550 data, drec.size); 551 else 552 result = Py_BuildValue("s#s#", krec.data, krec.size, 553 data, drec.size); 554 if (data != buf) free(data); 555 return result; 554 556 } 555 557 … … 557 559 bsddb_seq(bsddbobject *dp, int sequence_request) 558 560 { 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 if ((kdata == NULL) || (ddata == NULL)) 583 584 585 else { 586 /* (status != 0) */ 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 561 int status; 562 DBT krec, drec; 563 char *kdata=NULL,kbuf[4096]; 564 char *ddata=NULL,dbuf[4096]; 565 PyObject *result; 566 567 check_bsddbobject_open(dp, NULL); 568 krec.data = 0; 569 krec.size = 0; 570 571 BSDDB_BGN_SAVE(dp) 572 status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, 573 &drec, sequence_request); 574 if (status == 0) { 575 if (krec.size > sizeof(kbuf)) kdata = malloc(krec.size); 576 else kdata = kbuf; 577 if (kdata != NULL) memcpy(kdata,krec.data,krec.size); 578 if (drec.size > sizeof(dbuf)) ddata = malloc(drec.size); 579 else ddata = dbuf; 580 if (ddata != NULL) memcpy(ddata,drec.data,drec.size); 581 } 582 BSDDB_END_SAVE(dp) 583 if (status == 0) { 584 if ((kdata == NULL) || (ddata == NULL)) 585 return PyErr_NoMemory(); 586 } 587 else { 588 /* (status != 0) */ 589 if (status < 0) 590 PyErr_SetFromErrno(BsddbError); 591 else 592 PyErr_SetString(PyExc_KeyError, "no key/data pairs"); 593 return NULL; 594 } 595 596 if (dp->di_type == DB_RECNO) 597 result = Py_BuildValue("is#", *((int*)kdata), 598 ddata, drec.size); 599 else 600 result = Py_BuildValue("s#s#", kdata, krec.size, 601 ddata, drec.size); 602 if (kdata != kbuf) free(kdata); 603 if (ddata != dbuf) free(ddata); 604 return result; 603 605 } 604 606 … … 606 608 bsddb_next(bsddbobject *dp) 607 609 { 608 610 return bsddb_seq(dp, R_NEXT); 609 611 } 610 612 static PyObject * 611 613 bsddb_previous(bsddbobject *dp) 612 614 { 613 615 return bsddb_seq(dp, R_PREV); 614 616 } 615 617 static PyObject * 616 618 bsddb_first(bsddbobject *dp) 617 619 { 618 620 return bsddb_seq(dp, R_FIRST); 619 621 } 620 622 static PyObject * 621 623 bsddb_last(bsddbobject *dp) 622 624 { 623 625 return bsddb_seq(dp, R_LAST); 624 626 } 625 627 static PyObject * 626 628 bsddb_sync(bsddbobject *dp) 627 629 { 628 629 630 631 632 633 634 635 636 637 638 return PyInt_FromLong(status =0);630 int status; 631 632 check_bsddbobject_open(dp, NULL); 633 BSDDB_BGN_SAVE(dp) 634 status = (dp->di_bsddb->sync)(dp->di_bsddb, 0); 635 BSDDB_END_SAVE(dp) 636 if (status != 0) { 637 PyErr_SetFromErrno(BsddbError); 638 return NULL; 639 } 640 return PyInt_FromLong(0); 639 641 } 640 642 static PyMethodDef bsddb_methods[] = { 641 {"close",(PyCFunction)bsddb_close, METH_NOARGS},642 {"keys",(PyCFunction)bsddb_keys, METH_NOARGS},643 {"has_key",(PyCFunction)bsddb_has_key, METH_VARARGS},644 {"set_location",(PyCFunction)bsddb_set_location, METH_VARARGS},645 {"next",(PyCFunction)bsddb_next, METH_NOARGS},646 {"previous",(PyCFunction)bsddb_previous, METH_NOARGS},647 {"first",(PyCFunction)bsddb_first, METH_NOARGS},648 {"last",(PyCFunction)bsddb_last, METH_NOARGS},649 {"sync",(PyCFunction)bsddb_sync, METH_NOARGS},650 {NULL, NULL}/* sentinel */643 {"close", (PyCFunction)bsddb_close, METH_NOARGS}, 644 {"keys", (PyCFunction)bsddb_keys, METH_NOARGS}, 645 {"has_key", (PyCFunction)bsddb_has_key, METH_VARARGS}, 646 {"set_location", (PyCFunction)bsddb_set_location, METH_VARARGS}, 647 {"next", (PyCFunction)bsddb_next, METH_NOARGS}, 648 {"previous", (PyCFunction)bsddb_previous, METH_NOARGS}, 649 {"first", (PyCFunction)bsddb_first, METH_NOARGS}, 650 {"last", (PyCFunction)bsddb_last, METH_NOARGS}, 651 {"sync", (PyCFunction)bsddb_sync, METH_NOARGS}, 652 {NULL, NULL} /* sentinel */ 651 653 }; 652 654 … … 654 656 bsddb_getattr(PyObject *dp, char *name) 655 657 { 656 658 return Py_FindMethod(bsddb_methods, dp, name); 657 659 } 658 660 659 661 static PyTypeObject Bsddbtype = { 660 661 662 663 664 665 666 0,/*tp_print*/667 668 0,/*tp_setattr*/669 0,/*tp_compare*/670 0,/*tp_repr*/671 0,/*tp_as_number*/672 0,/*tp_as_sequence*/673 &bsddb_as_mapping,/*tp_as_mapping*/662 PyObject_HEAD_INIT(NULL) 663 0, 664 "bsddb.bsddb", 665 sizeof(bsddbobject), 666 0, 667 (destructor)bsddb_dealloc, /*tp_dealloc*/ 668 0, /*tp_print*/ 669 (getattrfunc)bsddb_getattr, /*tp_getattr*/ 670 0, /*tp_setattr*/ 671 0, /*tp_compare*/ 672 0, /*tp_repr*/ 673 0, /*tp_as_number*/ 674 0, /*tp_as_sequence*/ 675 &bsddb_as_mapping, /*tp_as_mapping*/ 674 676 }; 675 677 … … 677 679 bsdhashopen(PyObject *self, PyObject *args) 678 680 { 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 681 char *file; 682 char *flag = NULL; 683 int flags = O_RDONLY; 684 int mode = 0666; 685 int bsize = 0; 686 int ffactor = 0; 687 int nelem = 0; 688 int cachesize = 0; 689 int hash = 0; /* XXX currently ignored */ 690 int lorder = 0; 691 692 if (!PyArg_ParseTuple(args, "z|siiiiiii:hashopen", 693 &file, &flag, &mode, 694 &bsize, &ffactor, &nelem, &cachesize, 695 &hash, &lorder)) 696 return NULL; 697 if (flag != NULL) { 698 /* XXX need to pass O_EXCL, O_EXLOCK, O_NONBLOCK, O_SHLOCK */ 699 if (flag[0] == 'r') 700 flags = O_RDONLY; 701 else if (flag[0] == 'w') 702 flags = O_RDWR; 703 else if (flag[0] == 'c') 704 flags = O_RDWR|O_CREAT; 705 else if (flag[0] == 'n') 706 flags = O_RDWR|O_CREAT|O_TRUNC; 707 else { 708 PyErr_SetString(BsddbError, 709 "Flag should begin with 'r', 'w', 'c' or 'n'"); 710 return NULL; 711 } 712 if (flag[1] == 'l') { 711 713 #if defined(O_EXLOCK) && defined(O_SHLOCK) 712 713 714 715 714 if (flag[0] == 'r') 715 flags |= O_SHLOCK; 716 else 717 flags |= O_EXLOCK; 716 718 #else 717 718 719 720 #endif 721 722 723 724 719 PyErr_SetString(BsddbError, 720 "locking not supported on this platform"); 721 return NULL; 722 #endif 723 } 724 } 725 return newdbhashobject(file, flags, mode, 726 bsize, ffactor, nelem, cachesize, hash, lorder); 725 727 } 726 728 … … 728 730 bsdbtopen(PyObject *self, PyObject *args) 729 731 { 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 732 char *file; 733 char *flag = NULL; 734 int flags = O_RDONLY; 735 int mode = 0666; 736 int cachesize = 0; 737 int maxkeypage = 0; 738 int minkeypage = 0; 739 int btflags = 0; 740 unsigned int psize = 0; 741 int lorder = 0; 742 743 if (!PyArg_ParseTuple(args, "z|siiiiiii:btopen", 744 &file, &flag, &mode, 745 &btflags, &cachesize, &maxkeypage, &minkeypage, 746 &psize, &lorder)) 747 return NULL; 748 if (flag != NULL) { 749 /* XXX need to pass O_EXCL, O_EXLOCK, O_NONBLOCK, O_SHLOCK */ 750 if (flag[0] == 'r') 751 flags = O_RDONLY; 752 else if (flag[0] == 'w') 753 flags = O_RDWR; 754 else if (flag[0] == 'c') 755 flags = O_RDWR|O_CREAT; 756 else if (flag[0] == 'n') 757 flags = O_RDWR|O_CREAT|O_TRUNC; 758 else { 759 PyErr_SetString(BsddbError, 760 "Flag should begin with 'r', 'w', 'c' or 'n'"); 761 return NULL; 762 } 763 if (flag[1] == 'l') { 762 764 #if defined(O_EXLOCK) && defined(O_SHLOCK) 763 764 765 766 765 if (flag[0] == 'r') 766 flags |= O_SHLOCK; 767 else 768 flags |= O_EXLOCK; 767 769 #else 768 769 770 771 #endif 772 773 774 775 776 770 PyErr_SetString(BsddbError, 771 "locking not supported on this platform"); 772 return NULL; 773 #endif 774 } 775 } 776 return newdbbtobject(file, flags, mode, 777 btflags, cachesize, maxkeypage, minkeypage, 778 psize, lorder); 777 779 } 778 780 … … 780 782 bsdrnopen(PyObject *self, PyObject *args) 781 783 { 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 784 char *file; 785 char *flag = NULL; 786 int flags = O_RDONLY; 787 int mode = 0666; 788 int cachesize = 0; 789 int rnflags = 0; 790 unsigned int psize = 0; 791 int lorder = 0; 792 size_t reclen = 0; 793 char *bval = ""; 794 char *bfname = NULL; 795 796 if (!PyArg_ParseTuple(args, "z|siiiiiiss:rnopen", 797 &file, &flag, &mode, 798 &rnflags, &cachesize, &psize, &lorder, 799 &reclen, &bval, &bfname)) 800 return NULL; 801 802 if (flag != NULL) { 803 /* XXX need to pass O_EXCL, O_EXLOCK, O_NONBLOCK, O_SHLOCK */ 804 if (flag[0] == 'r') 805 flags = O_RDONLY; 806 else if (flag[0] == 'w') 807 flags = O_RDWR; 808 else if (flag[0] == 'c') 809 flags = O_RDWR|O_CREAT; 810 else if (flag[0] == 'n') 811 flags = O_RDWR|O_CREAT|O_TRUNC; 812 else { 813 PyErr_SetString(BsddbError, 814 "Flag should begin with 'r', 'w', 'c' or 'n'"); 815 return NULL; 816 } 817 if (flag[1] == 'l') { 816 818 #if defined(O_EXLOCK) && defined(O_SHLOCK) 817 818 819 820 819 if (flag[0] == 'r') 820 flags |= O_SHLOCK; 821 else 822 flags |= O_EXLOCK; 821 823 #else 822 823 824 825 #endif 826 827 828 829 830 831 832 833 834 824 PyErr_SetString(BsddbError, 825 "locking not supported on this platform"); 826 return NULL; 827 #endif 828 } 829 else if (flag[1] != '\0') { 830 PyErr_SetString(BsddbError, 831 "Flag char 2 should be 'l' or absent"); 832 return NULL; 833 } 834 } 835 return newdbrnobject(file, flags, mode, rnflags, cachesize, 836 psize, lorder, reclen, bval[0], bfname); 835 837 } 836 838 837 839 static PyMethodDef bsddbmodule_methods[] = { 838 {"hashopen",(PyCFunction)bsdhashopen, METH_VARARGS},839 {"btopen",(PyCFunction)bsdbtopen, METH_VARARGS},840 {"rnopen",(PyCFunction)bsdrnopen, METH_VARARGS},841 842 {"open",(PyCFunction)bsdhashopen, METH_VARARGS},843 {0,0},840 {"hashopen", (PyCFunction)bsdhashopen, METH_VARARGS}, 841 {"btopen", (PyCFunction)bsdbtopen, METH_VARARGS}, 842 {"rnopen", (PyCFunction)bsdrnopen, METH_VARARGS}, 843 /* strictly for use by dbhhash!!! */ 844 {"open", (PyCFunction)bsdhashopen, METH_VARARGS}, 845 {0, 0}, 844 846 }; 845 847 846 848 PyMODINIT_FUNC 847 849 initbsddb185(void) { 848 850 PyObject *m, *d; 849 851 850 852 if (PyErr_WarnPy3k("the bsddb185 module has been removed in " 851 853 "Python 3.0", 2) < 0) 852 return;853 854 855 856 857 858 859 860 861 862 } 854 return; 855 856 Bsddbtype.ob_type = &PyType_Type; 857 m = Py_InitModule("bsddb185", bsddbmodule_methods); 858 if (m == NULL) 859 return; 860 d = PyModule_GetDict(m); 861 BsddbError = PyErr_NewException("bsddb.error", NULL, NULL); 862 if (BsddbError != NULL) 863 PyDict_SetItemString(d, "error", BsddbError); 864 }
Note:
See TracChangeset
for help on using the changeset viewer.