mem.c
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:14k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: mem.c,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 20:35:02  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* FreeTDS - Library of routines accessing Sybase and Microsoft databases
  10.  * Copyright (C) 1998-1999  Brian Bruns
  11.  *
  12.  * This library is free software; you can redistribute it and/or
  13.  * modify it under the terms of the GNU Library General Public
  14.  * License as published by the Free Software Foundation; either
  15.  * version 2 of the License, or (at your option) any later version.
  16.  *
  17.  * This library is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  20.  * Library General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU Library General Public
  23.  * License along with this library; if not, write to the
  24.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  25.  * Boston, MA 02111-1307, USA.
  26.  */
  27. #include <tds_config.h>
  28. #include "tds.h"
  29. #include "tdsutil.h"
  30. #ifdef NCBI_FTDS
  31. #if HAVE_ICONV
  32. #include <iconv.h>
  33. #endif
  34. #ifdef __cplusplus
  35. extern "C" {
  36. #endif
  37. typedef struct tdsiconvinfo {
  38. int use_iconv;
  39. #if HAVE_ICONV
  40.      iconv_t cdto;
  41.      iconv_t cdfrom;
  42. #endif
  43. } TDSICONVINFO;
  44. #ifdef __cplusplus
  45. }
  46. #endif 
  47. #else
  48. #include "tdsiconv.h"
  49. #endif
  50. #ifdef DMALLOC
  51. #include <dmalloc.h>
  52. #endif
  53. static char  software_version[]   = "$Id: mem.c,v 1000.0 2003/10/29 20:35:02 gouriano Exp $";
  54. static void *no_unused_var_warn[] = {software_version,
  55.                                      no_unused_var_warn};
  56. TDSENVINFO *tds_alloc_env(TDSSOCKET *tds);
  57. void tds_free_env(TDSSOCKET *tds);
  58. TDSDYNAMIC *tds_alloc_dynamic(TDSSOCKET *tds, char *id)
  59. {
  60. int i;
  61. /* if this is the first dynamic stmt */
  62. if (!tds->num_dyns) {
  63. tds->dyns = (TDSDYNAMIC **) malloc(sizeof(TDSDYNAMIC *));
  64. tds->dyns[0] = (TDSDYNAMIC *) malloc(sizeof(TDSDYNAMIC));
  65. memset(tds->dyns[0], 0, sizeof(TDSDYNAMIC));
  66. strncpy(tds->dyns[0]->id, id, TDS_MAX_DYNID_LEN);
  67. tds->dyns[0]->id[TDS_MAX_DYNID_LEN-1]='';
  68. tds->num_dyns++;
  69. return tds->dyns[0];
  70. }
  71. /* otherwise check to see if id already exists (shouldn't) */
  72. for (i=0;i<tds->num_dyns;i++) {
  73. if (!strcmp(tds->dyns[i]->id, id)) {
  74. /* id already exists! just return it */
  75. return(tds->dyns[i]);
  76. }
  77. }
  78. /* ok, we have a list and need to add another */
  79. tds->dyns = (TDSDYNAMIC **) 
  80. realloc(tds->dyns, sizeof(TDSDYNAMIC *) * tds->num_dyns);
  81. tds->dyns[tds->num_dyns] = (TDSDYNAMIC *) malloc(sizeof(TDSDYNAMIC));
  82. memset(tds->dyns[tds->num_dyns], 0, sizeof(TDSDYNAMIC));
  83. strncpy(tds->dyns[tds->num_dyns]->id, id, TDS_MAX_DYNID_LEN);
  84. tds->dyns[tds->num_dyns]->id[TDS_MAX_DYNID_LEN-1]='';
  85. tds->num_dyns++;
  86. return tds->dyns[tds->num_dyns-1];
  87. }
  88. TDSINPUTPARAM *tds_add_input_param(TDSDYNAMIC *dyn)
  89. {
  90. TDSINPUTPARAM *param;
  91. if (!dyn->num_params) {
  92. param = (TDSINPUTPARAM *) malloc(sizeof(TDSINPUTPARAM));
  93. memset(param,'',sizeof(TDSINPUTPARAM));
  94. dyn->num_params=1;
  95. dyn->params = (TDSINPUTPARAM **) 
  96. malloc(sizeof(TDSINPUTPARAM *));
  97. dyn->params[0] = param;
  98. } else {
  99. param = (TDSINPUTPARAM *) malloc(sizeof(TDSINPUTPARAM));
  100. memset(param,'',sizeof(TDSINPUTPARAM));
  101. dyn->num_params++;
  102. dyn->params = (TDSINPUTPARAM **) 
  103. realloc(dyn->params, 
  104. sizeof(TDSINPUTPARAM *) * dyn->num_params);
  105. dyn->params[dyn->num_params-1] = param;
  106. }
  107. return param;
  108. }
  109. void tds_free_input_params(TDSDYNAMIC *dyn)
  110. {
  111. int i;
  112. if (dyn->num_params) {
  113. for (i=0;i<dyn->num_params;i++) {
  114. free(dyn->params[i]);
  115. }
  116. free(dyn->params);
  117. dyn->num_params = 0;
  118. }
  119. }
  120. void tds_free_dynamic(TDSSOCKET *tds)
  121. {
  122. int i;
  123. TDSDYNAMIC *dyn;
  124. for (i=0;i<tds->num_dyns;i++) {
  125. dyn = tds->dyns[i];
  126. tds_free_input_params(dyn);
  127. free(dyn);
  128. }
  129. if (tds->dyns) TDS_ZERO_FREE(tds->dyns);
  130. tds->num_dyns = 0;
  131. return;
  132. }
  133. /*
  134. ** tds_alloc_param_result() works a bit differently than the other alloc result
  135. ** functions.  Output parameters come in individually with no total number 
  136. ** given in advance, so we simply call this func every time with get a
  137. ** TDS_PARAM_TOKEN and let it realloc the columns struct one bigger. 
  138. ** tds_free_all_results() usually cleans up after us.
  139. */
  140. TDSPARAMINFO *tds_alloc_param_result(TDSPARAMINFO *old_param)
  141. {
  142. TDSPARAMINFO *param_info;
  143. if (!old_param) {
  144. param_info = (TDSPARAMINFO *) malloc(sizeof(TDSPARAMINFO));
  145. memset(param_info,'',sizeof(TDSPARAMINFO));
  146. param_info->num_cols=1;
  147. param_info->columns = (TDSCOLINFO **) 
  148. malloc(sizeof(TDSCOLINFO *));
  149. param_info->columns[0] = (TDSCOLINFO *) malloc(sizeof(TDSCOLINFO));
  150. memset(param_info->columns[0],'',sizeof(TDSCOLINFO));
  151. } else {
  152. param_info = old_param;
  153. param_info->num_cols++;
  154. param_info->columns = (TDSCOLINFO **) 
  155. realloc(param_info->columns, 
  156. sizeof(TDSCOLINFO *) * param_info->num_cols);
  157. param_info->columns[param_info->num_cols-1] =
  158.         (TDSCOLINFO *) malloc(sizeof(TDSCOLINFO));
  159. memset(param_info->columns[param_info->num_cols-1],'',
  160. sizeof(TDSCOLINFO));
  161. }
  162. return param_info;
  163. }
  164. TDSCOMPUTEINFO *tds_alloc_compute_results(int num_cols)
  165. {
  166. /*TDSCOLINFO *curcol;
  167.  */
  168. TDSCOMPUTEINFO *comp_info;
  169. int col;
  170. comp_info = (TDSCOMPUTEINFO *) malloc(sizeof(TDSCOMPUTEINFO));
  171. memset(comp_info,'',sizeof(TDSCOMPUTEINFO));
  172. comp_info->columns = (TDSCOLINFO **) 
  173. malloc(sizeof(TDSCOLINFO *) * num_cols);
  174. for (col=0;col<num_cols;col++)  {
  175. comp_info->columns[col] = (TDSCOLINFO *) malloc(sizeof(TDSCOLINFO));
  176. memset(comp_info->columns[col],'',sizeof(TDSCOLINFO));
  177. }
  178. comp_info->num_cols = num_cols;
  179. return comp_info;
  180. }
  181. TDSRESULTINFO *tds_alloc_results(int num_cols)
  182. {
  183. /*TDSCOLINFO *curcol;
  184.  */
  185. TDSRESULTINFO *res_info;
  186. int col;
  187. int null_sz;
  188. res_info = (TDSRESULTINFO *) malloc(sizeof(TDSRESULTINFO));
  189. memset(res_info,'',sizeof(TDSRESULTINFO));
  190. res_info->columns = (TDSCOLINFO **) 
  191. malloc(sizeof(TDSCOLINFO *) * num_cols);
  192. for (col=0;col<num_cols;col++)  {
  193. res_info->columns[col] = (TDSCOLINFO *) malloc(sizeof(TDSCOLINFO));
  194. memset(res_info->columns[col],'',sizeof(TDSCOLINFO));
  195. }
  196. res_info->num_cols = num_cols;
  197. null_sz = (num_cols/8) + 1;
  198. /* 4 byte alignment fix -- should be ifdef'ed to only platforms that 
  199. ** need it */
  200. if (null_sz % 4) null_sz = ((null_sz/4)+1)*4;
  201. res_info->null_info_size = null_sz;
  202. /* set the initial row size to the size of the null info */
  203. res_info->row_size = res_info->null_info_size;
  204. return res_info;
  205. }
  206. void *tds_alloc_row(TDSRESULTINFO *res_info)
  207. {
  208. void *ptr;
  209. ptr = (void *) malloc(res_info->row_size);
  210. memset(ptr,'',res_info->row_size); 
  211. return ptr;
  212. }
  213. void tds_free_param_results(TDSPARAMINFO *param_info)
  214. {
  215. int i;
  216. if(param_info)
  217. {
  218. for (i=0;i<param_info->num_cols;i++)
  219. {
  220. if(param_info->columns[i])
  221. TDS_ZERO_FREE(param_info->columns[i]);
  222. }
  223. if (param_info->num_cols) TDS_ZERO_FREE(param_info->columns);
  224. if (param_info->current_row) TDS_ZERO_FREE(param_info->current_row);
  225. TDS_ZERO_FREE(param_info);
  226. }
  227. }
  228. void tds_free_compute_results(TDSCOMPUTEINFO *comp_info)
  229. {
  230. int i;
  231. if(comp_info)
  232. {
  233. for (i=0;i<comp_info->num_cols;i++)
  234. {
  235. if(comp_info->columns[i])
  236. TDS_ZERO_FREE(comp_info->columns[i]);
  237. }
  238. if (comp_info->num_cols) TDS_ZERO_FREE(comp_info->columns);
  239. if (comp_info->current_row) TDS_ZERO_FREE(comp_info->current_row);
  240. TDS_ZERO_FREE(comp_info);
  241. }
  242. }
  243. void tds_free_results(TDSRESULTINFO *res_info)
  244. {
  245. int i;
  246. if(res_info)
  247. {
  248. if (res_info->current_row) TDS_ZERO_FREE(res_info->current_row);
  249. for (i=0;i<res_info->num_cols;i++)
  250. {
  251. if(res_info->columns && res_info->columns[i])
  252. tds_free_column(res_info->columns[i]);
  253. }
  254. if (res_info->num_cols) TDS_ZERO_FREE(res_info->columns);
  255. TDS_ZERO_FREE(res_info);
  256. }
  257. }
  258. void tds_free_all_results(TDSSOCKET *tds)
  259. {
  260. tds_free_results(tds->res_info);
  261. tds->res_info = NULL;
  262. tds_free_param_results(tds->param_info);
  263. tds->param_info = NULL;
  264. tds_free_compute_results(tds->comp_info);
  265. tds->comp_info = NULL;
  266. }
  267. void tds_free_column(TDSCOLINFO *column)
  268. {
  269. if (column->column_textvalue) TDS_ZERO_FREE(column->column_textvalue);
  270. TDS_ZERO_FREE(column);
  271. }
  272. TDSCONTEXT *tds_alloc_context()
  273. {
  274. TDSCONTEXT *context;
  275. context = (TDSCONTEXT *) malloc(sizeof(TDSCONTEXT));
  276. memset(context, '', sizeof(TDSCONTEXT));
  277. context->locale = tds_get_locale();
  278. return context;
  279. }
  280. void tds_free_context(TDSCONTEXT *context)
  281. {
  282. if (context->locale) tds_free_locale(context->locale);
  283. TDS_ZERO_FREE(context);
  284. }
  285. TDSLOCINFO *tds_alloc_locale()
  286. {
  287. TDSLOCINFO *locale;
  288. locale = (TDSLOCINFO *) malloc(sizeof(TDSLOCINFO));
  289. memset(locale, '', sizeof(TDSLOCINFO));
  290. return locale;
  291. }
  292. TDSCONFIGINFO *tds_alloc_config(TDSLOCINFO *locale)
  293. {
  294. TDSCONFIGINFO *config;
  295. char hostname[30];
  296. config = (TDSCONFIGINFO *) malloc(sizeof(TDSCONFIGINFO));
  297. memset(config, '', sizeof(TDSCONFIGINFO));
  298. /* fill in all hardcoded defaults */
  299. config->server_name = strdup(TDS_DEF_SERVER);
  300. config->major_version = TDS_DEF_MAJOR;
  301. config->minor_version = TDS_DEF_MINOR;
  302. #ifdef NCBI_FTDS
  303. config->port[0] = TDS_DEF_PORT;
  304. #else
  305. config->port = TDS_DEF_PORT;
  306. #endif
  307. config->block_size = TDS_DEF_BLKSZ;
  308. if (locale) {
  309. if (locale->language) 
  310.          config->language = strdup(locale->language);
  311. else 
  312.          config->language = strdup(TDS_DEF_LANG);
  313. if (locale->char_set) 
  314.          config->char_set = strdup(locale->char_set);
  315. else 
  316.          config->char_set = strdup(TDS_DEF_CHARSET);
  317. }
  318. config->try_server_login = 1;
  319. memset(hostname,'', 30);
  320. gethostname(hostname,30);
  321. hostname[29]=''; /* make sure it's truncated */
  322. config->host_name = strdup(hostname);
  323. return config;
  324. }
  325. TDSLOGIN *tds_alloc_login()
  326. {
  327. TDSLOGIN *tds_login;
  328. static const unsigned char defaultcaps[] = {0x01,0x07,0x03,109,127,0xFF,0xFF,0xFF,0xFE,0x02,0x07,0x00,0x00,0x0A,104,0x00,0x00,0x00};
  329. char *tdsver;
  330. tds_login = (TDSLOGIN *) malloc(sizeof(TDSLOGIN));
  331. memset(tds_login, '', sizeof(TDSLOGIN));
  332. if ((tdsver=getenv("TDSVER"))) {
  333. if (!strcmp(tdsver,"42") || !strcmp(tdsver,"4.2")) {
  334. tds_login->major_version=4;
  335. tds_login->minor_version=2;
  336. } else if (!strcmp(tdsver,"46") || !strcmp(tdsver,"4.6")) {
  337. tds_login->major_version=4;
  338. tds_login->minor_version=6;
  339. } else if (!strcmp(tdsver,"50") || !strcmp(tdsver,"5.0")) {
  340. tds_login->major_version=5;
  341. tds_login->minor_version=0;
  342. } else if (!strcmp(tdsver,"70") || !strcmp(tdsver,"7.0")) {
  343. tds_login->major_version=7;
  344. tds_login->minor_version=0;
  345. } else if (!strcmp(tdsver,"80") || !strcmp(tdsver,"8.0")) {
  346. tds_login->major_version=8;
  347. tds_login->minor_version=0;
  348. }
  349. /* else unrecognized...use compile time default above */
  350. }
  351. memcpy(tds_login->capabilities,defaultcaps,TDS_MAX_CAPABILITY);
  352. return tds_login;
  353. }
  354. void tds_free_login(TDSLOGIN *login)
  355. {
  356. if (login) {
  357. /* for security reason clear memory */
  358. memset(login->password,0,sizeof(login->password));
  359. free(login);
  360. }
  361. }
  362. TDSSOCKET *tds_alloc_socket(TDSCONTEXT *context, int bufsize)
  363. {
  364. TDSSOCKET *tds_socket;
  365. TDSICONVINFO *iconv;
  366. tds_socket = (TDSSOCKET *) malloc(sizeof(TDSSOCKET));
  367. memset(tds_socket, '', sizeof(TDSSOCKET));
  368. tds_socket->tds_ctx = context;
  369. tds_socket->in_buf_max=0;
  370. tds_socket->out_buf = (unsigned char *) malloc(bufsize);
  371. tds_socket->msg_info = (TDSMSGINFO *) malloc(sizeof(TDSMSGINFO));
  372. memset(tds_socket->msg_info,'',sizeof(TDSMSGINFO));
  373. tds_socket->parent = (char*)NULL;
  374. tds_socket->env = tds_alloc_env(tds_socket);
  375. iconv = (TDSICONVINFO *) malloc(sizeof(TDSICONVINFO));
  376. tds_socket->iconv_info = (void *) iconv;
  377. memset(tds_socket->iconv_info,'',sizeof(TDSICONVINFO));
  378. #if HAVE_ICONV
  379. iconv->cdfrom = (iconv_t)-1;
  380. iconv->cdto = (iconv_t)-1;
  381. #endif
  382. /* Jeff's hack, init to no timeout */
  383. tds_socket->timeout = 0;                
  384. tds_init_write_buf(tds_socket);
  385. return tds_socket;
  386. }
  387. TDSSOCKET *tds_realloc_socket(int bufsize)
  388. {
  389.    return NULL; /* XXX */
  390. }
  391. void tds_free_socket(TDSSOCKET *tds)
  392. {
  393. TDSICONVINFO *iconv_info;
  394. if (tds) {
  395. tds_free_all_results(tds);
  396. tds_free_env(tds);
  397. tds_free_dynamic(tds);
  398. if (tds->msg_info) {
  399. tds_free_msg(tds->msg_info); /* dnr */
  400. TDS_ZERO_FREE(tds->msg_info);
  401. }
  402. if (tds->in_buf) TDS_ZERO_FREE(tds->in_buf);
  403. if (tds->out_buf) TDS_ZERO_FREE(tds->out_buf);
  404. if (tds->s) close(tds->s);
  405. if (tds->date_fmt) free(tds->date_fmt);
  406. if (tds->iconv_info) {
  407. iconv_info = (TDSICONVINFO *) tds->iconv_info;
  408. if (iconv_info->use_iconv) tds_iconv_close(tds);
  409. free(tds->iconv_info);
  410. }
  411. if (tds->date_fmt) free(tds->date_fmt);
  412. TDS_ZERO_FREE(tds);
  413. }
  414. }
  415. void tds_free_locale(TDSLOCINFO *locale)
  416. {
  417. if (locale->language) free(locale->language);
  418. if (locale->char_set) free(locale->char_set);
  419. if (locale->date_fmt) free(locale->date_fmt);
  420. TDS_ZERO_FREE(locale);
  421. }
  422. void tds_free_config(TDSCONFIGINFO *config)
  423. {
  424. if (config->server_name) free(config->server_name);
  425. if (config->host_name) free(config->host_name);
  426. #ifdef NCBI_FTDS
  427. {int i;
  428.     for(i= 0; i < NCBI_NUM_SERVERS; i++) {
  429.         if(config->ip_addr[i]) free(config->ip_addr[i]);
  430.     }
  431. }
  432. #else
  433. if (config->ip_addr) free(config->ip_addr);
  434. #endif
  435. if (config->language) free(config->language);
  436. if (config->char_set) free(config->char_set);
  437. if (config->database) free(config->database);
  438. if (config->dump_file) free(config->dump_file);
  439. if (config->default_domain) free(config->default_domain);
  440. if (config->client_charset) free(config->client_charset);
  441. /* dnr */
  442. if (config->host) free(config->host);
  443. if (config->app_name) free(config->app_name);
  444. if (config->user_name) free(config->user_name);
  445. if (config->password) {
  446. /* for security reason clear memory */
  447. memset(config->password,0,strlen(config->password));
  448. free(config->password);
  449. }
  450. if (config->library) free(config->library);
  451. /* !dnr */
  452. TDS_ZERO_FREE(config);
  453. }
  454. TDSENVINFO *tds_alloc_env(TDSSOCKET *tds)
  455. {
  456. TDSENVINFO *env;
  457. env = (TDSENVINFO *) malloc(sizeof(TDSENVINFO));
  458. memset(env,'',sizeof(TDSENVINFO));
  459. env->block_size = 512;
  460. return env;
  461. }
  462. void tds_free_env(TDSSOCKET *tds)
  463. {
  464. if (tds->env) {
  465. if (tds->env->language)
  466. TDS_ZERO_FREE(tds->env->language);
  467. if (tds->env->charset)
  468. TDS_ZERO_FREE(tds->env->charset);
  469. if (tds->env->database)
  470. TDS_ZERO_FREE(tds->env->database);
  471. TDS_ZERO_FREE(tds->env);
  472. }
  473. }
  474. void tds_free_msg(TDSMSGINFO *msg_info)
  475. {
  476. if (msg_info) {
  477. if(msg_info->message) TDS_ZERO_FREE(msg_info->message);
  478. if(msg_info->server) TDS_ZERO_FREE(msg_info->server);
  479. if(msg_info->proc_name) TDS_ZERO_FREE(msg_info->proc_name);
  480. if(msg_info->sql_state) TDS_ZERO_FREE(msg_info->sql_state);
  481. }
  482. }