1/*[clinic input] 2preserve 3[clinic start generated code]*/ 4 5PyDoc_STRVAR(blob_close__doc__, 6"close($self, /)\n" 7"--\n" 8"\n" 9"Close the blob."); 10 11#define BLOB_CLOSE_METHODDEF \ 12 {"close", (PyCFunction)blob_close, METH_NOARGS, blob_close__doc__}, 13 14static PyObject * 15blob_close_impl(pysqlite_Blob *self); 16 17static PyObject * 18blob_close(pysqlite_Blob *self, PyObject *Py_UNUSED(ignored)) 19{ 20 return blob_close_impl(self); 21} 22 23PyDoc_STRVAR(blob_read__doc__, 24"read($self, length=-1, /)\n" 25"--\n" 26"\n" 27"Read data at the current offset position.\n" 28"\n" 29" length\n" 30" Read length in bytes.\n" 31"\n" 32"If the end of the blob is reached, the data up to end of file will be returned.\n" 33"When length is not specified, or is negative, Blob.read() will read until the\n" 34"end of the blob."); 35 36#define BLOB_READ_METHODDEF \ 37 {"read", _PyCFunction_CAST(blob_read), METH_FASTCALL, blob_read__doc__}, 38 39static PyObject * 40blob_read_impl(pysqlite_Blob *self, int length); 41 42static PyObject * 43blob_read(pysqlite_Blob *self, PyObject *const *args, Py_ssize_t nargs) 44{ 45 PyObject *return_value = NULL; 46 int length = -1; 47 48 if (!_PyArg_CheckPositional("read", nargs, 0, 1)) { 49 goto exit; 50 } 51 if (nargs < 1) { 52 goto skip_optional; 53 } 54 length = _PyLong_AsInt(args[0]); 55 if (length == -1 && PyErr_Occurred()) { 56 goto exit; 57 } 58skip_optional: 59 return_value = blob_read_impl(self, length); 60 61exit: 62 return return_value; 63} 64 65PyDoc_STRVAR(blob_write__doc__, 66"write($self, data, /)\n" 67"--\n" 68"\n" 69"Write data at the current offset.\n" 70"\n" 71"This function cannot change the blob length. Writing beyond the end of the\n" 72"blob will result in an exception being raised."); 73 74#define BLOB_WRITE_METHODDEF \ 75 {"write", (PyCFunction)blob_write, METH_O, blob_write__doc__}, 76 77static PyObject * 78blob_write_impl(pysqlite_Blob *self, Py_buffer *data); 79 80static PyObject * 81blob_write(pysqlite_Blob *self, PyObject *arg) 82{ 83 PyObject *return_value = NULL; 84 Py_buffer data = {NULL, NULL}; 85 86 if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) { 87 goto exit; 88 } 89 if (!PyBuffer_IsContiguous(&data, 'C')) { 90 _PyArg_BadArgument("write", "argument", "contiguous buffer", arg); 91 goto exit; 92 } 93 return_value = blob_write_impl(self, &data); 94 95exit: 96 /* Cleanup for data */ 97 if (data.obj) { 98 PyBuffer_Release(&data); 99 } 100 101 return return_value; 102} 103 104PyDoc_STRVAR(blob_seek__doc__, 105"seek($self, offset, origin=0, /)\n" 106"--\n" 107"\n" 108"Set the current access position to offset.\n" 109"\n" 110"The origin argument defaults to os.SEEK_SET (absolute blob positioning).\n" 111"Other values for origin are os.SEEK_CUR (seek relative to the current position)\n" 112"and os.SEEK_END (seek relative to the blob\'s end)."); 113 114#define BLOB_SEEK_METHODDEF \ 115 {"seek", _PyCFunction_CAST(blob_seek), METH_FASTCALL, blob_seek__doc__}, 116 117static PyObject * 118blob_seek_impl(pysqlite_Blob *self, int offset, int origin); 119 120static PyObject * 121blob_seek(pysqlite_Blob *self, PyObject *const *args, Py_ssize_t nargs) 122{ 123 PyObject *return_value = NULL; 124 int offset; 125 int origin = 0; 126 127 if (!_PyArg_CheckPositional("seek", nargs, 1, 2)) { 128 goto exit; 129 } 130 offset = _PyLong_AsInt(args[0]); 131 if (offset == -1 && PyErr_Occurred()) { 132 goto exit; 133 } 134 if (nargs < 2) { 135 goto skip_optional; 136 } 137 origin = _PyLong_AsInt(args[1]); 138 if (origin == -1 && PyErr_Occurred()) { 139 goto exit; 140 } 141skip_optional: 142 return_value = blob_seek_impl(self, offset, origin); 143 144exit: 145 return return_value; 146} 147 148PyDoc_STRVAR(blob_tell__doc__, 149"tell($self, /)\n" 150"--\n" 151"\n" 152"Return the current access position for the blob."); 153 154#define BLOB_TELL_METHODDEF \ 155 {"tell", (PyCFunction)blob_tell, METH_NOARGS, blob_tell__doc__}, 156 157static PyObject * 158blob_tell_impl(pysqlite_Blob *self); 159 160static PyObject * 161blob_tell(pysqlite_Blob *self, PyObject *Py_UNUSED(ignored)) 162{ 163 return blob_tell_impl(self); 164} 165 166PyDoc_STRVAR(blob_enter__doc__, 167"__enter__($self, /)\n" 168"--\n" 169"\n" 170"Blob context manager enter."); 171 172#define BLOB_ENTER_METHODDEF \ 173 {"__enter__", (PyCFunction)blob_enter, METH_NOARGS, blob_enter__doc__}, 174 175static PyObject * 176blob_enter_impl(pysqlite_Blob *self); 177 178static PyObject * 179blob_enter(pysqlite_Blob *self, PyObject *Py_UNUSED(ignored)) 180{ 181 return blob_enter_impl(self); 182} 183 184PyDoc_STRVAR(blob_exit__doc__, 185"__exit__($self, type, val, tb, /)\n" 186"--\n" 187"\n" 188"Blob context manager exit."); 189 190#define BLOB_EXIT_METHODDEF \ 191 {"__exit__", _PyCFunction_CAST(blob_exit), METH_FASTCALL, blob_exit__doc__}, 192 193static PyObject * 194blob_exit_impl(pysqlite_Blob *self, PyObject *type, PyObject *val, 195 PyObject *tb); 196 197static PyObject * 198blob_exit(pysqlite_Blob *self, PyObject *const *args, Py_ssize_t nargs) 199{ 200 PyObject *return_value = NULL; 201 PyObject *type; 202 PyObject *val; 203 PyObject *tb; 204 205 if (!_PyArg_CheckPositional("__exit__", nargs, 3, 3)) { 206 goto exit; 207 } 208 type = args[0]; 209 val = args[1]; 210 tb = args[2]; 211 return_value = blob_exit_impl(self, type, val, tb); 212 213exit: 214 return return_value; 215} 216/*[clinic end generated code: output=382cbf0977bb158a input=a9049054013a1b77]*/ 217