Skip to content

Commit

Permalink
Update for new name, and clean up repository
Browse files Browse the repository at this point in the history
  • Loading branch information
Israel Brewster committed Dec 3, 2014
1 parent 01b4eb9 commit 4111052
Show file tree
Hide file tree
Showing 29 changed files with 4,040 additions and 58 deletions.
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,9 @@
*.xcodeproj
.DS_Store
__pycache__
DerivedData
*.pyc
package.sh
testMain.c
dist
*.egg-info
1 change: 1 addition & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include lib4d_sql/*.h
4 changes: 3 additions & 1 deletion README
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
This is a CFFI based, python database API compliant driver for the 4D database
p4d is a Python Database API 2.0 compliant driver for the 4D (4th Dimension) database server. As such, usage should be familiar to anyone who has used any python database modules before. This module is based off of a C library provided by 4D, and integrated with Python using CFFI. As such, installation of this module does require CFFI.

NOTE: Due to an apparent bug in the C code provided by 4D, or the 4D server itself, only the first "page" of results can be retrieved. To work around this limitation, I have added a "page size" property to the cursor class. Set this a number larger than the maximum number of results you are expecting from the query, and it should work fine. Note, however, that while I have tested this with the value set high (100,000), the largest query I have tested with only returned around 14,000 rows. It is possible that larger result sets could cause issues, either with the server or with the C driver code.
Binary file removed dist/py4d-0.1.tar.gz
Binary file not shown.
218 changes: 218 additions & 0 deletions lib4d_sql/base64.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
/*
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2008 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Jim Winstead <jimw@php.net> |
+----------------------------------------------------------------------+
*/

/* $Id: base64.c 287670 2009-08-25 08:35:39Z fourd $ */

#include <string.h>
#include <stdlib.h>
//#include "php.h"
#include "base64.h"

/* {{{ */
static const char base64_table[] =
{ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '\0'
};

static const char base64_pad = '=';

static const short base64_reverse_table[256] = {
-2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -2, -2, -1, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, -2, -2, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -2, -2, -2,
-2, 0, 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, -2, -2, -2, -2, -2,
-2, 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, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
};
/* }}} */

/* {{{ php_base64_encode */
//PHPAPI
unsigned char *base64_encode(const unsigned char *str, int length, int *ret_length)
{
const unsigned char *current = str;
unsigned char *p;
unsigned char *result;

if ((length + 2) < 0 || ((length + 2) / 3) >= (1 << (sizeof(int) * 8 - 2))) {
if (ret_length != NULL) {
*ret_length = 0;
}
return NULL;
}

result = (unsigned char *)malloc(((length + 2) / 3) * 4* sizeof(char)+1);
p = result;

while (length > 2) { /* keep going until we have less than 24 bits */
*p++ = base64_table[current[0] >> 2];
*p++ = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
*p++ = base64_table[((current[1] & 0x0f) << 2) + (current[2] >> 6)];
*p++ = base64_table[current[2] & 0x3f];

current += 3;
length -= 3; /* we just handle 3 octets of data */
}

/* now deal with the tail end of things */
if (length != 0) {
*p++ = base64_table[current[0] >> 2];
if (length > 1) {
*p++ = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
*p++ = base64_table[(current[1] & 0x0f) << 2];
*p++ = base64_pad;
} else {
*p++ = base64_table[(current[0] & 0x03) << 4];
*p++ = base64_pad;
*p++ = base64_pad;
}
}
if (ret_length != NULL) {
*ret_length = (int)(p - result);
}
*p = '\0';
return result;
}
/* }}} */

/* {{{ */
/* generate reverse table (do not set index 0 to 64)
static unsigned short base64_reverse_table[256];
#define rt base64_reverse_table
void php_base64_init(void)
{
char *s = emalloc(10240), *sp;
char *chp;
short idx;
for(ch = 0; ch < 256; ch++) {
chp = strchr(base64_table, ch);
if(ch && chp) {
idx = chp - base64_table;
if (idx >= 64) idx = -1;
rt[ch] = idx;
} else {
rt[ch] = -1;
}
}
sp = s;
sprintf(sp, "static const short base64_reverse_table[256] = {\n");
for(ch =0; ch < 256;) {
sp = s+strlen(s);
sprintf(sp, "\t% 3d,% 3d,% 3d,% 3d,% 3d,% 3d,% 3d,% 3d,% 3d,% 3d,% 3d,% 3d,% 3d,% 3d,% 3d,% 3d,\n", rt[ch+0], rt[ch+1], rt[ch+2], rt[ch+3], rt[ch+4], rt[ch+5], rt[ch+6], rt[ch+7], rt[ch+8], rt[ch+9], rt[ch+10], rt[ch+11], rt[ch+12], rt[ch+13], rt[ch+14], rt[ch+15]);
ch += 16;
}
sprintf(sp, "};");
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Reverse_table:\n%s", s);
efree(s);
}
*/
/* }}} */

//PHPAPI
unsigned char *base64_decode(const unsigned char *str, int length, int *ret_length)
{
return base64_decode_ex(str, length, ret_length, 0);
}

/* {{{ php_base64_decode */
/* as above, but backwards. :) */
//PHPAPI
unsigned char *base64_decode_ex(const unsigned char *str, int length, int *ret_length, int strict)
{
const unsigned char *current = str;
int ch, i = 0, j = 0, k;
/* this sucks for threaded environments */
unsigned char *result;

result = (unsigned char *)malloc(length + 1);

/* run through the whole string, converting as we go */
while ((ch = *current++) != '\0' && length-- > 0) {
if (ch == base64_pad) break;

ch = base64_reverse_table[ch];
if ((!strict && ch < 0) || ch == -1) { /* a space or some other separator character, we simply skip over */
continue;
} else if (ch == -2) {
free(result);
return NULL;
}

switch(i % 4) {
case 0:
result[j] = ch << 2;
break;
case 1:
result[j++] |= ch >> 4;
result[j] = (ch & 0x0f) << 4;
break;
case 2:
result[j++] |= ch >>2;
result[j] = (ch & 0x03) << 6;
break;
case 3:
result[j++] |= ch;
break;
}
i++;
}

k = j;
/* mop things up if we ended on a boundary */
if (ch == base64_pad) {
switch(i % 4) {
case 1:
free(result);
return NULL;
case 2:
k++;
case 3:
result[k++] = 0;
}
}
if(ret_length) {
*ret_length = j;
}
result[j] = '\0';
return result;
}
/* }}} */


/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim600: sw=4 ts=4 fdm=marker
* vim<600: sw=4 ts=4
*/
41 changes: 41 additions & 0 deletions lib4d_sql/base64.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2008 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Jim Winstead <jimw@php.net> |
+----------------------------------------------------------------------+
*/

/* $Id: base64.h 279540 2009-04-29 08:57:22Z splanquart $ */

#ifndef BASE64_H
#define BASE64_H

//PHP_FUNCTION(base64_decode);
//PHP_FUNCTION(base64_encode);

//PHPAPI extern
unsigned char *base64_encode(const unsigned char *, int, int *);
//PHPAPI extern
unsigned char *base64_decode_ex(const unsigned char *, int, int *, int);
//PHPAPI extern
unsigned char *base64_decode(const unsigned char *, int, int *);

#endif /* BASE64_H */

/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
Loading

0 comments on commit 4111052

Please sign in to comment.