Mercurial > p > mysql-python > mysqldb-2
diff src/fields.c @ 55:e606fd52e866 MySQLdb
make things a little cleaner by moving to a src directory for the C code
author | kylev |
---|---|
date | Fri, 27 Feb 2009 19:14:09 +0000 |
parents | _mysql_fields.c@28e9be1ca559 |
children | 1e1e24fddc74 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/fields.c Fri Feb 27 19:14:09 2009 +0000 @@ -0,0 +1,295 @@ +/* -*- mode: C; indent-tabs-mode: t; c-basic-offset: 8; -*- */ + +#include "mysqlmod.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; +} + +static int +_mysql_FieldObject_traverse( + _mysql_FieldObject *self, + visitproc visit, + void *arg) +{ + if (self->result) + return visit(self->result, arg); + return 0; +} + +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 struct PyMemberDef _mysql_FieldObject_memberlist[] = { + { + "result", + T_OBJECT, + offsetof(_mysql_FieldObject, result), + RO, + "Result set" + }, + { + "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." + }, + { + "org_name", + T_STRING, + offsetof(_mysql_FieldObject, field.org_name), + RO, + "The name of the field. Aliases are ignored." + }, + { + "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" + }, + { + "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" + }, + { + "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." + }, + { + "catalog", + T_STRING, + offsetof(_mysql_FieldObject, field.catalog), + RO, + "The catalog name. This value is always \"def\"." + }, + { + "length", + T_ULONG, + offsetof(_mysql_FieldObject, field.length), + RO, + "The width of the field.\n\ +as specified in the table definition.\n" + }, + { + "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" + }, + { + "decimals", + T_UINT, + offsetof(_mysql_FieldObject, field.decimals), + RO, + "The number of decimals for numeric fields.\n" + }, + { + "charsetnr", + T_UINT, + offsetof(_mysql_FieldObject, field.charsetnr), + RO, + "The character set number for the field." + }, + { + "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" + }, + { + "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; + struct PyMemberDef *l; + + res = Py_FindMethod(_mysql_FieldObject_methods, (PyObject *)self, name); + if (res != NULL) + return res; + PyErr_Clear(); + + 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; +} + +static int +_mysql_FieldObject_setattr( + _mysql_FieldObject *self, + char *name, + PyObject *v) +{ + struct PyMemberDef *l; + + if (v == NULL) { + PyErr_SetString(PyExc_AttributeError, + "can't delete attributes"); + return -1; + } + + + 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; +} + +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 */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + + _mysql_FieldObject__doc__, /* (char *) tp_doc Documentation string */ + + /* call function for all accessible objects */ + (traverseproc)_mysql_FieldObject_traverse, /* tp_traverse */ + + /* delete references to contained objects */ + (inquiry)_mysql_FieldObject_clear, /* tp_clear */ + + /* rich comparisons */ + 0, /* (richcmpfunc) tp_richcompare */ + + /* weak reference enabler */ + 0, /* (long) tp_weaklistoffset */ + + /* Iterators */ + 0, /* (getiterfunc) tp_iter */ + 0, /* (iternextfunc) tp_iternext */ + + /* Attribute descriptor and subclassing stuff */ + (struct PyMethodDef *)_mysql_FieldObject_methods, /* tp_methods */ + (struct PyMemberDef *)_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 */ +};