Re: LOAD broken? - Mailing list pgsql-bugs

From Tom Lane
Subject Re: LOAD broken?
Date
Msg-id 5768.1062901323@sss.pgh.pa.us
Whole thread Raw
In response to LOAD broken?  (Dennis Bjorklund <db@zigo.dhs.org>)
List pgsql-bugs
Dennis Bjorklund <db@zigo.dhs.org> writes:
> I've got a C function in a .so that I use in postgres. While developing it
> I want to reload the dynamic library. The docs says that LOAD should do
> the trick but nothing happens when I use it.

You're right, this seems not to work on Linux.  I've applied the
attached patch to CVS tip.

            regards, tom lane

*** src/backend/utils/fmgr/dfmgr.c.orig    Sun Aug  3 23:01:07 2003
--- src/backend/utils/fmgr/dfmgr.c    Sat Sep  6 22:13:25 2003
***************
*** 177,183 ****
  load_file(char *filename)
  {
      DynamicFileList *file_scanner,
!                *p;
      struct stat stat_buf;
      char       *fullname;

--- 178,185 ----
  load_file(char *filename)
  {
      DynamicFileList *file_scanner,
!                *prv,
!                *nxt;
      struct stat stat_buf;
      char       *fullname;

***************
*** 196,226 ****
                  (errcode_for_file_access(),
                   errmsg("could not access file \"%s\": %m", fullname)));

!     if (file_list != (DynamicFileList *) NULL)
      {
!         if (SAME_INODE(stat_buf, *file_list))
          {
!             p = file_list;
!             file_list = p->next;
!             pg_dlclose(p->handle);
!             free((char *) p);
          }
          else
!         {
!             for (file_scanner = file_list;
!                  file_scanner->next != (DynamicFileList *) NULL;
!                  file_scanner = file_scanner->next)
!             {
!                 if (SAME_INODE(stat_buf, *(file_scanner->next)))
!                 {
!                     p = file_scanner->next;
!                     file_scanner->next = p->next;
!                     pg_dlclose(p->handle);
!                     free((char *) p);
!                     break;
!                 }
!             }
!         }
      }

      load_external_function(fullname, (char *) NULL, false, (void *) NULL);
--- 198,224 ----
                  (errcode_for_file_access(),
                   errmsg("could not access file \"%s\": %m", fullname)));

!     /*
!      * We have to zap all entries in the list that match on either filename
!      * or inode, else load_external_function() won't do anything.
!      */
!     prv = NULL;
!     for (file_scanner = file_list; file_scanner != NULL; file_scanner = nxt)
      {
!         nxt = file_scanner->next;
!         if (strcmp(fullname, file_scanner->filename) == 0 ||
!             SAME_INODE(stat_buf, *file_scanner))
          {
!             if (prv)
!                 prv->next = nxt;
!             else
!                 file_list = nxt;
!             pg_dlclose(file_scanner->handle);
!             free((char *) file_scanner);
!             /* prv does not change */
          }
          else
!             prv = file_scanner;
      }

      load_external_function(fullname, (char *) NULL, false, (void *) NULL);

pgsql-bugs by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: pl/pgsql problem with search_path
Next
From: "Gaetano Mendola"
Date:
Subject: Re: pl/pgsql problem with search_path