row0mysql.ic 3.14 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/******************************************************
MySQL interface for Innobase

(C) 2001 Innobase Oy

Created 1/23/2001 Heikki Tuuri
*******************************************************/

/***********************************************************************
Stores a variable-length field (like VARCHAR) length to dest, in the
MySQL format. No real var implemented in MySQL yet! */
UNIV_INLINE
byte*
row_mysql_store_var_len(
/*====================*/
			/* out: dest + 2 */
	byte*	dest,	/* in: where to store */
18 19
	ulint	len __attribute__((unused)))  /* in: length, must fit in two
                                                 bytes */
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
{
	ut_ad(len < 256 * 256);
/*	
	mach_write_to_2_little_endian(dest, len);

	return(dest + 2);
*/
	return(dest);	/* No real var implemented in MySQL yet! */
}

/***********************************************************************
Reads a MySQL format variable-length field (like VARCHAR) length and
returns pointer to the field data. No real var implemented in MySQL yet! */
UNIV_INLINE
byte*
row_mysql_read_var_ref(
/*===================*/
			/* out: field + 2 */
	ulint*	len,	/* out: variable-length field length; does not work
			yet! */
	byte*	field)	/* in: field */
{
/*	
	*len = mach_read_from_2_little_endian(field);

	return(field + 2);
*/
47 48
	UT_NOT_USED(len);

49 50 51 52 53 54 55 56 57 58 59 60
	return(field);	/* No real var implemented in MySQL yet! */
}

/******************************************************************
Stores a non-SQL-NULL field given in the MySQL format in the Innobase
format. */
UNIV_INLINE
void
row_mysql_store_col_in_innobase_format(
/*===================================*/
	dfield_t*	dfield,		/* in/out: dfield */
	byte*		buf,		/* in/out: buffer for the converted
heikki@hundin.mysql.fi's avatar
heikki@hundin.mysql.fi committed
61 62
					value; this must be at least col_len
					long! */
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
	byte*		mysql_data,	/* in: MySQL column value, not
					SQL NULL; NOTE that dfield may also
					get a pointer to mysql_data,
					therefore do not discard this as long
					as dfield is used! */
	ulint		col_len,	/* in: MySQL column length */
	ulint		type,		/* in: data type */
	ulint		is_unsigned)	/* in: != 0 if unsigned integer type */
{
	byte*	ptr 	= mysql_data;

	if (type == DATA_INT) {
		/* Store integer data in Innobase in a big-endian format,
		sign bit negated */

		ptr = buf + col_len;

		for (;;) {
			ptr--;
			*ptr = *mysql_data;
			if (ptr == buf) {
				break;
			}
			mysql_data++;
		}

		if (!is_unsigned) {
90
			*ptr = (byte) (*ptr ^ 128);
91 92 93
		}
	} else if (type == DATA_VARCHAR || type == DATA_VARMYSQL
						|| type == DATA_BINARY) {
94 95
		/* Remove trailing spaces. */

96 97 98
		/* Handle UCS2 strings differently. */
		ulint	mbminlen	= dtype_get_mbminlen(
						dfield_get_type(dfield));
99
		ptr = row_mysql_read_var_ref(&col_len, mysql_data);
100
		if (mbminlen == 2) {
101 102 103 104 105 106 107 108 109
			/* space=0x0020 */
			/* Trim "half-chars", just in case. */
			col_len &= ~1;

			while (col_len >= 2 && ptr[col_len - 2] == 0x00
					&& ptr[col_len - 1] == 0x20) {
				col_len -= 2;
			}
		} else {
110
			ut_a(mbminlen == 1);
111 112 113 114 115
			/* space=0x20 */
			while (col_len > 0 && ptr[col_len - 1] == 0x20) {
				col_len--;
			}
		}
116 117 118 119 120 121
	} else if (type == DATA_BLOB) {
		ptr = row_mysql_read_blob_ref(&col_len, mysql_data, col_len);
	}

	dfield_set_data(dfield, ptr, col_len);
}