AppPkg/Applications/Python: Add Python 2.7.2 sources since the release of Python 2.7.3 made them unavailable from the python.org web site.
These files are a subset of the python-2.7.2.tgz distribution from python.org. Changed files from PyMod-2.7.2 have been copied into the corresponding directories of this tree, replacing the original files in the distribution. Signed-off-by: daryl.mcdaniel@intel.com git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13197 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
375
AppPkg/Applications/Python/Python-2.7.2/Modules/_sqlite/cache.c
Normal file
375
AppPkg/Applications/Python/Python-2.7.2/Modules/_sqlite/cache.c
Normal file
@ -0,0 +1,375 @@
|
||||
/* cache .c - a LRU cache
|
||||
*
|
||||
* Copyright (C) 2004-2010 Gerhard H<>ring <gh@ghaering.de>
|
||||
*
|
||||
* This file is part of pysqlite.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include "sqlitecompat.h"
|
||||
#include "cache.h"
|
||||
#include <limits.h>
|
||||
|
||||
/* only used internally */
|
||||
pysqlite_Node* pysqlite_new_node(PyObject* key, PyObject* data)
|
||||
{
|
||||
pysqlite_Node* node;
|
||||
|
||||
node = (pysqlite_Node*) (pysqlite_NodeType.tp_alloc(&pysqlite_NodeType, 0));
|
||||
if (!node) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Py_INCREF(key);
|
||||
node->key = key;
|
||||
|
||||
Py_INCREF(data);
|
||||
node->data = data;
|
||||
|
||||
node->prev = NULL;
|
||||
node->next = NULL;
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
void pysqlite_node_dealloc(pysqlite_Node* self)
|
||||
{
|
||||
Py_DECREF(self->key);
|
||||
Py_DECREF(self->data);
|
||||
|
||||
Py_TYPE(self)->tp_free((PyObject*)self);
|
||||
}
|
||||
|
||||
int pysqlite_cache_init(pysqlite_Cache* self, PyObject* args, PyObject* kwargs)
|
||||
{
|
||||
PyObject* factory;
|
||||
int size = 10;
|
||||
|
||||
self->factory = NULL;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "O|i", &factory, &size)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* minimum cache size is 5 entries */
|
||||
if (size < 5) {
|
||||
size = 5;
|
||||
}
|
||||
self->size = size;
|
||||
self->first = NULL;
|
||||
self->last = NULL;
|
||||
|
||||
self->mapping = PyDict_New();
|
||||
if (!self->mapping) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
Py_INCREF(factory);
|
||||
self->factory = factory;
|
||||
|
||||
self->decref_factory = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pysqlite_cache_dealloc(pysqlite_Cache* self)
|
||||
{
|
||||
pysqlite_Node* node;
|
||||
pysqlite_Node* delete_node;
|
||||
|
||||
if (!self->factory) {
|
||||
/* constructor failed, just get out of here */
|
||||
return;
|
||||
}
|
||||
|
||||
/* iterate over all nodes and deallocate them */
|
||||
node = self->first;
|
||||
while (node) {
|
||||
delete_node = node;
|
||||
node = node->next;
|
||||
Py_DECREF(delete_node);
|
||||
}
|
||||
|
||||
if (self->decref_factory) {
|
||||
Py_DECREF(self->factory);
|
||||
}
|
||||
Py_DECREF(self->mapping);
|
||||
|
||||
Py_TYPE(self)->tp_free((PyObject*)self);
|
||||
}
|
||||
|
||||
PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* args)
|
||||
{
|
||||
PyObject* key = args;
|
||||
pysqlite_Node* node;
|
||||
pysqlite_Node* ptr;
|
||||
PyObject* data;
|
||||
|
||||
node = (pysqlite_Node*)PyDict_GetItem(self->mapping, key);
|
||||
if (node) {
|
||||
/* an entry for this key already exists in the cache */
|
||||
|
||||
/* increase usage counter of the node found */
|
||||
if (node->count < LONG_MAX) {
|
||||
node->count++;
|
||||
}
|
||||
|
||||
/* if necessary, reorder entries in the cache by swapping positions */
|
||||
if (node->prev && node->count > node->prev->count) {
|
||||
ptr = node->prev;
|
||||
|
||||
while (ptr->prev && node->count > ptr->prev->count) {
|
||||
ptr = ptr->prev;
|
||||
}
|
||||
|
||||
if (node->next) {
|
||||
node->next->prev = node->prev;
|
||||
} else {
|
||||
self->last = node->prev;
|
||||
}
|
||||
if (node->prev) {
|
||||
node->prev->next = node->next;
|
||||
}
|
||||
if (ptr->prev) {
|
||||
ptr->prev->next = node;
|
||||
} else {
|
||||
self->first = node;
|
||||
}
|
||||
|
||||
node->next = ptr;
|
||||
node->prev = ptr->prev;
|
||||
if (!node->prev) {
|
||||
self->first = node;
|
||||
}
|
||||
ptr->prev = node;
|
||||
}
|
||||
} else {
|
||||
/* There is no entry for this key in the cache, yet. We'll insert a new
|
||||
* entry in the cache, and make space if necessary by throwing the
|
||||
* least used item out of the cache. */
|
||||
|
||||
if (PyDict_Size(self->mapping) == self->size) {
|
||||
if (self->last) {
|
||||
node = self->last;
|
||||
|
||||
if (PyDict_DelItem(self->mapping, self->last->key) != 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (node->prev) {
|
||||
node->prev->next = NULL;
|
||||
}
|
||||
self->last = node->prev;
|
||||
node->prev = NULL;
|
||||
|
||||
Py_DECREF(node);
|
||||
}
|
||||
}
|
||||
|
||||
data = PyObject_CallFunction(self->factory, "O", key);
|
||||
|
||||
if (!data) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
node = pysqlite_new_node(key, data);
|
||||
if (!node) {
|
||||
return NULL;
|
||||
}
|
||||
node->prev = self->last;
|
||||
|
||||
Py_DECREF(data);
|
||||
|
||||
if (PyDict_SetItem(self->mapping, key, (PyObject*)node) != 0) {
|
||||
Py_DECREF(node);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (self->last) {
|
||||
self->last->next = node;
|
||||
} else {
|
||||
self->first = node;
|
||||
}
|
||||
self->last = node;
|
||||
}
|
||||
|
||||
Py_INCREF(node->data);
|
||||
return node->data;
|
||||
}
|
||||
|
||||
PyObject* pysqlite_cache_display(pysqlite_Cache* self, PyObject* args)
|
||||
{
|
||||
pysqlite_Node* ptr;
|
||||
PyObject* prevkey;
|
||||
PyObject* nextkey;
|
||||
PyObject* fmt_args;
|
||||
PyObject* template;
|
||||
PyObject* display_str;
|
||||
|
||||
ptr = self->first;
|
||||
|
||||
while (ptr) {
|
||||
if (ptr->prev) {
|
||||
prevkey = ptr->prev->key;
|
||||
} else {
|
||||
prevkey = Py_None;
|
||||
}
|
||||
Py_INCREF(prevkey);
|
||||
|
||||
if (ptr->next) {
|
||||
nextkey = ptr->next->key;
|
||||
} else {
|
||||
nextkey = Py_None;
|
||||
}
|
||||
Py_INCREF(nextkey);
|
||||
|
||||
fmt_args = Py_BuildValue("OOO", prevkey, ptr->key, nextkey);
|
||||
if (!fmt_args) {
|
||||
return NULL;
|
||||
}
|
||||
template = PyString_FromString("%s <- %s ->%s\n");
|
||||
if (!template) {
|
||||
Py_DECREF(fmt_args);
|
||||
return NULL;
|
||||
}
|
||||
display_str = PyString_Format(template, fmt_args);
|
||||
Py_DECREF(template);
|
||||
Py_DECREF(fmt_args);
|
||||
if (!display_str) {
|
||||
return NULL;
|
||||
}
|
||||
PyObject_Print(display_str, stdout, Py_PRINT_RAW);
|
||||
Py_DECREF(display_str);
|
||||
|
||||
Py_DECREF(prevkey);
|
||||
Py_DECREF(nextkey);
|
||||
|
||||
ptr = ptr->next;
|
||||
}
|
||||
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
static PyMethodDef cache_methods[] = {
|
||||
{"get", (PyCFunction)pysqlite_cache_get, METH_O,
|
||||
PyDoc_STR("Gets an entry from the cache or calls the factory function to produce one.")},
|
||||
{"display", (PyCFunction)pysqlite_cache_display, METH_NOARGS,
|
||||
PyDoc_STR("For debugging only.")},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
PyTypeObject pysqlite_NodeType = {
|
||||
PyVarObject_HEAD_INIT(NULL, 0)
|
||||
MODULE_NAME "Node", /* tp_name */
|
||||
sizeof(pysqlite_Node), /* tp_basicsize */
|
||||
0, /* tp_itemsize */
|
||||
(destructor)pysqlite_node_dealloc, /* tp_dealloc */
|
||||
0, /* tp_print */
|
||||
0, /* tp_getattr */
|
||||
0, /* tp_setattr */
|
||||
0, /* tp_compare */
|
||||
0, /* tp_repr */
|
||||
0, /* tp_as_number */
|
||||
0, /* tp_as_sequence */
|
||||
0, /* tp_as_mapping */
|
||||
0, /* tp_hash */
|
||||
0, /* tp_call */
|
||||
0, /* tp_str */
|
||||
0, /* tp_getattro */
|
||||
0, /* tp_setattro */
|
||||
0, /* tp_as_buffer */
|
||||
Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
|
||||
0, /* tp_doc */
|
||||
0, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
0, /* tp_richcompare */
|
||||
0, /* tp_weaklistoffset */
|
||||
0, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
0, /* tp_methods */
|
||||
0, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
0, /* tp_dict */
|
||||
0, /* tp_descr_get */
|
||||
0, /* tp_descr_set */
|
||||
0, /* tp_dictoffset */
|
||||
(initproc)0, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
0, /* tp_new */
|
||||
0 /* tp_free */
|
||||
};
|
||||
|
||||
PyTypeObject pysqlite_CacheType = {
|
||||
PyVarObject_HEAD_INIT(NULL, 0)
|
||||
MODULE_NAME ".Cache", /* tp_name */
|
||||
sizeof(pysqlite_Cache), /* tp_basicsize */
|
||||
0, /* tp_itemsize */
|
||||
(destructor)pysqlite_cache_dealloc, /* tp_dealloc */
|
||||
0, /* tp_print */
|
||||
0, /* tp_getattr */
|
||||
0, /* tp_setattr */
|
||||
0, /* tp_compare */
|
||||
0, /* tp_repr */
|
||||
0, /* tp_as_number */
|
||||
0, /* tp_as_sequence */
|
||||
0, /* tp_as_mapping */
|
||||
0, /* tp_hash */
|
||||
0, /* tp_call */
|
||||
0, /* tp_str */
|
||||
0, /* tp_getattro */
|
||||
0, /* tp_setattro */
|
||||
0, /* tp_as_buffer */
|
||||
Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
|
||||
0, /* tp_doc */
|
||||
0, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
0, /* tp_richcompare */
|
||||
0, /* tp_weaklistoffset */
|
||||
0, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
cache_methods, /* tp_methods */
|
||||
0, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
0, /* tp_dict */
|
||||
0, /* tp_descr_get */
|
||||
0, /* tp_descr_set */
|
||||
0, /* tp_dictoffset */
|
||||
(initproc)pysqlite_cache_init, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
0, /* tp_new */
|
||||
0 /* tp_free */
|
||||
};
|
||||
|
||||
extern int pysqlite_cache_setup_types(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
pysqlite_NodeType.tp_new = PyType_GenericNew;
|
||||
pysqlite_CacheType.tp_new = PyType_GenericNew;
|
||||
|
||||
rc = PyType_Ready(&pysqlite_NodeType);
|
||||
if (rc < 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = PyType_Ready(&pysqlite_CacheType);
|
||||
return rc;
|
||||
}
|
@ -0,0 +1,73 @@
|
||||
/* cache.h - definitions for the LRU cache
|
||||
*
|
||||
* Copyright (C) 2004-2010 Gerhard H<>ring <gh@ghaering.de>
|
||||
*
|
||||
* This file is part of pysqlite.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef PYSQLITE_CACHE_H
|
||||
#define PYSQLITE_CACHE_H
|
||||
#include "Python.h"
|
||||
|
||||
/* The LRU cache is implemented as a combination of a doubly-linked with a
|
||||
* dictionary. The list items are of type 'Node' and the dictionary has the
|
||||
* nodes as values. */
|
||||
|
||||
typedef struct _pysqlite_Node
|
||||
{
|
||||
PyObject_HEAD
|
||||
PyObject* key;
|
||||
PyObject* data;
|
||||
long count;
|
||||
struct _pysqlite_Node* prev;
|
||||
struct _pysqlite_Node* next;
|
||||
} pysqlite_Node;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
PyObject_HEAD
|
||||
int size;
|
||||
|
||||
/* a dictionary mapping keys to Node entries */
|
||||
PyObject* mapping;
|
||||
|
||||
/* the factory callable */
|
||||
PyObject* factory;
|
||||
|
||||
pysqlite_Node* first;
|
||||
pysqlite_Node* last;
|
||||
|
||||
/* if set, decrement the factory function when the Cache is deallocated.
|
||||
* this is almost always desirable, but not in the pysqlite context */
|
||||
int decref_factory;
|
||||
} pysqlite_Cache;
|
||||
|
||||
extern PyTypeObject pysqlite_NodeType;
|
||||
extern PyTypeObject pysqlite_CacheType;
|
||||
|
||||
int pysqlite_node_init(pysqlite_Node* self, PyObject* args, PyObject* kwargs);
|
||||
void pysqlite_node_dealloc(pysqlite_Node* self);
|
||||
|
||||
int pysqlite_cache_init(pysqlite_Cache* self, PyObject* args, PyObject* kwargs);
|
||||
void pysqlite_cache_dealloc(pysqlite_Cache* self);
|
||||
PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* args);
|
||||
|
||||
int pysqlite_cache_setup_types(void);
|
||||
|
||||
#endif
|
1664
AppPkg/Applications/Python/Python-2.7.2/Modules/_sqlite/connection.c
Normal file
1664
AppPkg/Applications/Python/Python-2.7.2/Modules/_sqlite/connection.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,138 @@
|
||||
/* connection.h - definitions for the connection type
|
||||
*
|
||||
* Copyright (C) 2004-2010 Gerhard H<>ring <gh@ghaering.de>
|
||||
*
|
||||
* This file is part of pysqlite.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef PYSQLITE_CONNECTION_H
|
||||
#define PYSQLITE_CONNECTION_H
|
||||
#include "Python.h"
|
||||
#include "pythread.h"
|
||||
#include "structmember.h"
|
||||
|
||||
#include "cache.h"
|
||||
#include "module.h"
|
||||
|
||||
#include "sqlite3.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
PyObject_HEAD
|
||||
sqlite3* db;
|
||||
|
||||
/* 1 if we are currently within a transaction, i. e. if a BEGIN has been
|
||||
* issued */
|
||||
int inTransaction;
|
||||
|
||||
/* the type detection mode. Only 0, PARSE_DECLTYPES, PARSE_COLNAMES or a
|
||||
* bitwise combination thereof makes sense */
|
||||
int detect_types;
|
||||
|
||||
/* the timeout value in seconds for database locks */
|
||||
double timeout;
|
||||
|
||||
/* for internal use in the timeout handler: when did the timeout handler
|
||||
* first get called with count=0? */
|
||||
double timeout_started;
|
||||
|
||||
/* None for autocommit, otherwise a PyString with the isolation level */
|
||||
PyObject* isolation_level;
|
||||
|
||||
/* NULL for autocommit, otherwise a string with the BEGIN statement; will be
|
||||
* freed in connection destructor */
|
||||
char* begin_statement;
|
||||
|
||||
/* 1 if a check should be performed for each API call if the connection is
|
||||
* used from the same thread it was created in */
|
||||
int check_same_thread;
|
||||
|
||||
int initialized;
|
||||
|
||||
/* thread identification of the thread the connection was created in */
|
||||
long thread_ident;
|
||||
|
||||
pysqlite_Cache* statement_cache;
|
||||
|
||||
/* Lists of weak references to statements and cursors used within this connection */
|
||||
PyObject* statements;
|
||||
PyObject* cursors;
|
||||
|
||||
/* Counters for how many statements/cursors were created in the connection. May be
|
||||
* reset to 0 at certain intervals */
|
||||
int created_statements;
|
||||
int created_cursors;
|
||||
|
||||
PyObject* row_factory;
|
||||
|
||||
/* Determines how bytestrings from SQLite are converted to Python objects:
|
||||
* - PyUnicode_Type: Python Unicode objects are constructed from UTF-8 bytestrings
|
||||
* - OptimizedUnicode: Like before, but for ASCII data, only PyStrings are created.
|
||||
* - PyString_Type: PyStrings are created as-is.
|
||||
* - Any custom callable: Any object returned from the callable called with the bytestring
|
||||
* as single parameter.
|
||||
*/
|
||||
PyObject* text_factory;
|
||||
|
||||
/* remember references to functions/classes used in
|
||||
* create_function/create/aggregate, use these as dictionary keys, so we
|
||||
* can keep the total system refcount constant by clearing that dictionary
|
||||
* in connection_dealloc */
|
||||
PyObject* function_pinboard;
|
||||
|
||||
/* a dictionary of registered collation name => collation callable mappings */
|
||||
PyObject* collations;
|
||||
|
||||
/* if our connection was created from a APSW connection, we keep a
|
||||
* reference to the APSW connection around and get rid of it in our
|
||||
* destructor */
|
||||
PyObject* apsw_connection;
|
||||
|
||||
/* Exception objects */
|
||||
PyObject* Warning;
|
||||
PyObject* Error;
|
||||
PyObject* InterfaceError;
|
||||
PyObject* DatabaseError;
|
||||
PyObject* DataError;
|
||||
PyObject* OperationalError;
|
||||
PyObject* IntegrityError;
|
||||
PyObject* InternalError;
|
||||
PyObject* ProgrammingError;
|
||||
PyObject* NotSupportedError;
|
||||
} pysqlite_Connection;
|
||||
|
||||
extern PyTypeObject pysqlite_ConnectionType;
|
||||
|
||||
PyObject* pysqlite_connection_alloc(PyTypeObject* type, int aware);
|
||||
void pysqlite_connection_dealloc(pysqlite_Connection* self);
|
||||
PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args, PyObject* kwargs);
|
||||
PyObject* pysqlite_connection_close(pysqlite_Connection* self, PyObject* args);
|
||||
PyObject* _pysqlite_connection_begin(pysqlite_Connection* self);
|
||||
PyObject* pysqlite_connection_commit(pysqlite_Connection* self, PyObject* args);
|
||||
PyObject* pysqlite_connection_rollback(pysqlite_Connection* self, PyObject* args);
|
||||
PyObject* pysqlite_connection_new(PyTypeObject* type, PyObject* args, PyObject* kw);
|
||||
int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject* kwargs);
|
||||
|
||||
int pysqlite_connection_register_cursor(pysqlite_Connection* connection, PyObject* cursor);
|
||||
int pysqlite_check_thread(pysqlite_Connection* self);
|
||||
int pysqlite_check_connection(pysqlite_Connection* con);
|
||||
|
||||
int pysqlite_connection_setup_types(void);
|
||||
|
||||
#endif
|
1126
AppPkg/Applications/Python/Python-2.7.2/Modules/_sqlite/cursor.c
Normal file
1126
AppPkg/Applications/Python/Python-2.7.2/Modules/_sqlite/cursor.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,74 @@
|
||||
/* cursor.h - definitions for the cursor type
|
||||
*
|
||||
* Copyright (C) 2004-2010 Gerhard H<>ring <gh@ghaering.de>
|
||||
*
|
||||
* This file is part of pysqlite.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef PYSQLITE_CURSOR_H
|
||||
#define PYSQLITE_CURSOR_H
|
||||
#include "Python.h"
|
||||
|
||||
#include "statement.h"
|
||||
#include "connection.h"
|
||||
#include "module.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
PyObject_HEAD
|
||||
pysqlite_Connection* connection;
|
||||
PyObject* description;
|
||||
PyObject* row_cast_map;
|
||||
int arraysize;
|
||||
PyObject* lastrowid;
|
||||
long rowcount;
|
||||
PyObject* row_factory;
|
||||
pysqlite_Statement* statement;
|
||||
int closed;
|
||||
int reset;
|
||||
int initialized;
|
||||
|
||||
/* the next row to be returned, NULL if no next row available */
|
||||
PyObject* next_row;
|
||||
|
||||
PyObject* in_weakreflist; /* List of weak references */
|
||||
} pysqlite_Cursor;
|
||||
|
||||
typedef enum {
|
||||
STATEMENT_INVALID, STATEMENT_INSERT, STATEMENT_DELETE,
|
||||
STATEMENT_UPDATE, STATEMENT_REPLACE, STATEMENT_SELECT,
|
||||
STATEMENT_OTHER
|
||||
} pysqlite_StatementKind;
|
||||
|
||||
extern PyTypeObject pysqlite_CursorType;
|
||||
|
||||
PyObject* pysqlite_cursor_execute(pysqlite_Cursor* self, PyObject* args);
|
||||
PyObject* pysqlite_cursor_executemany(pysqlite_Cursor* self, PyObject* args);
|
||||
PyObject* pysqlite_cursor_getiter(pysqlite_Cursor *self);
|
||||
PyObject* pysqlite_cursor_iternext(pysqlite_Cursor *self);
|
||||
PyObject* pysqlite_cursor_fetchone(pysqlite_Cursor* self, PyObject* args);
|
||||
PyObject* pysqlite_cursor_fetchmany(pysqlite_Cursor* self, PyObject* args, PyObject* kwargs);
|
||||
PyObject* pysqlite_cursor_fetchall(pysqlite_Cursor* self, PyObject* args);
|
||||
PyObject* pysqlite_noop(pysqlite_Connection* self, PyObject* args);
|
||||
PyObject* pysqlite_cursor_close(pysqlite_Cursor* self, PyObject* args);
|
||||
|
||||
int pysqlite_cursor_setup_types(void);
|
||||
|
||||
#define UNKNOWN (-1)
|
||||
#endif
|
@ -0,0 +1,142 @@
|
||||
/* microprotocols.c - minimalist and non-validating protocols implementation
|
||||
*
|
||||
* Copyright (C) 2003-2004 Federico Di Gregorio <fog@debian.org>
|
||||
*
|
||||
* This file is part of psycopg and was adapted for pysqlite. Federico Di
|
||||
* Gregorio gave the permission to use it within pysqlite under the following
|
||||
* license:
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include <Python.h>
|
||||
#include <structmember.h>
|
||||
|
||||
#include "cursor.h"
|
||||
#include "microprotocols.h"
|
||||
#include "prepare_protocol.h"
|
||||
|
||||
|
||||
/** the adapters registry **/
|
||||
|
||||
PyObject *psyco_adapters;
|
||||
|
||||
/* pysqlite_microprotocols_init - initialize the adapters dictionary */
|
||||
|
||||
int
|
||||
pysqlite_microprotocols_init(PyObject *dict)
|
||||
{
|
||||
/* create adapters dictionary and put it in module namespace */
|
||||
if ((psyco_adapters = PyDict_New()) == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return PyDict_SetItemString(dict, "adapters", psyco_adapters);
|
||||
}
|
||||
|
||||
|
||||
/* pysqlite_microprotocols_add - add a reverse type-caster to the dictionary */
|
||||
|
||||
int
|
||||
pysqlite_microprotocols_add(PyTypeObject *type, PyObject *proto, PyObject *cast)
|
||||
{
|
||||
PyObject* key;
|
||||
int rc;
|
||||
|
||||
if (proto == NULL) proto = (PyObject*)&pysqlite_PrepareProtocolType;
|
||||
|
||||
key = Py_BuildValue("(OO)", (PyObject*)type, proto);
|
||||
if (!key) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
rc = PyDict_SetItem(psyco_adapters, key, cast);
|
||||
Py_DECREF(key);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* pysqlite_microprotocols_adapt - adapt an object to the built-in protocol */
|
||||
|
||||
PyObject *
|
||||
pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt)
|
||||
{
|
||||
PyObject *adapter, *key;
|
||||
|
||||
/* we don't check for exact type conformance as specified in PEP 246
|
||||
because the pysqlite_PrepareProtocolType type is abstract and there is no
|
||||
way to get a quotable object to be its instance */
|
||||
|
||||
/* look for an adapter in the registry */
|
||||
key = Py_BuildValue("(OO)", (PyObject*)obj->ob_type, proto);
|
||||
if (!key) {
|
||||
return NULL;
|
||||
}
|
||||
adapter = PyDict_GetItem(psyco_adapters, key);
|
||||
Py_DECREF(key);
|
||||
if (adapter) {
|
||||
PyObject *adapted = PyObject_CallFunctionObjArgs(adapter, obj, NULL);
|
||||
return adapted;
|
||||
}
|
||||
|
||||
/* try to have the protocol adapt this object*/
|
||||
if (PyObject_HasAttrString(proto, "__adapt__")) {
|
||||
PyObject *adapted = PyObject_CallMethod(proto, "__adapt__", "O", obj);
|
||||
if (adapted) {
|
||||
if (adapted != Py_None) {
|
||||
return adapted;
|
||||
} else {
|
||||
Py_DECREF(adapted);
|
||||
}
|
||||
}
|
||||
|
||||
if (PyErr_Occurred() && !PyErr_ExceptionMatches(PyExc_TypeError))
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* and finally try to have the object adapt itself */
|
||||
if (PyObject_HasAttrString(obj, "__conform__")) {
|
||||
PyObject *adapted = PyObject_CallMethod(obj, "__conform__","O", proto);
|
||||
if (adapted) {
|
||||
if (adapted != Py_None) {
|
||||
return adapted;
|
||||
} else {
|
||||
Py_DECREF(adapted);
|
||||
}
|
||||
}
|
||||
|
||||
if (PyErr_Occurred() && !PyErr_ExceptionMatches(PyExc_TypeError)) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* else set the right exception and return NULL */
|
||||
PyErr_SetString(pysqlite_ProgrammingError, "can't adapt");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** module-level functions **/
|
||||
|
||||
PyObject *
|
||||
pysqlite_adapt(pysqlite_Cursor *self, PyObject *args)
|
||||
{
|
||||
PyObject *obj, *alt = NULL;
|
||||
PyObject *proto = (PyObject*)&pysqlite_PrepareProtocolType;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "O|OO", &obj, &proto, &alt)) return NULL;
|
||||
return pysqlite_microprotocols_adapt(obj, proto, alt);
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
/* microprotocols.c - definitions for minimalist and non-validating protocols
|
||||
*
|
||||
* Copyright (C) 2003-2004 Federico Di Gregorio <fog@debian.org>
|
||||
*
|
||||
* This file is part of psycopg and was adapted for pysqlite. Federico Di
|
||||
* Gregorio gave the permission to use it within pysqlite under the following
|
||||
* license:
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef PSYCOPG_MICROPROTOCOLS_H
|
||||
#define PSYCOPG_MICROPROTOCOLS_H 1
|
||||
|
||||
#include <Python.h>
|
||||
|
||||
/** adapters registry **/
|
||||
|
||||
extern PyObject *psyco_adapters;
|
||||
|
||||
/** the names of the three mandatory methods **/
|
||||
|
||||
#define MICROPROTOCOLS_GETQUOTED_NAME "getquoted"
|
||||
#define MICROPROTOCOLS_GETSTRING_NAME "getstring"
|
||||
#define MICROPROTOCOLS_GETBINARY_NAME "getbinary"
|
||||
|
||||
/** exported functions **/
|
||||
|
||||
/* used by module.c to init the microprotocols system */
|
||||
extern int pysqlite_microprotocols_init(PyObject *dict);
|
||||
extern int pysqlite_microprotocols_add(
|
||||
PyTypeObject *type, PyObject *proto, PyObject *cast);
|
||||
extern PyObject *pysqlite_microprotocols_adapt(
|
||||
PyObject *obj, PyObject *proto, PyObject *alt);
|
||||
|
||||
extern PyObject *
|
||||
pysqlite_adapt(pysqlite_Cursor* self, PyObject *args);
|
||||
#define pysqlite_adapt_doc \
|
||||
"adapt(obj, protocol, alternate) -> adapt obj to given protocol. Non-standard."
|
||||
|
||||
#endif /* !defined(PSYCOPG_MICROPROTOCOLS_H) */
|
457
AppPkg/Applications/Python/Python-2.7.2/Modules/_sqlite/module.c
Normal file
457
AppPkg/Applications/Python/Python-2.7.2/Modules/_sqlite/module.c
Normal file
@ -0,0 +1,457 @@
|
||||
/* module.c - the module itself
|
||||
*
|
||||
* Copyright (C) 2004-2010 Gerhard H<>ring <gh@ghaering.de>
|
||||
*
|
||||
* This file is part of pysqlite.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include "connection.h"
|
||||
#include "statement.h"
|
||||
#include "cursor.h"
|
||||
#include "cache.h"
|
||||
#include "prepare_protocol.h"
|
||||
#include "microprotocols.h"
|
||||
#include "row.h"
|
||||
|
||||
#if SQLITE_VERSION_NUMBER >= 3003003
|
||||
#define HAVE_SHARED_CACHE
|
||||
#endif
|
||||
|
||||
/* static objects at module-level */
|
||||
|
||||
PyObject* pysqlite_Error, *pysqlite_Warning, *pysqlite_InterfaceError, *pysqlite_DatabaseError,
|
||||
*pysqlite_InternalError, *pysqlite_OperationalError, *pysqlite_ProgrammingError,
|
||||
*pysqlite_IntegrityError, *pysqlite_DataError, *pysqlite_NotSupportedError, *pysqlite_OptimizedUnicode;
|
||||
|
||||
PyObject* converters;
|
||||
int _enable_callback_tracebacks;
|
||||
int pysqlite_BaseTypeAdapted;
|
||||
|
||||
static PyObject* module_connect(PyObject* self, PyObject* args, PyObject*
|
||||
kwargs)
|
||||
{
|
||||
/* Python seems to have no way of extracting a single keyword-arg at
|
||||
* C-level, so this code is redundant with the one in connection_init in
|
||||
* connection.c and must always be copied from there ... */
|
||||
|
||||
static char *kwlist[] = {"database", "timeout", "detect_types", "isolation_level", "check_same_thread", "factory", "cached_statements", NULL, NULL};
|
||||
PyObject* database;
|
||||
int detect_types = 0;
|
||||
PyObject* isolation_level;
|
||||
PyObject* factory = NULL;
|
||||
int check_same_thread = 1;
|
||||
int cached_statements;
|
||||
double timeout = 5.0;
|
||||
|
||||
PyObject* result;
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|diOiOi", kwlist,
|
||||
&database, &timeout, &detect_types, &isolation_level, &check_same_thread, &factory, &cached_statements))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (factory == NULL) {
|
||||
factory = (PyObject*)&pysqlite_ConnectionType;
|
||||
}
|
||||
|
||||
result = PyObject_Call(factory, args, kwargs);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(module_connect_doc,
|
||||
"connect(database[, timeout, isolation_level, detect_types, factory])\n\
|
||||
\n\
|
||||
Opens a connection to the SQLite database file *database*. You can use\n\
|
||||
\":memory:\" to open a database connection to a database that resides in\n\
|
||||
RAM instead of on disk.");
|
||||
|
||||
static PyObject* module_complete(PyObject* self, PyObject* args, PyObject*
|
||||
kwargs)
|
||||
{
|
||||
static char *kwlist[] = {"statement", NULL, NULL};
|
||||
char* statement;
|
||||
|
||||
PyObject* result;
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &statement))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (sqlite3_complete(statement)) {
|
||||
result = Py_True;
|
||||
} else {
|
||||
result = Py_False;
|
||||
}
|
||||
|
||||
Py_INCREF(result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(module_complete_doc,
|
||||
"complete_statement(sql)\n\
|
||||
\n\
|
||||
Checks if a string contains a complete SQL statement. Non-standard.");
|
||||
|
||||
#ifdef HAVE_SHARED_CACHE
|
||||
static PyObject* module_enable_shared_cache(PyObject* self, PyObject* args, PyObject*
|
||||
kwargs)
|
||||
{
|
||||
static char *kwlist[] = {"do_enable", NULL, NULL};
|
||||
int do_enable;
|
||||
int rc;
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &do_enable))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
rc = sqlite3_enable_shared_cache(do_enable);
|
||||
|
||||
if (rc != SQLITE_OK) {
|
||||
PyErr_SetString(pysqlite_OperationalError, "Changing the shared_cache flag failed");
|
||||
return NULL;
|
||||
} else {
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
}
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(module_enable_shared_cache_doc,
|
||||
"enable_shared_cache(do_enable)\n\
|
||||
\n\
|
||||
Enable or disable shared cache mode for the calling thread.\n\
|
||||
Experimental/Non-standard.");
|
||||
#endif /* HAVE_SHARED_CACHE */
|
||||
|
||||
static PyObject* module_register_adapter(PyObject* self, PyObject* args)
|
||||
{
|
||||
PyTypeObject* type;
|
||||
PyObject* caster;
|
||||
int rc;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "OO", &type, &caster)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* a basic type is adapted; there's a performance optimization if that's not the case
|
||||
* (99 % of all usages) */
|
||||
if (type == &PyInt_Type || type == &PyLong_Type || type == &PyFloat_Type
|
||||
|| type == &PyString_Type || type == &PyUnicode_Type || type == &PyBuffer_Type) {
|
||||
pysqlite_BaseTypeAdapted = 1;
|
||||
}
|
||||
|
||||
rc = pysqlite_microprotocols_add(type, (PyObject*)&pysqlite_PrepareProtocolType, caster);
|
||||
if (rc == -1)
|
||||
return NULL;
|
||||
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(module_register_adapter_doc,
|
||||
"register_adapter(type, callable)\n\
|
||||
\n\
|
||||
Registers an adapter with pysqlite's adapter registry. Non-standard.");
|
||||
|
||||
static PyObject* module_register_converter(PyObject* self, PyObject* args)
|
||||
{
|
||||
PyObject* orig_name;
|
||||
PyObject* name = NULL;
|
||||
PyObject* callable;
|
||||
PyObject* retval = NULL;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "SO", &orig_name, &callable)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* convert the name to upper case */
|
||||
name = PyObject_CallMethod(orig_name, "upper", "");
|
||||
if (!name) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (PyDict_SetItem(converters, name, callable) != 0) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
Py_INCREF(Py_None);
|
||||
retval = Py_None;
|
||||
error:
|
||||
Py_XDECREF(name);
|
||||
return retval;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(module_register_converter_doc,
|
||||
"register_converter(typename, callable)\n\
|
||||
\n\
|
||||
Registers a converter with pysqlite. Non-standard.");
|
||||
|
||||
static PyObject* enable_callback_tracebacks(PyObject* self, PyObject* args)
|
||||
{
|
||||
if (!PyArg_ParseTuple(args, "i", &_enable_callback_tracebacks)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(enable_callback_tracebacks_doc,
|
||||
"enable_callback_tracebacks(flag)\n\
|
||||
\n\
|
||||
Enable or disable callback functions throwing errors to stderr.");
|
||||
|
||||
static void converters_init(PyObject* dict)
|
||||
{
|
||||
converters = PyDict_New();
|
||||
if (!converters) {
|
||||
return;
|
||||
}
|
||||
|
||||
PyDict_SetItemString(dict, "converters", converters);
|
||||
}
|
||||
|
||||
static PyMethodDef module_methods[] = {
|
||||
{"connect", (PyCFunction)module_connect,
|
||||
METH_VARARGS | METH_KEYWORDS, module_connect_doc},
|
||||
{"complete_statement", (PyCFunction)module_complete,
|
||||
METH_VARARGS | METH_KEYWORDS, module_complete_doc},
|
||||
#ifdef HAVE_SHARED_CACHE
|
||||
{"enable_shared_cache", (PyCFunction)module_enable_shared_cache,
|
||||
METH_VARARGS | METH_KEYWORDS, module_enable_shared_cache_doc},
|
||||
#endif
|
||||
{"register_adapter", (PyCFunction)module_register_adapter,
|
||||
METH_VARARGS, module_register_adapter_doc},
|
||||
{"register_converter", (PyCFunction)module_register_converter,
|
||||
METH_VARARGS, module_register_converter_doc},
|
||||
{"adapt", (PyCFunction)pysqlite_adapt, METH_VARARGS,
|
||||
pysqlite_adapt_doc},
|
||||
{"enable_callback_tracebacks", (PyCFunction)enable_callback_tracebacks,
|
||||
METH_VARARGS, enable_callback_tracebacks_doc},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
struct _IntConstantPair {
|
||||
char* constant_name;
|
||||
int constant_value;
|
||||
};
|
||||
|
||||
typedef struct _IntConstantPair IntConstantPair;
|
||||
|
||||
static IntConstantPair _int_constants[] = {
|
||||
{"PARSE_DECLTYPES", PARSE_DECLTYPES},
|
||||
{"PARSE_COLNAMES", PARSE_COLNAMES},
|
||||
|
||||
{"SQLITE_OK", SQLITE_OK},
|
||||
{"SQLITE_DENY", SQLITE_DENY},
|
||||
{"SQLITE_IGNORE", SQLITE_IGNORE},
|
||||
{"SQLITE_CREATE_INDEX", SQLITE_CREATE_INDEX},
|
||||
{"SQLITE_CREATE_TABLE", SQLITE_CREATE_TABLE},
|
||||
{"SQLITE_CREATE_TEMP_INDEX", SQLITE_CREATE_TEMP_INDEX},
|
||||
{"SQLITE_CREATE_TEMP_TABLE", SQLITE_CREATE_TEMP_TABLE},
|
||||
{"SQLITE_CREATE_TEMP_TRIGGER", SQLITE_CREATE_TEMP_TRIGGER},
|
||||
{"SQLITE_CREATE_TEMP_VIEW", SQLITE_CREATE_TEMP_VIEW},
|
||||
{"SQLITE_CREATE_TRIGGER", SQLITE_CREATE_TRIGGER},
|
||||
{"SQLITE_CREATE_VIEW", SQLITE_CREATE_VIEW},
|
||||
{"SQLITE_DELETE", SQLITE_DELETE},
|
||||
{"SQLITE_DROP_INDEX", SQLITE_DROP_INDEX},
|
||||
{"SQLITE_DROP_TABLE", SQLITE_DROP_TABLE},
|
||||
{"SQLITE_DROP_TEMP_INDEX", SQLITE_DROP_TEMP_INDEX},
|
||||
{"SQLITE_DROP_TEMP_TABLE", SQLITE_DROP_TEMP_TABLE},
|
||||
{"SQLITE_DROP_TEMP_TRIGGER", SQLITE_DROP_TEMP_TRIGGER},
|
||||
{"SQLITE_DROP_TEMP_VIEW", SQLITE_DROP_TEMP_VIEW},
|
||||
{"SQLITE_DROP_TRIGGER", SQLITE_DROP_TRIGGER},
|
||||
{"SQLITE_DROP_VIEW", SQLITE_DROP_VIEW},
|
||||
{"SQLITE_INSERT", SQLITE_INSERT},
|
||||
{"SQLITE_PRAGMA", SQLITE_PRAGMA},
|
||||
{"SQLITE_READ", SQLITE_READ},
|
||||
{"SQLITE_SELECT", SQLITE_SELECT},
|
||||
{"SQLITE_TRANSACTION", SQLITE_TRANSACTION},
|
||||
{"SQLITE_UPDATE", SQLITE_UPDATE},
|
||||
{"SQLITE_ATTACH", SQLITE_ATTACH},
|
||||
{"SQLITE_DETACH", SQLITE_DETACH},
|
||||
#if SQLITE_VERSION_NUMBER >= 3002001
|
||||
{"SQLITE_ALTER_TABLE", SQLITE_ALTER_TABLE},
|
||||
{"SQLITE_REINDEX", SQLITE_REINDEX},
|
||||
#endif
|
||||
#if SQLITE_VERSION_NUMBER >= 3003000
|
||||
{"SQLITE_ANALYZE", SQLITE_ANALYZE},
|
||||
#endif
|
||||
{(char*)NULL, 0}
|
||||
};
|
||||
|
||||
PyMODINIT_FUNC init_sqlite3(void)
|
||||
{
|
||||
PyObject *module, *dict;
|
||||
PyObject *tmp_obj;
|
||||
int i;
|
||||
|
||||
module = Py_InitModule("_sqlite3", module_methods);
|
||||
|
||||
if (!module ||
|
||||
(pysqlite_row_setup_types() < 0) ||
|
||||
(pysqlite_cursor_setup_types() < 0) ||
|
||||
(pysqlite_connection_setup_types() < 0) ||
|
||||
(pysqlite_cache_setup_types() < 0) ||
|
||||
(pysqlite_statement_setup_types() < 0) ||
|
||||
(pysqlite_prepare_protocol_setup_types() < 0)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
Py_INCREF(&pysqlite_ConnectionType);
|
||||
PyModule_AddObject(module, "Connection", (PyObject*) &pysqlite_ConnectionType);
|
||||
Py_INCREF(&pysqlite_CursorType);
|
||||
PyModule_AddObject(module, "Cursor", (PyObject*) &pysqlite_CursorType);
|
||||
Py_INCREF(&pysqlite_CacheType);
|
||||
PyModule_AddObject(module, "Statement", (PyObject*)&pysqlite_StatementType);
|
||||
Py_INCREF(&pysqlite_StatementType);
|
||||
PyModule_AddObject(module, "Cache", (PyObject*) &pysqlite_CacheType);
|
||||
Py_INCREF(&pysqlite_PrepareProtocolType);
|
||||
PyModule_AddObject(module, "PrepareProtocol", (PyObject*) &pysqlite_PrepareProtocolType);
|
||||
Py_INCREF(&pysqlite_RowType);
|
||||
PyModule_AddObject(module, "Row", (PyObject*) &pysqlite_RowType);
|
||||
|
||||
if (!(dict = PyModule_GetDict(module))) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
/*** Create DB-API Exception hierarchy */
|
||||
|
||||
if (!(pysqlite_Error = PyErr_NewException(MODULE_NAME ".Error", PyExc_StandardError, NULL))) {
|
||||
goto error;
|
||||
}
|
||||
PyDict_SetItemString(dict, "Error", pysqlite_Error);
|
||||
|
||||
if (!(pysqlite_Warning = PyErr_NewException(MODULE_NAME ".Warning", PyExc_StandardError, NULL))) {
|
||||
goto error;
|
||||
}
|
||||
PyDict_SetItemString(dict, "Warning", pysqlite_Warning);
|
||||
|
||||
/* Error subclasses */
|
||||
|
||||
if (!(pysqlite_InterfaceError = PyErr_NewException(MODULE_NAME ".InterfaceError", pysqlite_Error, NULL))) {
|
||||
goto error;
|
||||
}
|
||||
PyDict_SetItemString(dict, "InterfaceError", pysqlite_InterfaceError);
|
||||
|
||||
if (!(pysqlite_DatabaseError = PyErr_NewException(MODULE_NAME ".DatabaseError", pysqlite_Error, NULL))) {
|
||||
goto error;
|
||||
}
|
||||
PyDict_SetItemString(dict, "DatabaseError", pysqlite_DatabaseError);
|
||||
|
||||
/* pysqlite_DatabaseError subclasses */
|
||||
|
||||
if (!(pysqlite_InternalError = PyErr_NewException(MODULE_NAME ".InternalError", pysqlite_DatabaseError, NULL))) {
|
||||
goto error;
|
||||
}
|
||||
PyDict_SetItemString(dict, "InternalError", pysqlite_InternalError);
|
||||
|
||||
if (!(pysqlite_OperationalError = PyErr_NewException(MODULE_NAME ".OperationalError", pysqlite_DatabaseError, NULL))) {
|
||||
goto error;
|
||||
}
|
||||
PyDict_SetItemString(dict, "OperationalError", pysqlite_OperationalError);
|
||||
|
||||
if (!(pysqlite_ProgrammingError = PyErr_NewException(MODULE_NAME ".ProgrammingError", pysqlite_DatabaseError, NULL))) {
|
||||
goto error;
|
||||
}
|
||||
PyDict_SetItemString(dict, "ProgrammingError", pysqlite_ProgrammingError);
|
||||
|
||||
if (!(pysqlite_IntegrityError = PyErr_NewException(MODULE_NAME ".IntegrityError", pysqlite_DatabaseError,NULL))) {
|
||||
goto error;
|
||||
}
|
||||
PyDict_SetItemString(dict, "IntegrityError", pysqlite_IntegrityError);
|
||||
|
||||
if (!(pysqlite_DataError = PyErr_NewException(MODULE_NAME ".DataError", pysqlite_DatabaseError, NULL))) {
|
||||
goto error;
|
||||
}
|
||||
PyDict_SetItemString(dict, "DataError", pysqlite_DataError);
|
||||
|
||||
if (!(pysqlite_NotSupportedError = PyErr_NewException(MODULE_NAME ".NotSupportedError", pysqlite_DatabaseError, NULL))) {
|
||||
goto error;
|
||||
}
|
||||
PyDict_SetItemString(dict, "NotSupportedError", pysqlite_NotSupportedError);
|
||||
|
||||
/* We just need "something" unique for pysqlite_OptimizedUnicode. It does not really
|
||||
* need to be a string subclass. Just anything that can act as a special
|
||||
* marker for us. So I pulled PyCell_Type out of my magic hat.
|
||||
*/
|
||||
Py_INCREF((PyObject*)&PyCell_Type);
|
||||
pysqlite_OptimizedUnicode = (PyObject*)&PyCell_Type;
|
||||
PyDict_SetItemString(dict, "OptimizedUnicode", pysqlite_OptimizedUnicode);
|
||||
|
||||
/* Set integer constants */
|
||||
for (i = 0; _int_constants[i].constant_name != 0; i++) {
|
||||
tmp_obj = PyInt_FromLong(_int_constants[i].constant_value);
|
||||
if (!tmp_obj) {
|
||||
goto error;
|
||||
}
|
||||
PyDict_SetItemString(dict, _int_constants[i].constant_name, tmp_obj);
|
||||
Py_DECREF(tmp_obj);
|
||||
}
|
||||
|
||||
if (!(tmp_obj = PyString_FromString(PYSQLITE_VERSION))) {
|
||||
goto error;
|
||||
}
|
||||
PyDict_SetItemString(dict, "version", tmp_obj);
|
||||
Py_DECREF(tmp_obj);
|
||||
|
||||
if (!(tmp_obj = PyString_FromString(sqlite3_libversion()))) {
|
||||
goto error;
|
||||
}
|
||||
PyDict_SetItemString(dict, "sqlite_version", tmp_obj);
|
||||
Py_DECREF(tmp_obj);
|
||||
|
||||
/* initialize microprotocols layer */
|
||||
pysqlite_microprotocols_init(dict);
|
||||
|
||||
/* initialize the default converters */
|
||||
converters_init(dict);
|
||||
|
||||
_enable_callback_tracebacks = 0;
|
||||
|
||||
pysqlite_BaseTypeAdapted = 0;
|
||||
|
||||
/* Original comment from _bsddb.c in the Python core. This is also still
|
||||
* needed nowadays for Python 2.3/2.4.
|
||||
*
|
||||
* PyEval_InitThreads is called here due to a quirk in python 1.5
|
||||
* - 2.2.1 (at least) according to Russell Williamson <merel@wt.net>:
|
||||
* The global interpreter lock is not initialized until the first
|
||||
* thread is created using thread.start_new_thread() or fork() is
|
||||
* called. that would cause the ALLOW_THREADS here to segfault due
|
||||
* to a null pointer reference if no threads or child processes
|
||||
* have been created. This works around that and is a no-op if
|
||||
* threads have already been initialized.
|
||||
* (see pybsddb-users mailing list post on 2002-08-07)
|
||||
*/
|
||||
#ifdef WITH_THREAD
|
||||
PyEval_InitThreads();
|
||||
#endif
|
||||
|
||||
error:
|
||||
if (PyErr_Occurred())
|
||||
{
|
||||
PyErr_SetString(PyExc_ImportError, MODULE_NAME ": init failed");
|
||||
}
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
/* module.h - definitions for the module
|
||||
*
|
||||
* Copyright (C) 2004-2010 Gerhard H<>ring <gh@ghaering.de>
|
||||
*
|
||||
* This file is part of pysqlite.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef PYSQLITE_MODULE_H
|
||||
#define PYSQLITE_MODULE_H
|
||||
#include "Python.h"
|
||||
|
||||
#define PYSQLITE_VERSION "2.6.0"
|
||||
|
||||
extern PyObject* pysqlite_Error;
|
||||
extern PyObject* pysqlite_Warning;
|
||||
extern PyObject* pysqlite_InterfaceError;
|
||||
extern PyObject* pysqlite_DatabaseError;
|
||||
extern PyObject* pysqlite_InternalError;
|
||||
extern PyObject* pysqlite_OperationalError;
|
||||
extern PyObject* pysqlite_ProgrammingError;
|
||||
extern PyObject* pysqlite_IntegrityError;
|
||||
extern PyObject* pysqlite_DataError;
|
||||
extern PyObject* pysqlite_NotSupportedError;
|
||||
|
||||
extern PyObject* pysqlite_OptimizedUnicode;
|
||||
|
||||
/* the functions time.time() and time.sleep() */
|
||||
extern PyObject* time_time;
|
||||
extern PyObject* time_sleep;
|
||||
|
||||
/* A dictionary, mapping colum types (INTEGER, VARCHAR, etc.) to converter
|
||||
* functions, that convert the SQL value to the appropriate Python value.
|
||||
* The key is uppercase.
|
||||
*/
|
||||
extern PyObject* converters;
|
||||
|
||||
extern int _enable_callback_tracebacks;
|
||||
extern int pysqlite_BaseTypeAdapted;
|
||||
|
||||
#define PARSE_DECLTYPES 1
|
||||
#define PARSE_COLNAMES 2
|
||||
#endif
|
@ -0,0 +1,84 @@
|
||||
/* prepare_protocol.c - the protocol for preparing values for SQLite
|
||||
*
|
||||
* Copyright (C) 2005-2010 Gerhard H<>ring <gh@ghaering.de>
|
||||
*
|
||||
* This file is part of pysqlite.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include "sqlitecompat.h"
|
||||
#include "prepare_protocol.h"
|
||||
|
||||
int pysqlite_prepare_protocol_init(pysqlite_PrepareProtocol* self, PyObject* args, PyObject* kwargs)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pysqlite_prepare_protocol_dealloc(pysqlite_PrepareProtocol* self)
|
||||
{
|
||||
Py_TYPE(self)->tp_free((PyObject*)self);
|
||||
}
|
||||
|
||||
PyTypeObject pysqlite_PrepareProtocolType= {
|
||||
PyVarObject_HEAD_INIT(NULL, 0)
|
||||
MODULE_NAME ".PrepareProtocol", /* tp_name */
|
||||
sizeof(pysqlite_PrepareProtocol), /* tp_basicsize */
|
||||
0, /* tp_itemsize */
|
||||
(destructor)pysqlite_prepare_protocol_dealloc, /* tp_dealloc */
|
||||
0, /* tp_print */
|
||||
0, /* tp_getattr */
|
||||
0, /* tp_setattr */
|
||||
0, /* tp_compare */
|
||||
0, /* tp_repr */
|
||||
0, /* tp_as_number */
|
||||
0, /* tp_as_sequence */
|
||||
0, /* tp_as_mapping */
|
||||
0, /* tp_hash */
|
||||
0, /* tp_call */
|
||||
0, /* tp_str */
|
||||
0, /* tp_getattro */
|
||||
0, /* tp_setattro */
|
||||
0, /* tp_as_buffer */
|
||||
Py_TPFLAGS_DEFAULT, /* tp_flags */
|
||||
0, /* tp_doc */
|
||||
0, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
0, /* tp_richcompare */
|
||||
0, /* tp_weaklistoffset */
|
||||
0, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
0, /* tp_methods */
|
||||
0, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
0, /* tp_dict */
|
||||
0, /* tp_descr_get */
|
||||
0, /* tp_descr_set */
|
||||
0, /* tp_dictoffset */
|
||||
(initproc)pysqlite_prepare_protocol_init, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
0, /* tp_new */
|
||||
0 /* tp_free */
|
||||
};
|
||||
|
||||
extern int pysqlite_prepare_protocol_setup_types(void)
|
||||
{
|
||||
pysqlite_PrepareProtocolType.tp_new = PyType_GenericNew;
|
||||
Py_TYPE(&pysqlite_PrepareProtocolType)= &PyType_Type;
|
||||
return PyType_Ready(&pysqlite_PrepareProtocolType);
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
/* prepare_protocol.h - the protocol for preparing values for SQLite
|
||||
*
|
||||
* Copyright (C) 2005-2010 Gerhard H<>ring <gh@ghaering.de>
|
||||
*
|
||||
* This file is part of pysqlite.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef PYSQLITE_PREPARE_PROTOCOL_H
|
||||
#define PYSQLITE_PREPARE_PROTOCOL_H
|
||||
#include "Python.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
PyObject_HEAD
|
||||
} pysqlite_PrepareProtocol;
|
||||
|
||||
extern PyTypeObject pysqlite_PrepareProtocolType;
|
||||
|
||||
int pysqlite_prepare_protocol_init(pysqlite_PrepareProtocol* self, PyObject* args, PyObject* kwargs);
|
||||
void pysqlite_prepare_protocol_dealloc(pysqlite_PrepareProtocol* self);
|
||||
|
||||
int pysqlite_prepare_protocol_setup_types(void);
|
||||
|
||||
#define UNKNOWN (-1)
|
||||
#endif
|
256
AppPkg/Applications/Python/Python-2.7.2/Modules/_sqlite/row.c
Normal file
256
AppPkg/Applications/Python/Python-2.7.2/Modules/_sqlite/row.c
Normal file
@ -0,0 +1,256 @@
|
||||
/* row.c - an enhanced tuple for database rows
|
||||
*
|
||||
* Copyright (C) 2005-2010 Gerhard H<>ring <gh@ghaering.de>
|
||||
*
|
||||
* This file is part of pysqlite.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include "row.h"
|
||||
#include "cursor.h"
|
||||
#include "sqlitecompat.h"
|
||||
|
||||
void pysqlite_row_dealloc(pysqlite_Row* self)
|
||||
{
|
||||
Py_XDECREF(self->data);
|
||||
Py_XDECREF(self->description);
|
||||
|
||||
Py_TYPE(self)->tp_free((PyObject*)self);
|
||||
}
|
||||
|
||||
int pysqlite_row_init(pysqlite_Row* self, PyObject* args, PyObject* kwargs)
|
||||
{
|
||||
PyObject* data;
|
||||
pysqlite_Cursor* cursor;
|
||||
|
||||
self->data = 0;
|
||||
self->description = 0;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "OO", &cursor, &data)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!PyObject_IsInstance((PyObject*)cursor, (PyObject*)&pysqlite_CursorType)) {
|
||||
PyErr_SetString(PyExc_TypeError, "instance of cursor required for first argument");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!PyTuple_Check(data)) {
|
||||
PyErr_SetString(PyExc_TypeError, "tuple required for second argument");
|
||||
return -1;
|
||||
}
|
||||
|
||||
Py_INCREF(data);
|
||||
self->data = data;
|
||||
|
||||
Py_INCREF(cursor->description);
|
||||
self->description = cursor->description;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
PyObject* pysqlite_row_subscript(pysqlite_Row* self, PyObject* idx)
|
||||
{
|
||||
long _idx;
|
||||
char* key;
|
||||
int nitems, i;
|
||||
char* compare_key;
|
||||
|
||||
char* p1;
|
||||
char* p2;
|
||||
|
||||
PyObject* item;
|
||||
|
||||
if (PyInt_Check(idx)) {
|
||||
_idx = PyInt_AsLong(idx);
|
||||
item = PyTuple_GetItem(self->data, _idx);
|
||||
Py_XINCREF(item);
|
||||
return item;
|
||||
} else if (PyLong_Check(idx)) {
|
||||
_idx = PyLong_AsLong(idx);
|
||||
item = PyTuple_GetItem(self->data, _idx);
|
||||
Py_XINCREF(item);
|
||||
return item;
|
||||
} else if (PyString_Check(idx)) {
|
||||
key = PyString_AsString(idx);
|
||||
|
||||
nitems = PyTuple_Size(self->description);
|
||||
|
||||
for (i = 0; i < nitems; i++) {
|
||||
compare_key = PyString_AsString(PyTuple_GET_ITEM(PyTuple_GET_ITEM(self->description, i), 0));
|
||||
if (!compare_key) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
p1 = key;
|
||||
p2 = compare_key;
|
||||
|
||||
while (1) {
|
||||
if ((*p1 == (char)0) || (*p2 == (char)0)) {
|
||||
break;
|
||||
}
|
||||
|
||||
if ((*p1 | 0x20) != (*p2 | 0x20)) {
|
||||
break;
|
||||
}
|
||||
|
||||
p1++;
|
||||
p2++;
|
||||
}
|
||||
|
||||
if ((*p1 == (char)0) && (*p2 == (char)0)) {
|
||||
/* found item */
|
||||
item = PyTuple_GetItem(self->data, i);
|
||||
Py_INCREF(item);
|
||||
return item;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
PyErr_SetString(PyExc_IndexError, "No item with that key");
|
||||
return NULL;
|
||||
} else if (PySlice_Check(idx)) {
|
||||
PyErr_SetString(PyExc_ValueError, "slices not implemented, yet");
|
||||
return NULL;
|
||||
} else {
|
||||
PyErr_SetString(PyExc_IndexError, "Index must be int or string");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Py_ssize_t pysqlite_row_length(pysqlite_Row* self, PyObject* args, PyObject* kwargs)
|
||||
{
|
||||
return PyTuple_GET_SIZE(self->data);
|
||||
}
|
||||
|
||||
PyObject* pysqlite_row_keys(pysqlite_Row* self, PyObject* args, PyObject* kwargs)
|
||||
{
|
||||
PyObject* list;
|
||||
int nitems, i;
|
||||
|
||||
list = PyList_New(0);
|
||||
if (!list) {
|
||||
return NULL;
|
||||
}
|
||||
nitems = PyTuple_Size(self->description);
|
||||
|
||||
for (i = 0; i < nitems; i++) {
|
||||
if (PyList_Append(list, PyTuple_GET_ITEM(PyTuple_GET_ITEM(self->description, i), 0)) != 0) {
|
||||
Py_DECREF(list);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
static int pysqlite_row_print(pysqlite_Row* self, FILE *fp, int flags)
|
||||
{
|
||||
return (&PyTuple_Type)->tp_print(self->data, fp, flags);
|
||||
}
|
||||
|
||||
static PyObject* pysqlite_iter(pysqlite_Row* self)
|
||||
{
|
||||
return PyObject_GetIter(self->data);
|
||||
}
|
||||
|
||||
static long pysqlite_row_hash(pysqlite_Row *self)
|
||||
{
|
||||
return PyObject_Hash(self->description) ^ PyObject_Hash(self->data);
|
||||
}
|
||||
|
||||
static PyObject* pysqlite_row_richcompare(pysqlite_Row *self, PyObject *_other, int opid)
|
||||
{
|
||||
if (opid != Py_EQ && opid != Py_NE) {
|
||||
Py_INCREF(Py_NotImplemented);
|
||||
return Py_NotImplemented;
|
||||
}
|
||||
if (PyType_IsSubtype(Py_TYPE(_other), &pysqlite_RowType)) {
|
||||
pysqlite_Row *other = (pysqlite_Row *)_other;
|
||||
PyObject *res = PyObject_RichCompare(self->description, other->description, opid);
|
||||
if ((opid == Py_EQ && res == Py_True)
|
||||
|| (opid == Py_NE && res == Py_False)) {
|
||||
Py_DECREF(res);
|
||||
return PyObject_RichCompare(self->data, other->data, opid);
|
||||
}
|
||||
}
|
||||
Py_INCREF(Py_NotImplemented);
|
||||
return Py_NotImplemented;
|
||||
}
|
||||
|
||||
PyMappingMethods pysqlite_row_as_mapping = {
|
||||
/* mp_length */ (lenfunc)pysqlite_row_length,
|
||||
/* mp_subscript */ (binaryfunc)pysqlite_row_subscript,
|
||||
/* mp_ass_subscript */ (objobjargproc)0,
|
||||
};
|
||||
|
||||
static PyMethodDef pysqlite_row_methods[] = {
|
||||
{"keys", (PyCFunction)pysqlite_row_keys, METH_NOARGS,
|
||||
PyDoc_STR("Returns the keys of the row.")},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
||||
PyTypeObject pysqlite_RowType = {
|
||||
PyVarObject_HEAD_INIT(NULL, 0)
|
||||
MODULE_NAME ".Row", /* tp_name */
|
||||
sizeof(pysqlite_Row), /* tp_basicsize */
|
||||
0, /* tp_itemsize */
|
||||
(destructor)pysqlite_row_dealloc, /* tp_dealloc */
|
||||
(printfunc)pysqlite_row_print, /* tp_print */
|
||||
0, /* tp_getattr */
|
||||
0, /* tp_setattr */
|
||||
0, /* tp_compare */
|
||||
0, /* tp_repr */
|
||||
0, /* tp_as_number */
|
||||
0, /* tp_as_sequence */
|
||||
0, /* tp_as_mapping */
|
||||
(hashfunc)pysqlite_row_hash, /* tp_hash */
|
||||
0, /* tp_call */
|
||||
0, /* tp_str */
|
||||
0, /* tp_getattro */
|
||||
0, /* tp_setattro */
|
||||
0, /* tp_as_buffer */
|
||||
Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
|
||||
0, /* tp_doc */
|
||||
(traverseproc)0, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
(richcmpfunc)pysqlite_row_richcompare, /* tp_richcompare */
|
||||
0, /* tp_weaklistoffset */
|
||||
(getiterfunc)pysqlite_iter, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
pysqlite_row_methods, /* tp_methods */
|
||||
0, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
0, /* tp_dict */
|
||||
0, /* tp_descr_get */
|
||||
0, /* tp_descr_set */
|
||||
0, /* tp_dictoffset */
|
||||
(initproc)pysqlite_row_init, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
0, /* tp_new */
|
||||
0 /* tp_free */
|
||||
};
|
||||
|
||||
extern int pysqlite_row_setup_types(void)
|
||||
{
|
||||
pysqlite_RowType.tp_new = PyType_GenericNew;
|
||||
pysqlite_RowType.tp_as_mapping = &pysqlite_row_as_mapping;
|
||||
return PyType_Ready(&pysqlite_RowType);
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
/* row.h - an enhanced tuple for database rows
|
||||
*
|
||||
* Copyright (C) 2005-2010 Gerhard H<>ring <gh@ghaering.de>
|
||||
*
|
||||
* This file is part of pysqlite.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef PYSQLITE_ROW_H
|
||||
#define PYSQLITE_ROW_H
|
||||
#include "Python.h"
|
||||
|
||||
typedef struct _Row
|
||||
{
|
||||
PyObject_HEAD
|
||||
PyObject* data;
|
||||
PyObject* description;
|
||||
} pysqlite_Row;
|
||||
|
||||
extern PyTypeObject pysqlite_RowType;
|
||||
|
||||
int pysqlite_row_setup_types(void);
|
||||
|
||||
#endif
|
@ -0,0 +1,63 @@
|
||||
/* sqlitecompat.h - compatibility macros
|
||||
*
|
||||
* Copyright (C) 2006-2010 Gerhard H<>ring <gh@ghaering.de>
|
||||
*
|
||||
* This file is part of pysqlite.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include "Python.h"
|
||||
|
||||
#ifndef PYSQLITE_COMPAT_H
|
||||
#define PYSQLITE_COMPAT_H
|
||||
|
||||
/* define Py_ssize_t for pre-2.5 versions of Python */
|
||||
|
||||
#if PY_VERSION_HEX < 0x02050000
|
||||
typedef int Py_ssize_t;
|
||||
typedef int (*lenfunc)(PyObject*);
|
||||
#endif
|
||||
|
||||
|
||||
/* define PyDict_CheckExact for pre-2.4 versions of Python */
|
||||
#ifndef PyDict_CheckExact
|
||||
#define PyDict_CheckExact(op) ((op)->ob_type == &PyDict_Type)
|
||||
#endif
|
||||
|
||||
/* define Py_CLEAR for pre-2.4 versions of Python */
|
||||
#ifndef Py_CLEAR
|
||||
#define Py_CLEAR(op) \
|
||||
do { \
|
||||
if (op) { \
|
||||
PyObject *tmp = (PyObject *)(op); \
|
||||
(op) = NULL; \
|
||||
Py_DECREF(tmp); \
|
||||
} \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#ifndef PyVarObject_HEAD_INIT
|
||||
#define PyVarObject_HEAD_INIT(type, size) \
|
||||
PyObject_HEAD_INIT(type) size,
|
||||
#endif
|
||||
|
||||
#ifndef Py_TYPE
|
||||
#define Py_TYPE(ob) ((ob)->ob_type)
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,543 @@
|
||||
/* statement.c - the statement type
|
||||
*
|
||||
* Copyright (C) 2005-2010 Gerhard H<>ring <gh@ghaering.de>
|
||||
*
|
||||
* This file is part of pysqlite.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include "statement.h"
|
||||
#include "cursor.h"
|
||||
#include "connection.h"
|
||||
#include "microprotocols.h"
|
||||
#include "prepare_protocol.h"
|
||||
#include "sqlitecompat.h"
|
||||
|
||||
/* prototypes */
|
||||
static int pysqlite_check_remaining_sql(const char* tail);
|
||||
|
||||
typedef enum {
|
||||
LINECOMMENT_1,
|
||||
IN_LINECOMMENT,
|
||||
COMMENTSTART_1,
|
||||
IN_COMMENT,
|
||||
COMMENTEND_1,
|
||||
NORMAL
|
||||
} parse_remaining_sql_state;
|
||||
|
||||
typedef enum {
|
||||
TYPE_INT,
|
||||
TYPE_LONG,
|
||||
TYPE_FLOAT,
|
||||
TYPE_STRING,
|
||||
TYPE_UNICODE,
|
||||
TYPE_BUFFER,
|
||||
TYPE_UNKNOWN
|
||||
} parameter_type;
|
||||
|
||||
int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* connection, PyObject* sql)
|
||||
{
|
||||
const char* tail;
|
||||
int rc;
|
||||
PyObject* sql_str;
|
||||
char* sql_cstr;
|
||||
|
||||
self->st = NULL;
|
||||
self->in_use = 0;
|
||||
|
||||
if (PyString_Check(sql)) {
|
||||
sql_str = sql;
|
||||
Py_INCREF(sql_str);
|
||||
} else if (PyUnicode_Check(sql)) {
|
||||
sql_str = PyUnicode_AsUTF8String(sql);
|
||||
if (!sql_str) {
|
||||
rc = PYSQLITE_SQL_WRONG_TYPE;
|
||||
return rc;
|
||||
}
|
||||
} else {
|
||||
rc = PYSQLITE_SQL_WRONG_TYPE;
|
||||
return rc;
|
||||
}
|
||||
|
||||
self->in_weakreflist = NULL;
|
||||
self->sql = sql_str;
|
||||
|
||||
sql_cstr = PyString_AsString(sql_str);
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
rc = sqlite3_prepare(connection->db,
|
||||
sql_cstr,
|
||||
-1,
|
||||
&self->st,
|
||||
&tail);
|
||||
Py_END_ALLOW_THREADS
|
||||
|
||||
self->db = connection->db;
|
||||
|
||||
if (rc == SQLITE_OK && pysqlite_check_remaining_sql(tail)) {
|
||||
(void)sqlite3_finalize(self->st);
|
||||
self->st = NULL;
|
||||
rc = PYSQLITE_TOO_MUCH_SQL;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int pysqlite_statement_bind_parameter(pysqlite_Statement* self, int pos, PyObject* parameter, int allow_8bit_chars)
|
||||
{
|
||||
int rc = SQLITE_OK;
|
||||
long longval;
|
||||
PY_LONG_LONG longlongval;
|
||||
const char* buffer;
|
||||
char* string;
|
||||
Py_ssize_t buflen;
|
||||
PyObject* stringval;
|
||||
parameter_type paramtype;
|
||||
char* c;
|
||||
|
||||
if (parameter == Py_None) {
|
||||
rc = sqlite3_bind_null(self->st, pos);
|
||||
goto final;
|
||||
}
|
||||
|
||||
if (PyInt_CheckExact(parameter)) {
|
||||
paramtype = TYPE_INT;
|
||||
} else if (PyLong_CheckExact(parameter)) {
|
||||
paramtype = TYPE_LONG;
|
||||
} else if (PyFloat_CheckExact(parameter)) {
|
||||
paramtype = TYPE_FLOAT;
|
||||
} else if (PyString_CheckExact(parameter)) {
|
||||
paramtype = TYPE_STRING;
|
||||
} else if (PyUnicode_CheckExact(parameter)) {
|
||||
paramtype = TYPE_UNICODE;
|
||||
} else if (PyBuffer_Check(parameter)) {
|
||||
paramtype = TYPE_BUFFER;
|
||||
} else if (PyInt_Check(parameter)) {
|
||||
paramtype = TYPE_INT;
|
||||
} else if (PyLong_Check(parameter)) {
|
||||
paramtype = TYPE_LONG;
|
||||
} else if (PyFloat_Check(parameter)) {
|
||||
paramtype = TYPE_FLOAT;
|
||||
} else if (PyString_Check(parameter)) {
|
||||
paramtype = TYPE_STRING;
|
||||
} else if (PyUnicode_Check(parameter)) {
|
||||
paramtype = TYPE_UNICODE;
|
||||
} else {
|
||||
paramtype = TYPE_UNKNOWN;
|
||||
}
|
||||
|
||||
if (paramtype == TYPE_STRING && !allow_8bit_chars) {
|
||||
string = PyString_AS_STRING(parameter);
|
||||
for (c = string; *c != 0; c++) {
|
||||
if (*c & 0x80) {
|
||||
PyErr_SetString(pysqlite_ProgrammingError, "You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.");
|
||||
rc = -1;
|
||||
goto final;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch (paramtype) {
|
||||
case TYPE_INT:
|
||||
longval = PyInt_AsLong(parameter);
|
||||
rc = sqlite3_bind_int64(self->st, pos, (sqlite_int64)longval);
|
||||
break;
|
||||
case TYPE_LONG:
|
||||
longlongval = PyLong_AsLongLong(parameter);
|
||||
/* in the overflow error case, longlongval is -1, and an exception is set */
|
||||
rc = sqlite3_bind_int64(self->st, pos, (sqlite_int64)longlongval);
|
||||
break;
|
||||
case TYPE_FLOAT:
|
||||
rc = sqlite3_bind_double(self->st, pos, PyFloat_AsDouble(parameter));
|
||||
break;
|
||||
case TYPE_STRING:
|
||||
string = PyString_AS_STRING(parameter);
|
||||
rc = sqlite3_bind_text(self->st, pos, string, -1, SQLITE_TRANSIENT);
|
||||
break;
|
||||
case TYPE_UNICODE:
|
||||
stringval = PyUnicode_AsUTF8String(parameter);
|
||||
string = PyString_AsString(stringval);
|
||||
rc = sqlite3_bind_text(self->st, pos, string, -1, SQLITE_TRANSIENT);
|
||||
Py_DECREF(stringval);
|
||||
break;
|
||||
case TYPE_BUFFER:
|
||||
if (PyObject_AsCharBuffer(parameter, &buffer, &buflen) == 0) {
|
||||
rc = sqlite3_bind_blob(self->st, pos, buffer, buflen, SQLITE_TRANSIENT);
|
||||
} else {
|
||||
PyErr_SetString(PyExc_ValueError, "could not convert BLOB to buffer");
|
||||
rc = -1;
|
||||
}
|
||||
break;
|
||||
case TYPE_UNKNOWN:
|
||||
rc = -1;
|
||||
}
|
||||
|
||||
final:
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* returns 0 if the object is one of Python's internal ones that don't need to be adapted */
|
||||
static int _need_adapt(PyObject* obj)
|
||||
{
|
||||
if (pysqlite_BaseTypeAdapted) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (PyInt_CheckExact(obj) || PyLong_CheckExact(obj)
|
||||
|| PyFloat_CheckExact(obj) || PyString_CheckExact(obj)
|
||||
|| PyUnicode_CheckExact(obj) || PyBuffer_Check(obj)) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* parameters, int allow_8bit_chars)
|
||||
{
|
||||
PyObject* current_param;
|
||||
PyObject* adapted;
|
||||
const char* binding_name;
|
||||
int i;
|
||||
int rc;
|
||||
int num_params_needed;
|
||||
int num_params;
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
num_params_needed = sqlite3_bind_parameter_count(self->st);
|
||||
Py_END_ALLOW_THREADS
|
||||
|
||||
if (PyTuple_CheckExact(parameters) || PyList_CheckExact(parameters) || (!PyDict_Check(parameters) && PySequence_Check(parameters))) {
|
||||
/* parameters passed as sequence */
|
||||
if (PyTuple_CheckExact(parameters)) {
|
||||
num_params = PyTuple_GET_SIZE(parameters);
|
||||
} else if (PyList_CheckExact(parameters)) {
|
||||
num_params = PyList_GET_SIZE(parameters);
|
||||
} else {
|
||||
num_params = PySequence_Size(parameters);
|
||||
}
|
||||
if (num_params != num_params_needed) {
|
||||
PyErr_Format(pysqlite_ProgrammingError, "Incorrect number of bindings supplied. The current statement uses %d, and there are %d supplied.",
|
||||
num_params_needed, num_params);
|
||||
return;
|
||||
}
|
||||
for (i = 0; i < num_params; i++) {
|
||||
if (PyTuple_CheckExact(parameters)) {
|
||||
current_param = PyTuple_GET_ITEM(parameters, i);
|
||||
Py_XINCREF(current_param);
|
||||
} else if (PyList_CheckExact(parameters)) {
|
||||
current_param = PyList_GET_ITEM(parameters, i);
|
||||
Py_XINCREF(current_param);
|
||||
} else {
|
||||
current_param = PySequence_GetItem(parameters, i);
|
||||
}
|
||||
if (!current_param) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_need_adapt(current_param)) {
|
||||
adapted = current_param;
|
||||
} else {
|
||||
adapted = pysqlite_microprotocols_adapt(current_param, (PyObject*)&pysqlite_PrepareProtocolType, NULL);
|
||||
if (adapted) {
|
||||
Py_DECREF(current_param);
|
||||
} else {
|
||||
PyErr_Clear();
|
||||
adapted = current_param;
|
||||
}
|
||||
}
|
||||
|
||||
rc = pysqlite_statement_bind_parameter(self, i + 1, adapted, allow_8bit_chars);
|
||||
Py_DECREF(adapted);
|
||||
|
||||
if (rc != SQLITE_OK) {
|
||||
if (!PyErr_Occurred()) {
|
||||
PyErr_Format(pysqlite_InterfaceError, "Error binding parameter %d - probably unsupported type.", i);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else if (PyDict_Check(parameters)) {
|
||||
/* parameters passed as dictionary */
|
||||
for (i = 1; i <= num_params_needed; i++) {
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
binding_name = sqlite3_bind_parameter_name(self->st, i);
|
||||
Py_END_ALLOW_THREADS
|
||||
if (!binding_name) {
|
||||
PyErr_Format(pysqlite_ProgrammingError, "Binding %d has no name, but you supplied a dictionary (which has only names).", i);
|
||||
return;
|
||||
}
|
||||
|
||||
binding_name++; /* skip first char (the colon) */
|
||||
if (PyDict_CheckExact(parameters)) {
|
||||
current_param = PyDict_GetItemString(parameters, binding_name);
|
||||
Py_XINCREF(current_param);
|
||||
} else {
|
||||
current_param = PyMapping_GetItemString(parameters, (char*)binding_name);
|
||||
}
|
||||
if (!current_param) {
|
||||
PyErr_Format(pysqlite_ProgrammingError, "You did not supply a value for binding %d.", i);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_need_adapt(current_param)) {
|
||||
adapted = current_param;
|
||||
} else {
|
||||
adapted = pysqlite_microprotocols_adapt(current_param, (PyObject*)&pysqlite_PrepareProtocolType, NULL);
|
||||
if (adapted) {
|
||||
Py_DECREF(current_param);
|
||||
} else {
|
||||
PyErr_Clear();
|
||||
adapted = current_param;
|
||||
}
|
||||
}
|
||||
|
||||
rc = pysqlite_statement_bind_parameter(self, i, adapted, allow_8bit_chars);
|
||||
Py_DECREF(adapted);
|
||||
|
||||
if (rc != SQLITE_OK) {
|
||||
if (!PyErr_Occurred()) {
|
||||
PyErr_Format(pysqlite_InterfaceError, "Error binding parameter :%s - probably unsupported type.", binding_name);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
PyErr_SetString(PyExc_ValueError, "parameters are of unsupported type");
|
||||
}
|
||||
}
|
||||
|
||||
int pysqlite_statement_recompile(pysqlite_Statement* self, PyObject* params)
|
||||
{
|
||||
const char* tail;
|
||||
int rc;
|
||||
char* sql_cstr;
|
||||
sqlite3_stmt* new_st;
|
||||
|
||||
sql_cstr = PyString_AsString(self->sql);
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
rc = sqlite3_prepare(self->db,
|
||||
sql_cstr,
|
||||
-1,
|
||||
&new_st,
|
||||
&tail);
|
||||
Py_END_ALLOW_THREADS
|
||||
|
||||
if (rc == SQLITE_OK) {
|
||||
/* The efficient sqlite3_transfer_bindings is only available in SQLite
|
||||
* version 3.2.2 or later. For older SQLite releases, that might not
|
||||
* even define SQLITE_VERSION_NUMBER, we do it the manual way.
|
||||
*/
|
||||
#ifdef SQLITE_VERSION_NUMBER
|
||||
#if SQLITE_VERSION_NUMBER >= 3002002
|
||||
/* The check for the number of parameters is necessary to not trigger a
|
||||
* bug in certain SQLite versions (experienced in 3.2.8 and 3.3.4). */
|
||||
if (sqlite3_bind_parameter_count(self->st) > 0) {
|
||||
(void)sqlite3_transfer_bindings(self->st, new_st);
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
statement_bind_parameters(self, params);
|
||||
#endif
|
||||
|
||||
(void)sqlite3_finalize(self->st);
|
||||
self->st = new_st;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int pysqlite_statement_finalize(pysqlite_Statement* self)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = SQLITE_OK;
|
||||
if (self->st) {
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
rc = sqlite3_finalize(self->st);
|
||||
Py_END_ALLOW_THREADS
|
||||
self->st = NULL;
|
||||
}
|
||||
|
||||
self->in_use = 0;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int pysqlite_statement_reset(pysqlite_Statement* self)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = SQLITE_OK;
|
||||
|
||||
if (self->in_use && self->st) {
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
rc = sqlite3_reset(self->st);
|
||||
Py_END_ALLOW_THREADS
|
||||
|
||||
if (rc == SQLITE_OK) {
|
||||
self->in_use = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
void pysqlite_statement_mark_dirty(pysqlite_Statement* self)
|
||||
{
|
||||
self->in_use = 1;
|
||||
}
|
||||
|
||||
void pysqlite_statement_dealloc(pysqlite_Statement* self)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (self->st) {
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
rc = sqlite3_finalize(self->st);
|
||||
Py_END_ALLOW_THREADS
|
||||
}
|
||||
|
||||
self->st = NULL;
|
||||
|
||||
Py_XDECREF(self->sql);
|
||||
|
||||
if (self->in_weakreflist != NULL) {
|
||||
PyObject_ClearWeakRefs((PyObject*)self);
|
||||
}
|
||||
|
||||
Py_TYPE(self)->tp_free((PyObject*)self);
|
||||
}
|
||||
|
||||
/*
|
||||
* Checks if there is anything left in an SQL string after SQLite compiled it.
|
||||
* This is used to check if somebody tried to execute more than one SQL command
|
||||
* with one execute()/executemany() command, which the DB-API and we don't
|
||||
* allow.
|
||||
*
|
||||
* Returns 1 if there is more left than should be. 0 if ok.
|
||||
*/
|
||||
static int pysqlite_check_remaining_sql(const char* tail)
|
||||
{
|
||||
const char* pos = tail;
|
||||
|
||||
parse_remaining_sql_state state = NORMAL;
|
||||
|
||||
for (;;) {
|
||||
switch (*pos) {
|
||||
case 0:
|
||||
return 0;
|
||||
case '-':
|
||||
if (state == NORMAL) {
|
||||
state = LINECOMMENT_1;
|
||||
} else if (state == LINECOMMENT_1) {
|
||||
state = IN_LINECOMMENT;
|
||||
}
|
||||
break;
|
||||
case ' ':
|
||||
case '\t':
|
||||
break;
|
||||
case '\n':
|
||||
case 13:
|
||||
if (state == IN_LINECOMMENT) {
|
||||
state = NORMAL;
|
||||
}
|
||||
break;
|
||||
case '/':
|
||||
if (state == NORMAL) {
|
||||
state = COMMENTSTART_1;
|
||||
} else if (state == COMMENTEND_1) {
|
||||
state = NORMAL;
|
||||
} else if (state == COMMENTSTART_1) {
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
case '*':
|
||||
if (state == NORMAL) {
|
||||
return 1;
|
||||
} else if (state == LINECOMMENT_1) {
|
||||
return 1;
|
||||
} else if (state == COMMENTSTART_1) {
|
||||
state = IN_COMMENT;
|
||||
} else if (state == IN_COMMENT) {
|
||||
state = COMMENTEND_1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (state == COMMENTEND_1) {
|
||||
state = IN_COMMENT;
|
||||
} else if (state == IN_LINECOMMENT) {
|
||||
} else if (state == IN_COMMENT) {
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
pos++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
PyTypeObject pysqlite_StatementType = {
|
||||
PyVarObject_HEAD_INIT(NULL, 0)
|
||||
MODULE_NAME ".Statement", /* tp_name */
|
||||
sizeof(pysqlite_Statement), /* tp_basicsize */
|
||||
0, /* tp_itemsize */
|
||||
(destructor)pysqlite_statement_dealloc, /* tp_dealloc */
|
||||
0, /* tp_print */
|
||||
0, /* tp_getattr */
|
||||
0, /* tp_setattr */
|
||||
0, /* tp_compare */
|
||||
0, /* tp_repr */
|
||||
0, /* tp_as_number */
|
||||
0, /* tp_as_sequence */
|
||||
0, /* tp_as_mapping */
|
||||
0, /* tp_hash */
|
||||
0, /* tp_call */
|
||||
0, /* tp_str */
|
||||
0, /* tp_getattro */
|
||||
0, /* tp_setattro */
|
||||
0, /* tp_as_buffer */
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
|
||||
0, /* tp_doc */
|
||||
0, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
0, /* tp_richcompare */
|
||||
offsetof(pysqlite_Statement, in_weakreflist), /* tp_weaklistoffset */
|
||||
0, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
0, /* tp_methods */
|
||||
0, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
0, /* tp_dict */
|
||||
0, /* tp_descr_get */
|
||||
0, /* tp_descr_set */
|
||||
0, /* tp_dictoffset */
|
||||
(initproc)0, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
0, /* tp_new */
|
||||
0 /* tp_free */
|
||||
};
|
||||
|
||||
extern int pysqlite_statement_setup_types(void)
|
||||
{
|
||||
pysqlite_StatementType.tp_new = PyType_GenericNew;
|
||||
return PyType_Ready(&pysqlite_StatementType);
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
/* statement.h - definitions for the statement type
|
||||
*
|
||||
* Copyright (C) 2005-2010 Gerhard H<>ring <gh@ghaering.de>
|
||||
*
|
||||
* This file is part of pysqlite.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef PYSQLITE_STATEMENT_H
|
||||
#define PYSQLITE_STATEMENT_H
|
||||
#include "Python.h"
|
||||
|
||||
#include "connection.h"
|
||||
#include "sqlite3.h"
|
||||
|
||||
#define PYSQLITE_TOO_MUCH_SQL (-100)
|
||||
#define PYSQLITE_SQL_WRONG_TYPE (-101)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
PyObject_HEAD
|
||||
sqlite3* db;
|
||||
sqlite3_stmt* st;
|
||||
PyObject* sql;
|
||||
int in_use;
|
||||
PyObject* in_weakreflist; /* List of weak references */
|
||||
} pysqlite_Statement;
|
||||
|
||||
extern PyTypeObject pysqlite_StatementType;
|
||||
|
||||
int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* connection, PyObject* sql);
|
||||
void pysqlite_statement_dealloc(pysqlite_Statement* self);
|
||||
|
||||
int pysqlite_statement_bind_parameter(pysqlite_Statement* self, int pos, PyObject* parameter, int allow_8bit_chars);
|
||||
void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* parameters, int allow_8bit_chars);
|
||||
|
||||
int pysqlite_statement_recompile(pysqlite_Statement* self, PyObject* parameters);
|
||||
int pysqlite_statement_finalize(pysqlite_Statement* self);
|
||||
int pysqlite_statement_reset(pysqlite_Statement* self);
|
||||
void pysqlite_statement_mark_dirty(pysqlite_Statement* self);
|
||||
|
||||
int pysqlite_statement_setup_types(void);
|
||||
|
||||
#endif
|
106
AppPkg/Applications/Python/Python-2.7.2/Modules/_sqlite/util.c
Normal file
106
AppPkg/Applications/Python/Python-2.7.2/Modules/_sqlite/util.c
Normal file
@ -0,0 +1,106 @@
|
||||
/* util.c - various utility functions
|
||||
*
|
||||
* Copyright (C) 2005-2010 Gerhard H<>ring <gh@ghaering.de>
|
||||
*
|
||||
* This file is part of pysqlite.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include "module.h"
|
||||
#include "connection.h"
|
||||
|
||||
int pysqlite_step(sqlite3_stmt* statement, pysqlite_Connection* connection)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (statement == NULL) {
|
||||
/* this is a workaround for SQLite 3.5 and later. it now apparently
|
||||
* returns NULL for "no-operation" statements */
|
||||
rc = SQLITE_OK;
|
||||
} else {
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
rc = sqlite3_step(statement);
|
||||
Py_END_ALLOW_THREADS
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the SQLite error code and sets the appropriate DB-API exception.
|
||||
* Returns the error code (0 means no error occurred).
|
||||
*/
|
||||
int _pysqlite_seterror(sqlite3* db, sqlite3_stmt* st)
|
||||
{
|
||||
int errorcode;
|
||||
|
||||
/* SQLite often doesn't report anything useful, unless you reset the statement first */
|
||||
if (st != NULL) {
|
||||
(void)sqlite3_reset(st);
|
||||
}
|
||||
|
||||
errorcode = sqlite3_errcode(db);
|
||||
|
||||
switch (errorcode)
|
||||
{
|
||||
case SQLITE_OK:
|
||||
PyErr_Clear();
|
||||
break;
|
||||
case SQLITE_INTERNAL:
|
||||
case SQLITE_NOTFOUND:
|
||||
PyErr_SetString(pysqlite_InternalError, sqlite3_errmsg(db));
|
||||
break;
|
||||
case SQLITE_NOMEM:
|
||||
(void)PyErr_NoMemory();
|
||||
break;
|
||||
case SQLITE_ERROR:
|
||||
case SQLITE_PERM:
|
||||
case SQLITE_ABORT:
|
||||
case SQLITE_BUSY:
|
||||
case SQLITE_LOCKED:
|
||||
case SQLITE_READONLY:
|
||||
case SQLITE_INTERRUPT:
|
||||
case SQLITE_IOERR:
|
||||
case SQLITE_FULL:
|
||||
case SQLITE_CANTOPEN:
|
||||
case SQLITE_PROTOCOL:
|
||||
case SQLITE_EMPTY:
|
||||
case SQLITE_SCHEMA:
|
||||
PyErr_SetString(pysqlite_OperationalError, sqlite3_errmsg(db));
|
||||
break;
|
||||
case SQLITE_CORRUPT:
|
||||
PyErr_SetString(pysqlite_DatabaseError, sqlite3_errmsg(db));
|
||||
break;
|
||||
case SQLITE_TOOBIG:
|
||||
PyErr_SetString(pysqlite_DataError, sqlite3_errmsg(db));
|
||||
break;
|
||||
case SQLITE_CONSTRAINT:
|
||||
case SQLITE_MISMATCH:
|
||||
PyErr_SetString(pysqlite_IntegrityError, sqlite3_errmsg(db));
|
||||
break;
|
||||
case SQLITE_MISUSE:
|
||||
PyErr_SetString(pysqlite_ProgrammingError, sqlite3_errmsg(db));
|
||||
break;
|
||||
default:
|
||||
PyErr_SetString(pysqlite_DatabaseError, sqlite3_errmsg(db));
|
||||
break;
|
||||
}
|
||||
|
||||
return errorcode;
|
||||
}
|
||||
|
@ -0,0 +1,38 @@
|
||||
/* util.h - various utility functions
|
||||
*
|
||||
* Copyright (C) 2005-2010 Gerhard H<>ring <gh@ghaering.de>
|
||||
*
|
||||
* This file is part of pysqlite.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef PYSQLITE_UTIL_H
|
||||
#define PYSQLITE_UTIL_H
|
||||
#include "Python.h"
|
||||
#include "pythread.h"
|
||||
#include "sqlite3.h"
|
||||
#include "connection.h"
|
||||
|
||||
int pysqlite_step(sqlite3_stmt* statement, pysqlite_Connection* connection);
|
||||
|
||||
/**
|
||||
* Checks the SQLite error code and sets the appropriate DB-API exception.
|
||||
* Returns the error code (0 means no error occurred).
|
||||
*/
|
||||
int _pysqlite_seterror(sqlite3* db, sqlite3_stmt* st);
|
||||
#endif
|
Reference in New Issue
Block a user