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 }