/* $Id: drydb.h,v 1.39 2009/05/07 21:22:52 imil Exp $ */

/*
 * Copyright (c) 2009 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Emile "iMil" Heitor <imil@NetBSD.org> .
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 */

#ifndef _DRYDB_H
#define _DRYDB_H

#include "ddb_create.h"


#define DROP_LOCAL_TABLES "												\
	DROP TABLE IF EXISTS LOCAL_DEPS;									\
    DROP TABLE IF EXISTS LOCAL_PKG;										\
    DROP TABLE IF EXISTS LOCAL_CONFLICTS;								\
    DROP TABLE IF EXISTS LOCAL_REQUIRES;								\
    DROP TABLE IF EXISTS LOCAL_PROVIDES;								\
    "
#define DROP_REMOTE_TABLES "                                            \
	DROP TABLE IF EXISTS REMOTE_DEPS;									\
	DROP TABLE IF EXISTS REMOTE_PKG;									\
	DROP TABLE IF EXISTS REMOTE_CONFLICTS;								\
	DROP TABLE IF EXISTS REMOTE_REQUIRES;								\
	DROP TABLE IF EXISTS REMOTE_PROVIDES;								\
    "

#define PKGPATH_DEPS "										            \
	SELECT REMOTE_DEPS.REMOTE_DEPS_PKGNAME								\
    FROM REMOTE_DEPS,REMOTE_PKG											\
    WHERE REMOTE_PKG.PKGPATH GLOB \'*/%s\'								\
    AND REMOTE_DEPS.PKG_ID = REMOTE_PKG.PKG_ID;							\
    "	

#define DIRECT_DEPS "										   			\
	SELECT REMOTE_DEPS.REMOTE_DEPS_PKGNAME					   			\
    FROM REMOTE_DEPS,REMOTE_PKG								   			\
    WHERE REMOTE_PKG.PKGNAME GLOB \'%s-[0-9]*\'				   			\
    AND REMOTE_DEPS.PKG_ID = REMOTE_PKG.PKG_ID;				   			\
    "

#define LOCAL_DIRECT_DEPS "										   		\
	SELECT LOCAL_DEPS.LOCAL_DEPS_PKGNAME					   			\
    FROM LOCAL_DEPS,LOCAL_PKG								   			\
    WHERE LOCAL_PKG.PKGNAME GLOB \'%s-[0-9]*\'				   			\
    AND LOCAL_DEPS.PKG_ID = LOCAL_PKG.PKG_ID;				   			\
    "

#define EXACT_DIRECT_DEPS "										   		\
	SELECT REMOTE_DEPS.REMOTE_DEPS_PKGNAME					   			\
    FROM REMOTE_DEPS,REMOTE_PKG								   			\
    WHERE REMOTE_PKG.PKGNAME GLOB \'%s*\'								\
    AND REMOTE_DEPS.PKG_ID = REMOTE_PKG.PKG_ID;				   			\
    "
#define LOCAL_REVERSE_DEPS "											\
	SELECT LOCAL_PKG.PKGNAME,LOCAL_PKG.PKG_KEEP							\
    FROM LOCAL_PKG,LOCAL_DEPS											\
	WHERE LOCAL_DEPS.LOCAL_DEPS_PKGNAME GLOB \'%s*\'					\
	AND LOCAL_PKG.PKG_ID = LOCAL_DEPS.PKG_ID;							\
	"

#define REMOTE_REVERSE_DEPS "											\
	SELECT REMOTE_PKG.PKGNAME FROM REMOTE_PKG,REMOTE_DEPS		   		\
	WHERE REMOTE_DEPS.REMOTE_DEPS_PKGNAME GLOB \'%s*\'					\
	AND REMOTE_PKG.PKG_ID = REMOTE_DEPS.PKG_ID;							\
	"

#define LOCAL_CONFLICTS "SELECT LOCAL_CONFLICTS_PKGNAME FROM LOCAL_CONFLICTS;"

#define GET_CONFLICT_QUERY "											\
	SELECT LOCAL_PKG.PKGNAME  FROM LOCAL_CONFLICTS,LOCAL_PKG			\
	WHERE LOCAL_CONFLICTS.LOCAL_CONFLICTS_PKGNAME = '%s'				\
	AND LOCAL_CONFLICTS.PKG_ID = LOCAL_PKG.PKG_ID;						\
	"

/* naming dirt, this is not really a PKGNAME, but this shortcut permits
 * the use of a generic function in summary.c (child_table)
 */
#define GET_REQUIRES_QUERY	"											\
	SELECT REMOTE_REQUIRES.REMOTE_REQUIRES_PKGNAME						\
	FROM REMOTE_REQUIRES,REMOTE_PKG										\
	WHERE REMOTE_PKG.PKGNAME = \'%s\'									\
	AND REMOTE_REQUIRES.PKG_ID = REMOTE_PKG.PKG_ID;						\
	"

#define GET_PROVIDES_QUERY	"											\
	SELECT REMOTE_PROVIDES.REMOTE_PROVIDES_PKGNAME						\
	FROM REMOTE_PROVIDES,REMOTE_PKG										\
	WHERE REMOTE_PKG.PKGNAME = \'%s\'									\
	AND REMOTE_PROVIDES.PKG_ID = REMOTE_PKG.PKG_ID;						\
	"

#define LOCAL_PROVIDES "SELECT LOCAL_PROVIDES_PKGNAME FROM LOCAL_PROVIDES;" 

#define KEEP_PKG "UPDATE LOCAL_PKG SET PKG_KEEP = 1 WHERE PKGNAME = \'%s\';"
#define UNKEEP_PKG 														\
	"UPDATE LOCAL_PKG SET PKG_KEEP = NULL WHERE PKGNAME = \'%s\';"

#define LOCAL_PKGS_QUERY 												\
	"SELECT PKGNAME,COMMENT,FILE_SIZE,SIZE_PKG FROM LOCAL_PKG;"
#define REMOTE_PKGS_QUERY												\
	"SELECT PKGNAME,COMMENT,FILE_SIZE,SIZE_PKG FROM REMOTE_PKG;"

#define NOKEEP_LOCAL_PKGS " 											\
    SELECT PKGNAME FROM LOCAL_PKG WHERE PKG_KEEP IS NULL;				\
    "
#define KEEP_LOCAL_PKGS " 												\
	SELECT PKGNAME FROM LOCAL_PKG WHERE PKG_KEEP IS NOT NULL; 			\
    "

#define PKG_URL "SELECT REPOSITORY FROM REMOTE_PKG WHERE PKGNAME = \'%s\';"

#define DELETE_EMPTY_ROWS						\
	"DELETE FROM REMOTE_PKG WHERE PKGNAME IS NULL;"

#define DDB PKG_DRY_DB"/pkg_dry.db"

void	drydb_init(void);
void	drydb_close(void);
int		drydb_doquery(const char *,
	int (*drydb_callback)(void *, int, char **, char **), void *);
int		ddb_get_value(void *, int, char **, char **);

#define DDB_OK 0
#define DDB_ERR -1

#endif

