亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sqlite3odbc.c

?? 定時(shí)器for timer for ic chip
?? C
?? 第 1 頁 / 共 5 頁
字號(hào):
 * Get maximum display size and number of digits after decimal point
 * from field type specification.
 * @param typename field type specification
 * @param sqltype target SQL data type
 * @param mp pointer to maximum display size or NULL
 * @param dp pointer to number of digits after decimal point or NULL
 */

static void
getmd(const char *typename, int sqltype, int *mp, int *dp)
{
    int m = 0, d = 0;

    switch (sqltype) {
    case SQL_INTEGER:       m = 10; d = 9; break;
    case SQL_TINYINT:       m = 4; d = 3; break;
    case SQL_SMALLINT:      m = 6; d = 5; break;
    case SQL_FLOAT:         m = 25; d = 24; break;
    case SQL_DOUBLE:        m = 54; d = 53; break;
    case SQL_VARCHAR:       m = 255; d = 0; break;
#ifdef WINTERFACE
#ifdef SQL_WVARCHAR
    case SQL_WVARCHAR:      m = 255; d = 0; break;
#endif
#endif
#ifdef SQL_TYPE_DATE
    case SQL_TYPE_DATE:
#endif
    case SQL_DATE:          m = 10; d = 0; break;
#ifdef SQL_TYPE_TIME
    case SQL_TYPE_TIME:
#endif
    case SQL_TIME:          m = 8; d = 0; break;
#ifdef SQL_TYPE_TIMESTAMP
    case SQL_TYPE_TIMESTAMP:
#endif
    case SQL_TIMESTAMP:     m = 32; d = 0; break;
#ifdef SQL_LONGVARCHAR
    case SQL_LONGVARCHAR :  m = 65536; d = 0; break;
#endif
#ifdef WINTERFACE
#ifdef SQL_WLONGVARCHAR
    case SQL_WLONGVARCHAR:  m = 65536; d = 0; break;
#endif
#endif
    case SQL_VARBINARY:     m = 255; d = 0; break;
    case SQL_LONGVARBINARY: m = 65536; d = 0; break;
#ifdef SQL_BIGINT
    case SQL_BIGINT:        m = 20; d = 19; break;
#endif
    }
    if (m && typename) {
	int mm, dd;

	if (sscanf(typename, "%*[^(](%d)", &mm) == 1) {
	    m = d = mm;
	} else if (sscanf(typename, "%*[^(](%d,%d)", &mm, &dd) == 2) {
	    m = mm;
	    d = dd;
	}
    }
    if (mp) {
	*mp = m;
    }
    if (dp) {
	*dp = d;
    }
}

/**
 * Map SQL_C_DEFAULT to proper C type.
 * @param type input C type
 * @param stype input SQL type
 * @param nosign 0=signed, 0>unsigned, 0<undefined
 * @param nowchar when compiled with WINTERFACE don't use WCHAR
 * @result C type
 */

static int
mapdeftype(int type, int stype, int nosign, int nowchar)
{
    if (type == SQL_C_DEFAULT) {
	switch (stype) {
	case SQL_INTEGER:
	    type = (nosign > 0) ? SQL_C_ULONG : SQL_C_LONG;
	    break;
	case SQL_TINYINT:
	    type = (nosign > 0) ? SQL_C_UTINYINT : SQL_C_TINYINT;
	    break;
	case SQL_SMALLINT:
	    type = (nosign > 0) ? SQL_C_USHORT : SQL_C_SHORT;
	    break;
	case SQL_FLOAT:
	    type = SQL_C_FLOAT;
	    break;
	case SQL_DOUBLE:
	    type = SQL_C_DOUBLE;
	    break;
	case SQL_TIMESTAMP:
	    type = SQL_C_TIMESTAMP;
	    break;
	case SQL_TIME:
	    type = SQL_C_TIME;
	    break;
	case SQL_DATE:
	    type = SQL_C_DATE;
	    break;
#ifdef SQL_C_TYPE_TIMESTAMP
	case SQL_TYPE_TIMESTAMP:
	    type = SQL_C_TYPE_TIMESTAMP;
	    break;
#endif
#ifdef SQL_C_TYPE_TIME
	case SQL_TYPE_TIME:
	    type = SQL_C_TYPE_TIME;
	    break;
#endif
#ifdef SQL_C_TYPE_DATE
	case SQL_TYPE_DATE:
	    type = SQL_C_TYPE_DATE;
	    break;
#endif
#ifdef WINTERFACE
	case SQL_WVARCHAR:
	case SQL_WCHAR:
#ifdef SQL_WLONGVARCHAR
	case SQL_WLONGVARCHAR:
#endif
	    type = nowchar ? SQL_C_CHAR : SQL_C_WCHAR;
	    break;
#endif
	case SQL_BINARY:
	case SQL_VARBINARY:
	case SQL_LONGVARBINARY:
	    type = SQL_C_BINARY;
	    break;
#ifdef SQL_BIT
	case SQL_BIT:
	    type = SQL_C_BIT;
	    break;
#endif
#ifdef SQL_BIGINT
	case SQL_BIGINT:
	    type = (nosign > 0) ? SQL_C_UBIGINT : SQL_C_SBIGINT;
	    break;
#endif
	default:
#ifdef WINTERFACE
	    type = SQL_C_WCHAR;
#else
	    type = SQL_C_CHAR;
#endif
	}
    }
#ifdef WINTERFACE
    if (nowchar) {
	if (type == SQL_C_WCHAR) {
	    type = SQL_C_CHAR;
	}
    }
#endif
    return type;
}

/**
 * Fixup query string with optional parameter markers.
 * @param sql original query string
 * @param sqlLen length of query string or SQL_NTS
 * @param nparam output number of parameters
 * @param isselect output indicator for SELECT statement
 * @param errmsg output error message
 * @result newly allocated string containing query string for SQLite or NULL
 */

static char *
fixupsql(char *sql, int sqlLen, int *nparam, int *isselect, char **errmsg)
{
    char *q = sql, *qz = NULL, *p, *inq = NULL, *out;
    int np = 0, isddl = -1, size;

    *errmsg = NULL;
    if (sqlLen != SQL_NTS) {
	qz = q = xmalloc(sqlLen + 1);
	if (!qz) {
	    return NULL;
	}
	memcpy(q, sql, sqlLen);
	q[sqlLen] = '\0';
	size = sqlLen * 4;
    } else {
	size = strlen(sql) * 4;
    }
    size += sizeof (char *) - 1;
    size &= ~(sizeof (char *) - 1);
    p = xmalloc(size);
    if (!p) {
errout:
	freep(&qz);
	return NULL;
    }
    out = p;
    while (*q) {
	switch (*q) {
	case '\'':
	case '\"':
	    if (q == inq) {
		inq = NULL;
	    } else if (!inq) {
		inq = q + 1;

		while (*inq) {
		    if (*inq == *q) {
			if (inq[1] == *q) {
			    inq++;
			} else {
			    break;
			}
		    }
		    inq++;
		}
	    }
	    *p++ = *q;
	    break;
	case '?':
	    *p++ = *q;
	    if (!inq) {
		np++;
	    }
	    break;
	case ';':
	    if (!inq) {
		if (isddl < 0) {
		    char *qq = out;

		    while (*qq && ISSPACE(*qq)) {
			++qq;
		    }
		    if (*qq && *qq != ';') {
			size = strlen(qq);
			if ((size >= 5) &&
			    (strncasecmp(qq, "create", 5) == 0)) {
			    isddl = 1;
			} else if ((size >= 4) &&
				   (strncasecmp(qq, "drop", 4) == 0)) {
			    isddl = 1;
			} else {
			    isddl = 0;
			}
		    }
		}
		if (isddl == 0) {
		    char *qq = q;

		    do {
			++qq;
		    } while (*qq && ISSPACE(*qq));
		    if (*qq && *qq != ';') {
			freep(&out);
			*errmsg = "only one SQL statement allowed";
			goto errout;
		    }
		}
	    }
	    *p++ = *q;
	    break;
	case '{':
	    /* deal with {d 'YYYY-MM-DD'}, {t ...}, and {ts ...} */
	    if (!inq) {
		char *end = q + 1;

		while (*end && *end != '}') {
		    ++end;
		}
		if (*end == '}') {
		    char *start = q + 1;
		    char *end2 = end - 1;

		    while (start < end2 && *start != '\'') {
			++start;
		    }
		    while (end2 > start && *end2 != '\'') {
			--end2;
		    }
		    if (*start == '\'' && *end2 == '\'') {
			while (start <= end2) {
			    *p++ = *start;
			    ++start;
			}
			q = end;
			break;
		    }
		}
	    }
	    /* FALL THROUGH */
	default:
	    *p++ = *q;
	}
	++q;
    }
    freep(&qz);
    *p = '\0';
    if (nparam) {
	*nparam = np;
    }
    if (isselect) {
	if (isddl > 0) {
	    *isselect = 0;
	} else {
	    p = out;
	    while (*p && ISSPACE(*p)) {
		++p;
	    }
	    size = strlen(p);
	    *isselect = (size >= 6) && (strncasecmp(p, "select", 6) == 0);
	}
    }
    return out;
}

/**
 * Find column given name in string array.
 * @param cols string array
 * @param ncols number of strings
 * @param name column name
 * @result >= 0 on success, -1 on error
 */

static int
findcol(char **cols, int ncols, char *name)
{
    int i;

    if (cols) {
	for (i = 0; i < ncols; i++) {
	    if (strcmp(cols[i], name) == 0) {
		return i;
	    }
	}
    }
    return -1;
}

/**
 * Fixup column information for a running statement.
 * @param s statement to get fresh column information
 * @param d DBC pointer
 *
 * The column labels get the table names stripped
 * when there's more than one column and all table
 * names are identical.
 *
 * The "dyncols" field of STMT is filled with column
 * information obtained by SQLite "PRAGMA table_info"
 * for each column whose table name is known. If the
 * types are already present as with SQLite 2.5.7
 * this information is used instead.
 */

static void
fixupdyncols(STMT *s, DBC *d)
{
    int i, k, pk, nn, t, r, nrows, ncols;
    char **rowp, *flagp, flags[128];

    if (!s->dyncols) {
	return;
    }
    /* fixup labels */
    if (!s->longnames) {
	if (s->dcols > 1) {
	    char *table = s->dyncols[0].table;

	    for (i = 1; table[0] && i < s->dcols; i++) {
		if (strcmp(s->dyncols[i].table, table)) {
		    break;
		}
	    }
	    if (i >= s->dcols) {
		for (i = 0; i < s->dcols; i++) {
		    s->dyncols[i].label = s->dyncols[i].column;
		}
	    }
	} else if (s->dcols == 1) {
	    s->dyncols[0].label = s->dyncols[0].column;
	}
    }
    for (i = 0; i < s->dcols; i++) {
	s->dyncols[i].type =
	    mapsqltype(s->dyncols[i].typename, &s->dyncols[i].nosign, *s->ov3,
		       s->nowchar[0] || s->nowchar[1]);
	getmd(s->dyncols[i].typename, s->dyncols[i].type,
	      &s->dyncols[i].size, NULL);
#ifdef SQL_LONGVARCHAR
	if (s->dyncols[i].type == SQL_VARCHAR &&
	    s->dyncols[i].size > 255) {
	    s->dyncols[i].type = SQL_LONGVARCHAR;
	}
#endif
#ifdef WINTERFACE
#ifdef SQL_WLONGVARCHAR
	if (s->dyncols[i].type == SQL_WVARCHAR &&
	    s->dyncols[i].size > 255) {
	    s->dyncols[i].type = SQL_WLONGVARCHAR;
	}
#endif
#endif
	if (s->dyncols[i].type == SQL_VARBINARY &&
	    s->dyncols[i].size > 255) {
	    s->dyncols[i].type = SQL_LONGVARBINARY;
	}
    }
    if (s->dcols > array_size(flags)) {
	flagp = xmalloc(sizeof (flags[0]) * s->dcols);
	if (flagp == NULL) {
	    return;
	}
    } else {
	flagp = flags;
    }
    memset(flagp, 0, sizeof (flags[0]) * s->dcols);
    for (i = 0; i < s->dcols; i++) {
	s->dyncols[i].autoinc = SQL_FALSE;
	s->dyncols[i].notnull = SQL_NULLABLE;
    }
    for (i = 0; i < s->dcols; i++) {
	int ret, lastpk = -1, autoinccount = 0;
	char *sql;

	if (!s->dyncols[i].table[0]) {
	    continue;
	}
	if (flagp[i]) {
	    continue;
	}
	sql = sqlite3_mprintf("PRAGMA table_info(%Q)", s->dyncols[i].table);
	if (!sql) {
	    continue;
	}
	dbtraceapi(d, "sqlite3_get_table", sql);
	ret = sqlite3_get_table(d->sqlite, sql, &rowp, &nrows, &ncols, NULL);
	sqlite3_free(sql);
	if (ret != SQLITE_OK) {
	    continue;
	}
	k = findcol(rowp, ncols, "name");
	t = findcol(rowp, ncols, "type");
	pk = findcol(rowp, ncols, "pk");
	nn = findcol(rowp, ncols, "notnull");
	if (k < 0 || t < 0) {
	    goto freet;
	}
	for (r = 1; r <= nrows; r++) {
	    int m;

	    for (m = i; m < s->dcols; m++) {
		char *colname = s->dyncols[m].column;

		if (s->longnames) {
		    char *dotp = strchr(colname, '.');

		    if (dotp) {
			colname = dotp + 1;
		    }
		}
		if (!flagp[m] &&
		    strcmp(colname, rowp[r * ncols + k]) == 0 &&
		    strcmp(s->dyncols[m].table, s->dyncols[i].table) == 0) {
		    char *typename = rowp[r * ncols + t];

		    flagp[m] = 1;
		    freep(&s->dyncols[m].typename);
		    s->dyncols[m].typename = xstrdup(typename);
		    s->dyncols[m].type =
			mapsqltype(typename, &s->dyncols[m].nosign, *s->ov3,
				   s->nowchar[0] || s->nowchar[1]);
		    getmd(typename, s->dyncols[m].type, &s->dyncols[m].size,
			  NULL);
#ifdef SQL_LONGVARCHAR
		    if (s->dyncols[m].type == SQL_VARCHAR &&
			s->dyncols[m].size > 255) {
			s->dyncols[m].type = SQL_LONGVARCHAR;
		    }
#endif
#ifdef WINTERFACE
#ifdef SQL_WLONGVARCHAR
		    if (s->dyncols[i].type == SQL_WVARCHAR &&
			s->dyncols[i].size > 255) {
			s->dyncols[i].type = SQL_WLONGVARCHAR;
		    }
#endif
#endif
		    if (s->dyncols[i].type == SQL_VARBINARY &&
			s->dyncols[i].size > 255) {
			s->dyncols[i].type = SQL_LONGVARBINARY;
		    }
		    if (pk >= 0	&& strcmp(rowp[r * ncols + pk], "1") == 0) {
			if (++autoinccount > 1) {
			    if (lastpk >= 0) {
				s->dyncols[lastpk].autoinc = SQL_FALSE;
				lastpk = -1;
			    }
			} else {
			    lastpk = m;
			    if (strlen(typename) == 7 &&
				strncasecmp(typename, "integer", 7) == 0) {
				s->dyncols[m].autoinc = SQL_TRUE;
			    }
			}
		    }
		    if (nn >= 0 && rowp[r * ncols + nn][0] != '0') {
			s->dyncols[m].notnull = SQL_NO_NULLS;
		    }
		}
	    }
	}
freet:
	sqlite3_free_table(rowp);
    }
    if (flagp != flags) {
	freep(&flagp);
    }
}

/**
 * Return number of month days.
 * @param year
 * @param month 1..12
 * @result number of month days or 0
 */

static int
getmdays(int year, int month)
{
    static const int mdays[] = {
	31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
    };
    int mday;

    if (month < 1) {
	return 0;
    }
    mday = mdays[(month - 1) % 12];
    if (mday == 28 && year % 4 == 0 &&
	(!(year % 100 == 0) || year % 400 == 0)) {
	mday++;
    }
    return mday;
}

/**
 * Convert string to ODBC DATE_STRUCT.
 * @param str string to be converted
 * @param ds output DATE_STRUCT
 * @result 0 on success, -1 on error
 *
 * Strings of the format 'YYYYMMDD' or 'YYYY-MM-DD' or
 * 'YYYY/MM/DD' are converted to a DATE_STRUCT.
 */

static int
str2date(char *str, DATE_STRUCT *ds)
{
    int i, err = 0;
    char *p, *q;

    ds->year = ds->month = ds->day = 0;
    p = str;
    while (*p && !ISDIGIT(*p)) {
	++p;
    }
    q = p;
    i = 0;
    while (*q && !ISDIGIT(*q)) {
	++i;
	++q;
    }
    if (i >= 8) {
	char buf[8];

	strncpy(buf, p + 0, 4); buf[4] = '\0';
	ds->year = strtol(buf, NULL, 10);
	strncpy(buf, p + 4, 2); buf[2] = '\0';
	ds->month = strtol(buf, NULL, 10);
	strncpy(buf, p + 6, 2); buf[2] = '\0';
	ds->day = strtol(buf, NULL, 10);
	goto done;
    }
    i = 0;
    while (i < 3) {
	int n;

	q = NULL; 
	n = strtol(p, &q, 10);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费毛片高清视频| 国产精品欧美综合在线| 欧美性猛交一区二区三区精品| 成人a区在线观看| 成人国产精品免费观看视频| 国产成人精品亚洲777人妖| 九九九久久久精品| 国产精品99久| 成人一区二区三区| jiyouzz国产精品久久| 99精品久久只有精品| 91香蕉视频污在线| 色av一区二区| 91精品久久久久久久久99蜜臂| 欧美一区二区三区播放老司机| 日韩午夜在线播放| 久久精品男人天堂av| 国产精品欧美精品| 亚洲免费av高清| 亚洲sss视频在线视频| 日韩高清在线电影| 精品亚洲欧美一区| 成人精品视频一区| 色av综合在线| 日韩欧美一区二区久久婷婷| 精品剧情在线观看| 国产亚洲视频系列| 亚洲免费观看高清完整| 日本伊人午夜精品| 国产一区二区不卡老阿姨| 成人免费视频网站在线观看| 色婷婷久久99综合精品jk白丝 | 欧美三级欧美一级| 91麻豆精品国产自产在线观看一区 | 中文字幕 久热精品 视频在线| 亚洲天堂av老司机| 日韩精品欧美精品| 国产福利91精品| 91电影在线观看| 欧美一级黄色大片| 国产精品日韩精品欧美在线| 亚洲国产乱码最新视频 | 欧美精品在线一区二区| 久久久精品免费网站| 亚洲免费电影在线| 麻豆精品视频在线观看视频| 99久久精品99国产精品| 91精品国产综合久久福利软件| 国产人久久人人人人爽| 亚洲一区电影777| 国产福利视频一区二区三区| 欧美在线观看视频一区二区三区| 日韩欧美自拍偷拍| 亚洲欧洲www| 精品亚洲国产成人av制服丝袜| 一本大道久久a久久精二百| 日韩一区和二区| 亚洲人成7777| 国产盗摄视频一区二区三区| 欧美美女一区二区三区| 国产精品天干天干在线综合| 秋霞午夜av一区二区三区| 成人黄色一级视频| 精品国产青草久久久久福利| 亚洲午夜激情av| jiyouzz国产精品久久| 91精品国产综合久久精品麻豆| 中文字幕日韩一区| 国产精品综合一区二区三区| 777久久久精品| 亚洲人成亚洲人成在线观看图片| 国产精品亚洲第一区在线暖暖韩国| 欧美色图在线观看| 中文字幕一区免费在线观看| 国产精品一区在线| 日韩欧美专区在线| 三级在线观看一区二区| 日本二三区不卡| 国产精品乱码久久久久久| 精品一区二区综合| 欧美一级久久久久久久大片| 亚洲福利视频一区| 在线一区二区视频| 亚洲视频在线观看一区| 国产精品69久久久久水密桃 | 五月婷婷欧美视频| 91久久精品国产91性色tv| 国产精品色呦呦| 国产91综合一区在线观看| 日韩精品一区二区三区swag | 日韩欧美亚洲国产另类| 首页国产丝袜综合| 欧美视频在线观看一区| 一区二区三区色| 色香色香欲天天天影视综合网| 欧美韩日一区二区三区| 国产大陆精品国产| 久久一留热品黄| 国产中文字幕一区| 日韩久久久久久| 久久精品72免费观看| 91精品久久久久久久久99蜜臂| 日韩中文字幕亚洲一区二区va在线| 在线观看日韩毛片| 亚洲一区二区免费视频| 欧美日韩综合在线免费观看| 亚洲尤物在线视频观看| 欧美主播一区二区三区美女| 亚洲一区二区视频在线| 91蝌蚪porny| 亚洲一区二区在线免费观看视频| 欧美综合亚洲图片综合区| 亚洲与欧洲av电影| 欧美高清精品3d| 久久国产成人午夜av影院| 精品国产伦一区二区三区免费| 国产乱人伦偷精品视频不卡| 国产精品美女一区二区在线观看| 99久久伊人精品| 亚洲电影在线免费观看| 日韩欧美国产午夜精品| 国产一区二区三区在线观看免费视频| 久久久久久久综合日本| 99久久免费精品高清特色大片| 亚洲乱码国产乱码精品精98午夜| 日本韩国欧美在线| 日本少妇一区二区| 久久久久九九视频| 99视频精品全部免费在线| 亚洲第一激情av| 精品国产成人在线影院 | 欧美电影免费观看高清完整版在线 | 日本欧美韩国一区三区| 国产亚洲一区二区在线观看| 成人av片在线观看| 亚洲成人自拍一区| 久久综合色之久久综合| 色综合天天性综合| 日韩国产高清在线| 国产女人18水真多18精品一级做 | 一区二区在线看| 欧美一区二区三区电影| 高清免费成人av| 亚洲一区二区三区四区中文字幕| 欧美一区二区福利在线| 不卡av电影在线播放| 婷婷综合在线观看| 欧美激情一区二区| 欧美另类z0zxhd电影| 成人免费视频视频在线观看免费| 亚洲综合偷拍欧美一区色| 日韩免费一区二区| 色综合久久久久| 国产一区二区三区电影在线观看| 亚洲欧美综合网| 日韩美女视频一区二区在线观看| www.久久精品| 极品少妇xxxx精品少妇偷拍| 亚洲欧洲三级电影| 日韩一区二区三免费高清| 成人av网站免费观看| 蜜桃视频在线观看一区二区| ...av二区三区久久精品| 日韩一区二区三区视频在线 | 中文字幕欧美日韩一区| 91精品黄色片免费大全| 91在线视频免费观看| 激情成人综合网| 亚洲国产中文字幕在线视频综合| 久久久99久久精品欧美| 欧美色视频在线| 成人av动漫在线| 国产一本一道久久香蕉| 五月婷婷久久综合| 亚洲黄色性网站| 国产精品美女久久久久久| 精品国产精品网麻豆系列| 7777精品伊人久久久大香线蕉超级流畅 | 欧美精品九九99久久| av电影在线不卡| 国产精品一区二区无线| 美女一区二区在线观看| 亚洲成av人片在线| 亚洲美女在线一区| 国产精品久久三区| 久久久久久麻豆| 精品不卡在线视频| 日韩一区二区三区四区五区六区| 欧美日韩三级在线| 欧美在线制服丝袜| aaa亚洲精品| 成人免费福利片| 国产成人免费高清| 国产精品正在播放| 国产精品综合一区二区| 国产制服丝袜一区| 久久精品国产免费| 麻豆免费看一区二区三区| 蜜桃精品视频在线| 青青草91视频|