Mercurial > hg > xemacs-beta
comparison src/database.c @ 4985:358aa3bb603f
Automatic merge
| author | Ben Wing <ben@xemacs.org> |
|---|---|
| date | Fri, 05 Feb 2010 12:12:28 -0600 |
| parents | 4aebb0131297 |
| children | 97c45e3ad810 |
comparison
equal
deleted
inserted
replaced
| 4984:f23cd0184dcf | 4985:358aa3bb603f |
|---|---|
| 338 static Lisp_Object | 338 static Lisp_Object |
| 339 dbm_get (Lisp_Database *db, Lisp_Object key) | 339 dbm_get (Lisp_Database *db, Lisp_Object key) |
| 340 { | 340 { |
| 341 datum keydatum, valdatum; | 341 datum keydatum, valdatum; |
| 342 | 342 |
| 343 TO_EXTERNAL_FORMAT (LISP_STRING, key, | 343 LISP_STRING_TO_SIZED_EXTERNAL (key, keydatum.dptr, keydatum.dsize, |
| 344 ALLOCA, (keydatum.dptr, keydatum.dsize), | 344 db->coding_system); |
| 345 db->coding_system); | |
| 346 valdatum = dbm_fetch (db->dbm_handle, keydatum); | 345 valdatum = dbm_fetch (db->dbm_handle, keydatum); |
| 347 | 346 |
| 348 return (valdatum.dptr | 347 return (valdatum.dptr |
| 349 ? make_extstring ((Extbyte *) valdatum.dptr, valdatum.dsize, | 348 ? make_extstring ((Extbyte *) valdatum.dptr, valdatum.dsize, |
| 350 db->coding_system) | 349 db->coding_system) |
| 355 dbm_put (Lisp_Database *db, | 354 dbm_put (Lisp_Database *db, |
| 356 Lisp_Object key, Lisp_Object val, Lisp_Object replace) | 355 Lisp_Object key, Lisp_Object val, Lisp_Object replace) |
| 357 { | 356 { |
| 358 datum keydatum, valdatum; | 357 datum keydatum, valdatum; |
| 359 | 358 |
| 360 TO_EXTERNAL_FORMAT (LISP_STRING, val, | 359 LISP_STRING_TO_SIZED_EXTERNAL (val, valdatum.dptr, valdatum.dsize, |
| 361 ALLOCA, (valdatum.dptr, valdatum.dsize), | 360 db->coding_system); |
| 362 db->coding_system); | 361 LISP_STRING_TO_SIZED_EXTERNAL (key, keydatum.dptr, keydatum.dsize, |
| 363 TO_EXTERNAL_FORMAT (LISP_STRING, key, | 362 db->coding_system); |
| 364 ALLOCA, (keydatum.dptr, keydatum.dsize), | |
| 365 db->coding_system); | |
| 366 | 363 |
| 367 return !dbm_store (db->dbm_handle, keydatum, valdatum, | 364 return !dbm_store (db->dbm_handle, keydatum, valdatum, |
| 368 NILP (replace) ? DBM_INSERT : DBM_REPLACE); | 365 NILP (replace) ? DBM_INSERT : DBM_REPLACE); |
| 369 } | 366 } |
| 370 | 367 |
| 371 static int | 368 static int |
| 372 dbm_remove (Lisp_Database *db, Lisp_Object key) | 369 dbm_remove (Lisp_Database *db, Lisp_Object key) |
| 373 { | 370 { |
| 374 datum keydatum; | 371 datum keydatum; |
| 375 | 372 |
| 376 TO_EXTERNAL_FORMAT (LISP_STRING, key, | 373 LISP_STRING_TO_SIZED_EXTERNAL (key, keydatum.dptr, keydatum.dsize, |
| 377 ALLOCA, (keydatum.dptr, keydatum.dsize), | 374 db->coding_system); |
| 378 db->coding_system); | |
| 379 | 375 |
| 380 return dbm_delete (db->dbm_handle, keydatum); | 376 return dbm_delete (db->dbm_handle, keydatum); |
| 381 } | 377 } |
| 382 | 378 |
| 383 static Lisp_Object | 379 static Lisp_Object |
| 460 | 456 |
| 461 /* DB Version 2 requires DBT's to be zeroed before use. */ | 457 /* DB Version 2 requires DBT's to be zeroed before use. */ |
| 462 xzero (keydatum); | 458 xzero (keydatum); |
| 463 xzero (valdatum); | 459 xzero (valdatum); |
| 464 | 460 |
| 465 TO_EXTERNAL_FORMAT (LISP_STRING, key, | 461 LISP_STRING_TO_SIZED_EXTERNAL (key, keydatum.data, keydatum.size, |
| 466 ALLOCA, (keydatum.data, keydatum.size), | 462 db->coding_system); |
| 467 db->coding_system); | |
| 468 | 463 |
| 469 #if DB_VERSION_MAJOR == 1 | 464 #if DB_VERSION_MAJOR == 1 |
| 470 status = db->db_handle->get (db->db_handle, &keydatum, &valdatum, 0); | 465 status = db->db_handle->get (db->db_handle, &keydatum, &valdatum, 0); |
| 471 #else | 466 #else |
| 472 status = db->db_handle->get (db->db_handle, NULL, &keydatum, &valdatum, 0); | 467 status = db->db_handle->get (db->db_handle, NULL, &keydatum, &valdatum, 0); |
| 496 | 491 |
| 497 /* DB Version 2 requires DBT's to be zeroed before use. */ | 492 /* DB Version 2 requires DBT's to be zeroed before use. */ |
| 498 xzero (keydatum); | 493 xzero (keydatum); |
| 499 xzero (valdatum); | 494 xzero (valdatum); |
| 500 | 495 |
| 501 TO_EXTERNAL_FORMAT (LISP_STRING, key, | 496 LISP_STRING_TO_SIZED_EXTERNAL (key, keydatum.data, keydatum.size, |
| 502 ALLOCA, (keydatum.data, keydatum.size), | 497 db->coding_system); |
| 503 db->coding_system); | 498 LISP_STRING_TO_SIZED_EXTERNAL (val, valdatum.data, valdatum.size, |
| 504 TO_EXTERNAL_FORMAT (LISP_STRING, val, | 499 db->coding_system); |
| 505 ALLOCA, (valdatum.data, valdatum.size), | |
| 506 db->coding_system); | |
| 507 #if DB_VERSION_MAJOR == 1 | 500 #if DB_VERSION_MAJOR == 1 |
| 508 status = db->db_handle->put (db->db_handle, &keydatum, &valdatum, | 501 status = db->db_handle->put (db->db_handle, &keydatum, &valdatum, |
| 509 NILP (replace) ? R_NOOVERWRITE : 0); | 502 NILP (replace) ? R_NOOVERWRITE : 0); |
| 510 db->dberrno = (status == 1) ? -1 : errno; | 503 db->dberrno = (status == 1) ? -1 : errno; |
| 511 #else | 504 #else |
| 524 int status; | 517 int status; |
| 525 | 518 |
| 526 /* DB Version 2 requires DBT's to be zeroed before use. */ | 519 /* DB Version 2 requires DBT's to be zeroed before use. */ |
| 527 xzero (keydatum); | 520 xzero (keydatum); |
| 528 | 521 |
| 529 TO_EXTERNAL_FORMAT (LISP_STRING, key, | 522 LISP_STRING_TO_SIZED_EXTERNAL (key, keydatum.data, keydatum.size, |
| 530 ALLOCA, (keydatum.data, keydatum.size), | 523 db->coding_system); |
| 531 db->coding_system); | |
| 532 | 524 |
| 533 #if DB_VERSION_MAJOR == 1 | 525 #if DB_VERSION_MAJOR == 1 |
| 534 status = db->db_handle->del (db->db_handle, &keydatum, 0); | 526 status = db->db_handle->del (db->db_handle, &keydatum, 0); |
| 535 #else | 527 #else |
| 536 status = db->db_handle->del (db->db_handle, NULL, &keydatum, 0); | 528 status = db->db_handle->del (db->db_handle, NULL, &keydatum, 0); |
| 651 { | 643 { |
| 652 /* This function can GC */ | 644 /* This function can GC */ |
| 653 int modemask; | 645 int modemask; |
| 654 int accessmask = 0; | 646 int accessmask = 0; |
| 655 Lisp_Database *db = NULL; | 647 Lisp_Database *db = NULL; |
| 656 char *filename; | 648 Extbyte *filename; |
| 657 struct gcpro gcpro1, gcpro2; | 649 struct gcpro gcpro1, gcpro2; |
| 658 | 650 |
| 659 CHECK_STRING (file); | 651 CHECK_STRING (file); |
| 660 GCPRO2 (file, access_); | 652 GCPRO2 (file, access_); |
| 661 file = Fexpand_file_name (file, Qnil); | 653 file = Fexpand_file_name (file, Qnil); |
| 662 UNGCPRO; | 654 UNGCPRO; |
| 663 | 655 |
| 664 TO_EXTERNAL_FORMAT (LISP_STRING, file, | 656 LISP_PATHNAME_CONVERT_OUT (file, filename); |
| 665 C_STRING_ALLOCA, filename, | |
| 666 Qfile_name); | |
| 667 | 657 |
| 668 if (NILP (access_)) | 658 if (NILP (access_)) |
| 669 { | 659 { |
| 670 accessmask = O_RDWR | O_CREAT; | 660 accessmask = O_RDWR | O_CREAT; |
| 671 } | 661 } |
| 672 else | 662 else |
| 673 { | 663 { |
| 674 char *acc; | 664 Ibyte *acc; |
| 675 CHECK_STRING (access_); | 665 CHECK_STRING (access_); |
| 676 acc = (char *) XSTRING_DATA (access_); | 666 acc = XSTRING_DATA (access_); |
| 677 | 667 |
| 678 if (strchr (acc, '+')) | 668 if (qxestrchr (acc, '+')) |
| 679 accessmask |= O_CREAT; | 669 accessmask |= O_CREAT; |
| 680 | 670 |
| 681 { | 671 { |
| 682 char *rp = strchr (acc, 'r'); | 672 int rp = !!qxestrchr (acc, 'r'); |
| 683 char *wp = strchr (acc, 'w'); | 673 int wp = !!qxestrchr (acc, 'w'); |
| 684 if (rp && wp) accessmask |= O_RDWR; | 674 if (rp && wp) accessmask |= O_RDWR; |
| 685 else if (wp) accessmask |= O_WRONLY; | 675 else if (wp) accessmask |= O_WRONLY; |
| 686 else accessmask |= O_RDONLY; | 676 else accessmask |= O_RDONLY; |
| 687 } | 677 } |
| 688 } | 678 } |
