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