-
Notifications
You must be signed in to change notification settings - Fork 1
/
dystopia.c
122 lines (104 loc) · 2.74 KB
/
dystopia.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "Python.h"
#include <dystopia.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
static PyObject* idbclose(PyObject *self, PyObject *args)
{
int ecode;
TCIDB* idb;
PyObject *obj;
if (!PyArg_ParseTuple(args, "O", &obj ))
return NULL;
idb = (TCIDB *) PyCObject_AsVoidPtr(obj);
if(!tcidbclose(idb)){
ecode = tcidbecode(idb);
fprintf(stderr, "open error: %s\n", tcidberrmsg(ecode));
}
tcidbdel(idb);
return Py_None;
}
static PyObject *open(PyObject *self, PyObject *args)
{
const char *dbname;
int mask;
TCIDB *idb;
int ecode;
PyObject *c_object;
if (!PyArg_ParseTuple(args, "si", &dbname, &mask))
return NULL;
idb = tcidbnew();
if(!tcidbopen(idb, dbname, mask)){
ecode = tcidbecode(idb);
fprintf(stderr, "open error: %s\n", tcidberrmsg(ecode));
}
c_object = PyCObject_FromVoidPtr(idb, NULL);
return c_object;
}
static PyObject *
put(PyObject *self,PyObject *args){
PyObject *db;
const char *stext;
const int *docid;
int ecode;
bool result;
TCIDB *idb;
if (!PyArg_ParseTuple(args, "Ois", &db, &docid, &stext))
return NULL;
idb = (TCIDB *) PyCObject_AsVoidPtr(db);
result = tcidbput(idb,(int64_t)docid,stext);
/* delete the object */
return Py_BuildValue("b",result);
}
static PyObject *idbinfo(PyObject *self, PyObject *args)
{
PyObject *db;
TCIDB *idb;
int ecode;
uint64_t number, size;
PyObject *tuple;
if (!PyArg_ParseTuple(args, "O", &db))
return NULL;
idb = (TCIDB *) PyCObject_AsVoidPtr(db);
number = tcidbrnum(idb);
size = tcidbfsiz(idb);
tuple = Py_BuildValue("ii", number, size);
return tuple;
}
static PyObject *search(PyObject *self, PyObject *args){
const char *stext;
int ecode, rnum, i;
uint64_t *result;
PyObject* pList;
PyObject *db;
TCIDB *idb;
if (!PyArg_ParseTuple(args, "Os", &db, &stext))
return NULL;
idb = (TCIDB *) PyCObject_AsVoidPtr(db);
/* search records */
result = tcidbsearch2(idb, stext, &rnum);
pList = PyList_New(rnum);
if(result){
for(i = 0; i < rnum; i++){
// printf("r[i]:%lld\n",result[i]);
PyList_SetItem(pList, i, Py_BuildValue("i", (int)result[i]));
}
tcfree(result);
} else {
ecode = tcidbecode(idb);
fprintf(stderr, "search error: %s\n", tcidberrmsg(ecode));
}
return Py_BuildValue("O",pList);
}
PyMethodDef methods[] = {
{"open", open, METH_VARARGS},
{"search", search, METH_VARARGS},
{"put", put, METH_VARARGS},
{"close", idbclose, METH_VARARGS},
{"info", idbinfo, METH_VARARGS},
{NULL, NULL},
};
void init_dystopia(){
PyObject* m;
m = Py_InitModule("_dystopia", methods);
}