Skip to content

Commit 3cc4960

Browse files
committed
Sparated the c-header information into a separate file.
1 parent 261e469 commit 3cc4960

File tree

5 files changed

+184
-159
lines changed

5 files changed

+184
-159
lines changed

README

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Python wrapper around pxlib.
2+
3+
This module, written in Pyrex_, allow to read data from Paradox tables
4+
using the pxlib_ library.
5+
6+
.. _cython: http://www.cython.org/
7+
.. _pxlib: http://pxlib.sourceforge.net/

paradox.pxd

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
cdef extern from *:
2+
ctypedef char* const_char_ptr "const char*"
3+
4+
cdef extern from "stdlib.h" nogil:
5+
void *memset(void *str, int c, size_t n)
6+
void *memcpy(void *str1, void *str2, size_t n)
7+
8+
cdef extern from "Python.h":
9+
object PyString_FromStringAndSize(char *s, int len)
10+
object PyString_Decode(char *s, int len, char *encoding, char *errors)
11+
object PyString_FromStringAndSize(char *v, int len)
12+
object PyString_AsDecodedObject(object str, char *encoding, char *errors)
13+
14+
15+
cdef extern from "string.h":
16+
int strnlen(char *s, int maxlen)
17+
char *strcpy(char *, char *)
18+
19+
20+
cdef extern from "paradox.h":
21+
ctypedef enum fieldtype_t:
22+
pxfAlpha = 0x01
23+
pxfDate = 0x02
24+
pxfShort = 0x03
25+
pxfLong = 0x04
26+
pxfCurrency = 0x05
27+
pxfNumber = 0x06
28+
pxfLogical = 0x09
29+
pxfMemoBLOb = 0x0C
30+
pxfBLOb = 0x0D
31+
pxfFmtMemoBLOb = 0x0E
32+
pxfOLE = 0x0F
33+
pxfGraphic = 0x10
34+
pxfTime = 0x14
35+
pxfTimestamp = 0x15
36+
pxfAutoInc = 0x16
37+
pxfBCD = 0x17
38+
pxfBytes = 0x18
39+
pxfNumTypes = 0x18
40+
41+
ctypedef enum filetype_t:
42+
pxfFileTypIndexDB = 0
43+
pxfFileTypPrimIndex = 1
44+
pxfFileTypNonIndexDB = 2
45+
pxfFileTypNonIncSecIndex = 3
46+
pxfFileTypSecIndex = 4
47+
pxfFileTypIncSecIndex = 5
48+
pxfFileTypNonIncSecIndexG = 6
49+
pxfFileTypSecIndexG = 7
50+
pxfFileTypIncSecIndexG = 8
51+
52+
ctypedef struct pxfield_t:
53+
char *px_fname
54+
char px_ftype
55+
int px_flen
56+
int px_fdc
57+
58+
ctypedef struct pxhead_t:
59+
char *px_tablename
60+
int px_recordsize
61+
char px_filetype
62+
int px_fileversion
63+
int px_numrecords
64+
int px_theonumrecords
65+
int px_numfields
66+
int px_maxtablesize
67+
int px_headersize
68+
int px_fileblocks
69+
int px_firstblock
70+
int px_lastblock
71+
int px_indexfieldnumber
72+
int px_indexroot
73+
int px_numindexlevels
74+
int px_writeprotected
75+
int px_doscodepage
76+
int px_primarykeyfields
77+
char px_modifiedflags1
78+
char px_modifiedflags2
79+
char px_sortorder
80+
int px_autoinc
81+
int px_fileupdatetime
82+
char px_refintegrity
83+
pxfield_t *px_fields
84+
unsigned long px_encryption
85+
86+
ctypedef struct pxdoc_t:
87+
char *px_name
88+
pxhead_t *px_head
89+
char *targetencoding
90+
void *(*malloc)(pxdoc_t *p, unsigned int size, char *caller)
91+
void (*free)(pxdoc_t *p, void *mem)
92+
93+
ctypedef struct pxdatablockinfo_t
94+
ctypedef struct pxblob_t:
95+
char *px_name
96+
pxdoc_t * pxdoc
97+
98+
ctypedef struct pxpindex_t
99+
ctypedef struct pxstream_t
100+
101+
102+
ctypedef struct Pxval_str:
103+
char *val
104+
int len
105+
ctypedef union Pxval_value:
106+
long lval
107+
double dval
108+
Pxval_str str
109+
ctypedef struct pxval_t:
110+
char isnull
111+
int type
112+
Pxval_value value
113+
114+
115+
pxdoc_t *PX_new()
116+
pxdoc_t* PX_new2(void (*errorhandler)(pxdoc_t *p, int type, const_char_ptr msg, void *data),
117+
void* (*allocproc)(pxdoc_t *p, size_t size, const_char_ptr caller),
118+
void* (*reallocproc)(pxdoc_t *p, void *mem, size_t size, const_char_ptr caller),
119+
void (*freeproc)(pxdoc_t *p, void *mem))
120+
char *PX_strdup(pxdoc_t *pxdoc, char *str)
121+
int PX_open_file(pxdoc_t *pxdoc, const_char_ptr filename)
122+
int PX_create_file(pxdoc_t *pxdoc, pxfield_t *px_fields, unsigned int numfields, char *filename, int type)
123+
int PX_read_primary_index(pxdoc_t *pindex)
124+
int PX_add_primary_index(pxdoc_t *pxdoc, pxdoc_t *pindex)
125+
int PX_set_targetencoding(pxdoc_t *pxdoc, char *encoding)
126+
int PX_set_inputencoding(pxdoc_t *pxdoc, char *encoding)
127+
int PX_set_parameter(pxdoc_t *pxdoc, char *name, char *value)
128+
int PX_set_value(pxdoc_t *pxdoc, char *name, float value)
129+
pxblob_t *PX_new_blob(pxdoc_t *pxdoc)
130+
int PX_open_blob_file(pxblob_t *pxdoc, char *filename)
131+
int PX_close(pxdoc_t *pxdoc)
132+
int PX_close_blob(pxblob_t *pxdoc)
133+
void *PX_get_record(pxdoc_t *pxdoc, int recno, void *data)
134+
void *PX_get_record2(pxdoc_t *pxdoc, int recno, void *data, int *deleted, pxdatablockinfo_t *pxdbinfo)
135+
int PX_get_data_alpha(pxdoc_t *pxdoc, void *data, int len, char **value)
136+
int PX_get_data_bytes(pxdoc_t *pxdoc, void *data, int len, char **value)
137+
int PX_get_data_double(pxdoc_t *pxdoc, void *data, int len, double *value)
138+
int PX_get_data_long(pxdoc_t *pxdoc, void *data, int len, long *value)
139+
int PX_get_data_short(pxdoc_t *pxdoc, void *data, int len, short int *value)
140+
int PX_get_data_byte(pxdoc_t *pxdoc, void *data, int len, char *value)
141+
int PX_get_parameter(pxdoc_t *pxdoc, const_char_ptr name, char **value)
142+
143+
int PX_put_record(pxdoc_t *pxdoc, char *data)
144+
145+
void PX_put_data_alpha(pxdoc_t *pxdoc, char *data, int len, char *value)
146+
void PX_put_data_double(pxdoc_t *pxdoc, char *data, int len, double value)
147+
void PX_put_data_long(pxdoc_t *pxdoc, char *data, int len, int value)
148+
void PX_put_data_short(pxdoc_t *pxdoc, char *data, int len, short int value)
149+
150+
char *PX_read_blobdata(pxblob_t *pxblob, void *data, int len, int *mod, int *blobsize)
151+
void PX_SdnToGregorian(long int sdn, int *pYear, int *pMonth, int *pDay)
152+
long int PX_GregorianToSdn(int year, int month, int day)
153+
154+

pxpy.pyx

Lines changed: 8 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -10,171 +10,24 @@
1010
"""
1111
Python wrapper around pxlib.
1212
13-
This module, written in Pyrex_, allow to read data from Paradox tables
13+
This module, written in Cython_, allow to read data from Paradox tables
1414
using the pxlib_ library.
1515
16-
.. _pyrex: http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/
16+
.. _cython: http://pxlib.sourceforge.net/
1717
.. _pxlib: http://pxlib.sourceforge.net/
1818
"""
1919

2020
import datetime
2121

2222
import sys
2323

24-
cdef extern from *:
25-
ctypedef char* const_char_ptr "const char*"
26-
24+
cimport python_unicode
2725
from cpython.mem cimport PyMem_Malloc, PyMem_Free
2826
from cpython.version cimport PY_MAJOR_VERSION
2927

3028
from libc.stdlib cimport *
31-
cdef extern from "stdlib.h" nogil:
32-
void *memset(void *str, int c, size_t n)
33-
void *memcpy(void *str1, void *str2, size_t n)
34-
35-
cdef extern from "Python.h":
36-
object PyString_FromStringAndSize(char *s, int len)
37-
object PyString_Decode(char *s, int len, char *encoding, char *errors)
38-
object PyString_FromStringAndSize(char *v, int len)
39-
object PyString_AsDecodedObject(object str, char *encoding, char *errors)
40-
41-
42-
cdef extern from "string.h":
43-
int strnlen(char *s, int maxlen)
44-
char *strcpy(char *, char *)
45-
46-
47-
cdef extern from "paradox.h":
48-
ctypedef enum fieldtype_t:
49-
pxfAlpha = 0x01
50-
pxfDate = 0x02
51-
pxfShort = 0x03
52-
pxfLong = 0x04
53-
pxfCurrency = 0x05
54-
pxfNumber = 0x06
55-
pxfLogical = 0x09
56-
pxfMemoBLOb = 0x0C
57-
pxfBLOb = 0x0D
58-
pxfFmtMemoBLOb = 0x0E
59-
pxfOLE = 0x0F
60-
pxfGraphic = 0x10
61-
pxfTime = 0x14
62-
pxfTimestamp = 0x15
63-
pxfAutoInc = 0x16
64-
pxfBCD = 0x17
65-
pxfBytes = 0x18
66-
pxfNumTypes = 0x18
67-
68-
ctypedef enum filetype_t:
69-
pxfFileTypIndexDB = 0
70-
pxfFileTypPrimIndex = 1
71-
pxfFileTypNonIndexDB = 2
72-
pxfFileTypNonIncSecIndex = 3
73-
pxfFileTypSecIndex = 4
74-
pxfFileTypIncSecIndex = 5
75-
pxfFileTypNonIncSecIndexG = 6
76-
pxfFileTypSecIndexG = 7
77-
pxfFileTypIncSecIndexG = 8
78-
79-
ctypedef struct pxfield_t:
80-
char *px_fname
81-
char px_ftype
82-
int px_flen
83-
int px_fdc
84-
85-
ctypedef struct pxhead_t:
86-
char *px_tablename
87-
int px_recordsize
88-
char px_filetype
89-
int px_fileversion
90-
int px_numrecords
91-
int px_theonumrecords
92-
int px_numfields
93-
int px_maxtablesize
94-
int px_headersize
95-
int px_fileblocks
96-
int px_firstblock
97-
int px_lastblock
98-
int px_indexfieldnumber
99-
int px_indexroot
100-
int px_numindexlevels
101-
int px_writeprotected
102-
int px_doscodepage
103-
int px_primarykeyfields
104-
char px_modifiedflags1
105-
char px_modifiedflags2
106-
char px_sortorder
107-
int px_autoinc
108-
int px_fileupdatetime
109-
char px_refintegrity
110-
pxfield_t *px_fields
111-
112-
ctypedef struct pxdoc_t:
113-
char *px_name
114-
pxhead_t *px_head
115-
char *targetencoding
116-
void *(*malloc)(pxdoc_t *p, unsigned int size, char *caller)
117-
void (*free)(pxdoc_t *p, void *mem)
118-
119-
ctypedef struct pxdatablockinfo_t
120-
ctypedef struct pxblob_t:
121-
char *px_name
122-
pxdoc_t * pxdoc
123-
124-
ctypedef struct pxpindex_t
125-
ctypedef struct pxstream_t
126-
127-
128-
ctypedef struct Pxval_str:
129-
char *val
130-
int len
131-
ctypedef union Pxval_value:
132-
long lval
133-
double dval
134-
Pxval_str str
135-
ctypedef struct pxval_t:
136-
char isnull
137-
int type
138-
Pxval_value value
139-
140-
141-
pxdoc_t *PX_new()
142-
pxdoc_t* PX_new2(void (*errorhandler)(pxdoc_t *p, int type, const_char_ptr msg, void *data),
143-
void* (*allocproc)(pxdoc_t *p, size_t size, const_char_ptr caller),
144-
void* (*reallocproc)(pxdoc_t *p, void *mem, size_t size, const_char_ptr caller),
145-
void (*freeproc)(pxdoc_t *p, void *mem))
146-
char *PX_strdup(pxdoc_t *pxdoc, char *str)
147-
int PX_open_file(pxdoc_t *pxdoc, const_char_ptr filename)
148-
int PX_create_file(pxdoc_t *pxdoc, pxfield_t *px_fields, unsigned int numfields, char *filename, int type)
149-
int PX_read_primary_index(pxdoc_t *pindex)
150-
int PX_add_primary_index(pxdoc_t *pxdoc, pxdoc_t *pindex)
151-
int PX_set_targetencoding(pxdoc_t *pxdoc, char *encoding)
152-
int PX_set_inputencoding(pxdoc_t *pxdoc, char *encoding)
153-
int PX_set_parameter(pxdoc_t *pxdoc, char *name, char *value)
154-
int PX_set_value(pxdoc_t *pxdoc, char *name, float value)
155-
pxblob_t *PX_new_blob(pxdoc_t *pxdoc)
156-
int PX_open_blob_file(pxblob_t *pxdoc, char *filename)
157-
int PX_close(pxdoc_t *pxdoc)
158-
int PX_close_blob(pxblob_t *pxdoc)
159-
void *PX_get_record(pxdoc_t *pxdoc, int recno, void *data)
160-
void *PX_get_record2(pxdoc_t *pxdoc, int recno, void *data, int *deleted, pxdatablockinfo_t *pxdbinfo)
161-
int PX_get_data_alpha(pxdoc_t *pxdoc, void *data, int len, char **value)
162-
int PX_get_data_bytes(pxdoc_t *pxdoc, void *data, int len, char **value)
163-
int PX_get_data_double(pxdoc_t *pxdoc, void *data, int len, double *value)
164-
int PX_get_data_long(pxdoc_t *pxdoc, void *data, int len, long *value)
165-
int PX_get_data_short(pxdoc_t *pxdoc, void *data, int len, short int *value)
166-
int PX_get_data_byte(pxdoc_t *pxdoc, void *data, int len, char *value)
167-
168-
int PX_put_record(pxdoc_t *pxdoc, char *data)
169-
170-
void PX_put_data_alpha(pxdoc_t *pxdoc, char *data, int len, char *value)
171-
void PX_put_data_double(pxdoc_t *pxdoc, char *data, int len, double value)
172-
void PX_put_data_long(pxdoc_t *pxdoc, char *data, int len, int value)
173-
void PX_put_data_short(pxdoc_t *pxdoc, char *data, int len, short int value)
174-
175-
char *PX_read_blobdata(pxblob_t *pxblob, void *data, int len, int *mod, int *blobsize)
176-
void PX_SdnToGregorian(long int sdn, int *pYear, int *pMonth, int *pDay)
177-
long int PX_GregorianToSdn(int year, int month, int day)
29+
30+
from paradox cimport *
17831

17932
cdef void errorhandler(pxdoc_t *p, int type, char *msg, void *data):
18033
print 'error', type, msg
@@ -227,6 +80,9 @@ cdef class PXDoc:
22780
def setParameter(self, parameter, value):
22881
PX_set_parameter(self.doc, parameter, value)
22982

83+
def getTableName(self):
84+
return self.doc.px_head.px_tablename
85+
23086
def __dealloc__(self):
23187
"""
23288
Close the data file

setup.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,23 @@ class clean(_clean):
2323
"""
2424

2525
def run(self):
26-
super(_clean, self).run()
26+
_clean.run(self)
2727
for ext in self.distribution.ext_modules:
2828
cy_sources = [s for s in ext.sources if s.endswith('.pyx')]
2929
for cy_source in cy_sources:
30-
c_source = cy_source[:-3] + 'c'
31-
if os.path.exists(c_source):
32-
log.info('removing %s', c_source)
33-
os.remove(c_source)
30+
for extension in ('c', 'so'):
31+
xfile = cy_source[:-3] + extension
32+
if os.path.exists(xfile):
33+
log.info('removing %s', xfile)
34+
os.remove(xfile)
3435

3536
setup(
3637
name='python-pxlib',
3738
description="Python wrapper around pxlib",
3839
version='0.0.1',
3940
author="Lele Gaifax",
40-
author_email = "[email protected]",
41-
url = "http://pxlib.sourceforge.net/",
41+
author_email="[email protected]",
42+
url="http://pxlib.sourceforge.net/",
4243
test_suite='tests',
4344
cmdclass={
4445
'build_ext': build_ext,

tests/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@
1414
FIXTURE_DIR = os.path.join(os.path.dirname(__file__), 'fixtures')
1515

1616
class PxLibTest(unittest.TestCase):
17+
18+
def test_headers(self):
19+
table = pxpy.Table(os.path.join(FIXTURE_DIR, 'KOMMENT.DB'))
20+
table.open()
21+
self.assertEqual(table.getTableName(), 'KOMMENT.DB')
22+
table.close()
23+
1724
def test_iteration(self):
1825
table = pxpy.Table(os.path.join(FIXTURE_DIR, 'LAND.DB'))
1926
table.open()

0 commit comments

Comments
 (0)