]> granicus.if.org Git - python/commitdiff
Use AsCharBuffer to get C strings out of Python strings.
authorGuido van Rossum <guido@python.org>
Wed, 9 May 2007 23:37:01 +0000 (23:37 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 9 May 2007 23:37:01 +0000 (23:37 +0000)
Modules/_sqlite/cursor.c
Modules/_sqlite/statement.c

index ca15eedf498054e4e6d825d1e5187450f9d44759..cbb030e93c04c60ee4cb4b33cf76e093de29a5a5 100644 (file)
@@ -409,8 +409,8 @@ PyObject* _pysqlite_fetch_one_row(pysqlite_Cursor* self)
 PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args)
 {
     PyObject* operation;
-    PyObject* operation_bytestr = NULL;
-    char* operation_cstr;
+    const char* operation_cstr;
+    Py_ssize_t operation_len;
     PyObject* parameters_list = NULL;
     PyObject* parameters_iter = NULL;
     PyObject* parameters = NULL;
@@ -495,16 +495,8 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
         rc = pysqlite_statement_reset(self->statement);
     }
 
-    if (PyString_Check(operation)) {
-        operation_cstr = PyString_AsString(operation);
-    } else {
-        operation_bytestr = PyUnicode_AsUTF8String(operation);
-        if (!operation_bytestr) {
-            goto error;
-        }
-
-        operation_cstr = PyString_AsString(operation_bytestr);
-    }
+    if (PyObject_AsCharBuffer(operation, &operation_cstr, &operation_len) < 0)
+        goto error;
 
     /* reset description and rowcount */
     Py_DECREF(self->description);
@@ -714,7 +706,6 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
     }
 
 error:
-    Py_XDECREF(operation_bytestr);
     Py_XDECREF(parameters);
     Py_XDECREF(parameters_iter);
     Py_XDECREF(parameters_list);
index 870e7765e9983bb3ab18bd924a84df256612a243..8a4ea6ae3c4c8b05a9c2767357094cfc73d89f82 100644 (file)
@@ -44,30 +44,20 @@ int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* con
 {
     const char* tail;
     int rc;
-    PyObject* sql_str;
-    char* sql_cstr;
+    const char* sql_cstr;
+    Py_ssize_t sql_cstr_len;
 
     self->st = NULL;
     self->in_use = 0;
 
-    if (PyString_Check(sql)) {
-        sql_str = sql;
-        Py_INCREF(sql_str);
-    } else if (PyUnicode_Check(sql)) {
-        sql_str = PyUnicode_AsUTF8String(sql);
-        if (!sql_str) {
-            rc = PYSQLITE_SQL_WRONG_TYPE;
-            return rc;
-        }
-    } else {
+    if (PyObject_AsCharBuffer(sql, &sql_cstr, &sql_cstr_len) < 0) {
         rc = PYSQLITE_SQL_WRONG_TYPE;
         return rc;
     }
 
     self->in_weakreflist = NULL;
-    self->sql = sql_str;
-
-    sql_cstr = PyString_AsString(sql_str);
+    Py_INCREF(sql);
+    self->sql = sql;
 
     rc = sqlite3_prepare(connection->db,
                          sql_cstr,
@@ -219,10 +209,14 @@ int pysqlite_statement_recompile(pysqlite_Statement* self, PyObject* params)
 {
     const char* tail;
     int rc;
-    char* sql_cstr;
+    const char* sql_cstr;
+    Py_ssize_t sql_len;
     sqlite3_stmt* new_st;
 
-    sql_cstr = PyString_AsString(self->sql);
+    if (PyObject_AsCharBuffer(self->sql, &sql_cstr, &sql_len) < 0) {
+        rc = PYSQLITE_SQL_WRONG_TYPE;
+        return rc;
+    }
 
     rc = sqlite3_prepare(self->db,
                          sql_cstr,