misc.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:5k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /* Module:          misc.c
  2.  *
  3.  * Description:     This module contains miscellaneous routines
  4.  *                  such as for debugging/logging and string functions.
  5.  *
  6.  * Classes:         n/a
  7.  *
  8.  * API functions:   none
  9.  *
  10.  * Comments:        See "notice.txt" for copyright and license information.
  11.  *
  12.  */
  13. #include <stdio.h>
  14. #include <varargs.h>
  15. #include <string.h>
  16. #include "psqlodbc.h"
  17. #ifndef WIN32
  18. #if HAVE_PWD_H
  19. #include <pwd.h>
  20. #endif
  21. #include <sys/types.h>
  22. #include <unistd.h>
  23. #else
  24. #include <process.h> /* Byron: is this where Windows keeps def. of getpid ? */
  25. #endif
  26. extern GLOBAL_VALUES globals;
  27. void generate_filename(char*,char*,char*);
  28. void
  29. generate_filename(char* dirname,char* prefix,char* filename)
  30. {
  31. int pid = 0;
  32. #ifndef WIN32
  33. struct passwd *ptr = 0;
  34. ptr = getpwuid(getuid());
  35. #endif
  36. pid = getpid();
  37. if(dirname == 0 || filename == 0)
  38. return;
  39. strcpy(filename,dirname);
  40. strcat(filename,DIRSEPARATOR);
  41. if(prefix != 0)
  42. strcat(filename,prefix);
  43. #ifndef WIN32
  44. strcat(filename,ptr->pw_name);
  45. #endif
  46. sprintf(filename,"%s%u%s",filename,pid,".log");
  47. return;
  48. }
  49. #ifdef MY_LOG
  50. void
  51. mylog(va_alist)
  52. va_dcl
  53. {
  54. char *fmt;
  55. char *args;
  56. char filebuf[80];
  57. FILE* LOGFP = globals.mylogFP;
  58. if ( globals.debug) {
  59. va_start(args);
  60. fmt = va_arg(args, char *);
  61. if (! LOGFP) {
  62. generate_filename(MYLOGDIR,MYLOGFILE,filebuf);
  63. #ifndef __CYGWIN32__
  64. LOGFP = fopen(filebuf, "w");
  65. #else
  66. LOGFP = fopen(filebuf, "wb");
  67. #endif
  68. globals.mylogFP = LOGFP;
  69. setbuf(LOGFP, NULL);
  70. }
  71. if (LOGFP)
  72. vfprintf(LOGFP, fmt, args);
  73. va_end(args);
  74. }
  75. }
  76. #endif
  77. #ifdef Q_LOG
  78. void qlog(va_alist)
  79. va_dcl
  80. {
  81. char *fmt;
  82. char *args;
  83. char filebuf[80];
  84. FILE* LOGFP = globals.qlogFP;
  85. if ( globals.commlog) {
  86. va_start(args);
  87. fmt = va_arg(args, char *);
  88. if (! LOGFP) {
  89. generate_filename(QLOGDIR,QLOGFILE,filebuf);
  90. #ifndef __CYGWIN32__
  91. LOGFP = fopen(filebuf, "w");
  92. #else
  93. LOGFP = fopen(filebuf, "wb");
  94. #endif
  95. globals.qlogFP = LOGFP;
  96. setbuf(LOGFP, NULL);
  97. }
  98. if (LOGFP)
  99. vfprintf(LOGFP, fmt, args);
  100. va_end(args);
  101. }
  102. }
  103. #endif
  104. /*  Undefine these because windows.h will redefine and cause a warning */
  105. #ifdef HAVE_CONFIG_H
  106. #include "config.h"
  107. #endif
  108. #ifdef WIN32
  109. #undef va_start
  110. #undef va_end
  111. #endif
  112. #ifndef WIN32
  113. #include "iodbc.h"
  114. #include "isql.h"
  115. #else
  116. #include <windows.h>
  117. #include <sql.h>
  118. #endif
  119.  
  120. /* returns STRCPY_FAIL, STRCPY_TRUNCATED, or #bytes copied (not including null term) */
  121. int 
  122. my_strcpy(char *dst, int dst_len, char *src, int src_len)
  123. {
  124. if (dst_len <= 0)
  125. return STRCPY_FAIL;
  126. if (src_len == SQL_NULL_DATA) {
  127. dst[0] = '';
  128. return STRCPY_NULL;
  129. }
  130. else if (src_len == SQL_NTS)
  131. src_len = strlen(src);
  132. if (src_len <= 0)
  133. return STRCPY_FAIL;
  134. else {
  135. if (src_len < dst_len) {
  136. memcpy(dst, src, src_len);
  137. dst[src_len] = '';
  138. }
  139. else { 
  140. memcpy(dst, src, dst_len-1);
  141. dst[dst_len-1] = ''; /* truncated */
  142. return STRCPY_TRUNCATED;
  143. }
  144. }
  145. return strlen(dst);
  146. }
  147. // strncpy copies up to len characters, and doesn't terminate
  148. // the destination string if src has len characters or more.
  149. // instead, I want it to copy up to len-1 characters and always
  150. // terminate the destination string.
  151. char *strncpy_null(char *dst, const char *src, int len)
  152. {
  153. int i;
  154. if (NULL != dst) {
  155. /*  Just in case, check for special lengths */
  156. if (len == SQL_NULL_DATA) {
  157. dst[0] = '';
  158. return NULL;
  159. }
  160. else if (len == SQL_NTS)
  161. len = strlen(src) + 1;
  162. for(i = 0; src[i] && i < len - 1; i++) {
  163. dst[i] = src[i];
  164. }
  165. if(len > 0) {
  166. dst[i] = '';
  167. }
  168. }
  169. return dst;
  170. }
  171. // Create a null terminated string (handling the SQL_NTS thing):
  172. // 1. If buf is supplied, place the string in there (assumes enough space) and return buf.
  173. // 2. If buf is not supplied, malloc space and return this string
  174. char *
  175. make_string(char *s, int len, char *buf)
  176. {
  177. int length;
  178. char *str;
  179.     if(s && (len > 0 || (len == SQL_NTS && strlen(s) > 0))) {
  180. length = (len > 0) ? len : strlen(s);
  181. if (buf) {
  182. strncpy_null(buf, s, length+1);
  183. return buf;
  184. }
  185.         str = malloc(length + 1);
  186. if ( ! str)
  187. return NULL;
  188.         strncpy_null(str, s, length+1);
  189. return str;
  190. }
  191. return NULL;
  192. }
  193. // Concatenate a single formatted argument to a given buffer handling the SQL_NTS thing.
  194. // "fmt" must contain somewhere in it the single form '%.*s'
  195. // This is heavily used in creating queries for info routines (SQLTables, SQLColumns).
  196. // This routine could be modified to use vsprintf() to handle multiple arguments.
  197. char *
  198. my_strcat(char *buf, char *fmt, char *s, int len)
  199. {
  200.     if (s && (len > 0 || (len == SQL_NTS && strlen(s) > 0))) {
  201. int length = (len > 0) ? len : strlen(s);
  202. int pos = strlen(buf);
  203. sprintf(&buf[pos], fmt, length, s);
  204. return buf;
  205. }
  206. return NULL;
  207. }
  208. void remove_newlines(char *string)
  209. {
  210.     unsigned int i;
  211.     for(i=0; i < strlen(string); i++) {
  212.         if((string[i] == 'n') ||
  213.            (string[i] == 'r')) {
  214.             string[i] = ' ';
  215.         }
  216.     }
  217. }
  218. char *
  219. trim(char *s)
  220. {
  221. int i;
  222. for (i = strlen(s) - 1; i >= 0; i--) {
  223. if (s[i] == ' ')
  224. s[i] = '';
  225. else
  226. break;
  227. }
  228. return s;
  229. }