Geo,

I've added your dbsqlite.c to cvs-head in a separate directory. I've also added sqlite to the autoconf files. Dbmail compiles just fine with sqlite support.

Some things come to mind:

we need a create_tables file for sqlite?

where will we store the database file? /var/lib/sqlite/ would be the debian way.

Or maybe /var/lib/dbmail since we're embedded.




Geo Carncross wrote:
I've cobbled together what I think is 80-90% support for an SQLite
driver.

I'd like some assistance getting it into CVS and getting the various
autoconf nonsense set up so it doesn't depend on postgres/mysql.

I have not tested it yet, so perhaps the best thing to do is to setup a
way that we can --disable-builtin-dbs so I can build it outside of
dbmail.

Will hack more tomorrow...



------------------------------------------------------------------------

/*
  Copyright (C) 2005 Internet Connection, Inc.

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

/**
 * dbsqlite.c
 * SQLite driver file
 * Manages access to an SQLite2/3 database
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "db.h"
#include "dbmail.h"
#include "dbmailtypes.h"

#include <sqlite.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

db_param_t _db_params;

/* native format is the character string */
const char *TO_CHAR = "%s";
const char *TO_DATE = "%s";

static sqlite *conn;

struct qtmp {
        char **resp;
        unsigned int rows, cols;
};

struct qtmp *lastq = 0, *saveq = 0, *tempq = 0;

int db_connect()
{
        char *errmsg;
        if (!(conn = sqlite_open(_db_params.db, 0600, &errmsg))) {
                trace(TRACE_ERROR,
                      "%si,%s: sqlite_open failed: %s",
                      __FILE__, __func__, errmsg);
                sqlite_freemem(errmsg);
                return -1;
        }
        return 0;
}

int db_check_connection()
{
        return 0;
}
void db_free_result()
{
        if (lastq) {
                if (lastq->resp) sqlite_free_table(lastq->resp);
                lastq->resp = 0;
                lastq->rows = lastq->cols = 0;
                free(lastq);
        }
        lastq = 0;

}
int db_disconnect()
{
        db_free_result();

        db_store_msgbuf_result();
        db_free_result();

        db_use_msgbuf_result();
        db_free_result();

        sqlite_close(conn);
        conn = 0;
        return 0;
}
unsigned db_num_rows()
{
        return lastq ? lastq->rows : 0;
}
unsigned db_num_fields()
{
        return lastq ? lastq->cols : 0;
}

const char *db_get_result(unsigned row, unsigned field)
{
        if (!lastq || !lastq->resp || !lastq->resp[row]) return NULL;
        return lastq->resp[((row+1) * lastq->cols) + field];
}

u64_t db_insert_result(const char *sequence_identifier UNUSED)
{
        if (!conn) return 0;
        return (u64_t)sqlite_last_insert_rowid(conn);
}

int db_query(const char *the_query)
{
        char *errmsg;

        if (lastq) {
                if (lastq->resp) sqlite_free_table(lastq->resp);
        } else {
                lastq = (struct qtmp *)malloc(sizeof(struct qtmp));
                if (!lastq) {
                        trace(TRACE_ERROR,
                              "%si,%s: malloc failed: %s",
                              __FILE__, __func__, strerror(errno));
                }
        }

        if (sqlite_get_table(conn, the_query, &lastq->resp,
                        &lastq->rows, &lastq->cols, &errmsg) != SQLITE_OK) {
                trace(TRACE_ERROR,
                      "%si,%s: sqlite_exec failed: %s",
                      __FILE__, __func__, errmsg);
                sqlite_freemem(errmsg);
                return -1;
        }
}
unsigned long db_escape_string(char *to, const char *from, unsigned long length)
{
        unsigned long did = 0;
        while (length > 0) {
                if (*from == '\'') *to++ = *from;
                *to++ = *from;
                length--;
                did++;
        }
        return did;
}
int db_do_cleanup(const char **tables UNUSED, int num_tables UNUSED)
{
        char *errmsg;
        if (!conn) return -1;
        if (sqlite_exec(conn, "VACUUM", NULL, NULL, &errmsg) != SQLITE_OK) {
                trace(TRACE_ERROR,
                      "%s,%s: error vacuuming database: %s",
                      __FILE__, __func__, errmsg);
                return -1;
        }
        return 0;
}
u64_t db_get_length(unsigned row, unsigned field)
{
        const char *q = db_get_result(row,field);
        return (u64_t)strlen(q ? q : "");
}
u64_t db_get_affected_rows()
{
        if (!conn) return 0;
        return (u64_t)sqlite_changes(conn);
}

void db_use_msgbuf_result()
{
        saveq = lastq;
        lastq = tempq;
}

void db_store_msgbuf_result()
{
        tempq = lastq;
        lastq = saveq;
}

void *db_get_result_set()
{
        return (void*)lastq;
}

void db_set_result_set(void *the_result_set)
{
        db_free_result();
        lastq = (struct qtmp *)the_result_set;
}


------------------------------------------------------------------------

_______________________________________________
Dbmail-dev mailing list
Dbmail-dev@dbmail.org
http://twister.fastxs.net/mailman/listinfo/dbmail-dev

--
  ________________________________________________________________
  Paul Stevens                                         [EMAIL PROTECTED]
  NET FACILITIES GROUP                     GPG/PGP: 1024D/11F8CD31
  The Netherlands_______________________________________www.nfg.nl

Reply via email to