mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-13 00:03:09 -04:00
Get rid of PySpatiaLite
This commit is contained in:
parent
6402160526
commit
6415fad072
4
debian/copyright
vendored
4
debian/copyright
vendored
@ -125,10 +125,6 @@ License: public-domain
|
||||
is used when saving/restoring a QGIS project.
|
||||
This file is in the public domain
|
||||
|
||||
Files: python/ext-libs/pyspatialite/*
|
||||
Copyright: 2004-2010, Gerhard Häring <gh@ghaering.de>
|
||||
License: Zlib
|
||||
|
||||
Files: python/plugins/processing/modeler/ModelerArrowItem.py
|
||||
src/app/qgssettingstree.cpp
|
||||
src/app/qgssettingstree.h
|
||||
|
@ -99,7 +99,7 @@ set PYTHONPATH=
|
||||
if exist "%PF86%\CMake\bin" path %PATH%;c:\cygwin\bin;%PF86%\CMake\bin
|
||||
if exist "%PROGRAMFILES%\CMake\bin" path %PATH%;c:\cygwin\bin;%PROGRAMFILES%\CMake\bin
|
||||
|
||||
PROMPT qgis%VERSION%$g
|
||||
PROMPT qgis%VERSION%$g
|
||||
|
||||
set BUILDCONF=RelWithDebInfo
|
||||
|
||||
@ -185,7 +185,6 @@ cmake -G Ninja ^
|
||||
-D CMAKE_INSTALL_PREFIX=%O4W_ROOT%/apps/%PACKAGENAME% ^
|
||||
-D FCGI_INCLUDE_DIR=%O4W_ROOT%/include ^
|
||||
-D FCGI_LIBRARY=%O4W_ROOT%/lib/libfcgi.lib ^
|
||||
-D WITH_PYSPATIALITE=TRUE ^
|
||||
-D QCA_INCLUDE_DIR=%OSGEO4W_ROOT%\apps\Qt5\include\QtCrypto ^
|
||||
-D QCA_LIBRARY=%OSGEO4W_ROOT%\apps\Qt5\lib\qca-qt5.lib ^
|
||||
-D QSCINTILLA_LIBRARY=%OSGEO4W_ROOT%\apps\Qt5\lib\qscintilla2.lib ^
|
||||
|
@ -92,7 +92,7 @@ set GRASS_VERSIONS=%GRASS72_VERSION%
|
||||
set PYTHONPATH=
|
||||
path %PATH%;c:\cygwin\bin;%PF86%\CMake\bin
|
||||
|
||||
PROMPT qgis%VERSION%$g
|
||||
PROMPT qgis%VERSION%$g
|
||||
|
||||
set BUILDCONF=Release
|
||||
|
||||
@ -178,7 +178,6 @@ cmake -G Ninja ^
|
||||
-D CMAKE_INSTALL_PREFIX=%O4W_ROOT%/apps/%PACKAGENAME% ^
|
||||
-D FCGI_INCLUDE_DIR=%O4W_ROOT%/include ^
|
||||
-D FCGI_LIBRARY=%O4W_ROOT%/lib/libfcgi.lib ^
|
||||
-D WITH_PYSPATIALITE=TRUE ^
|
||||
-D QCA_INCLUDE_DIR=%OSGEO4W_ROOT%\apps\Qt5\include\QtCrypto ^
|
||||
-D QCA_LIBRARY=%OSGEO4W_ROOT%\apps\Qt5\lib\qca-qt5.lib ^
|
||||
-D QSCINTILLA_LIBRARY=%OSGEO4W_ROOT%\apps\Qt5\lib\qscintilla2.lib ^
|
||||
|
@ -3,11 +3,6 @@
|
||||
SET (QGIS_PYTHON_DIR ${QGIS_DATA_DIR}/python)
|
||||
SET (PYTHON_OUTPUT_DIRECTORY ${QGIS_OUTPUT_DIRECTORY}/python)
|
||||
|
||||
SET (WITH_PYSPATIALITE FALSE CACHE BOOL "Determines whether PYSPATIALITE should be built")
|
||||
IF (WITH_PYSPATIALITE)
|
||||
ADD_SUBDIRECTORY(pyspatialite)
|
||||
ENDIF (WITH_PYSPATIALITE)
|
||||
|
||||
MACRO(EXT_PYLIB lib enable_by_default)
|
||||
STRING(TOUPPER ${lib} ulib)
|
||||
SET (WITH_INTERNAL_${ulib} ${enable_by_default} CACHE BOOL "Determines whether python ${lib} should be included")
|
||||
|
@ -1,66 +0,0 @@
|
||||
SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PYTHON_OUTPUT_DIRECTORY}/pyspatialite)
|
||||
SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PYTHON_OUTPUT_DIRECTORY}/pyspatialite)
|
||||
|
||||
INCLUDE_DIRECTORIES(
|
||||
${PYTHON_INCLUDE_PATH}
|
||||
${GEOS_INCLUDE_DIR}
|
||||
${PROJ_INCLUDE_DIR}
|
||||
${SQLITE3_INCLUDE_DIR}
|
||||
)
|
||||
|
||||
SET(PYSPATIALITE_SRC
|
||||
src/cache.c
|
||||
src/connection.c
|
||||
src/cursor.c
|
||||
src/microprotocols.c
|
||||
src/module.c
|
||||
src/prepare_protocol.c
|
||||
src/row.c
|
||||
src/statement.c
|
||||
src/util.c
|
||||
)
|
||||
|
||||
IF(MSVC)
|
||||
SET_SOURCE_FILES_PROPERTIES(${PYSPATIALITE_SRC} PROPERTIES COMPILE_FLAGS /W0)
|
||||
ELSE(MSVC)
|
||||
SET_SOURCE_FILES_PROPERTIES(${PYSPATIALITE_SRC} PROPERTIES COMPILE_FLAGS -w)
|
||||
ENDIF(MSVC)
|
||||
|
||||
ADD_DEFINITIONS(-DMODULE_NAME="spatialite.dbapi2")
|
||||
|
||||
IF (CYGWIN OR APPLE)
|
||||
ADD_LIBRARY(pyspatialite MODULE ${PYSPATIALITE_SRC})
|
||||
ELSE (CYGWIN OR APPLE)
|
||||
ADD_LIBRARY(pyspatialite SHARED ${PYSPATIALITE_SRC})
|
||||
ENDIF (CYGWIN OR APPLE)
|
||||
|
||||
IF (NOT APPLE)
|
||||
TARGET_LINK_LIBRARIES(pyspatialite ${PYTHON_LIBRARY})
|
||||
ENDIF (NOT APPLE)
|
||||
|
||||
TARGET_LINK_LIBRARIES(pyspatialite qgis_core ${SPATIALITE_LIBRARY})
|
||||
|
||||
IF (APPLE)
|
||||
SET_TARGET_PROPERTIES(pyspatialite PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
|
||||
ENDIF (APPLE)
|
||||
|
||||
SET_TARGET_PROPERTIES(pyspatialite PROPERTIES PREFIX "" OUTPUT_NAME _spatialite)
|
||||
|
||||
IF (WIN32)
|
||||
SET_TARGET_PROPERTIES(pyspatialite PROPERTIES SUFFIX ".pyd")
|
||||
ENDIF (WIN32)
|
||||
|
||||
FOREACH(file lib/__init__.py lib/dbapi2.py lib/dump.py)
|
||||
ADD_CUSTOM_COMMAND(TARGET pyspatialite
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy ${file} ${PYTHON_OUTPUT_DIRECTORY}/pyspatialite/
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
)
|
||||
ENDFOREACH(file)
|
||||
|
||||
INSTALL(TARGETS pyspatialite DESTINATION "${PYTHON_SITE_PACKAGES_DIR}/pyspatialite")
|
||||
INSTALL(FILES
|
||||
lib/__init__.py
|
||||
lib/dbapi2.py
|
||||
lib/dump.py
|
||||
DESTINATION "${PYTHON_SITE_PACKAGES_DIR}/pyspatialite")
|
@ -1,19 +0,0 @@
|
||||
Copyright (c) 2004-2007 Gerhard Häring
|
||||
|
||||
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.
|
@ -1,22 +0,0 @@
|
||||
#-*- coding: ISO-8859-1 -*-
|
||||
# pysqlite2/__init__.py: the pysqlite2 package.
|
||||
#
|
||||
# Copyright (C) 2005-2007 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.
|
@ -1,91 +0,0 @@
|
||||
#-*- coding: ISO-8859-1 -*-
|
||||
# pyspatialite/dbapi2.py: the DB-API 2.0 interface
|
||||
#
|
||||
# Copyright (C) 2004-2007 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.
|
||||
|
||||
import datetime
|
||||
import time
|
||||
|
||||
from pyspatialite._spatialite import *
|
||||
|
||||
paramstyle = "qmark"
|
||||
|
||||
threadsafety = 1
|
||||
|
||||
apilevel = "2.0"
|
||||
|
||||
Date = datetime.date
|
||||
|
||||
Time = datetime.time
|
||||
|
||||
Timestamp = datetime.datetime
|
||||
|
||||
def DateFromTicks(ticks):
|
||||
return Date(*time.localtime(ticks)[:3])
|
||||
|
||||
def TimeFromTicks(ticks):
|
||||
return Time(*time.localtime(ticks)[3:6])
|
||||
|
||||
def TimestampFromTicks(ticks):
|
||||
return Timestamp(*time.localtime(ticks)[:6])
|
||||
|
||||
version_info = tuple([int(x) for x in version.split(".")])
|
||||
sqlite_version_info = tuple([int(x) for x in sqlite_version.split(".")])
|
||||
|
||||
# buffer is no longer supported is python 3
|
||||
# memoryview fit 2.7 and 3+
|
||||
# see https://docs.python.org/2/c-api/buffer.html
|
||||
Binary = memoryview
|
||||
|
||||
def register_adapters_and_converters():
|
||||
def adapt_date(val):
|
||||
return val.isoformat()
|
||||
|
||||
def adapt_datetime(val):
|
||||
return val.isoformat(" ")
|
||||
|
||||
def convert_date(val):
|
||||
return datetime.date(*map(int, val.split("-")))
|
||||
|
||||
def convert_timestamp(val):
|
||||
datepart, timepart = val.split(" ")
|
||||
year, month, day = map(int, datepart.split("-"))
|
||||
timepart_full = timepart.split(".")
|
||||
hours, minutes, seconds = map(int, timepart_full[0].split(":"))
|
||||
if len(timepart_full) == 2:
|
||||
microseconds = int(timepart_full[1])
|
||||
else:
|
||||
microseconds = 0
|
||||
|
||||
val = datetime.datetime(year, month, day, hours, minutes, seconds, microseconds)
|
||||
return val
|
||||
|
||||
|
||||
register_adapter(datetime.date, adapt_date)
|
||||
register_adapter(datetime.datetime, adapt_datetime)
|
||||
register_converter("date", convert_date)
|
||||
register_converter("timestamp", convert_timestamp)
|
||||
|
||||
register_adapters_and_converters()
|
||||
|
||||
# Clean up namespace
|
||||
|
||||
del(register_adapters_and_converters)
|
@ -1,65 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Mimic the sqlite3 console shell's .dump command
|
||||
# Author: Paul Kippes <kippesp@gmail.com>
|
||||
|
||||
def _iterdump(connection):
|
||||
"""
|
||||
Returns an iterator to the dump of the database in an SQL text format.
|
||||
|
||||
Used to produce an SQL dump of the database. Useful to save an in-memory
|
||||
database for later restoration. This function should not be called
|
||||
directly but instead called from the Connection method, iterdump().
|
||||
"""
|
||||
|
||||
cu = connection.cursor()
|
||||
yield('BEGIN TRANSACTION;')
|
||||
|
||||
# sqlite_master table contains the SQL CREATE statements for the database.
|
||||
q = """
|
||||
SELECT name, type, sql
|
||||
FROM sqlite_master
|
||||
WHERE sql NOT NULL AND
|
||||
type == 'table'
|
||||
"""
|
||||
schema_res = cu.execute(q)
|
||||
for table_name, type, sql in schema_res.fetchall():
|
||||
if table_name == 'sqlite_sequence':
|
||||
yield('DELETE FROM sqlite_sequence;')
|
||||
elif table_name == 'sqlite_stat1':
|
||||
yield('ANALYZE sqlite_master;')
|
||||
elif table_name.startswith('sqlite_'):
|
||||
continue
|
||||
# NOTE: Virtual table support not implemented
|
||||
#elif sql.startswith('CREATE VIRTUAL TABLE'):
|
||||
# qtable = table_name.replace("'", "''")
|
||||
# yield("INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"\
|
||||
# "VALUES('table','%s','%s',0,'%s');" %
|
||||
# qtable,
|
||||
# qtable,
|
||||
# sql.replace("''"))
|
||||
else:
|
||||
yield('%s;' % sql)
|
||||
|
||||
# Build the insert statement for each row of the current table
|
||||
res = cu.execute("PRAGMA table_info('%s')" % table_name)
|
||||
column_names = [str(table_info[1]) for table_info in res.fetchall()]
|
||||
q = "SELECT 'INSERT INTO \"%(tbl_name)s\" VALUES("
|
||||
q += ",".join(["'||quote(" + col + ")||'" for col in column_names])
|
||||
q += ")' FROM '%(tbl_name)s'"
|
||||
query_res = cu.execute(q % {'tbl_name': table_name})
|
||||
for row in query_res:
|
||||
yield("%s;" % row[0])
|
||||
|
||||
# Now when the type is 'index', 'trigger', or 'view'
|
||||
q = """
|
||||
SELECT name, type, sql
|
||||
FROM sqlite_master
|
||||
WHERE sql NOT NULL AND
|
||||
type IN ('index', 'trigger', 'view')
|
||||
"""
|
||||
schema_res = cu.execute(q)
|
||||
for name, type, sql in schema_res.fetchall():
|
||||
yield('%s;' % sql)
|
||||
|
||||
yield('COMMIT;')
|
@ -1,357 +0,0 @@
|
||||
/* 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 "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* display_str;
|
||||
|
||||
ptr = self->first;
|
||||
|
||||
while (ptr) {
|
||||
if (ptr->prev) {
|
||||
prevkey = ptr->prev->key;
|
||||
} else {
|
||||
prevkey = Py_None;
|
||||
}
|
||||
|
||||
if (ptr->next) {
|
||||
nextkey = ptr->next->key;
|
||||
} else {
|
||||
nextkey = Py_None;
|
||||
}
|
||||
|
||||
display_str = PyUnicode_FromFormat("%S <- %S -> %S\n",
|
||||
prevkey, ptr->key, nextkey);
|
||||
if (!display_str) {
|
||||
return NULL;
|
||||
}
|
||||
PyObject_Print(display_str, stdout, Py_PRINT_RAW);
|
||||
Py_DECREF(display_str);
|
||||
|
||||
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_reserved */
|
||||
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_reserved */
|
||||
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;
|
||||
}
|
@ -1,73 +0,0 @@
|
||||
/* 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
|
File diff suppressed because it is too large
Load Diff
@ -1,142 +0,0 @@
|
||||
/* 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"
|
||||
#include "spatialite.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
PyObject_HEAD
|
||||
sqlite3* db;
|
||||
#if defined(SPATIALITE_HAS_INIT_EX)
|
||||
void *slconn;
|
||||
#endif
|
||||
|
||||
/* 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 statment; 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
|
File diff suppressed because it is too large
Load Diff
@ -1,75 +0,0 @@
|
||||
/* 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 locked;
|
||||
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
|
@ -1,154 +0,0 @@
|
||||
/* 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__")) {
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
PyObject *adapted = PyObject_CallMethod(proto, "__adapt__", "O", obj);
|
||||
#else
|
||||
_Py_IDENTIFIER(__adapt__);
|
||||
PyObject *adapted = _PyObject_CallMethodId(proto, &PyId___adapt__, "O", obj);
|
||||
#endif
|
||||
|
||||
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__")) {
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
PyObject *adapted = PyObject_CallMethod(obj, "__conform__","O", proto);
|
||||
#else
|
||||
_Py_IDENTIFIER(__conform__);
|
||||
PyObject *adapted = _PyObject_CallMethodId(obj, &PyId___conform__,"O", proto);
|
||||
#endif
|
||||
|
||||
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);
|
||||
}
|
@ -1,55 +0,0 @@
|
||||
/* 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) */
|
@ -1,498 +0,0 @@
|
||||
/* 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;
|
||||
|
||||
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", "uri",
|
||||
NULL
|
||||
};
|
||||
char* database;
|
||||
int detect_types = 0;
|
||||
PyObject* isolation_level;
|
||||
PyObject* factory = NULL;
|
||||
int check_same_thread = 1;
|
||||
int cached_statements;
|
||||
int uri = 0;
|
||||
double timeout = 5.0;
|
||||
|
||||
PyObject* result;
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|diOiOip", kwlist,
|
||||
&database, &timeout, &detect_types,
|
||||
&isolation_level, &check_same_thread,
|
||||
&factory, &cached_statements, &uri))
|
||||
{
|
||||
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, detect_types, isolation_level,\n\
|
||||
check_same_thread, factory, cached_statements, uri])\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 == &PyLong_Type || type == &PyFloat_Type
|
||||
|| type == &PyUnicode_Type || type == &PyByteArray_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 PY_MAJOR_VERSION >= 3
|
||||
_Py_IDENTIFIER(upper);
|
||||
#endif
|
||||
|
||||
if (!PyArg_ParseTuple(args, "UO", &orig_name, &callable)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* convert the name to upper case */
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
name = PyObject_CallMethod(orig_name, "upper", "");
|
||||
#else
|
||||
name = _PyObject_CallMethodId(orig_name, &PyId_upper, "");
|
||||
#endif
|
||||
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}
|
||||
};
|
||||
|
||||
#if PY_MAJOR_VERSION >= 3
|
||||
static struct PyModuleDef _sqlite3module = {
|
||||
PyModuleDef_HEAD_INIT,
|
||||
"_spatialite",
|
||||
NULL,
|
||||
-1,
|
||||
module_methods,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
#endif
|
||||
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
PyMODINIT_FUNC init_spatialite(void)
|
||||
#else
|
||||
PyMODINIT_FUNC PyInit__spatialite(void)
|
||||
#endif
|
||||
{
|
||||
PyObject *module, *dict;
|
||||
PyObject *tmp_obj;
|
||||
int i;
|
||||
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
module = Py_InitModule("pyspatialite._spatialite", module_methods);
|
||||
#else
|
||||
module = PyModule_Create(&_sqlite3module);
|
||||
#endif
|
||||
|
||||
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)
|
||||
) {
|
||||
Py_XDECREF(module);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
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_Exception, NULL))) {
|
||||
goto error;
|
||||
}
|
||||
PyDict_SetItemString(dict, "Error", pysqlite_Error);
|
||||
|
||||
if (!(pysqlite_Warning = PyErr_NewException(MODULE_NAME ".Warning", PyExc_Exception, 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);
|
||||
|
||||
/* In Python 2.x, setting Connection.text_factory to
|
||||
OptimizedUnicode caused Unicode objects to be returned for
|
||||
non-ASCII data and bytestrings to be returned for ASCII data.
|
||||
Now OptimizedUnicode is an alias for str, so it has no
|
||||
effect. */
|
||||
Py_INCREF((PyObject*)&PyUnicode_Type);
|
||||
PyDict_SetItemString(dict, "OptimizedUnicode", (PyObject*)&PyUnicode_Type);
|
||||
|
||||
/* Set integer constants */
|
||||
for (i = 0; _int_constants[i].constant_name != 0; i++) {
|
||||
tmp_obj = PyLong_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 = PyUnicode_FromString(PYSPATIALITE_VERSION))) {
|
||||
goto error;
|
||||
}
|
||||
PyDict_SetItemString(dict, "version", tmp_obj);
|
||||
Py_DECREF(tmp_obj);
|
||||
|
||||
if (!(tmp_obj = PyUnicode_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");
|
||||
Py_DECREF(module);
|
||||
module = NULL;
|
||||
}
|
||||
return module;
|
||||
}
|
@ -1,58 +0,0 @@
|
||||
/* 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 PYSPATIALITE_VERSION "2.6.1"
|
||||
|
||||
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
|
@ -1,83 +0,0 @@
|
||||
/* 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 "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_reserved */
|
||||
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);
|
||||
}
|
@ -1,41 +0,0 @@
|
||||
/* 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
|
@ -1,301 +0,0 @@
|
||||
/* 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"
|
||||
|
||||
void pysqlite_row_dealloc(pysqlite_Row* self)
|
||||
{
|
||||
Py_XDECREF(self->data);
|
||||
Py_XDECREF(self->description);
|
||||
|
||||
Py_TYPE(self)->tp_free((PyObject*)self);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
pysqlite_row_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
|
||||
{
|
||||
pysqlite_Row *self;
|
||||
PyObject* data;
|
||||
pysqlite_Cursor* cursor;
|
||||
|
||||
assert(type != NULL && type->tp_alloc != NULL);
|
||||
|
||||
if (!_PyArg_NoKeywords("Row()", kwargs))
|
||||
return NULL;
|
||||
if (!PyArg_ParseTuple(args, "OO", &cursor, &data))
|
||||
return NULL;
|
||||
|
||||
if (!PyObject_TypeCheck((PyObject*)cursor, &pysqlite_CursorType)) {
|
||||
PyErr_SetString(PyExc_TypeError, "instance of cursor required for first argument");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!PyTuple_Check(data)) {
|
||||
PyErr_SetString(PyExc_TypeError, "tuple required for second argument");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
self = (pysqlite_Row *) type->tp_alloc(type, 0);
|
||||
if (self == NULL)
|
||||
return NULL;
|
||||
|
||||
Py_INCREF(data);
|
||||
self->data = data;
|
||||
|
||||
Py_INCREF(cursor->description);
|
||||
self->description = cursor->description;
|
||||
|
||||
return (PyObject *) self;
|
||||
}
|
||||
|
||||
PyObject* pysqlite_row_item(pysqlite_Row* self, Py_ssize_t idx)
|
||||
{
|
||||
PyObject* item = PyTuple_GetItem(self->data, idx);
|
||||
Py_XINCREF(item);
|
||||
return item;
|
||||
}
|
||||
|
||||
PyObject* pysqlite_row_subscript(pysqlite_Row* self, PyObject* idx)
|
||||
{
|
||||
Py_ssize_t _idx;
|
||||
char* key;
|
||||
Py_ssize_t nitems, i;
|
||||
char* compare_key;
|
||||
|
||||
char* p1;
|
||||
char* p2;
|
||||
|
||||
PyObject* item;
|
||||
|
||||
if (PyLong_Check(idx)) {
|
||||
_idx = PyNumber_AsSsize_t(idx, PyExc_IndexError);
|
||||
if (_idx == -1 && PyErr_Occurred())
|
||||
return NULL;
|
||||
if (_idx < 0)
|
||||
_idx += PyTuple_GET_SIZE(self->data);
|
||||
item = PyTuple_GetItem(self->data, _idx);
|
||||
Py_XINCREF(item);
|
||||
return item;
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
} else if (PyString_Check(idx)) {
|
||||
key = PyString_AsString(idx);
|
||||
#else
|
||||
} else if (PyUnicode_Check(idx)) {
|
||||
key = _PyUnicode_AsString(idx);
|
||||
#endif
|
||||
if (key == NULL)
|
||||
return NULL;
|
||||
|
||||
nitems = PyTuple_Size(self->description);
|
||||
|
||||
for (i = 0; i < nitems; i++) {
|
||||
PyObject *obj;
|
||||
obj = PyTuple_GET_ITEM(self->description, i);
|
||||
obj = PyTuple_GET_ITEM(obj, 0);
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
compare_key = PyString_AsString(obj);
|
||||
#else
|
||||
compare_key = _PyUnicode_AsString(obj);
|
||||
#endif
|
||||
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)) {
|
||||
return PyObject_GetItem(self->data, idx);
|
||||
} 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;
|
||||
Py_ssize_t 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);
|
||||
}
|
||||
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
#define Py_hash_t long
|
||||
#endif
|
||||
|
||||
static Py_hash_t 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) {
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
Py_INCREF(Py_NotImplemented);
|
||||
return Py_NotImplemented;
|
||||
#else
|
||||
Py_RETURN_NOTIMPLEMENTED;
|
||||
#endif
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
Py_INCREF(Py_NotImplemented);
|
||||
return Py_NotImplemented;
|
||||
#else
|
||||
Py_RETURN_NOTIMPLEMENTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
PyMappingMethods pysqlite_row_as_mapping = {
|
||||
/* mp_length */ (lenfunc)pysqlite_row_length,
|
||||
/* mp_subscript */ (binaryfunc)pysqlite_row_subscript,
|
||||
/* mp_ass_subscript */ (objobjargproc)0,
|
||||
};
|
||||
|
||||
static PySequenceMethods pysqlite_row_as_sequence = {
|
||||
/* sq_length */ (lenfunc)pysqlite_row_length,
|
||||
/* sq_concat */ 0,
|
||||
/* sq_repeat */ 0,
|
||||
/* sq_item */ (ssizeargfunc)pysqlite_row_item,
|
||||
};
|
||||
|
||||
|
||||
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_reserved */
|
||||
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 */
|
||||
0, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
0, /* tp_new */
|
||||
0 /* tp_free */
|
||||
};
|
||||
|
||||
extern int pysqlite_row_setup_types(void)
|
||||
{
|
||||
pysqlite_RowType.tp_new = pysqlite_row_new;
|
||||
pysqlite_RowType.tp_as_mapping = &pysqlite_row_as_mapping;
|
||||
pysqlite_RowType.tp_as_sequence = &pysqlite_row_as_sequence;
|
||||
return PyType_Ready(&pysqlite_RowType);
|
||||
}
|
@ -1,39 +0,0 @@
|
||||
/* 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
|
@ -1,57 +0,0 @@
|
||||
|
||||
/* 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 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
|
@ -1,571 +0,0 @@
|
||||
/* 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 "util.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 {
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
TYPE_INT,
|
||||
#endif
|
||||
TYPE_LONG,
|
||||
TYPE_FLOAT,
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
TYPE_STRING,
|
||||
#endif
|
||||
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;
|
||||
Py_ssize_t sql_cstr_len;
|
||||
const char *sql_cstr;
|
||||
|
||||
self->st = NULL;
|
||||
self->in_use = 0;
|
||||
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
if (PyString_Check(sql)) {
|
||||
sql_cstr = PyString_AsString(sql);
|
||||
} else if (PyUnicode_Check(sql)) {
|
||||
sql = PyUnicode_AsUTF8String(sql);
|
||||
if (!sql) {
|
||||
rc = PYSQLITE_SQL_WRONG_TYPE;
|
||||
return rc;
|
||||
}
|
||||
sql_cstr = PyString_AsString(sql);
|
||||
} else {
|
||||
rc = PYSQLITE_SQL_WRONG_TYPE;
|
||||
return rc;
|
||||
}
|
||||
#else
|
||||
sql_cstr = _PyUnicode_AsString(sql);
|
||||
if (!sql_cstr) {
|
||||
rc = PYSQLITE_SQL_WRONG_TYPE;
|
||||
return rc;
|
||||
}
|
||||
#endif
|
||||
if (strlen(sql_cstr) != (size_t)sql_cstr_len) {
|
||||
PyErr_SetString(PyExc_ValueError, "the query contains a null character");
|
||||
return PYSQLITE_SQL_WRONG_TYPE;
|
||||
}
|
||||
|
||||
self->in_weakreflist = NULL;
|
||||
Py_INCREF(sql);
|
||||
self->sql = sql;
|
||||
|
||||
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 rc = SQLITE_OK;
|
||||
char* string;
|
||||
Py_ssize_t buflen;
|
||||
parameter_type paramtype;
|
||||
|
||||
if (parameter == Py_None) {
|
||||
rc = sqlite3_bind_null(self->st, pos);
|
||||
goto final;
|
||||
}
|
||||
|
||||
if (PyLong_CheckExact(parameter)) {
|
||||
paramtype = TYPE_LONG;
|
||||
} else if (PyFloat_CheckExact(parameter)) {
|
||||
paramtype = TYPE_FLOAT;
|
||||
} else if (PyUnicode_CheckExact(parameter)) {
|
||||
paramtype = TYPE_UNICODE;
|
||||
} else if (PyLong_Check(parameter)) {
|
||||
paramtype = TYPE_LONG;
|
||||
} else if (PyFloat_Check(parameter)) {
|
||||
paramtype = TYPE_FLOAT;
|
||||
} else if (PyUnicode_Check(parameter)) {
|
||||
paramtype = TYPE_UNICODE;
|
||||
} else if (PyObject_CheckBuffer(parameter)) {
|
||||
paramtype = TYPE_BUFFER;
|
||||
} else {
|
||||
paramtype = TYPE_UNKNOWN;
|
||||
}
|
||||
|
||||
switch (paramtype) {
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
case TYPE_INT: {
|
||||
long longval = PyInt_AsLong(parameter);
|
||||
rc = sqlite3_bind_int64(self->st, pos, (sqlite_int64)longval);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
case TYPE_LONG: {
|
||||
sqlite_int64 value = _pysqlite_long_as_int64(parameter);
|
||||
if (value == -1 && PyErr_Occurred())
|
||||
rc = -1;
|
||||
else
|
||||
rc = sqlite3_bind_int64(self->st, pos, value);
|
||||
break;
|
||||
}
|
||||
case TYPE_FLOAT:
|
||||
rc = sqlite3_bind_double(self->st, pos, PyFloat_AsDouble(parameter));
|
||||
break;
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
case TYPE_STRING:
|
||||
string = PyString_AS_STRING(parameter);
|
||||
rc = sqlite3_bind_text(self->st, pos, string, -1, SQLITE_TRANSIENT);
|
||||
break;
|
||||
#endif
|
||||
case TYPE_UNICODE: {
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
PyObject* stringval = PyUnicode_AsUTF8String(parameter);
|
||||
string = PyString_AsString(stringval);
|
||||
rc = sqlite3_bind_text(self->st, pos, string, -1, SQLITE_TRANSIENT);
|
||||
Py_DECREF(stringval);
|
||||
#else
|
||||
string = _PyUnicode_AsStringAndSize(parameter, &buflen);
|
||||
if (string == NULL)
|
||||
return -1;
|
||||
if (buflen > INT_MAX) {
|
||||
PyErr_SetString(PyExc_OverflowError,
|
||||
"string longer than INT_MAX bytes");
|
||||
return -1;
|
||||
}
|
||||
rc = sqlite3_bind_text(self->st, pos, string, (int)buflen, SQLITE_TRANSIENT);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case TYPE_BUFFER: {
|
||||
Py_buffer view;
|
||||
if (PyObject_GetBuffer(parameter, &view, PyBUF_SIMPLE) != 0) {
|
||||
PyErr_SetString(PyExc_ValueError, "could not convert BLOB to buffer");
|
||||
return -1;
|
||||
}
|
||||
if (view.len > INT_MAX) {
|
||||
PyErr_SetString(PyExc_OverflowError,
|
||||
"BLOB longer than INT_MAX bytes");
|
||||
PyBuffer_Release(&view);
|
||||
return -1;
|
||||
}
|
||||
rc = sqlite3_bind_blob(self->st, pos, view.buf, (int)view.len, SQLITE_TRANSIENT);
|
||||
PyBuffer_Release(&view);
|
||||
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 (PyLong_CheckExact(obj) || PyFloat_CheckExact(obj)
|
||||
|| PyUnicode_CheckExact(obj) || PyByteArray_CheckExact(obj)) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* parameters)
|
||||
{
|
||||
PyObject* current_param;
|
||||
PyObject* adapted;
|
||||
const char* binding_name;
|
||||
int i;
|
||||
int rc;
|
||||
int num_params_needed;
|
||||
Py_ssize_t 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 %zd 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);
|
||||
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, 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);
|
||||
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;
|
||||
const char* sql_cstr;
|
||||
Py_ssize_t sql_len;
|
||||
sqlite3_stmt* new_st;
|
||||
|
||||
#if PY_MAJOR_VERSION < 3
|
||||
sql_cstr = PyString_AsString(self->sql);
|
||||
#else
|
||||
sql_cstr = _PyUnicode_AsStringAndSize(self->sql, &sql_len);
|
||||
#endif
|
||||
if (sql_cstr == NULL) {
|
||||
rc = PYSQLITE_SQL_WRONG_TYPE;
|
||||
return rc;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
if (self->st) {
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
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_reserved */
|
||||
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 */
|
||||
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);
|
||||
}
|
@ -1,59 +0,0 @@
|
||||
/* 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);
|
||||
void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* parameters);
|
||||
|
||||
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
|
@ -1,172 +0,0 @@
|
||||
/* 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;
|
||||
}
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
# define IS_LITTLE_ENDIAN 0
|
||||
#else
|
||||
# define IS_LITTLE_ENDIAN 1
|
||||
#endif
|
||||
|
||||
PyObject *
|
||||
_pysqlite_long_from_int64(sqlite_int64 value)
|
||||
{
|
||||
#ifdef HAVE_LONG_LONG
|
||||
# if SIZEOF_LONG_LONG < 8
|
||||
if (value > PY_LLONG_MAX || value < PY_LLONG_MIN) {
|
||||
return _PyLong_FromByteArray(&value, sizeof(value),
|
||||
IS_LITTLE_ENDIAN, 1 /* signed */);
|
||||
}
|
||||
# endif
|
||||
# if SIZEOF_LONG < SIZEOF_LONG_LONG
|
||||
if (value > LONG_MAX || value < LONG_MIN)
|
||||
return PyLong_FromLongLong(value);
|
||||
# endif
|
||||
#else
|
||||
# if SIZEOF_LONG < 8
|
||||
if (value > LONG_MAX || value < LONG_MIN) {
|
||||
return _PyLong_FromByteArray(&value, sizeof(value),
|
||||
IS_LITTLE_ENDIAN, 1 /* signed */);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
return PyLong_FromLong(Py_SAFE_DOWNCAST(value, sqlite_int64, long));
|
||||
}
|
||||
|
||||
sqlite_int64
|
||||
_pysqlite_long_as_int64(PyObject * py_val)
|
||||
{
|
||||
int overflow;
|
||||
#ifdef HAVE_LONG_LONG
|
||||
PY_LONG_LONG value = PyLong_AsLongLongAndOverflow(py_val, &overflow);
|
||||
#else
|
||||
long value = PyLong_AsLongAndOverflow(py_val, &overflow);
|
||||
#endif
|
||||
if (value == -1 && PyErr_Occurred())
|
||||
return -1;
|
||||
if (!overflow) {
|
||||
#ifdef HAVE_LONG_LONG
|
||||
# if SIZEOF_LONG_LONG > 8
|
||||
if (-0x8000000000000000LL <= value && value <= 0x7FFFFFFFFFFFFFFFLL)
|
||||
# endif
|
||||
#else
|
||||
# if SIZEOF_LONG > 8
|
||||
if (-0x8000000000000000L <= value && value <= 0x7FFFFFFFFFFFFFFFL)
|
||||
# endif
|
||||
#endif
|
||||
return value;
|
||||
}
|
||||
else if (sizeof(value) < sizeof(sqlite_int64)) {
|
||||
sqlite_int64 int64val;
|
||||
if (_PyLong_AsByteArray((PyLongObject *)py_val,
|
||||
(unsigned char *)&int64val, sizeof(int64val),
|
||||
IS_LITTLE_ENDIAN, 1 /* signed */) >= 0) {
|
||||
return int64val;
|
||||
}
|
||||
}
|
||||
PyErr_SetString(PyExc_OverflowError,
|
||||
"Python int too large to convert to SQLite INTEGER");
|
||||
return -1;
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
/* 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
|
@ -51,11 +51,6 @@ Source5: %{name}-mime.xml
|
||||
# https://github.com/qgis/QGIS/commit/718581ffb12b723f9a3c0ae01b7ec2d8aed9d4bb.patch
|
||||
Patch0: %{name}-lib64.patch
|
||||
|
||||
# Some plug-ins need Pyspatialite (bundled)
|
||||
# The license is not totally clear, see:
|
||||
# http://code.google.com/p/pyspatialite/issues/detail?id=3
|
||||
# It also is sort of a fork of pysqlite, which is not elegant.
|
||||
|
||||
# Compiling stuff
|
||||
BuildRequires: bison
|
||||
BuildRequires: clang
|
||||
|
Loading…
x
Reference in New Issue
Block a user