static PyObject * CSVParser_fread(CSVParser *self, size_t size) { char *buf = PyMem_Malloc(sizeof(char)*size); if(buf==NULL){ PyErr_NoMemory(); return NULL; } char c; size_t readsize; PyObject *datas = PyList_New(0); if(self->fields==NULL){ parse_reset(self); } while(size){ PyFile_IncUseCount((PyFileObject*)self->pyfile); Py_BEGIN_ALLOW_THREADS readsize = fread(buf, 1, size, self->file); Py_END_ALLOW_THREADS PyFile_DecUseCount((PyFileObject*)self->pyfile); if(readsize==0) break; size -= readsize; while(readsize--) { logq_readc(buf) } } err: return datas; }
static void FileWrapper_dealloc(PyObject* self) { PyFile_DecUseCount((PyFileObject*)((FileWrapper*)self)->file); Py_DECREF(((FileWrapper*)self)->file); PyObject_FREE(self); }
static PyObject * CSVParser_iternext(CSVParser *self) { if(!self->is_file) return CSVParser_iternext_filelike(self); char buf[MAXBUFSIZE]; char c; char *cp; PyObject *fields = NULL; long i; long linelen; Logq_Engine_reset(self->engine); while(!self->engine->is_success){ if (parse_reset(self) < 0) return NULL; do { PyFile_IncUseCount((PyFileObject*)self->pyfile); Py_BEGIN_ALLOW_THREADS cp = fgets(buf, MAXBUFSIZE, self->file); Py_END_ALLOW_THREADS PyFile_DecUseCount((PyFileObject*)self->pyfile); if (cp == NULL) { /* End of input OR exception */ if (!PyErr_Occurred() && (self->field_len != 0 || self->state == IN_QUOTED_FIELD)) { if (parse_save_field(self) >= 0 ) break; } return NULL; } ++self->line_num; linelen = strlen(buf); if (buf == NULL || linelen < 0) { return NULL; } for(i=0; i<linelen; ++i){ c = buf[i]; if (c == '\0') { PyErr_Format(csv_error_obj, "line contains NULL byte"); goto err; } if (parse_process_char(self, c) < 0) { goto err; } //query fail. go next line if (self->state == QUERY_FAIL){ if(buf[linelen-1]=='\n'){ self->state = START_RECORD; } break; } } } while (self->state != START_RECORD); } fields = self->fields; self->fields = NULL; err: return fields; }