view _mysql_fields.c @ 19:c3ecc32aea27 MySQLdb

Missing file, but #1928858
author adustman
date Sat, 29 Mar 2008 19:57:53 +0000
parents
children e36420b7ae6e
line wrap: on
line source

#include "_mysql.h"

static char _mysql_FieldObject__doc__[] =
"";

int
_mysql_FieldObject_Initialize(
	_mysql_FieldObject *self,
	PyObject *args,
	PyObject *kwargs)
{
	static char *kwlist[] = {"result", "index", NULL};
	_mysql_ResultObject *result=NULL;
	MYSQL_FIELD *field;
	unsigned int index;
	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Oi", kwlist,
					  &result, &index))
		return -1;
	
	self->index = index;
	field = mysql_fetch_field_direct(result->result, index);
	if (!field) return -1;
	self->field = *field;
	self->result = (PyObject *) result;
	Py_INCREF(result);
	return 0;
}

#if PY_VERSION_HEX >= 0x02020000
static int _mysql_FieldObject_traverse(
	_mysql_FieldObject *self,
	visitproc visit,
	void *arg)
{
	if (self->result)
		return visit(self->result, arg);
	return 0;
}
#endif

static int _mysql_FieldObject_clear(
	_mysql_FieldObject *self)
{
	Py_XDECREF(self->result);
	self->result = NULL;
	return 0;
}
	
static void
_mysql_FieldObject_dealloc(
	_mysql_FieldObject *self)
{
	PyObject_GC_UnTrack((PyObject *)self);
	_mysql_FieldObject_clear(self);
	MyFree(self);
}

static PyObject *
_mysql_FieldObject_repr(
	_mysql_FieldObject *self)
{
	char buf[300];
	snprintf(buf, 300, "<_mysql.field object at %lx>", (long)self);
	return PyString_FromString(buf);
}

static PyMethodDef _mysql_FieldObject_methods[] = {
	{NULL,              NULL} /* sentinel */
};

static MyMemberlist(_mysql_FieldObject_memberlist)[] = {
	MyMember(
		"result",
		T_OBJECT,
		offsetof(_mysql_FieldObject,result),
		RO,
		"Result set"
		),
	MyMember(
		"name",
		T_STRING,
		offsetof(_mysql_FieldObject,field.name),
		RO,
		"The name of the field. If the field was given\n\
an alias with an AS clause, the value of name is the alias."
		),
	MyMember(
		"org_name",
		T_STRING,
		offsetof(_mysql_FieldObject,field.org_name),
		RO,
		"The name of the field. Aliases are ignored."
		),
	MyMember(
		"table",
		T_STRING,
		offsetof(_mysql_FieldObject,field.table),
		RO,
		"The name of the table containing this field,\n\
if it isn't a calculated field. For calculated fields,\n\
the table value is an empty string. If the column is selected from a view,\n\
table names the view. If the table or view was given an alias with an AS clause,\n\
the value of table is the alias.\n"
		),
	MyMember(
		"org_table",
		T_STRING,
		offsetof(_mysql_FieldObject,field.org_table),
		RO,
		"The name of the table. Aliases are ignored.\n\
If the column is selected from a view, org_table names the underlying table.\n"
		),
	MyMember(
		"db",
		T_STRING,
		offsetof(_mysql_FieldObject,field.db),
		RO,
		"The name of the database that the field comes from.\n\
If the field is a calculated field, db is an empty string."
		),
	MyMember(
		"catalog",
		T_STRING,
		offsetof(_mysql_FieldObject,field.catalog),
		RO,
		"The catalog name. This value is always \"def\"."
		),
	MyMember(
		"length",
		T_ULONG,
		offsetof(_mysql_FieldObject,field.length),
		RO,
		"The width of the field.\n\
as specified in the table definition.\n"
		),
	MyMember(
		"max_length",
		T_ULONG,
		offsetof(_mysql_FieldObject,field.max_length),
		RO,
		"The maximum width of the field for the result set\n\
(the length of the longest field value for the rows actually in the\n\
result set). If you use conn.store_result(), this contains the\n\
maximum length for the field. If you use conn.use_result(),\n\
the value of this variable is zero.\n"
		),
	MyMember(
		"decimals",
		T_UINT,
		offsetof(_mysql_FieldObject,field.decimals),
		RO,
		"The number of decimals for numeric fields.\n"
		),
	MyMember(
		"charsetnr",
		T_UINT,
		offsetof(_mysql_FieldObject,field.charsetnr),
		RO,
		"The character set number for the field."
		),
	MyMember(
		"flags",
		T_UINT,
		offsetof(_mysql_FieldObject,field.flags),
		RO,
		"Different bit-flags for the field.\n\
The bits are enumerated in MySQLdb.constants.FLAG.\n\
The flags value may have zero or more of these bits set.\n"
		),
	MyMember(
		"type",
		T_UINT,
		offsetof(_mysql_FieldObject,field.type),
		RO,
		"The type of the field. The type values\n\
are enumerated in MySQLdb.constants.FIELD_TYPE.\n"
		),
	{NULL} /* Sentinel */
};

static PyObject *
_mysql_FieldObject_getattr(
	_mysql_FieldObject *self,
	char *name)
{
	PyObject *res;

	res = Py_FindMethod(_mysql_FieldObject_methods, (PyObject *)self, name);
	if (res != NULL)
		return res;
	PyErr_Clear();
#if PY_VERSION_HEX < 0x02020000
	return PyMember_Get((char *)self, _mysql_FieldObject_memberlist, name);
#else
	{
		MyMemberlist(*l);
		for (l = _mysql_FieldObject_memberlist; l->name != NULL; l++) {
			if (strcmp(l->name, name) == 0)
				return PyMember_GetOne((char *)self, l);
		}
		PyErr_SetString(PyExc_AttributeError, name);
		return NULL;
	}
#endif
}

static int
_mysql_FieldObject_setattr(
	_mysql_FieldObject *self,
	char *name,
	PyObject *v)
{
	if (v == NULL) {
		PyErr_SetString(PyExc_AttributeError,
				"can't delete attributes");
		return -1;
	}
#if PY_VERSION_HEX < 0x02020000
	return PyMember_Set((char *)self, _mysql_FieldObject_memberlist, name, v);
#else
        {
		MyMemberlist(*l);
		for (l = _mysql_FieldObject_memberlist; l->name != NULL; l++)
			if (strcmp(l->name, name) == 0)
				return PyMember_SetOne((char *)self, l, v);
	}
        PyErr_SetString(PyExc_AttributeError, name);
        return -1;
#endif
}

PyTypeObject _mysql_FieldObject_Type = {
	PyObject_HEAD_INIT(NULL)
	0,
	"_mysql.field",
	sizeof(_mysql_FieldObject),
	0,
	(destructor)_mysql_FieldObject_dealloc, /* tp_dealloc */
	0, /*tp_print*/
	(getattrfunc)_mysql_FieldObject_getattr, /* tp_getattr */
	(setattrfunc)_mysql_FieldObject_setattr, /* tp_setattr */
	0, /*tp_compare*/
	(reprfunc)_mysql_FieldObject_repr, /* tp_repr */
	
	/* Method suites for standard classes */
	
	0, /* (PyNumberMethods *) tp_as_number */
	0, /* (PySequenceMethods *) tp_as_sequence */
	0, /* (PyMappingMethods *) tp_as_mapping */
	
	/* More standard operations (here for binary compatibility) */
	
	0, /* (hashfunc) tp_hash */
	0, /* (ternaryfunc) tp_call */
	0, /* (reprfunc) tp_str */
	0, /* (getattrofunc) tp_getattro */
	0, /* (setattrofunc) tp_setattro */
	
	/* Functions to access object as input/output buffer */
	0, /* (PyBufferProcs *) tp_as_buffer */
	
	/* Flags to define presence of optional/expanded features */
#if PY_VERSION_HEX < 0x02020000
	Py_TPFLAGS_DEFAULT, /* (long) tp_flags */
#else
	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE,
#endif
	
	_mysql_FieldObject__doc__, /* (char *) tp_doc Documentation string */
#if PY_VERSION_HEX >= 0x02000000	
	/* Assigned meaning in release 2.0 */
#if PY_VERSION_HEX >= 0x02020000
	/* call function for all accessible objects */
	(traverseproc) _mysql_FieldObject_traverse, /* tp_traverse */
	
	/* delete references to contained objects */
	(inquiry) _mysql_FieldObject_clear, /* tp_clear */
#else
	/* not supporting pre-2.2 GC */
	0,
	0,
#endif
#if PY_VERSION_HEX >= 0x02010000	
	/* Assigned meaning in release 2.1 */
	/* rich comparisons */
	0, /* (richcmpfunc) tp_richcompare */
	
	/* weak reference enabler */
	0, /* (long) tp_weaklistoffset */
#if PY_VERSION_HEX >= 0x02020000
	/* Added in release 2.2 */
	/* Iterators */
	0, /* (getiterfunc) tp_iter */
	0, /* (iternextfunc) tp_iternext */
	
	/* Attribute descriptor and subclassing stuff */
	(struct PyMethodDef *) _mysql_FieldObject_methods, /* tp_methods */
	(MyMemberlist(*)) _mysql_FieldObject_memberlist, /*tp_members */
	0, /* (struct getsetlist *) tp_getset; */
	0, /* (struct _typeobject *) tp_base; */
	0, /* (PyObject *) tp_dict */
	0, /* (descrgetfunc) tp_descr_get */
	0, /* (descrsetfunc) tp_descr_set */
	0, /* (long) tp_dictoffset */
	(initproc)_mysql_FieldObject_Initialize, /* tp_init */
	NULL, /* tp_alloc */
	NULL, /* tp_new */
	NULL, /* tp_free Low-level free-memory routine */
	0, /* (PyObject *) tp_bases */
	0, /* (PyObject *) tp_mro method resolution order */
	0, /* (PyObject *) tp_defined */
#endif /* python 2.2 */
#endif /* python 2.1 */
#endif /* python 2.0 */
};