Browse Source

This commit was generated by cvs2svn to compensate for changes in r123706,

which included commits to RCS files with non-trunk default branches.
migration/unlabaled-1.3.2
Wez Furlong 24 years ago
parent
commit
25954d1d72
  1. 2
      ext/sqlite/CREDITS
  2. 0
      ext/sqlite/EXPERIMENTAL
  3. 45
      ext/sqlite/config.m4
  4. 74
      ext/sqlite/php_sqlite.h
  5. 391
      ext/sqlite/sqlite.c
  6. 28
      ext/sqlite/sqlite.php
  7. 24
      ext/sqlite/tests/001.phpt

2
ext/sqlite/CREDITS

@ -0,0 +1,2 @@
sqlite
Wez Furlong

0
ext/sqlite/EXPERIMENTAL

45
ext/sqlite/config.m4

@ -0,0 +1,45 @@
dnl $Id$
dnl config.m4 for extension sqlite
PHP_ARG_WITH(sqlite, for sqlite support,
[ --with-sqlite Include sqlite support])
if test "$PHP_SQLITE" != "no"; then
SEARCH_PATH="/usr/local /usr"
SEARCH_FOR="/include/sqlite.h"
if test -r $PHP_SQLITE/; then # path given as parameter
SQLITE_DIR=$PHP_SQLITE
else # search default path list
AC_MSG_CHECKING([for sqlite files in default path])
for i in $SEARCH_PATH ; do
if test -r $i/$SEARCH_FOR; then
SQLITE_DIR=$i
AC_MSG_RESULT(found in $i)
fi
done
fi
if test -z "$SQLITE_DIR"; then
AC_MSG_RESULT([not found])
AC_MSG_ERROR([Please reinstall the sqlite distribution])
fi
PHP_ADD_INCLUDE($SQLITE_DIR/include)
LIBNAME=sqlite
LIBSYMBOL=sqlite_open
PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
[
PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $SQLITE_DIR/lib, SQLITE_SHARED_LIBADD)
AC_DEFINE(HAVE_SQLITELIB,1,[ ])
],[
AC_MSG_ERROR([wrong sqlite lib version or lib not found])
],[
-L$SQLITE_DIR/lib -lm -ldl
])
PHP_SUBST(SQLITE_SHARED_LIBADD)
PHP_NEW_EXTENSION(sqlite, sqlite.c, $ext_shared)
fi

74
ext/sqlite/php_sqlite.h

@ -0,0 +1,74 @@
/*
+----------------------------------------------------------------------+
| PHP Version 4 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2002 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.02 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_02.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: |
+----------------------------------------------------------------------+
$Id$
*/
#ifndef PHP_SQLITE_H
#define PHP_SQLITE_H
extern zend_module_entry sqlite_module_entry;
#define phpext_sqlite_ptr &sqlite_module_entry
#ifdef PHP_WIN32
#define PHP_SQLITE_API __declspec(dllexport)
#else
#define PHP_SQLITE_API
#endif
#ifdef ZTS
#include "TSRM.h"
#endif
PHP_MINIT_FUNCTION(sqlite);
PHP_MSHUTDOWN_FUNCTION(sqlite);
PHP_RINIT_FUNCTION(sqlite);
PHP_RSHUTDOWN_FUNCTION(sqlite);
PHP_MINFO_FUNCTION(sqlite);
PHP_FUNCTION(sqlite_open);
PHP_FUNCTION(sqlite_close);
PHP_FUNCTION(sqlite_query);
PHP_FUNCTION(sqlite_fetch_array);
PHP_FUNCTION(sqlite_num_rows);
PHP_FUNCTION(sqlite_num_fields);
PHP_FUNCTION(sqlite_field_name);
PHP_FUNCTION(sqlite_seek);
PHP_FUNCTION(sqlite_libversion);
PHP_FUNCTION(sqlite_libencoding);
PHP_FUNCTION(sqlite_changes);
PHP_FUNCTION(sqlite_last_insert_rowid);
#ifdef ZTS
#define SQLITE_G(v) TSRMG(sqlite_globals_id, zend_sqlite_globals *, v)
#else
#define SQLITE_G(v) (sqlite_globals.v)
#endif
#endif
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* indent-tabs-mode: t
* End:
*/

391
ext/sqlite/sqlite.c

@ -0,0 +1,391 @@
/*
+----------------------------------------------------------------------+
| PHP Version 4 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2002 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.02 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_02.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: Wez Furlong <wez@thebrainroom.com> |
+----------------------------------------------------------------------+
$Id$
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_sqlite.h"
#include <sqlite.h>
static unsigned char arg3_force_ref[] = {3, BYREF_NONE, BYREF_NONE, BYREF_FORCE };
static int le_sqlite_db, le_sqlite_result;
struct php_sqlite_result {
char **table;
int nrows;
int ncolumns;
int curr_row;
};
enum { PHPSQLITE_ASSOC = 1, PHPSQLITE_NUM = 2, PHPSQLITE_BOTH = PHPSQLITE_ASSOC|PHPSQLITE_NUM };
function_entry sqlite_functions[] = {
PHP_FE(sqlite_open, arg3_force_ref)
PHP_FE(sqlite_close, NULL)
PHP_FE(sqlite_query, NULL)
PHP_FE(sqlite_fetch_array, NULL)
PHP_FE(sqlite_libversion, NULL)
PHP_FE(sqlite_libencoding, NULL)
PHP_FE(sqlite_changes, NULL)
PHP_FE(sqlite_last_insert_rowid, NULL)
PHP_FE(sqlite_num_rows, NULL)
PHP_FE(sqlite_num_fields, NULL)
PHP_FE(sqlite_field_name, NULL)
PHP_FE(sqlite_seek, NULL)
{NULL, NULL, NULL}
};
zend_module_entry sqlite_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
"sqlite",
sqlite_functions,
PHP_MINIT(sqlite),
NULL,
NULL,
NULL,
PHP_MINFO(sqlite),
#if ZEND_MODULE_API_NO >= 20010901
"0.1",
#endif
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_SQLITE
ZEND_GET_MODULE(sqlite)
#endif
static ZEND_RSRC_DTOR_FUNC(php_sqlite_db_dtor)
{
sqlite *db = (sqlite*)rsrc->ptr;
sqlite_close(db);
}
static ZEND_RSRC_DTOR_FUNC(php_sqlite_result_dtor)
{
struct php_sqlite_result *res = (struct php_sqlite_result *)rsrc->ptr;
sqlite_free_table(res->table);
efree(res);
}
PHP_MINIT_FUNCTION(sqlite)
{
le_sqlite_db = zend_register_list_destructors_ex(php_sqlite_db_dtor, NULL, "sqlite database", module_number);
le_sqlite_result = zend_register_list_destructors_ex(php_sqlite_result_dtor, NULL, "sqlite result", module_number);
REGISTER_LONG_CONSTANT("SQLITE_BOTH", PHPSQLITE_BOTH, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SQLITE_NUM", PHPSQLITE_NUM, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SQLITE_ASSOC", PHPSQLITE_ASSOC, CONST_CS|CONST_PERSISTENT);
return SUCCESS;
}
PHP_MINFO_FUNCTION(sqlite)
{
php_info_print_table_start();
php_info_print_table_header(2, "SQLite support", "enabled");
php_info_print_table_row(2, "PECL Module version", "$Id$");
php_info_print_table_row(2, "SQLite Library", sqlite_libversion());
php_info_print_table_row(2, "SQLite Encoding", sqlite_libencoding());
php_info_print_table_end();
}
/* {{{ proto resource sqlite_open(string filename [, int mode, string &errmessage])
Opens an SQLite database. Will create the database if it does not exist */
PHP_FUNCTION(sqlite_open)
{
int mode = 0666;
char *filename;
long filename_len;
zval *errmsg = NULL;
sqlite *db = NULL;
char *errtext = NULL;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lz/",
&filename, &filename_len, &mode, &errmsg)) {
return;
}
/* TODO: safemode and open_basedir checks on the filename */
db = sqlite_open(filename, mode, &errtext);
if (db == NULL) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", errtext);
if (errmsg) {
ZVAL_STRING(errmsg, errtext, 1);
}
sqlite_freemem(errtext);
RETURN_FALSE;
}
ZEND_REGISTER_RESOURCE(return_value, db, le_sqlite_db);
}
/* }}} */
/* {{{ proto void sqlite_close(resource db)
Closes an open sqlite database */
PHP_FUNCTION(sqlite_close)
{
zval *zdb;
sqlite *db;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zdb)) {
return;
}
ZEND_FETCH_RESOURCE(db, sqlite *, &zdb, -1, "sqlite database", le_sqlite_db);
zend_list_delete(Z_RESVAL_P(zdb));
}
/* }}} */
/* {{{ proto resource sqlite_query(string query, resource db)
Executes a query against a given database and returns a result handle */
PHP_FUNCTION(sqlite_query)
{
zval *zdb;
sqlite *db;
char *sql;
long sql_len;
struct php_sqlite_result res, *rres;
int ret;
char *errtext;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sr", &sql, &sql_len, &zdb)) {
return;
}
ZEND_FETCH_RESOURCE(db, sqlite *, &zdb, -1, "sqlite database", le_sqlite_db);
memset(&res, 0, sizeof(res));
ret = sqlite_get_table(db, sql, &res.table, &res.nrows, &res.ncolumns, &errtext);
if (ret != SQLITE_OK) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", errtext);
sqlite_freemem(errtext);
RETURN_FALSE;
}
rres = (struct php_sqlite_result*)emalloc(sizeof(*rres));
memcpy(rres, &res, sizeof(*rres));
rres->curr_row = 1; /* 0 holds the column header names */
ZEND_REGISTER_RESOURCE(return_value, rres, le_sqlite_result);
}
/* }}} */
/* {{{ proto array sqlite_fetch_array(resource result [, int result_type])
Fetches the next row from a result set as an array */
PHP_FUNCTION(sqlite_fetch_array)
{
zval *zres;
struct php_sqlite_result *res;
int mode = PHPSQLITE_BOTH;
int i, j;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &zres, &mode)) {
return;
}
ZEND_FETCH_RESOURCE(res, struct php_sqlite_result *, &zres, -1, "sqlite result", le_sqlite_result);
/* check range of the row */
if (res->curr_row > res->nrows) {
/* no more */
RETURN_FALSE;
}
array_init(return_value);
/* calculate the starting slot for the row */
i = res->curr_row * res->ncolumns;
/* now populate the result */
for (j = 0; j < res->ncolumns; j++) {
if (mode & PHPSQLITE_NUM) {
add_index_string(return_value, j, res->table[i + j], 1);
}
if (mode & PHPSQLITE_ASSOC) {
add_assoc_string(return_value, res->table[j], res->table[i + j], 1);
}
}
/* advance the row pointer */
res->curr_row++;
}
/* }}} */
/* {{{ proto string sqlite_libversion()
Returns the version of the linked SQLite library */
PHP_FUNCTION(sqlite_libversion)
{
if (ZEND_NUM_ARGS() != 0) {
WRONG_PARAM_COUNT;
}
RETURN_STRING((char*)sqlite_libversion(), 1);
}
/* }}} */
/* {{{ proto string sqlite_libencoding()
Returns the encoding (iso8859 or UTF-8) of the linked SQLite library */
PHP_FUNCTION(sqlite_libencoding)
{
if (ZEND_NUM_ARGS() != 0) {
WRONG_PARAM_COUNT;
}
RETURN_STRING((char*)sqlite_libencoding(), 1);
}
/* }}} */
/* {{{ proto int sqlite_changes(resource db)
Returns the number of rows that were changed by the most recent SQL statement */
PHP_FUNCTION(sqlite_changes)
{
zval *zdb;
sqlite *db;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zdb)) {
return;
}
ZEND_FETCH_RESOURCE(db, sqlite *, &zdb, -1, "sqlite database", le_sqlite_db);
RETURN_LONG(sqlite_changes(db));
}
/* }}} */
/* {{{ proto int sqlite_last_insert_rowid(resource db)
Returns the rowid of the most recently inserted row */
PHP_FUNCTION(sqlite_last_insert_rowid)
{
zval *zdb;
sqlite *db;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zdb)) {
return;
}
ZEND_FETCH_RESOURCE(db, sqlite *, &zdb, -1, "sqlite database", le_sqlite_db);
RETURN_LONG(sqlite_last_insert_rowid(db));
}
/* }}} */
/* {{{ proto int sqlite_num_rows(resource result)
Returns the number of rows in a result set */
PHP_FUNCTION(sqlite_num_rows)
{
zval *zres;
struct php_sqlite_result *res;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zres)) {
return;
}
ZEND_FETCH_RESOURCE(res, struct php_sqlite_result *, &zres, -1, "sqlite result", le_sqlite_result);
RETURN_LONG(res->nrows);
}
/* }}} */
/* {{{ proto int sqlite_num_fields(resource result)
Returns the number of fields in a result set */
PHP_FUNCTION(sqlite_num_fields)
{
zval *zres;
struct php_sqlite_result *res;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zres)) {
return;
}
ZEND_FETCH_RESOURCE(res, struct php_sqlite_result *, &zres, -1, "sqlite result", le_sqlite_result);
RETURN_LONG(res->ncolumns);
}
/* }}} */
/* {{{ proto string sqlite_field_name(resource result, int field)
Returns the name of a particular field */
PHP_FUNCTION(sqlite_field_name)
{
zval *zres;
struct php_sqlite_result *res;
int field;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &zres, &field)) {
return;
}
ZEND_FETCH_RESOURCE(res, struct php_sqlite_result *, &zres, -1, "sqlite result", le_sqlite_result);
if (field < 0 || field >= res->ncolumns) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "field %d out of range", field);
RETURN_FALSE;
}
RETURN_STRING(res->table[field], 1);
}
/* }}} */
/* {{{ proto bool sqlite_seek(resource result, int row)
Seek to a particular row number */
PHP_FUNCTION(sqlite_seek)
{
zval *zres;
struct php_sqlite_result *res;
int row;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &zres, &row)) {
return;
}
ZEND_FETCH_RESOURCE(res, struct php_sqlite_result *, &zres, -1, "sqlite result", le_sqlite_result);
if (row < 1 || row >= res->nrows) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "row %d out of range", row);
RETURN_FALSE;
}
res->curr_row = row;
RETURN_TRUE;
}
/* }}} */

28
ext/sqlite/sqlite.php

@ -0,0 +1,28 @@
<?php
dl("sqlite.so");
debug_zval_dump(sqlite_libversion());
debug_zval_dump(sqlite_libencoding());
$s = sqlite_open("weztest.sqlite", 0666, $err);
debug_zval_dump($err);
debug_zval_dump($s);
$r = sqlite_query("create table foo (a INTEGER PRIMARY KEY, b INTEGER )", $s);
$r = sqlite_query("select * from sqlite_master", $s);
debug_zval_dump($r);
debug_zval_dump(sqlite_num_rows($r));
debug_zval_dump(sqlite_num_fields($r));
for ($j = 0; $j < sqlite_num_fields($r); $j++) {
echo "Field $j is " . sqlite_field_name($r, $j) . "\n";
}
while ($row = sqlite_fetch_array($r, SQLITE_ASSOC)) {
print_r($row);
}
sqlite_close($s);
?>

24
ext/sqlite/tests/001.phpt

@ -0,0 +1,24 @@
--TEST--
Check for sqlite presence
--SKIPIF--
<?php if (!extension_loaded("sqlite")) print "skip"; ?>
--POST--
--GET--
--INI--
--FILE--
<?php
echo "sqlite extension is available";
/*
you can add regression tests for your extension here
the output of your test code has to be equal to the
text in the --EXPECT-- section below for the tests
to pass, differences between the output and the
expected text are interpreted as failure
see php4/README.TESTING for further information on
writing regression tests
*/
?>
--EXPECT--
sqlite extension is available
Loading…
Cancel
Save