summaryrefslogtreecommitdiffstats
path: root/dbd/unsupported
diff options
context:
space:
mode:
Diffstat (limited to 'dbd/unsupported')
-rw-r--r--dbd/unsupported/NWGNUdbdfreetds296
-rw-r--r--dbd/unsupported/apr_dbd_freetds.c809
-rw-r--r--dbd/unsupported/apr_dbd_freetds.dep13
-rw-r--r--dbd/unsupported/apr_dbd_freetds.dsp207
-rw-r--r--dbd/unsupported/apr_dbd_freetds.mak594
5 files changed, 1919 insertions, 0 deletions
diff --git a/dbd/unsupported/NWGNUdbdfreetds b/dbd/unsupported/NWGNUdbdfreetds
new file mode 100644
index 0000000..fcac227
--- /dev/null
+++ b/dbd/unsupported/NWGNUdbdfreetds
@@ -0,0 +1,296 @@
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+ifndef EnvironmentDefined
+include $(APR_WORK)/build/NWGNUhead.inc
+endif
+
+#include $(APR)\build\NWGNUcustom.inc
+
+#
+# build this level's files
+
+#
+# Make sure all needed macro's are defined
+#
+
+# LINK_STATIC = 1
+
+# for now defined here - should finally go into build/NWGNUenvironment.inc
+FREETDS_INC = $(FREETDSSDK)/include
+FREETDS_IMP = $(FREETDSSDK)/lib/libfreetds.imp
+FREETDS_LIB = $(FREETDSSDK)/lib/libfreetds.lib
+FREETDS_NLM = libfreetds
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(APR)/include/arch/netware \
+ $(APR)/include \
+ $(APU)/include \
+ $(APU)/include/private \
+ $(APR) \
+ $(FREETDS_INC) \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ -DAPU_HAVE_FREETDS=1 \
+ -DAPU_DSO_MODULE_BUILD \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+ifdef LINK_STATIC
+XLFLAGS += \
+ -l $(FREETDSSDK)/lib \
+ $(EOLIST)
+endif
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME = dbdfreetds
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) DBD FreeTDS Driver Module
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME = dbdfreetds
+
+#
+# If this is specified, it will override VERSION value in
+# $(AP_WORK)\build\NWGNUenvironment.inc
+#
+NLM_VERSION =
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE = 8192
+
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If these are specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
+# by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(OBJDIR)\$(NLM_NAME).nlm \
+ $(EOLIST)
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(OBJDIR)/apr_dbd_freetds.o \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(PRELUDE) \
+ $(EOLIST)
+
+ifeq ($(LINK_STATIC),1)
+FILES_nlm_libs += \
+ $(FREETDS_LIB) \
+ $(EOLIST)
+endif
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ aprlib \
+ libc \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_modules += \
+ $(FREETDS_NLM) \
+ $(EOLIST)
+endif
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override $(NWOS)\copyright.txt.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ @$(APR)/aprlib.imp \
+ @libc.imp \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_Ximports += \
+ @$(FREETDS_IMP) \
+ $(EOLIST)
+endif
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ apr_dbd_freetds_driver \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+
+#
+# Any specialized rules here
+#
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APRBUILD)/NWGNUtail.inc
+
+
+
diff --git a/dbd/unsupported/apr_dbd_freetds.c b/dbd/unsupported/apr_dbd_freetds.c
new file mode 100644
index 0000000..2c34ede
--- /dev/null
+++ b/dbd/unsupported/apr_dbd_freetds.c
@@ -0,0 +1,809 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifdef I_CAN_DEAL_WITH_THIS_PARTIAL_DRIVER_AND_UNMAINTAINED_CODE_FOR_FREETDS
+
+#include "apu.h"
+#include "apu_config.h"
+
+/* COMPILE_STUBS: compile stubs for unimplemented functions.
+ *
+ * This is required to compile in /trunk/, but can be
+ * undefined to compile a driver for httpd-2.2 and other
+ * APR-1.2 applications
+ */
+#define COMPILE_STUBS
+
+#if APU_HAVE_FREETDS
+
+#include <ctype.h>
+#include <stdlib.h>
+
+#include "apr_strings.h"
+#include "apr_lib.h"
+
+#include "apr_pools.h"
+#include "apr_dbd_internal.h"
+
+#ifdef HAVE_FREETDS_SYBDB_H
+#include <freetds/sybdb.h>
+#endif
+#ifdef HAVE_SYBDB_H
+#include <sybdb.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <regex.h>
+
+/* This probably needs to change for different applications */
+#define MAX_COL_LEN 256
+
+typedef struct freetds_cell_t {
+ int type;
+ DBINT len;
+ BYTE *data;
+} freetds_cell_t;
+
+struct apr_dbd_transaction_t {
+ int mode;
+ int errnum;
+ apr_dbd_t *handle;
+};
+
+struct apr_dbd_t {
+ DBPROCESS *proc;
+ apr_dbd_transaction_t *trans;
+ apr_pool_t *pool;
+ const char *params;
+ RETCODE err;
+};
+
+struct apr_dbd_results_t {
+ int random;
+ size_t ntuples;
+ size_t sz;
+ apr_pool_t *pool;
+ DBPROCESS *proc;
+};
+
+struct apr_dbd_row_t {
+ apr_dbd_results_t *res;
+ BYTE buf[MAX_COL_LEN];
+};
+
+struct apr_dbd_prepared_t {
+ int nargs;
+ regex_t **taint;
+ int *sz;
+ char *fmt;
+};
+
+#define dbd_freetds_is_success(x) (x == SUCCEED)
+
+static int labelnum = 0; /* FIXME */
+static regex_t dbd_freetds_find_arg;
+
+/* execute a query that doesn't return a result set, mop up,
+ * and return and APR-flavoured status
+ */
+static RETCODE freetds_exec(DBPROCESS *proc, const char *query,
+ int want_results, int *nrows)
+{
+ /* TBD */
+ RETCODE rv = dbcmd(proc, query);
+ if (rv != SUCCEED) {
+ return rv;
+ }
+ rv = dbsqlexec(proc);
+ if (rv != SUCCEED) {
+ return rv;
+ }
+ if (!want_results) {
+ while (dbresults(proc) != NO_MORE_RESULTS) {
+ ++*nrows;
+ }
+ }
+ return SUCCEED;
+}
+static apr_status_t clear_result(void *data)
+{
+ /* clear cursor */
+ return (dbcanquery((DBPROCESS*)data) == SUCCEED)
+ ? APR_SUCCESS
+ : APR_EGENERAL;
+}
+
+static int dbd_freetds_select(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ const char *query, int seek)
+{
+ apr_dbd_results_t *res;
+ if (sql->trans && (sql->trans->errnum != SUCCEED)) {
+ return 1;
+ }
+ /* the core of this is
+ * dbcmd(proc, query);
+ * dbsqlexec(proc);
+ * while (dbnextrow(dbproc) != NO_MORE_ROWS) {
+ * do things
+ * }
+ *
+ * Ignore seek
+ */
+
+ sql->err = freetds_exec(sql->proc, query, 1, NULL);
+ if (!dbd_freetds_is_success(sql->err)) {
+ if (sql->trans) {
+ sql->trans->errnum = sql->err;
+ }
+ return 1;
+ }
+
+ sql->err = dbresults(sql->proc);
+ if (sql->err != SUCCEED) {
+ if (sql->trans) {
+ sql->trans->errnum = sql->err;
+ }
+ return 1;
+ }
+
+ if (!*results) {
+ *results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
+ }
+ res = *results;
+ res->proc = sql->proc;
+ res->random = seek;
+ res->pool = pool;
+ res->ntuples = dblastrow(sql->proc);
+ res->sz = dbnumcols(sql->proc);
+ apr_pool_cleanup_register(pool, sql->proc, clear_result,
+ apr_pool_cleanup_null);
+
+#if 0
+ /* Now we have a result set. We need to bind to its vars */
+ res->vars = apr_palloc(pool, res->sz * sizeof(freetds_cell_t*));
+ for (i=1; i <= res->sz; ++i) {
+ freetds_cell_t *cell = &res->vars[i-1];
+ cell->type = dbcoltype(sql->proc, i);
+ cell->len = dbcollen(sql->proc, i);
+ cell->data = apr_palloc(pool, cell->len);
+ sql->err = dbbind(sql->proc, i, /*cell->type */ STRINGBIND, cell->len, cell->data);
+ if (sql->err != SUCCEED) {
+ fprintf(stderr, "dbbind error: %d, %d, %d", i, cell->type, cell->len);
+ }
+ if ((sql->err != SUCCEED) && (sql->trans != NULL)) {
+ sql->trans->errnum = sql->err;
+ }
+ }
+#endif
+ return (sql->err == SUCCEED) ? 0 : 1;
+}
+static const char *dbd_untaint(apr_pool_t *pool, regex_t *rx, const char *val)
+{
+ regmatch_t match[1];
+ if (rx == NULL) {
+ /* no untaint expression */
+ return val;
+ }
+ if (regexec(rx, val, 1, match, 0) == 0) {
+ return apr_pstrndup(pool, val+match[0].rm_so,
+ match[0].rm_eo - match[0].rm_so);
+ }
+ return "";
+}
+static const char *dbd_statement(apr_pool_t *pool,
+ apr_dbd_prepared_t *stmt,
+ int nargs, const char **args)
+{
+ int i;
+ int len;
+ const char *var;
+ char *ret;
+ const char *p_in;
+ char *p_out;
+ char *q;
+
+ /* compute upper bound on length (since untaint shrinks) */
+ len = strlen(stmt->fmt) +1;
+ for (i=0; i<nargs; ++i) {
+ len += strlen(args[i]) - 2;
+ }
+ i = 0;
+ p_in = stmt->fmt;
+ p_out = ret = apr_palloc(pool, len);
+ /* FIXME silly bug - this'll catch %%s */
+ while (q = strstr(p_in, "%s"), q != NULL) {
+ len = q-p_in;
+ strncpy(p_out, p_in, len);
+ p_in += len;
+ p_out += len;
+ var = dbd_untaint(pool, stmt->taint[i], args[i]);
+ len = strlen(var);
+ strncpy(p_out, var, len);
+ p_in += 2;
+ p_out += len;
+ ++i;
+ }
+ strcpy(p_out, p_in);
+ return ret;
+}
+static int dbd_freetds_pselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement,
+ int seek, const char **values)
+{
+ const char *query = dbd_statement(pool, statement,
+ statement->nargs, values);
+ return dbd_freetds_select(pool, sql, results, query, seek);
+}
+static int dbd_freetds_pvselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement,
+ int seek, va_list args)
+{
+ const char **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nargs);
+
+ for (i = 0; i < statement->nargs; i++) {
+ values[i] = va_arg(args, const char*);
+ }
+
+ return dbd_freetds_pselect(pool, sql, results, statement, seek, values);
+}
+static int dbd_freetds_query(apr_dbd_t *sql, int *nrows, const char *query);
+static int dbd_freetds_pquery(apr_pool_t *pool, apr_dbd_t *sql,
+ int *nrows, apr_dbd_prepared_t *statement,
+ const char **values)
+{
+ const char *query = dbd_statement(pool, statement,
+ statement->nargs, values);
+ return dbd_freetds_query(sql, nrows, query);
+}
+static int dbd_freetds_pvquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
+ apr_dbd_prepared_t *statement, va_list args)
+{
+ const char **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nargs);
+
+ for (i = 0; i < statement->nargs; i++) {
+ values[i] = va_arg(args, const char*);
+ }
+ return dbd_freetds_pquery(pool, sql, nrows, statement, values);
+}
+
+static int dbd_freetds_get_row(apr_pool_t *pool, apr_dbd_results_t *res,
+ apr_dbd_row_t **rowp, int rownum)
+{
+ RETCODE rv = 0;
+ apr_dbd_row_t *row = *rowp;
+ int sequential = ((rownum >= 0) && res->random) ? 0 : 1;
+
+ if (row == NULL) {
+ row = apr_palloc(pool, sizeof(apr_dbd_row_t));
+ *rowp = row;
+ row->res = res;
+ }
+ /*
+ else {
+ if ( sequential ) {
+ ++row->n;
+ }
+ else {
+ row->n = rownum;
+ }
+ }
+ */
+ if (sequential) {
+ rv = dbnextrow(res->proc);
+ }
+ else {
+ rv = (rownum >= 0) ? dbgetrow(res->proc, rownum) : NO_MORE_ROWS;
+ }
+ switch (rv) {
+ case SUCCEED: return 0;
+ case REG_ROW: return 0;
+ case NO_MORE_ROWS:
+ apr_pool_cleanup_run(res->pool, res->proc, clear_result);
+ *rowp = NULL;
+ return -1;
+ case FAIL: return 1;
+ case BUF_FULL: return 2; /* FIXME */
+ default: return 3;
+ }
+
+ return 0;
+}
+
+static const char *dbd_freetds_get_entry(const apr_dbd_row_t *row, int n)
+{
+ /* FIXME: support different data types */
+ /* this fails - bind gets some vars but not others
+ return (const char*)row->res->vars[n].data;
+ */
+ DBPROCESS* proc = row->res->proc;
+ BYTE *ptr = dbdata(proc, n+1);
+ int t = dbcoltype(proc, n+1);
+ int l = dbcollen(proc, n+1);
+ if (dbwillconvert(t, SYBCHAR)) {
+ dbconvert(proc, t, ptr, l, SYBCHAR, (BYTE *)row->buf, -1);
+ return (const char*)row->buf;
+ }
+ return (char*)ptr;
+}
+
+static const char *dbd_freetds_error(apr_dbd_t *sql, int n)
+{
+ /* XXX this doesn't seem to exist in the API ??? */
+ return apr_psprintf(sql->pool, "Error %d", sql->err);
+}
+
+static int dbd_freetds_query(apr_dbd_t *sql, int *nrows, const char *query)
+{
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+ *nrows = 0;
+ sql->err = freetds_exec(sql->proc, query, 0, nrows);
+
+ if (sql->err != SUCCEED) {
+ if (sql->trans) {
+ sql->trans->errnum = sql->err;
+ }
+ return 1;
+ }
+ return 0;
+}
+
+static const char *dbd_freetds_escape(apr_pool_t *pool, const char *arg,
+ apr_dbd_t *sql)
+{
+ return arg;
+}
+
+static apr_status_t freetds_regfree(void *rx)
+{
+ regfree((regex_t*)rx);
+ return APR_SUCCESS;
+}
+static int recurse_args(apr_pool_t *pool, int n, const char *query,
+ apr_dbd_prepared_t *stmt, int offs)
+{
+
+ /* we only support %s arguments for now */
+ int ret;
+ char arg[256];
+ regmatch_t matches[3];
+ if (regexec(&dbd_freetds_find_arg, query, 3, matches, 0) != 0) {
+ /* No more args */
+ stmt->nargs = n;
+ stmt->taint = apr_palloc(pool, n*sizeof(regex_t*));
+ stmt->sz = apr_palloc(pool, n*sizeof(int));
+ ret = 0;
+ }
+ else {
+ int i;
+ int sz = 0;
+ int len = matches[1].rm_eo - matches[1].rm_so - 2;
+ if (len > 255) {
+ return 9999;
+ }
+
+ ret = recurse_args(pool, n+1, query+matches[0].rm_eo,
+ stmt, offs+matches[0].rm_eo);
+
+ memmove(stmt->fmt + offs + matches[1].rm_so,
+ stmt->fmt + offs + matches[0].rm_eo-1,
+ strlen(stmt->fmt+offs+matches[0].rm_eo)+2);
+
+ /* compile untaint to a regex if found */
+ if (matches[1].rm_so == -1) {
+ stmt->taint[n] = NULL;
+ }
+ else {
+ strncpy(arg, query+matches[1].rm_so+1,
+ matches[1].rm_eo - matches[1].rm_so - 2);
+ arg[matches[1].rm_eo - matches[1].rm_so - 2] = '\0';
+ stmt->taint[n] = apr_palloc(pool, sizeof(regex_t));
+ if (regcomp(stmt->taint[n], arg, REG_ICASE|REG_EXTENDED) != 0) {
+ ++ret;
+ }
+ else {
+ apr_pool_cleanup_register(pool, stmt->taint[n], freetds_regfree,
+ apr_pool_cleanup_null);
+ }
+ }
+
+ /* record length if specified */
+ for (i=matches[2].rm_so; i<matches[2].rm_eo; ++i) {
+ sz = 10*sz + (query[i]-'\0');
+ }
+ }
+ return ret;
+}
+
+static int dbd_freetds_prepare(apr_pool_t *pool, apr_dbd_t *sql,
+ const char *query, const char *label,
+ int nargs, int nvals, apr_dbd_type_e *types,
+ apr_dbd_prepared_t **statement)
+{
+ apr_dbd_prepared_t *stmt;
+
+ if (label == NULL) {
+ label = apr_psprintf(pool, "%d", labelnum++);
+ }
+
+ if (!*statement) {
+ *statement = apr_palloc(pool, sizeof(apr_dbd_prepared_t));
+ }
+ stmt = *statement;
+
+#if 0
+ /* count args */
+ stmt->fmt = apr_pstrdup(pool, query);
+ stmt->fmt = recurse_args(pool, 0, query, stmt, stmt->fmt);
+
+ /* overestimate by a byte or two to simplify */
+ len = strlen("CREATE PROC apr.")
+ + strlen(label)
+ + stmt->nargs * strlen(" @arg1 varchar(len1),")
+ + strlen(" AS begin ")
+ + strlen(stmt->fmt)
+ + strlen(" end "); /* extra byte for terminator */
+
+ pquery = apr_pcalloc(pool, len);
+ sprintf(pquery, "CREATE PROC apr.%s", label);
+ for (i=0; i<stmt->nargs; ++i) {
+ sprintf(pquery+strlen(pquery), " @arg%d varchar(%d)", i, stmt->sz[i]);
+ if (i < stmt->nargs-1) {
+ pquery[strlen(pquery)] = ',';
+ }
+ }
+ strcat(pquery, " AS BEGIN ");
+ strcat(pquery, stmt->fmt);
+ strcat(pquery, " END");
+
+ return (freetds_exec(sql->proc, pquery, 0, &i) == SUCCEED) ? 0 : 1;
+#else
+ stmt->fmt = apr_pstrdup(pool, query);
+ return recurse_args(pool, 0, query, stmt, 0);
+#endif
+
+}
+
+static int dbd_freetds_start_transaction(apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_transaction_t **trans)
+{
+ int dummy;
+
+ /* XXX handle recursive transactions here */
+
+ handle->err = freetds_exec(handle->proc, "BEGIN TRANSACTION", 0, &dummy);
+
+ if (dbd_freetds_is_success(handle->err)) {
+ if (!*trans) {
+ *trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
+ }
+ (*trans)->handle = handle;
+ handle->trans = *trans;
+ return 0;
+ }
+
+ return 1;
+}
+
+static int dbd_freetds_end_transaction(apr_dbd_transaction_t *trans)
+{
+ int dummy;
+ if (trans) {
+ /* rollback on error or explicit rollback request */
+ if (trans->errnum) {
+ trans->errnum = 0;
+ trans->handle->err = freetds_exec(trans->handle->proc,
+ "ROLLBACK", 0, &dummy);
+ }
+ else {
+ trans->handle->err = freetds_exec(trans->handle->proc,
+ "COMMIT", 0, &dummy);
+ }
+ trans->handle->trans = NULL;
+ }
+ return (trans->handle->err == SUCCEED) ? 0 : 1;
+}
+
+static DBPROCESS *freetds_open(apr_pool_t *pool, const char *params,
+ const char **error)
+{
+ char *server = NULL;
+ DBPROCESS *process;
+ LOGINREC *login;
+ static const char *delims = " \r\n\t;|,";
+ char *ptr;
+ char *key;
+ char *value;
+ int vlen;
+ int klen;
+ char *buf;
+ char *databaseName = NULL;
+
+ /* FIXME - this uses malloc */
+ /* FIXME - pass error message back to the caller in case of failure */
+ login = dblogin();
+ if (login == NULL) {
+ return NULL;
+ }
+ /* now set login properties */
+ for (ptr = strchr(params, '='); ptr; ptr = strchr(ptr, '=')) {
+ /* don't dereference memory that may not belong to us */
+ if (ptr == params) {
+ ++ptr;
+ continue;
+ }
+ for (key = ptr-1; apr_isspace(*key); --key);
+ klen = 0;
+ while (apr_isalpha(*key)) {
+ --key;
+ ++klen;
+ }
+ ++key;
+ for (value = ptr+1; apr_isspace(*value); ++value);
+
+ vlen = strcspn(value, delims);
+ buf = apr_pstrndup(pool, value, vlen); /* NULL-terminated copy */
+
+ if (!strncasecmp(key, "username", klen)) {
+ DBSETLUSER(login, buf);
+ }
+ else if (!strncasecmp(key, "password", klen)) {
+ DBSETLPWD(login, buf);
+ }
+ else if (!strncasecmp(key, "appname", klen)) {
+ DBSETLAPP(login, buf);
+ }
+ else if (!strncasecmp(key, "dbname", klen)) {
+ databaseName = buf;
+ }
+ else if (!strncasecmp(key, "host", klen)) {
+ DBSETLHOST(login, buf);
+ }
+ else if (!strncasecmp(key, "charset", klen)) {
+ DBSETLCHARSET(login, buf);
+ }
+ else if (!strncasecmp(key, "lang", klen)) {
+ DBSETLNATLANG(login, buf);
+ }
+ else if (!strncasecmp(key, "server", klen)) {
+ server = buf;
+ }
+ else {
+ /* unknown param */
+ }
+ ptr = value+vlen;
+ }
+
+ process = dbopen(login, server);
+
+ if (process != NULL && databaseName != NULL)
+ {
+ dbuse(process, databaseName);
+ }
+
+ dbloginfree(login);
+ if (process == NULL) {
+ return NULL;
+ }
+
+ return process;
+}
+static apr_dbd_t *dbd_freetds_open(apr_pool_t *pool, const char *params,
+ const char **error)
+{
+ apr_dbd_t *sql;
+ /* FIXME - pass error message back to the caller in case of failure */
+ DBPROCESS *process = freetds_open(pool, params, error);
+ if (process == NULL) {
+ return NULL;
+ }
+ sql = apr_pcalloc(pool, sizeof (apr_dbd_t));
+ sql->pool = pool;
+ sql->proc = process;
+ sql->params = params;
+ return sql;
+}
+
+static apr_status_t dbd_freetds_close(apr_dbd_t *handle)
+{
+ dbclose(handle->proc);
+ return APR_SUCCESS;
+}
+
+static apr_status_t dbd_freetds_check_conn(apr_pool_t *pool,
+ apr_dbd_t *handle)
+{
+ if (dbdead(handle->proc)) {
+ /* try again */
+ dbclose(handle->proc);
+ handle->proc = freetds_open(handle->pool, handle->params, NULL);
+ if (!handle->proc || dbdead(handle->proc)) {
+ return APR_EGENERAL;
+ }
+ }
+ /* clear it, in case this is called in error handling */
+ dbcancel(handle->proc);
+ return APR_SUCCESS;
+}
+
+static int dbd_freetds_select_db(apr_pool_t *pool, apr_dbd_t *handle,
+ const char *name)
+{
+ /* ouch, it's declared int. But we can use APR 0/nonzero */
+ return (dbuse(handle->proc, (char*)name) == SUCCEED) ? APR_SUCCESS : APR_EGENERAL;
+}
+
+static void *dbd_freetds_native(apr_dbd_t *handle)
+{
+ return handle->proc;
+}
+
+static int dbd_freetds_num_cols(apr_dbd_results_t* res)
+{
+ return res->sz;
+}
+
+static int dbd_freetds_num_tuples(apr_dbd_results_t* res)
+{
+ if (res->random) {
+ return res->ntuples;
+ }
+ else {
+ return -1;
+ }
+}
+
+static apr_status_t freetds_term(void *dummy)
+{
+ dbexit();
+ regfree(&dbd_freetds_find_arg);
+ return APR_SUCCESS;
+}
+static int freetds_err_handler(DBPROCESS *dbproc, int severity, int dberr,
+ int oserr, char *dberrstr, char *oserrstr)
+{
+ return INT_CANCEL; /* never exit */
+}
+static void dbd_freetds_init(apr_pool_t *pool)
+{
+ int rv = regcomp(&dbd_freetds_find_arg,
+ "%(\\{[^}]*\\})?([0-9]*)[A-Za-z]", REG_EXTENDED);
+ if (rv != 0) {
+ char errmsg[256];
+ regerror(rv, &dbd_freetds_find_arg, errmsg, 256);
+ fprintf(stderr, "regcomp failed: %s\n", errmsg);
+ }
+ dbinit();
+ dberrhandle(freetds_err_handler);
+ apr_pool_cleanup_register(pool, NULL, freetds_term, apr_pool_cleanup_null);
+}
+
+#ifdef COMPILE_STUBS
+/* get_name is the only one of these that is implemented */
+static const char *dbd_freetds_get_name(const apr_dbd_results_t *res, int n)
+{
+ return (const char*) dbcolname(res->proc, n+1); /* numbering starts at 1 */
+}
+
+/* These are stubs: transaction modes not implemented here */
+#define DBD_NOTIMPL APR_ENOTIMPL;
+static int dbd_freetds_transaction_mode_get(apr_dbd_transaction_t *trans)
+{
+ return trans ? trans->mode : APR_DBD_TRANSACTION_COMMIT;
+}
+
+static int dbd_freetds_transaction_mode_set(apr_dbd_transaction_t *trans,
+ int mode)
+{
+ if (trans) {
+ trans->mode = mode & TXN_MODE_BITS;
+ return trans->mode;
+ }
+ return APR_DBD_TRANSACTION_COMMIT;
+}
+static int dbd_freetds_pvbquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
+ apr_dbd_prepared_t *statement, va_list args)
+{
+ return DBD_NOTIMPL;
+}
+static int dbd_freetds_pbquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
+ apr_dbd_prepared_t * statement,
+ const void **values)
+{
+ return DBD_NOTIMPL;
+}
+
+static int dbd_freetds_pvbselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement,
+ int seek, va_list args)
+{
+ return DBD_NOTIMPL;
+}
+static int dbd_freetds_pbselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement,
+ int seek, const void **values)
+{
+ return DBD_NOTIMPL;
+}
+static apr_status_t dbd_freetds_datum_get(const apr_dbd_row_t *row, int n,
+ apr_dbd_type_e type, void *data)
+{
+ return APR_ENOTIMPL;
+}
+#endif
+
+APU_MODULE_DECLARE_DATA const apr_dbd_driver_t apr_dbd_freetds_driver = {
+ "freetds",
+ dbd_freetds_init,
+ dbd_freetds_native,
+ dbd_freetds_open,
+ dbd_freetds_check_conn,
+ dbd_freetds_close,
+ dbd_freetds_select_db,
+ dbd_freetds_start_transaction,
+ dbd_freetds_end_transaction,
+ dbd_freetds_query,
+ dbd_freetds_select,
+ dbd_freetds_num_cols,
+ dbd_freetds_num_tuples,
+ dbd_freetds_get_row,
+ dbd_freetds_get_entry,
+ dbd_freetds_error,
+ dbd_freetds_escape,
+ dbd_freetds_prepare,
+ dbd_freetds_pvquery,
+ dbd_freetds_pvselect,
+ dbd_freetds_pquery,
+ dbd_freetds_pselect,
+ /* this is only implemented to support httpd/2.2 standard usage,
+ * as in the original DBD implementation. Everything else is NOTIMPL.
+ */
+#ifdef COMPILE_STUBS
+ dbd_freetds_get_name,
+ dbd_freetds_transaction_mode_get,
+ dbd_freetds_transaction_mode_set,
+ "",
+ dbd_freetds_pvbquery,
+ dbd_freetds_pvbselect,
+ dbd_freetds_pbquery,
+ dbd_freetds_pbselect,
+ dbd_freetds_datum_get
+#endif
+};
+#endif
+
+#endif
diff --git a/dbd/unsupported/apr_dbd_freetds.dep b/dbd/unsupported/apr_dbd_freetds.dep
new file mode 100644
index 0000000..386f030
--- /dev/null
+++ b/dbd/unsupported/apr_dbd_freetds.dep
@@ -0,0 +1,13 @@
+# Microsoft Developer Studio Generated Dependency File, included by apr_dbd_freetds.mak
+
+.\apr_dbd_freetds.c : \
+ "..\include\apr_dbd.h"\
+ "..\include\apu.h"\
+ "..\include\private\apr_dbd_internal.h"\
+ "..\include\private\apu_config.h"\
+
+
+..\libaprutil.rc : \
+ "..\include\apu.h"\
+ "..\include\apu_version.h"\
+
diff --git a/dbd/unsupported/apr_dbd_freetds.dsp b/dbd/unsupported/apr_dbd_freetds.dsp
new file mode 100644
index 0000000..29f3852
--- /dev/null
+++ b/dbd/unsupported/apr_dbd_freetds.dsp
@@ -0,0 +1,207 @@
+# Microsoft Developer Studio Project File - Name="apr_dbd_freetds" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=apr_dbd_freetds - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "apr_dbd_freetds.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "apr_dbd_freetds.mak" CFG="apr_dbd_freetds - Win32 Release"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "apr_dbd_freetds - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "apr_dbd_freetds - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "apr_dbd_freetds - x64 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "apr_dbd_freetds - x64 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "apr_dbd_freetds - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
+# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_FREETDS=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_freetds_src" /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /fo"Release/apr_dbd_freetds-1.res" /d DLL_NAME="apr_dbd_freetds" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug /opt:ref
+# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug /out:"Release\apr_dbd_freetds-1.dll" /pdb:"Release\apr_dbd_freetds-1.pdb" /implib:"Release\apr_dbd_freetds-1.lib" /MACHINE:X86 /opt:ref
+# Begin Special Build Tool
+TargetPath=Release\apr_dbd_freetds-1.dll
+SOURCE="$(InputPath)"
+PostBuild_Desc=Embed .manifest
+PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "apr_dbd_freetds - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
+# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_FREETDS=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_freetds_src" /FD /EHsc /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /fo"Debug/apr_dbd_freetds-1.res" /d DLL_NAME="apr_dbd_freetds" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug
+# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug /out:"Debug\apr_dbd_freetds-1.dll" /pdb:"Debug\apr_dbd_freetds-1.pdb" /implib:"Debug\apr_dbd_freetds-1.lib" /MACHINE:X86
+# Begin Special Build Tool
+TargetPath=Debug\apr_dbd_freetds-1.dll
+SOURCE="$(InputPath)"
+PostBuild_Desc=Embed .manifest
+PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "apr_dbd_freetds - x64 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "x64\Release"
+# PROP BASE Intermediate_Dir "x64\Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "x64\Release"
+# PROP Intermediate_Dir "x64\Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
+# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_FREETDS=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_freetds_src" /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /fo"x64/Release/apr_dbd_freetds-1.res" /d DLL_NAME="apr_dbd_freetds" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug /opt:ref
+# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Release\apr_dbd_freetds-1.dll" /pdb:"x64\Release\apr_dbd_freetds-1.pdb" /implib:"x64\Release\apr_dbd_freetds-1.lib" /MACHINE:X64 /opt:ref
+# Begin Special Build Tool
+TargetPath=x64\Release\apr_dbd_freetds-1.dll
+SOURCE="$(InputPath)"
+PostBuild_Desc=Embed .manifest
+PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "apr_dbd_freetds - x64 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "x64\Debug"
+# PROP BASE Intermediate_Dir "x64\Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "x64\Debug"
+# PROP Intermediate_Dir "x64\Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
+# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_FREETDS=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_freetds_src" /FD /EHsc /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /fo"x64/Debug/apr_dbd_freetds-1.res" /d DLL_NAME="apr_dbd_freetds" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug
+# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Debug\apr_dbd_freetds-1.dll" /pdb:"x64\Debug\apr_dbd_freetds-1.pdb" /implib:"x64\Debug\apr_dbd_freetds-1.lib" /MACHINE:X64
+# Begin Special Build Tool
+TargetPath=x64\Debug\apr_dbd_freetds-1.dll
+SOURCE="$(InputPath)"
+PostBuild_Desc=Embed .manifest
+PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "apr_dbd_freetds - Win32 Release"
+# Name "apr_dbd_freetds - Win32 Debug"
+# Name "apr_dbd_freetds - x64 Release"
+# Name "apr_dbd_freetds - x64 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\apr_dbd_freetds.c
+# End Source File
+# End Group
+# Begin Group "Public Header Files"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\include\apr_dbd.h
+# End Source File
+# End Group
+# Begin Group "Internal Header Files"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\include\private\apu_config.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\private\apu_dbd_internal.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\private\apu_internal.h
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=..\libaprutil.rc
+# End Source File
+# End Target
+# End Project
diff --git a/dbd/unsupported/apr_dbd_freetds.mak b/dbd/unsupported/apr_dbd_freetds.mak
new file mode 100644
index 0000000..d34f7aa
--- /dev/null
+++ b/dbd/unsupported/apr_dbd_freetds.mak
@@ -0,0 +1,594 @@
+# Microsoft Developer Studio Generated NMAKE File, Based on apr_dbd_freetds.dsp
+!IF "$(CFG)" == ""
+CFG=apr_dbd_freetds - Win32 Release
+!MESSAGE No configuration specified. Defaulting to apr_dbd_freetds - Win32 Release.
+!ENDIF
+
+!IF "$(CFG)" != "apr_dbd_freetds - Win32 Release" && "$(CFG)" != "apr_dbd_freetds - Win32 Debug" && "$(CFG)" != "apr_dbd_freetds - x64 Release" && "$(CFG)" != "apr_dbd_freetds - x64 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "apr_dbd_freetds.mak" CFG="apr_dbd_freetds - Win32 Release"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "apr_dbd_freetds - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "apr_dbd_freetds - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "apr_dbd_freetds - x64 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "apr_dbd_freetds - x64 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+!IF "$(CFG)" == "apr_dbd_freetds - Win32 Release"
+
+OUTDIR=.\Release
+INTDIR=.\Release
+DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep
+# Begin Custom Macros
+OutDir=.\Release
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\apr_dbd_freetds-1.dll" "$(DS_POSTBUILD_DEP)"
+
+!ELSE
+
+ALL : "libaprutil - Win32 Release" "libapr - Win32 Release" "$(OUTDIR)\apr_dbd_freetds-1.dll" "$(DS_POSTBUILD_DEP)"
+
+!ENDIF
+
+!IF "$(RECURSE)" == "1"
+CLEAN :"libapr - Win32 ReleaseCLEAN" "libaprutil - Win32 ReleaseCLEAN"
+!ELSE
+CLEAN :
+!ENDIF
+ -@erase "$(INTDIR)\apr_dbd_freetds-1.res"
+ -@erase "$(INTDIR)\apr_dbd_freetds.obj"
+ -@erase "$(INTDIR)\apr_dbd_freetds_src.idb"
+ -@erase "$(INTDIR)\apr_dbd_freetds_src.pdb"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.dll"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.exp"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.lib"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_FREETDS=1 /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\apr_dbd_freetds_src" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
+RSC=rc.exe
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\apr_dbd_freetds-1.res" /i "../include" /i "../../apr/include" /d DLL_NAME="apr_dbd_freetds" /d "NDEBUG" /d "APU_VERSION_ONLY"
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\apr_dbd_freetds.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\apr_dbd_freetds-1.pdb" /debug /out:"$(OUTDIR)\apr_dbd_freetds-1.dll" /implib:"$(OUTDIR)\apr_dbd_freetds-1.lib" /opt:ref
+LINK32_OBJS= \
+ "$(INTDIR)\apr_dbd_freetds.obj" \
+ "$(INTDIR)\apr_dbd_freetds-1.res" \
+ "..\..\apr\Release\libapr-1.lib" \
+ "..\Release\libaprutil-1.lib"
+
+"$(OUTDIR)\apr_dbd_freetds-1.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+TargetPath=.\Release\apr_dbd_freetds-1.dll
+SOURCE="$(InputPath)"
+PostBuild_Desc=Embed .manifest
+DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep
+
+# Begin Custom Macros
+OutDir=.\Release
+# End Custom Macros
+
+"$(DS_POSTBUILD_DEP)" : "$(OUTDIR)\apr_dbd_freetds-1.dll"
+ if exist .\Release\apr_dbd_freetds-1.dll.manifest mt.exe -manifest .\Release\apr_dbd_freetds-1.dll.manifest -outputresource:.\Release\apr_dbd_freetds-1.dll;2
+ echo Helper for Post-build step > "$(DS_POSTBUILD_DEP)"
+
+!ELSEIF "$(CFG)" == "apr_dbd_freetds - Win32 Debug"
+
+OUTDIR=.\Debug
+INTDIR=.\Debug
+DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep
+# Begin Custom Macros
+OutDir=.\Debug
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\apr_dbd_freetds-1.dll" "$(DS_POSTBUILD_DEP)"
+
+!ELSE
+
+ALL : "libaprutil - Win32 Debug" "libapr - Win32 Debug" "$(OUTDIR)\apr_dbd_freetds-1.dll" "$(DS_POSTBUILD_DEP)"
+
+!ENDIF
+
+!IF "$(RECURSE)" == "1"
+CLEAN :"libapr - Win32 DebugCLEAN" "libaprutil - Win32 DebugCLEAN"
+!ELSE
+CLEAN :
+!ENDIF
+ -@erase "$(INTDIR)\apr_dbd_freetds-1.res"
+ -@erase "$(INTDIR)\apr_dbd_freetds.obj"
+ -@erase "$(INTDIR)\apr_dbd_freetds_src.idb"
+ -@erase "$(INTDIR)\apr_dbd_freetds_src.pdb"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.dll"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.exp"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.lib"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_FREETDS=1 /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\apr_dbd_freetds_src" /FD /EHsc /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
+RSC=rc.exe
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\apr_dbd_freetds-1.res" /i "../include" /i "../../apr/include" /d DLL_NAME="apr_dbd_freetds" /d "_DEBUG" /d "APU_VERSION_ONLY"
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\apr_dbd_freetds.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\apr_dbd_freetds-1.pdb" /debug /out:"$(OUTDIR)\apr_dbd_freetds-1.dll" /implib:"$(OUTDIR)\apr_dbd_freetds-1.lib"
+LINK32_OBJS= \
+ "$(INTDIR)\apr_dbd_freetds.obj" \
+ "$(INTDIR)\apr_dbd_freetds-1.res" \
+ "..\..\apr\Debug\libapr-1.lib" \
+ "..\Debug\libaprutil-1.lib"
+
+"$(OUTDIR)\apr_dbd_freetds-1.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+TargetPath=.\Debug\apr_dbd_freetds-1.dll
+SOURCE="$(InputPath)"
+PostBuild_Desc=Embed .manifest
+DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep
+
+# Begin Custom Macros
+OutDir=.\Debug
+# End Custom Macros
+
+"$(DS_POSTBUILD_DEP)" : "$(OUTDIR)\apr_dbd_freetds-1.dll"
+ if exist .\Debug\apr_dbd_freetds-1.dll.manifest mt.exe -manifest .\Debug\apr_dbd_freetds-1.dll.manifest -outputresource:.\Debug\apr_dbd_freetds-1.dll;2
+ echo Helper for Post-build step > "$(DS_POSTBUILD_DEP)"
+
+!ELSEIF "$(CFG)" == "apr_dbd_freetds - x64 Release"
+
+OUTDIR=.\x64\Release
+INTDIR=.\x64\Release
+DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep
+# Begin Custom Macros
+OutDir=.\x64\Release
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\apr_dbd_freetds-1.dll" "$(DS_POSTBUILD_DEP)"
+
+!ELSE
+
+ALL : "libaprutil - x64 Release" "libapr - x64 Release" "$(OUTDIR)\apr_dbd_freetds-1.dll" "$(DS_POSTBUILD_DEP)"
+
+!ENDIF
+
+!IF "$(RECURSE)" == "1"
+CLEAN :"libapr - x64 ReleaseCLEAN" "libaprutil - x64 ReleaseCLEAN"
+!ELSE
+CLEAN :
+!ENDIF
+ -@erase "$(INTDIR)\apr_dbd_freetds-1.res"
+ -@erase "$(INTDIR)\apr_dbd_freetds.obj"
+ -@erase "$(INTDIR)\apr_dbd_freetds_src.idb"
+ -@erase "$(INTDIR)\apr_dbd_freetds_src.pdb"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.dll"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.exp"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.lib"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_FREETDS=1 /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\apr_dbd_freetds_src" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
+RSC=rc.exe
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\apr_dbd_freetds-1.res" /i "../include" /i "../../apr/include" /d DLL_NAME="apr_dbd_freetds" /d "NDEBUG" /d "APU_VERSION_ONLY"
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\apr_dbd_freetds.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\apr_dbd_freetds-1.pdb" /debug /out:"$(OUTDIR)\apr_dbd_freetds-1.dll" /implib:"$(OUTDIR)\apr_dbd_freetds-1.lib" /MACHINE:X64 /opt:ref
+LINK32_OBJS= \
+ "$(INTDIR)\apr_dbd_freetds.obj" \
+ "$(INTDIR)\apr_dbd_freetds-1.res" \
+ "..\..\apr\x64\Release\libapr-1.lib" \
+ "..\x64\Release\libaprutil-1.lib"
+
+"$(OUTDIR)\apr_dbd_freetds-1.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+TargetPath=.\x64\Release\apr_dbd_freetds-1.dll
+SOURCE="$(InputPath)"
+PostBuild_Desc=Embed .manifest
+DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep
+
+# Begin Custom Macros
+OutDir=.\x64\Release
+# End Custom Macros
+
+"$(DS_POSTBUILD_DEP)" : "$(OUTDIR)\apr_dbd_freetds-1.dll"
+ if exist .\x64\Release\apr_dbd_freetds-1.dll.manifest mt.exe -manifest .\x64\Release\apr_dbd_freetds-1.dll.manifest -outputresource:.\x64\Release\apr_dbd_freetds-1.dll;2
+ echo Helper for Post-build step > "$(DS_POSTBUILD_DEP)"
+
+!ELSEIF "$(CFG)" == "apr_dbd_freetds - x64 Debug"
+
+OUTDIR=.\x64\Debug
+INTDIR=.\x64\Debug
+DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep
+# Begin Custom Macros
+OutDir=.\x64\Debug
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\apr_dbd_freetds-1.dll" "$(DS_POSTBUILD_DEP)"
+
+!ELSE
+
+ALL : "libaprutil - x64 Debug" "libapr - x64 Debug" "$(OUTDIR)\apr_dbd_freetds-1.dll" "$(DS_POSTBUILD_DEP)"
+
+!ENDIF
+
+!IF "$(RECURSE)" == "1"
+CLEAN :"libapr - x64 DebugCLEAN" "libaprutil - x64 DebugCLEAN"
+!ELSE
+CLEAN :
+!ENDIF
+ -@erase "$(INTDIR)\apr_dbd_freetds-1.res"
+ -@erase "$(INTDIR)\apr_dbd_freetds.obj"
+ -@erase "$(INTDIR)\apr_dbd_freetds_src.idb"
+ -@erase "$(INTDIR)\apr_dbd_freetds_src.pdb"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.dll"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.exp"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.lib"
+ -@erase "$(OUTDIR)\apr_dbd_freetds-1.pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_FREETDS=1 /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\apr_dbd_freetds_src" /FD /EHsc /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
+RSC=rc.exe
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\apr_dbd_freetds-1.res" /i "../include" /i "../../apr/include" /d DLL_NAME="apr_dbd_freetds" /d "_DEBUG" /d "APU_VERSION_ONLY"
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\apr_dbd_freetds.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\apr_dbd_freetds-1.pdb" /debug /out:"$(OUTDIR)\apr_dbd_freetds-1.dll" /implib:"$(OUTDIR)\apr_dbd_freetds-1.lib" /MACHINE:X64
+LINK32_OBJS= \
+ "$(INTDIR)\apr_dbd_freetds.obj" \
+ "$(INTDIR)\apr_dbd_freetds-1.res" \
+ "..\..\apr\x64\Debug\libapr-1.lib" \
+ "..\x64\Debug\libaprutil-1.lib"
+
+"$(OUTDIR)\apr_dbd_freetds-1.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+TargetPath=.\x64\Debug\apr_dbd_freetds-1.dll
+SOURCE="$(InputPath)"
+PostBuild_Desc=Embed .manifest
+DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep
+
+# Begin Custom Macros
+OutDir=.\x64\Debug
+# End Custom Macros
+
+"$(DS_POSTBUILD_DEP)" : "$(OUTDIR)\apr_dbd_freetds-1.dll"
+ if exist .\x64\Debug\apr_dbd_freetds-1.dll.manifest mt.exe -manifest .\x64\Debug\apr_dbd_freetds-1.dll.manifest -outputresource:.\x64\Debug\apr_dbd_freetds-1.dll;2
+ echo Helper for Post-build step > "$(DS_POSTBUILD_DEP)"
+
+!ENDIF
+
+
+!IF "$(NO_EXTERNAL_DEPS)" != "1"
+!IF EXISTS("apr_dbd_freetds.dep")
+!INCLUDE "apr_dbd_freetds.dep"
+!ELSE
+!MESSAGE Warning: cannot find "apr_dbd_freetds.dep"
+!ENDIF
+!ENDIF
+
+
+!IF "$(CFG)" == "apr_dbd_freetds - Win32 Release" || "$(CFG)" == "apr_dbd_freetds - Win32 Debug" || "$(CFG)" == "apr_dbd_freetds - x64 Release" || "$(CFG)" == "apr_dbd_freetds - x64 Debug"
+SOURCE=.\apr_dbd_freetds.c
+
+"$(INTDIR)\apr_dbd_freetds.obj" : $(SOURCE) "$(INTDIR)"
+
+
+!IF "$(CFG)" == "apr_dbd_freetds - Win32 Release"
+
+"libapr - Win32 Release" :
+ cd ".\..\..\apr"
+ $(MAKE) /$(MAKEFLAGS) /F ".\libapr.mak" CFG="libapr - Win32 Release"
+ cd "..\apr-util\dbd"
+
+"libapr - Win32 ReleaseCLEAN" :
+ cd ".\..\..\apr"
+ $(MAKE) /$(MAKEFLAGS) /F ".\libapr.mak" CFG="libapr - Win32 Release" RECURSE=1 CLEAN
+ cd "..\apr-util\dbd"
+
+!ELSEIF "$(CFG)" == "apr_dbd_freetds - Win32 Debug"
+
+"libapr - Win32 Debug" :
+ cd ".\..\..\apr"
+ $(MAKE) /$(MAKEFLAGS) /F ".\libapr.mak" CFG="libapr - Win32 Debug"
+ cd "..\apr-util\dbd"
+
+"libapr - Win32 DebugCLEAN" :
+ cd ".\..\..\apr"
+ $(MAKE) /$(MAKEFLAGS) /F ".\libapr.mak" CFG="libapr - Win32 Debug" RECURSE=1 CLEAN
+ cd "..\apr-util\dbd"
+
+!ELSEIF "$(CFG)" == "apr_dbd_freetds - x64 Release"
+
+"libapr - x64 Release" :
+ cd ".\..\..\apr"
+ $(MAKE) /$(MAKEFLAGS) /F ".\libapr.mak" CFG="libapr - x64 Release"
+ cd "..\apr-util\dbd"
+
+"libapr - x64 ReleaseCLEAN" :
+ cd ".\..\..\apr"
+ $(MAKE) /$(MAKEFLAGS) /F ".\libapr.mak" CFG="libapr - x64 Release" RECURSE=1 CLEAN
+ cd "..\apr-util\dbd"
+
+!ELSEIF "$(CFG)" == "apr_dbd_freetds - x64 Debug"
+
+"libapr - x64 Debug" :
+ cd ".\..\..\apr"
+ $(MAKE) /$(MAKEFLAGS) /F ".\libapr.mak" CFG="libapr - x64 Debug"
+ cd "..\apr-util\dbd"
+
+"libapr - x64 DebugCLEAN" :
+ cd ".\..\..\apr"
+ $(MAKE) /$(MAKEFLAGS) /F ".\libapr.mak" CFG="libapr - x64 Debug" RECURSE=1 CLEAN
+ cd "..\apr-util\dbd"
+
+!ENDIF
+
+!IF "$(CFG)" == "apr_dbd_freetds - Win32 Release"
+
+"libaprutil - Win32 Release" :
+ cd ".\.."
+ $(MAKE) /$(MAKEFLAGS) /F ".\libaprutil.mak" CFG="libaprutil - Win32 Release"
+ cd ".\dbd"
+
+"libaprutil - Win32 ReleaseCLEAN" :
+ cd ".\.."
+ $(MAKE) /$(MAKEFLAGS) /F ".\libaprutil.mak" CFG="libaprutil - Win32 Release" RECURSE=1 CLEAN
+ cd ".\dbd"
+
+!ELSEIF "$(CFG)" == "apr_dbd_freetds - Win32 Debug"
+
+"libaprutil - Win32 Debug" :
+ cd ".\.."
+ $(MAKE) /$(MAKEFLAGS) /F ".\libaprutil.mak" CFG="libaprutil - Win32 Debug"
+ cd ".\dbd"
+
+"libaprutil - Win32 DebugCLEAN" :
+ cd ".\.."
+ $(MAKE) /$(MAKEFLAGS) /F ".\libaprutil.mak" CFG="libaprutil - Win32 Debug" RECURSE=1 CLEAN
+ cd ".\dbd"
+
+!ELSEIF "$(CFG)" == "apr_dbd_freetds - x64 Release"
+
+"libaprutil - x64 Release" :
+ cd ".\.."
+ $(MAKE) /$(MAKEFLAGS) /F ".\libaprutil.mak" CFG="libaprutil - x64 Release"
+ cd ".\dbd"
+
+"libaprutil - x64 ReleaseCLEAN" :
+ cd ".\.."
+ $(MAKE) /$(MAKEFLAGS) /F ".\libaprutil.mak" CFG="libaprutil - x64 Release" RECURSE=1 CLEAN
+ cd ".\dbd"
+
+!ELSEIF "$(CFG)" == "apr_dbd_freetds - x64 Debug"
+
+"libaprutil - x64 Debug" :
+ cd ".\.."
+ $(MAKE) /$(MAKEFLAGS) /F ".\libaprutil.mak" CFG="libaprutil - x64 Debug"
+ cd ".\dbd"
+
+"libaprutil - x64 DebugCLEAN" :
+ cd ".\.."
+ $(MAKE) /$(MAKEFLAGS) /F ".\libaprutil.mak" CFG="libaprutil - x64 Debug" RECURSE=1 CLEAN
+ cd ".\dbd"
+
+!ENDIF
+
+SOURCE=..\libaprutil.rc
+
+!IF "$(CFG)" == "apr_dbd_freetds - Win32 Release"
+
+
+"$(INTDIR)\apr_dbd_freetds-1.res" : $(SOURCE) "$(INTDIR)"
+ $(RSC) /l 0x409 /fo"$(INTDIR)\apr_dbd_freetds-1.res" /i "../include" /i "../../apr/include" /i "\httpd-2.4.4\srclib\apr-util" /d DLL_NAME="apr_dbd_freetds" /d "NDEBUG" /d "APU_VERSION_ONLY" $(SOURCE)
+
+
+!ELSEIF "$(CFG)" == "apr_dbd_freetds - Win32 Debug"
+
+
+"$(INTDIR)\apr_dbd_freetds-1.res" : $(SOURCE) "$(INTDIR)"
+ $(RSC) /l 0x409 /fo"$(INTDIR)\apr_dbd_freetds-1.res" /i "../include" /i "../../apr/include" /i "\httpd-2.4.4\srclib\apr-util" /d DLL_NAME="apr_dbd_freetds" /d "_DEBUG" /d "APU_VERSION_ONLY" $(SOURCE)
+
+
+!ELSEIF "$(CFG)" == "apr_dbd_freetds - x64 Release"
+
+
+"$(INTDIR)\apr_dbd_freetds-1.res" : $(SOURCE) "$(INTDIR)"
+ $(RSC) /l 0x409 /fo"$(INTDIR)\apr_dbd_freetds-1.res" /i "../include" /i "../../apr/include" /i "\httpd-2.4.4\srclib\apr-util" /d DLL_NAME="apr_dbd_freetds" /d "NDEBUG" /d "APU_VERSION_ONLY" $(SOURCE)
+
+
+!ELSEIF "$(CFG)" == "apr_dbd_freetds - x64 Debug"
+
+
+"$(INTDIR)\apr_dbd_freetds-1.res" : $(SOURCE) "$(INTDIR)"
+ $(RSC) /l 0x409 /fo"$(INTDIR)\apr_dbd_freetds-1.res" /i "../include" /i "../../apr/include" /i "\httpd-2.4.4\srclib\apr-util" /d DLL_NAME="apr_dbd_freetds" /d "_DEBUG" /d "APU_VERSION_ONLY" $(SOURCE)
+
+
+!ENDIF
+
+
+!ENDIF
+