Force a checkpoint in CREATE DATABASE before starting to copy the files,
[PostgreSQL.git] / src / backend / port / dynloader / win32.c
blobab5f5af7509dbe663dea1f3e53b4a9850e8870dd
1 /* $PostgreSQL$ */
3 #include "postgres.h"
5 char *dlerror(void);
6 int dlclose(void *handle);
7 void *dlsym(void *handle, const char *symbol);
8 void *dlopen(const char *path, int mode);
10 static char last_dyn_error[512];
12 static void
13 set_dl_error(void)
15 DWORD err = GetLastError();
17 if (FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS |
18 FORMAT_MESSAGE_FROM_SYSTEM,
19 NULL,
20 err,
21 MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT),
22 last_dyn_error,
23 sizeof(last_dyn_error) - 1,
24 NULL) == 0)
26 snprintf(last_dyn_error, sizeof(last_dyn_error) - 1,
27 "unknown error %lu", err);
31 char *
32 dlerror(void)
34 if (last_dyn_error[0])
35 return last_dyn_error;
36 else
37 return NULL;
40 int
41 dlclose(void *handle)
43 if (!FreeLibrary((HMODULE) handle))
45 set_dl_error();
46 return 1;
48 last_dyn_error[0] = 0;
49 return 0;
52 void *
53 dlsym(void *handle, const char *symbol)
55 void *ptr;
57 ptr = GetProcAddress((HMODULE) handle, symbol);
58 if (!ptr)
60 set_dl_error();
61 return NULL;
63 last_dyn_error[0] = 0;
64 return ptr;
67 void *
68 dlopen(const char *path, int mode)
70 HMODULE h;
71 int prevmode;
73 /* Disable popup error messages when loading DLLs */
74 prevmode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
75 h = LoadLibrary(path);
76 SetErrorMode(prevmode);
78 if (!h)
80 set_dl_error();
81 return NULL;
83 last_dyn_error[0] = 0;
84 return (void *) h;