/***********************************************************************

 
         name: sqlinsert.pl
  description: Interacts with mysql (using mysql.pl)
               Constructs an Insert command
       author: Peo Grimheden and Maria H�kansson
               modified by Rebecca Jonson

***************************************************************************/


:- module(sqlinsert,[insertDB2/3]).
:- use_module(sqlselect).
:- use_module(library(system)).
:- use_module(library(charsio)).
:- use_module(library(lists)).
:- use_module(mysql).

/*=====================================================================
     insertDB( +Table, +Values, -Answer )
     -- Is supposed to return Answer if insertion succeeds
=======================================================================*/

insertDB2(To,set(Values),Answer):-
        splitIn2(Values,Columns,Vals),
        megaList(Columns, ConcColumns),
        megaList(Vals, ConcVals),
        print_insert(To, ConcColumns, ConcVals,AnswerC),
	%AnswerC = "Insertion completed.",
	atom_chars(Answer,AnswerC).

/*===========================================================================
    print_insert(+Table, +ListOfColums, +ListOfValues, -Answer
    -- Constructs an SQL query, calls the mysql module and returns the answer
=============================================================================*/

print_insert(To, ConcColumns, ConcVals, AnswerC):-
        INSERT = "INSERT INTO ",
        atom_to_chars(To, AsciiTo),
        VAL = " VALUES ",
        append(INSERT,AsciiTo,X),
        append(X,[40|ConcColumns],Y),
        append(Y,[41],Z),
        append(Z,VAL,W),
        append(W,[40|ConcVals],Q),
	append(Q,[41],V),
        atom_chars(SQL,V),
        mysql(SQL,AnswerC,[]).



/*============================================================
    splitIn2(+ValueList, -ColList, -ValList)
    -- Takes a list similar to believeslist and
    returnsseparated lists of colums and values
    with values surrounded with ""
=============================================================*/

splitIn2([],[],[]).
splitIn2([X=Y|List],[Col|Cols],[QuoteValQuote|Vals]):-
        name(X,Col),
        name(Y,Val),
        quotefier(Val,QuoteValQuote),
        splitIn2(List,Cols,Vals).

/*==================================================
    quotefier(+Val, -QuoteValQuote)
    -- provides a value with quotation marks
===================================================*/

quotefier(Val,QuoteValQuote):-
        append([34|Val],[34],QuoteValQuote).


/*============================================================
    megaList(+ListofLists, -List)
    -- Returns the concatenation of all lists in list of list
    values separated with comma
==============================================================*/

megaList(Xs,Ys):- megaList(Xs,[],Ys).
 
megaList([],Ys,Ys).
megaList([X|Xs],Zs,Ys):-
	(Xs == [] -> W = X
	;
	    append(X, [44], W)),    
	    append(Zs, W, Qs),   
	    megaList(Xs,Qs,Ys).