comparison modules/postgresql/postgresql.c @ 4981:4aebb0131297

Cleanups/renaming of EXTERNAL_TO_C_STRING and friends -------------------- ChangeLog entries follow: -------------------- modules/ChangeLog addition: 2010-02-05 Ben Wing <ben@xemacs.org> * postgresql/postgresql.c: * postgresql/postgresql.c (CHECK_LIVE_CONNECTION): * postgresql/postgresql.c (Fpq_connectdb): * postgresql/postgresql.c (Fpq_connect_start): * postgresql/postgresql.c (Fpq_lo_import): * postgresql/postgresql.c (Fpq_lo_export): * ldap/eldap.c (Fldap_open): * ldap/eldap.c (Fldap_search_basic): * ldap/eldap.c (Fldap_add): * ldap/eldap.c (Fldap_modify): * ldap/eldap.c (Fldap_delete): * canna/canna_api.c (Fcanna_initialize): * canna/canna_api.c (Fcanna_store_yomi): * canna/canna_api.c (Fcanna_parse): * canna/canna_api.c (Fcanna_henkan_begin): EXTERNAL_TO_C_STRING returns its argument instead of storing it in a parameter, and is renamed to EXTERNAL_TO_ITEXT. Similar things happen to related macros. See entry in src/ChangeLog. More Mule-izing of postgresql.c. Extract out common code between `pq-connectdb' and `pq-connect-start'. Fix places that signal an error string using a formatted string to instead follow the standard and have a fixed reason followed by the particular error message stored as one of the frobs. src/ChangeLog addition: 2010-02-05 Ben Wing <ben@xemacs.org> * console-msw.c (write_string_to_mswindows_debugging_output): * console-msw.c (Fmswindows_message_box): * console-x.c (x_perhaps_init_unseen_key_defaults): * console.c: * database.c (dbm_get): * database.c (dbm_put): * database.c (dbm_remove): * database.c (berkdb_get): * database.c (berkdb_put): * database.c (berkdb_remove): * database.c (Fopen_database): * device-gtk.c (gtk_init_device): * device-msw.c (msprinter_init_device_internal): * device-msw.c (msprinter_default_printer): * device-msw.c (msprinter_init_device): * device-msw.c (sync_printer_with_devmode): * device-msw.c (Fmsprinter_select_settings): * device-x.c (sanity_check_geometry_resource): * device-x.c (Dynarr_add_validified_lisp_string): * device-x.c (x_init_device): * device-x.c (Fx_put_resource): * device-x.c (Fx_valid_keysym_name_p): * device-x.c (Fx_set_font_path): * dialog-msw.c (push_lisp_string_as_unicode): * dialog-msw.c (handle_directory_dialog_box): * dialog-msw.c (handle_file_dialog_box): * dialog-x.c (dbox_descriptor_to_widget_value): * editfns.c (Fformat_time_string): * editfns.c (Fencode_time): * editfns.c (Fset_time_zone_rule): * emacs.c (make_argc_argv): * emacs.c (Fdump_emacs): * emodules.c (emodules_load): * eval.c: * eval.c (maybe_signal_error_1): * event-msw.c (Fdde_alloc_advise_item): * event-msw.c (mswindows_dde_callback): * event-msw.c (mswindows_wnd_proc): * fileio.c (report_error_with_errno): * fileio.c (Fsysnetunam): * fileio.c (Fdo_auto_save): * font-mgr.c (extract_fcapi_string): * font-mgr.c (Ffc_config_app_font_add_file): * font-mgr.c (Ffc_config_app_font_add_dir): * font-mgr.c (Ffc_config_filename): * frame-gtk.c (gtk_set_frame_text_value): * frame-gtk.c (gtk_create_widgets): * frame-msw.c (mswindows_init_frame_1): * frame-msw.c (mswindows_set_title_from_ibyte): * frame-msw.c (msprinter_init_frame_3): * frame-x.c (x_set_frame_text_value): * frame-x.c (x_set_frame_properties): * frame-x.c (start_drag_internal_1): * frame-x.c (x_cde_transfer_callback): * frame-x.c (x_create_widgets): * glyphs-eimage.c (my_jpeg_output_message): * glyphs-eimage.c (jpeg_instantiate): * glyphs-eimage.c (gif_instantiate): * glyphs-eimage.c (png_instantiate): * glyphs-eimage.c (tiff_instantiate): * glyphs-gtk.c (xbm_instantiate_1): * glyphs-gtk.c (gtk_xbm_instantiate): * glyphs-gtk.c (gtk_xpm_instantiate): * glyphs-gtk.c (gtk_xface_instantiate): * glyphs-gtk.c (cursor_font_instantiate): * glyphs-gtk.c (gtk_redisplay_widget): * glyphs-gtk.c (gtk_widget_instantiate_1): * glyphs-gtk.c (gtk_add_tab_item): * glyphs-msw.c (mswindows_xpm_instantiate): * glyphs-msw.c (bmp_instantiate): * glyphs-msw.c (mswindows_resource_instantiate): * glyphs-msw.c (xbm_instantiate_1): * glyphs-msw.c (mswindows_xbm_instantiate): * glyphs-msw.c (mswindows_xface_instantiate): * glyphs-msw.c (mswindows_redisplay_widget): * glyphs-msw.c (mswindows_widget_instantiate): * glyphs-msw.c (add_tree_item): * glyphs-msw.c (add_tab_item): * glyphs-msw.c (mswindows_combo_box_instantiate): * glyphs-msw.c (mswindows_widget_query_string_geometry): * glyphs-x.c (x_locate_pixmap_file): * glyphs-x.c (xbm_instantiate_1): * glyphs-x.c (x_xbm_instantiate): * glyphs-x.c (extract_xpm_color_names): * glyphs-x.c (x_xpm_instantiate): * glyphs-x.c (x_xface_instantiate): * glyphs-x.c (autodetect_instantiate): * glyphs-x.c (safe_XLoadFont): * glyphs-x.c (cursor_font_instantiate): * glyphs-x.c (x_redisplay_widget): * glyphs-x.c (Fchange_subwindow_property): * glyphs-x.c (x_widget_instantiate): * glyphs-x.c (x_tab_control_redisplay): * glyphs.c (pixmap_to_lisp_data): * gui-x.c (menu_separator_style_and_to_external): * gui-x.c (add_accel_and_to_external): * gui-x.c (button_item_to_widget_value): * hpplay.c (player_error_internal): * hpplay.c (play_sound_file): * hpplay.c (play_sound_data): * intl.c (Fset_current_locale): * lisp.h: * menubar-gtk.c (gtk_xemacs_set_accel_keys): * menubar-msw.c (populate_menu_add_item): * menubar-msw.c (populate_or_checksum_helper): * menubar-x.c (menu_item_descriptor_to_widget_value_1): * nt.c (init_user_info): * nt.c (get_long_basename): * nt.c (nt_get_resource): * nt.c (init_mswindows_environment): * nt.c (get_cached_volume_information): * nt.c (mswindows_readdir): * nt.c (read_unc_volume): * nt.c (mswindows_stat): * nt.c (mswindows_getdcwd): * nt.c (mswindows_executable_type): * nt.c (Fmswindows_short_file_name): * ntplay.c (nt_play_sound_file): * objects-gtk.c: * objects-gtk.c (gtk_valid_color_name_p): * objects-gtk.c (gtk_initialize_font_instance): * objects-gtk.c (gtk_font_list): * objects-msw.c (font_enum_callback_2): * objects-msw.c (parse_font_spec): * objects-x.c (x_parse_nearest_color): * objects-x.c (x_valid_color_name_p): * objects-x.c (x_initialize_font_instance): * objects-x.c (x_font_instance_truename): * objects-x.c (x_font_list): * objects-xlike-inc.c (XFUN): * objects-xlike-inc.c (xft_find_charset_font): * process-nt.c (mswindows_report_winsock_error): * process-nt.c (nt_create_process): * process-nt.c (get_internet_address): * process-nt.c (nt_open_network_stream): * process-unix.c: * process-unix.c (allocate_pty): * process-unix.c (get_internet_address): * process-unix.c (unix_canonicalize_host_name): * process-unix.c (unix_open_network_stream): * realpath.c: * select-common.h (lisp_data_to_selection_data): * select-gtk.c (symbol_to_gtk_atom): * select-gtk.c (atom_to_symbol): * select-msw.c (symbol_to_ms_cf): * select-msw.c (mswindows_register_selection_data_type): * select-x.c (symbol_to_x_atom): * select-x.c (x_atom_to_symbol): * select-x.c (hack_motif_clipboard_selection): * select-x.c (Fx_store_cutbuffer_internal): * sound.c (Fplay_sound_file): * sound.c (Fplay_sound): * sound.h (sound_perror): * sysdep.c: * sysdep.c (qxe_allocating_getcwd): * sysdep.c (qxe_execve): * sysdep.c (copy_in_passwd): * sysdep.c (qxe_getpwnam): * sysdep.c (qxe_ctime): * sysdll.c (dll_open): * sysdll.c (dll_function): * sysdll.c (dll_variable): * sysdll.c (search_linked_libs): * sysdll.c (dll_error): * sysfile.h: * sysfile.h (PATHNAME_CONVERT_OUT_TSTR): * sysfile.h (PATHNAME_CONVERT_OUT_UTF_8): * sysfile.h (PATHNAME_CONVERT_OUT): * sysfile.h (LISP_PATHNAME_CONVERT_OUT): * syswindows.h (ITEXT_TO_TSTR): * syswindows.h (LOCAL_FILE_FORMAT_TO_TSTR): * syswindows.h (TSTR_TO_LOCAL_FILE_FORMAT): * syswindows.h (LOCAL_FILE_FORMAT_TO_INTERNAL_MSWIN): * syswindows.h (LISP_LOCAL_FILE_FORMAT_MAYBE_URL_TO_TSTR): * text.h: * text.h (eicpy_ext_len): * text.h (enum new_dfc_src_type): * text.h (EXTERNAL_TO_ITEXT): * text.h (GET_STRERROR): * tooltalk.c (check_status): * tooltalk.c (Fadd_tooltalk_message_arg): * tooltalk.c (Fadd_tooltalk_pattern_attribute): * tooltalk.c (Fadd_tooltalk_pattern_arg): * win32.c (tstr_to_local_file_format): * win32.c (mswindows_lisp_error_1): * win32.c (mswindows_report_process_error): * win32.c (Fmswindows_shell_execute): * win32.c (mswindows_read_link_1): Changes involving external/internal format conversion, mostly code cleanup and renaming. 1. Eliminate the previous macros like LISP_STRING_TO_EXTERNAL that stored its result in a parameter. The new version of LISP_STRING_TO_EXTERNAL returns its result through the return value, same as the previous NEW_LISP_STRING_TO_EXTERNAL. Use the new-style macros throughout the code. 2. Rename C_STRING_TO_EXTERNAL and friends to ITEXT_TO_EXTERNAL, in keeping with overall naming rationalization involving Itext and related types. Macros involved in previous two: EXTERNAL_TO_C_STRING -> EXTERNAL_TO_ITEXT EXTERNAL_TO_C_STRING_MALLOC -> EXTERNAL_TO_ITEXT_MALLOC SIZED_EXTERNAL_TO_C_STRING -> SIZED_EXTERNAL_TO_ITEXT SIZED_EXTERNAL_TO_C_STRING_MALLOC -> SIZED_EXTERNAL_TO_ITEXT_MALLOC C_STRING_TO_EXTERNAL -> ITEXT_TO_EXTERNAL C_STRING_TO_EXTERNAL_MALLOC -> ITEXT_TO_EXTERNAL_MALLOC LISP_STRING_TO_EXTERNAL LISP_STRING_TO_EXTERNAL_MALLOC LISP_STRING_TO_TSTR C_STRING_TO_TSTR -> ITEXT_TO_TSTR TSTR_TO_C_STRING -> TSTR_TO_ITEXT The following four still return their values through parameters, since they have more than one value to return: C_STRING_TO_SIZED_EXTERNAL -> ITEXT_TO_SIZED_EXTERNAL LISP_STRING_TO_SIZED_EXTERNAL C_STRING_TO_SIZED_EXTERNAL_MALLOC -> ITEXT_TO_SIZED_EXTERNAL_MALLOC LISP_STRING_TO_SIZED_EXTERNAL_MALLOC Sometimes additional casts had to be inserted, since the old macros played strange games and completely defeated the type system of the store params. 3. Rewrite many places where direct calls to TO_EXTERNAL_FORMAT occurred with calls to one of the convenience macros listed above, or to make_extstring(). 4. Eliminate SIZED_C_STRING macros (they were hardly used, anyway) and use a direct call to TO_EXTERNAL_FORMAT or TO_INTERNAL_FORMAT. 4. Use LISP_PATHNAME_CONVERT_OUT in many places instead of something like LISP_STRING_TO_EXTERNAL(..., Qfile_name). 5. Eliminate some temporary variables that are no longer necessary now that we return a value rather than storing it into a variable. 6. Some Mule-izing in database.c. 7. Error functions: -- A bit of code cleanup in maybe_signal_error_1. -- Eliminate report_file_type_error; it's just an alias for signal_error_2 with params in a different order. -- Fix some places in the hostname-handling code that directly inserted externally-retrieved error strings into the supposed ASCII "reason" param instead of doing the right thing and sticking text descriptive of what was going on in "reason" and putting the external message in a frob. 8. Use Ascbyte instead of CIbyte in process-unix.c and maybe one or two other places. 9. Some code cleanup in copy_in_passwd() in sysdep.c. 10. Fix a real bug due to accidental variable shadowing in tstr_to_local_file_format() in win32.c.
author Ben Wing <ben@xemacs.org>
date Fri, 05 Feb 2010 11:02:24 -0600
parents 304aebb79cd3
children b5df3737028a
comparison
equal deleted inserted replaced
4972:c448f4c38d65 4981:4aebb0131297
95 #endif 95 #endif
96 96
97 /* #define POSTGRES_LO_IMPORT_IS_VOID 1 */ 97 /* #define POSTGRES_LO_IMPORT_IS_VOID 1 */
98 98
99 #include "lisp.h" 99 #include "lisp.h"
100 #include "sysdep.h"
101 100
102 #include "buffer.h" 101 #include "buffer.h"
103 #include "postgresql.h" 102 #include "postgresql.h"
104 #include "process.h" 103 #include "process.h"
105 #ifdef HAVE_SHLIB 104 #ifdef HAVE_SHLIB
106 # include "emodules.h" 105 # include "emodules.h"
107 #endif 106 #endif
107 #include "sysdep.h"
108 #include "sysfile.h"
108 109
109 #ifdef RUNNING_XEMACS_21_1 /* handle interface changes */ 110 #ifdef RUNNING_XEMACS_21_1 /* handle interface changes */
110 #define PG_OS_CODING FORMAT_FILENAME 111 #define PG_OS_CODING FORMAT_FILENAME
111 #define TO_EXTERNAL_FORMAT(a,from,b,to,c) GET_C_STRING_EXT_DATA_ALLOCA(from,FORMAT_FILENAME,to) 112 #define TO_EXTERNAL_FORMAT(a,from,b,to,c) GET_C_STRING_EXT_DATA_ALLOCA(from,FORMAT_FILENAME,to)
112 #else 113 #else
121 #define CHECK_LIVE_CONNECTION(P) \ 122 #define CHECK_LIVE_CONNECTION(P) \
122 do \ 123 do \
123 { \ 124 { \
124 if (!P || (PQstatus (P) != CONNECTION_OK)) \ 125 if (!P || (PQstatus (P) != CONNECTION_OK)) \
125 { \ 126 { \
126 const Ibyte *err; \ 127 Lisp_Object err; \
127 \ 128 \
128 if (P) \ 129 if (P) \
129 err = NEW_EXTERNAL_TO_C_STRING (PQerrorMessage (P), PG_OS_CODING); \ 130 err = build_extstring (PQerrorMessage (P), PG_OS_CODING); \
130 else \ 131 else \
131 err = (const Ibyte *) "bad value"; \ 132 err = build_msg_string ("Bad value"); \
132 signal_ferror (Qprocess_error, "dead connection [%s]", err); \ 133 signal_error (Qprocess_error, "Dead connection", err); \
133 } \ 134 } \
134 } \ 135 } \
135 while (0) 136 while (0)
136 137
137 #define PUKE_IF_NULL(p) \ 138 #define PUKE_IF_NULL(p) \
138 do \ 139 do \
139 { \ 140 { \
140 if (!p) signal_error (Qinvalid_argument, "bad value", Qunbound); \ 141 if (!p) signal_error (Qinvalid_argument, "Bad value", Qunbound); \
141 } \ 142 } \
142 while (0) 143 while (0)
144
145 #define SIGNAL_ERROR(p, reason) \
146 do \
147 { \
148 signal_error (Qprocess_error, reason, \
149 build_extstring (PQerrorMessage (p), PG_OS_CODING)); \
150 } \
151 while (0)
143 152
144 static Lisp_Object VXPGHOST; 153 static Lisp_Object VXPGHOST;
145 static Lisp_Object VXPGUSER; 154 static Lisp_Object VXPGUSER;
146 static Lisp_Object VXPGOPTIONS; 155 static Lisp_Object VXPGOPTIONS;
147 static Lisp_Object VXPGPORT; 156 static Lisp_Object VXPGPORT;
477 486
478 /* PQconnectdb Makes a new connection to a backend. 487 /* PQconnectdb Makes a new connection to a backend.
479 PGconn *PQconnectdb(const char *conninfo) 488 PGconn *PQconnectdb(const char *conninfo)
480 */ 489 */
481 490
482 /* ###autoload */ 491 #ifdef HAVE_POSTGRESQLV7
483 DEFUN ("pq-connectdb", Fpq_connectdb, 1, 1, 0, /* 492 #define USED_IF_V7(x) x
484 Make a new connection to a PostgreSQL backend. 493 #else
485 */ 494 #define USED_IF_V7(x) UNUSED (x)
486 (conninfo)) 495 #endif
496
497 static Lisp_Object
498 postgresql_connect (Lisp_Object conninfo, int USED_IF_V7 (async))
487 { 499 {
488 PGconn *P; 500 PGconn *P;
489 Lisp_PGconn *lisp_pgconn; 501 Lisp_PGconn *lisp_pgconn;
490 const Ascbyte *error_message = "Out of Memory?";
491 Extbyte *c_conninfo;
492 502
493 CHECK_STRING (conninfo); 503 CHECK_STRING (conninfo);
494 504
495 LISP_STRING_TO_EXTERNAL (conninfo, c_conninfo, PG_OS_CODING); 505 P = (
496 P = PQconnectdb (c_conninfo); 506 #ifdef HAVE_POSTGRESQLV7
507 async ? PQconnectStart :
508 #endif
509 PQconnectdb)
510 (LISP_STRING_TO_EXTERNAL (conninfo, PG_OS_CODING));
497 if (P && (PQstatus (P) == CONNECTION_OK)) 511 if (P && (PQstatus (P) == CONNECTION_OK))
498 { 512 {
499 (void)PQsetNoticeProcessor (P, xemacs_notice_processor, NULL); 513 (void) PQsetNoticeProcessor (P, xemacs_notice_processor, NULL);
500 lisp_pgconn = allocate_pgconn (); 514 lisp_pgconn = allocate_pgconn ();
501 lisp_pgconn->pgconn = P; 515 lisp_pgconn->pgconn = P;
502 return make_pgconn (lisp_pgconn); 516 return make_pgconn (lisp_pgconn);
503 } 517 }
504 else 518 else
505 { 519 {
506 /* Connection failed. Destroy the connection and signal an error. */ 520 /* Connection failed. Destroy the connection and signal an error. */
507 Ibyte *errmsg = (Ibyte *) error_message; 521
522 Lisp_Object errmsg;
508 if (P) 523 if (P)
509 { 524 {
510 /* storage for the error message gets erased when call PQfinish */ 525 errmsg = build_extstring (PQerrorMessage (P), PG_OS_CODING);
511 /* so we must temporarily stash it somewhere -- make alloca() copy */
512 errmsg = NEW_EXTERNAL_TO_C_STRING (PQerrorMessage (P), PG_OS_CODING);
513 IBYTE_STRING_TO_ALLOCA (errmsg, errmsg);
514 PQfinish (P); 526 PQfinish (P);
515 } 527 }
516 signal_ferror (Qprocess_error, "libpq: %s", errmsg); 528 else
529 errmsg = build_msg_string ("Out of Memory?");
530 signal_error (Qprocess_error, "Connecting to PostGreSQL backend",
531 errmsg);
517 } 532 }
533 }
534
535 /* ###autoload */
536 DEFUN ("pq-connectdb", Fpq_connectdb, 1, 1, 0, /*
537 Make a new connection to a PostgreSQL backend.
538 */
539 (conninfo))
540 {
541 return postgresql_connect (conninfo, 0);
518 } 542 }
519 543
520 /* PQconnectStart Makes a new asynchronous connection to a backend. 544 /* PQconnectStart Makes a new asynchronous connection to a backend.
521 PGconn *PQconnectStart(const char *conninfo) 545 PGconn *PQconnectStart(const char *conninfo)
522 */ 546 */
526 DEFUN ("pq-connect-start", Fpq_connect_start, 1, 1, 0, /* 550 DEFUN ("pq-connect-start", Fpq_connect_start, 1, 1, 0, /*
527 Make a new asynchronous connection to a PostgreSQL backend. 551 Make a new asynchronous connection to a PostgreSQL backend.
528 */ 552 */
529 (conninfo)) 553 (conninfo))
530 { 554 {
531 PGconn *P; 555 return postgresql_connect (conninfo, 1);
532 Lisp_PGconn *lisp_pgconn;
533 const Ascbyte *error_message = "Out of Memory?";
534 Extbyte *c_conninfo;
535
536 CHECK_STRING (conninfo);
537
538 LISP_STRING_TO_EXTERNAL (conninfo, c_conninfo, PG_OS_CODING);
539 P = PQconnectStart (c_conninfo);
540
541 if (P && (PQstatus (P) != CONNECTION_BAD))
542 {
543 (void)PQsetNoticeProcessor (P, xemacs_notice_processor, NULL);
544 lisp_pgconn = allocate_pgconn ();
545 lisp_pgconn->pgconn = P;
546
547 return make_pgconn (lisp_pgconn);
548 }
549 else
550 {
551 /* capture the error message before destroying the object */
552 char buf[BLCKSZ];
553 strcpy (buf, error_message);
554 if (P)
555 {
556 strncpy (buf, PQerrorMessage (P), sizeof (buf));
557 buf[sizeof (buf) - 1] = '\0';
558 PQfinish (P);
559 }
560 signal_ferror (Qprocess_error, "libpq: %s", buf);
561 }
562 } 556 }
563 557
564 DEFUN ("pq-connect-poll", Fpq_connect_poll, 1, 1, 0, /* 558 DEFUN ("pq-connect-poll", Fpq_connect_poll, 1, 1, 0, /*
565 Poll an asynchronous connection for completion 559 Poll an asynchronous connection for completion
566 */ 560 */
577 polling_status = PQconnectPoll (P); 571 polling_status = PQconnectPoll (P);
578 switch (polling_status) 572 switch (polling_status)
579 { 573 {
580 case PGRES_POLLING_FAILED: 574 case PGRES_POLLING_FAILED:
581 /* Something Bad has happened */ 575 /* Something Bad has happened */
582 { 576 SIGNAL_ERROR (P, "Polling asynchronous connection");
583 char *e = PQerrorMessage (P);
584 signal_ferror (Qprocess_error, "libpq: %s", e);
585 }
586 case PGRES_POLLING_OK: 577 case PGRES_POLLING_OK:
587 return Qpgres_polling_ok; 578 return Qpgres_polling_ok;
588 case PGRES_POLLING_READING: 579 case PGRES_POLLING_READING:
589 return Qpgres_polling_reading; 580 return Qpgres_polling_reading;
590 case PGRES_POLLING_WRITING: 581 case PGRES_POLLING_WRITING:
743 CHECK_PGCONN (conn); 734 CHECK_PGCONN (conn);
744 P = (XPGCONN (conn))->pgconn; 735 P = (XPGCONN (conn))->pgconn;
745 CHECK_LIVE_CONNECTION (P); 736 CHECK_LIVE_CONNECTION (P);
746 737
747 if (PQresetStart (P)) return Qt; 738 if (PQresetStart (P)) return Qt;
748 { 739 SIGNAL_ERROR (P, "Resetting connection");
749 char *e = PQerrorMessage (P);
750 signal_ferror (Qprocess_error, "libpq: %s", e);
751 }
752 } 740 }
753 741
754 DEFUN ("pq-reset-poll", Fpq_reset_poll, 1, 1, 0, /* 742 DEFUN ("pq-reset-poll", Fpq_reset_poll, 1, 1, 0, /*
755 Poll an asynchronous reset for completion. 743 Poll an asynchronous reset for completion.
756 */ 744 */
766 754
767 polling_status = PQresetPoll (P); 755 polling_status = PQresetPoll (P);
768 switch (polling_status) 756 switch (polling_status)
769 { 757 {
770 case PGRES_POLLING_FAILED: 758 case PGRES_POLLING_FAILED:
771 /* Something Bad has happened */ 759 SIGNAL_ERROR (P, "Polling asynchronous reset");
772 {
773 char *e = PQerrorMessage (P);
774 signal_ferror (Qprocess_error, "libpq: %s", e);
775 }
776 case PGRES_POLLING_OK: 760 case PGRES_POLLING_OK:
777 return Qpgres_polling_ok; 761 return Qpgres_polling_ok;
778 case PGRES_POLLING_READING: 762 case PGRES_POLLING_READING:
779 return Qpgres_polling_reading; 763 return Qpgres_polling_reading;
780 case PGRES_POLLING_WRITING: 764 case PGRES_POLLING_WRITING:
982 966
983 TO_EXTERNAL_FORMAT (LISP_STRING, query, 967 TO_EXTERNAL_FORMAT (LISP_STRING, query,
984 C_STRING_ALLOCA, c_query, Qnative); 968 C_STRING_ALLOCA, c_query, Qnative);
985 969
986 if (PQsendQuery (P, c_query)) return Qt; 970 if (PQsendQuery (P, c_query)) return Qt;
987 else signal_ferror (Qprocess_error, "async query: %s", PQerrorMessage (P)); 971 else SIGNAL_ERROR (P, "Sending asynchronous query");
988 } 972 }
989 973
990 DEFUN ("pq-get-result", Fpq_get_result, 1, 1, 0, /* 974 DEFUN ("pq-get-result", Fpq_get_result, 1, 1, 0, /*
991 Retrieve an asynchronous result from a query. 975 Retrieve an asynchronous result from a query.
992 NIL is returned when no more query work remains. 976 NIL is returned when no more query work remains.
1420 CHECK_STRING (filename); 1404 CHECK_STRING (filename);
1421 1405
1422 P = (XPGCONN (conn))->pgconn; 1406 P = (XPGCONN (conn))->pgconn;
1423 CHECK_LIVE_CONNECTION (P); 1407 CHECK_LIVE_CONNECTION (P);
1424 1408
1425 TO_EXTERNAL_FORMAT (LISP_STRING, filename, 1409 LISP_PATHNAME_CONVERT_OUT (filename, c_filename);
1426 C_STRING_ALLOCA, c_filename,
1427 Qfile_name);
1428 1410
1429 return make_int ((int)lo_import (P, c_filename)); 1411 return make_int ((int)lo_import (P, c_filename));
1430 } 1412 }
1431 1413
1432 DEFUN ("pq-lo-export", Fpq_lo_export, 3, 3, 0, /* 1414 DEFUN ("pq-lo-export", Fpq_lo_export, 3, 3, 0, /*
1441 CHECK_STRING (filename); 1423 CHECK_STRING (filename);
1442 1424
1443 P = (XPGCONN (conn))->pgconn; 1425 P = (XPGCONN (conn))->pgconn;
1444 CHECK_LIVE_CONNECTION (P); 1426 CHECK_LIVE_CONNECTION (P);
1445 1427
1446 TO_EXTERNAL_FORMAT (LISP_STRING, filename, 1428 LISP_PATHNAME_CONVERT_OUT (filename, c_filename);
1447 C_STRING_ALLOCA, c_filename, Qfile_name);
1448 1429
1449 return make_int ((int)lo_export (P, XINT (oid), c_filename)); 1430 return make_int ((int)lo_export (P, XINT (oid), c_filename));
1450 } 1431 }
1451 1432
1452 DEFUN ("pq-make-empty-pgresult", Fpq_make_empty_pgresult, 2, 2, 0, /* 1433 DEFUN ("pq-make-empty-pgresult", Fpq_make_empty_pgresult, 2, 2, 0, /*