Annotation of libwww/Library/src/HTSQL.c, revision 2.1
2.1 ! frystyk 1: /* HTSQL.c
! 2: ** MYSQL INTERFACE MODULE
! 3: **
! 4: ** (c) COPYRIGHT MIT 1995.
! 5: ** Please first read the full copyright statement in the file COPYRIGH.
! 6: ** @(#) $Id: HTSQLLog.c,v 2.1 1998/05/04 19:37:19 frystyk Exp $
! 7: **
! 8: ** This module interacts with the MYSQL C client library to perform
! 9: ** SQL operations. It is not intended as a complete SQL API but handles
! 10: ** most of the typical error situations talking to an SQL server so that
! 11: ** the caller doesn't have to think about it.
! 12: **
! 13: ** History:
! 14: ** 23 Apr 98 Henrik Frystyk, frystyk@w3.org
! 15: */
! 16:
! 17: /* Library include files */
! 18: #include "WWWLib.h"
! 19: #include "HTSQL.h" /* Implemented here */
! 20:
! 21: #include <mysql/mysql.h>
! 22: #include <mysql/errmsg.h>
! 23:
! 24: struct _HTSQL {
! 25: MYSQL server;
! 26: MYSQL * psvr;
! 27: const char * host;
! 28: const char * user;
! 29: const char * password; /* @@@ Should be scambled! @@@ */
! 30: const char * db;
! 31: };
! 32:
! 33: /* ------------------------------------------------------------------------- */
! 34:
! 35: PRIVATE int sql_datetimestr (char ** ptr, time_t t)
! 36: {
! 37: int length = -1;
! 38: if (t > 0 && *ptr) {
! 39: #if defined(HT_REENTRANT) || defined(SOLARIS)
! 40: struct tm gmt;
! 41: struct * pgmt = gmtime_r(&t, &gmt);
! 42: #else
! 43: struct tm *pgmt = gmtime(&t);
! 44: #endif /* SOLARIS || HT_REENTRANT */
! 45:
! 46: #ifdef HAVE_STRFTIME
! 47: length = strftime(*ptr, 40, "\'%Y-%m-%d %H:%M:%S\'", pgmt);
! 48: #else
! 49: length = sprintf(*ptr, "\'%04d-%02d-%02d %02d:%02d:%02d\'",
! 50: pgmt->tm_year + 1900,
! 51: pgmt->tm_mon + 1,
! 52: pgmt->tm_wday + 1,
! 53: pgmt->tm_hour,
! 54: pgmt->tm_min,
! 55: pgmt->tm_sec);
! 56: #endif /* HAVE_STRFTIME */
! 57:
! 58: /* Remove the trailing zero */
! 59: *ptr = *ptr + strlen(*ptr);
! 60: **ptr++ = ' ';
! 61: }
! 62: return length;
! 63: }
! 64:
! 65: PUBLIC char * HTSQL_printf (char * buf, int length, char * fmt, ...)
! 66: {
! 67: va_list pArgs;
! 68: char * p=fmt;
! 69: char * q=buf;
! 70: char * cpar;
! 71: unsigned upar;
! 72: long lpar;
! 73: time_t tpar;
! 74: va_start(pArgs, fmt);
! 75: while (*p && length>0) {
! 76: if (*p == '%') {
! 77: switch (*++p) {
! 78: case 's':
! 79: if ((cpar = va_arg(pArgs, char *)) != NULL) {
! 80: char * cp = cpar;
! 81: while ((*q++ = *cp++) && length-->0); q--;
! 82: } else {
! 83: *q++='n'; *q++='u'; *q++='l'; *q++='l';
! 84: length -= 4;
! 85: }
! 86: break;
! 87: case 'S':
! 88: if ((cpar = va_arg(pArgs, char *)) != NULL) {
! 89: char * cp = cpar;
! 90: *q++='\'';
! 91: mysql_escape_string(q, cp, strlen(cp));
! 92: while (*q) q++, length--;
! 93: *q++='\'';
! 94: } else {
! 95: *q++='n'; *q++='u'; *q++='l'; *q++='l';
! 96: length -= 4;
! 97: }
! 98: break;
! 99: case 'T':
! 100: if ((tpar = va_arg(pArgs, time_t)) > 0) {
! 101: length -= sql_datetimestr(&q, tpar);
! 102: } else {
! 103: *q++='n'; *q++='u'; *q++='l'; *q++='l';
! 104: length -= 4;
! 105: }
! 106: break;
! 107: case 'u':
! 108: if ((upar = va_arg(pArgs, unsigned int)) >= 0) {
! 109: char num[32];
! 110: char * nptr = num;
! 111: int i;
! 112: do {
! 113: i = upar % 10;
! 114: *nptr++ = i+'0';
! 115: upar /= 10;
! 116: } while (upar > 0);
! 117: while (nptr > num && length>0) *q++=*--nptr, length--;
! 118: } else {
! 119: *q++='0';
! 120: length--;
! 121: }
! 122: break;
! 123: case 'l':
! 124: if ((lpar = va_arg(pArgs, unsigned long)) >= 0) {
! 125: char num[32];
! 126: char * nptr = num;
! 127: int i;
! 128: do {
! 129: i = lpar % 10;
! 130: *nptr++ = i+'0';
! 131: lpar /= 10;
! 132: } while (lpar > 0);
! 133: while (nptr > num && length>0) *q++=*--nptr, length--;
! 134: } else {
! 135: *q++='0';
! 136: length--;
! 137: }
! 138: break;
! 139: default:
! 140: *q++=*p++;
! 141: length--;
! 142: }
! 143: p++;
! 144: } else {
! 145: *q++=*p++;
! 146: length--;
! 147: }
! 148: }
! 149: *q = '\0';
! 150: va_end(pArgs);
! 151: return buf;
! 152: }
! 153:
! 154: PUBLIC HTSQL * HTSQL_new (const char * host,
! 155: const char * user, const char * pw,
! 156: int flags)
! 157: {
! 158: HTSQL * me = NULL;
! 159: if (!host || !user || !pw) {
! 160: if (SQL_TRACE)
! 161: HTTrace("SQL new..... Missing host, user, or password\n");
! 162: return NULL;
! 163: }
! 164: if ((me = (HTSQL *) HT_CALLOC(1, sizeof(HTSQL))) == NULL)
! 165: HT_OUTOFMEM("HTSQL_new");
! 166: me->host = host;
! 167: me->user = user;
! 168: me->password = pw; /* @@@ scramble!!! @@@ */
! 169: return me;
! 170: }
! 171:
! 172: PUBLIC BOOL HTSQL_delete (HTSQL * me)
! 173: {
! 174: if (me) {
! 175: if (me->psvr) HTSQL_close(me);
! 176: HT_FREE(me);
! 177: return YES;
! 178: }
! 179: return NO;
! 180: }
! 181:
! 182: PUBLIC BOOL HTSQL_connect (HTSQL * me)
! 183: {
! 184: if (me && me->host) {
! 185: if (SQL_TRACE)
! 186: HTTrace("SQL connect. Open a link to server `%s\'\n", me->host);
! 187: if ((me->psvr = mysql_connect(&(me->server), me->host,
! 188: me->user ? me->user : "",
! 189: me->password ? me->password : "")) == NULL) {
! 190: if (SQL_TRACE)
! 191: HTTrace("SQL connect. `%s\' errno %d\n",
! 192: mysql_error(&me->server), mysql_errno(&me->server));
! 193: return NO;
! 194: }
! 195: return YES;
! 196: }
! 197: return NO;
! 198: }
! 199:
! 200: PUBLIC MYSQL * HTSQL_getMysql (HTSQL * me)
! 201: {
! 202: return me ? me->psvr : NULL;
! 203: }
! 204:
! 205: PUBLIC BOOL HTSQL_close (HTSQL * me)
! 206: {
! 207: if (me && me->psvr) {
! 208: if (SQL_TRACE)
! 209: HTTrace("SQL close... Link to host `%s\'\n", me->host);
! 210: mysql_close(me->psvr);
! 211: me->psvr = NULL;
! 212: me->db = NULL;
! 213: return YES;
! 214: }
! 215: return NO;
! 216: }
! 217:
! 218: PUBLIC BOOL HTSQL_version (HTSQL * me,
! 219: char ** server,
! 220: unsigned int * protocol_version,
! 221: char ** server_version,
! 222: char ** client_version)
! 223: {
! 224: if (me && me->psvr) {
! 225: if (*server) *server = mysql_get_server_info(me->psvr);
! 226: if (protocol_version) *protocol_version = mysql_get_proto_info(me->psvr);
! 227: if (*server_version) *server_version = mysql_get_server_info(me->psvr);
! 228: if (*client_version) *client_version = mysql_get_client_info();
! 229: return YES;
! 230: }
! 231: return NO;
! 232: }
! 233:
! 234: PUBLIC BOOL HTSQL_selectDB (HTSQL * me, const char * db)
! 235: {
! 236: BOOL created = NO;
! 237: if (me && me->psvr && db) {
! 238: if (SQL_TRACE)
! 239: HTTrace("SQL select.. Database `%s\'\n", db);
! 240: me->db = NULL;
! 241: if (mysql_select_db(me->psvr, db) < 0) {
! 242: int err = mysql_errno(me->psvr);
! 243: if (SQL_TRACE) HTTrace("SQL select.. `%s\', errno %d\n",
! 244: mysql_error(me->psvr), err);
! 245:
! 246: /* If the database couldn't be found then create a new one */
! 247: if (err == 1049) {
! 248: if (mysql_create_db(me->psvr, db) < 0) {
! 249: if (SQL_TRACE) HTTrace("SQL error... `%s\', errno %d\n",
! 250: mysql_error(me->psvr), err);
! 251: return NO;
! 252: }
! 253: created = YES;
! 254: } else
! 255: return NO;
! 256: }
! 257:
! 258: if (created) {
! 259: if (mysql_select_db(me->psvr, db) < 0) {
! 260: int err = mysql_errno(me->psvr);
! 261: if (SQL_TRACE) HTTrace("SQL select.. `%s\', errno %d\n",
! 262: mysql_error(me->psvr), err);
! 263: return NO;
! 264: }
! 265: }
! 266:
! 267: /* The database is now up and running */
! 268: me->db = db;
! 269: return YES;
! 270: }
! 271: return NO;
! 272: }
! 273:
! 274: PUBLIC BOOL HTSQL_query (HTSQL * me, const char * query)
! 275: {
! 276: if (SQL_TRACE)
! 277: HTTrace("SQL query... `%s\'\n", query ? query : "<null>");
! 278: if (me && me->psvr && query) {
! 279: if (mysql_query(me->psvr, query) < 0) {
! 280: int status = mysql_errno(me->psvr);
! 281: if (SQL_TRACE)
! 282: HTTrace("SQL query... `%s\' on query `%s\' with errno %d\n",
! 283: mysql_error(me->psvr), query, status);
! 284:
! 285: /* Check to see if we should try and reconnect */
! 286: if (status==CR_SERVER_GONE_ERROR || status==CR_SERVER_LOST) {
! 287: if (HTSQL_connect(me)==NO || HTSQL_selectDB(me, me->db)==NO)
! 288: return NO;
! 289: return (mysql_query(me->psvr, query) == 0);
! 290: }
! 291: return NO;
! 292: }
! 293: return YES;
! 294: }
! 295: return NO;
! 296: }
! 297:
! 298: PUBLIC int HTSQL_getLastInsertId (HTSQL * me)
! 299: {
! 300: return (me && me->psvr) ? mysql_insert_id(me->psvr) : -1;
! 301: }
! 302:
! 303: PUBLIC int HTSQL_GetAffectedRows (HTSQL * me)
! 304: {
! 305: return (me && me->psvr) ? mysql_affected_rows(me->psvr) : -1;
! 306: }
! 307:
! 308:
! 309: PUBLIC MYSQL_RES * HTSQL_storeResult (HTSQL * me)
! 310: {
! 311: MYSQL_RES * result = NULL;
! 312: if (me && me->psvr) {
! 313: if ((result = mysql_store_result(me->psvr)) == NULL) {
! 314: int status = mysql_errno(me->psvr);
! 315: if (SQL_TRACE)
! 316: HTTrace("SQL store... `%s\' with errno %d\n",
! 317: mysql_error(me->psvr), status);
! 318: }
! 319: }
! 320: return result;
! 321: }
! 322:
! 323: PUBLIC BOOL HTSQL_freeResult (MYSQL_RES * me)
! 324: {
! 325: if (me) {
! 326: mysql_free_result(me);
! 327: return YES;
! 328: }
! 329: return NO;
! 330: }
Webmaster