#!/bin/bash


DATABASE_NAME=`echo "${1}" | sed 's/\(.*\)\..*/\1/g'`
echo "////////////////////////////////////////////////////////////////"
echo "// This file is a generated file - DO NOT EDIT"
echo "// Database name:              ${DATABASE_NAME}"
echo "// Command used to generate:   ${0} ${*}"
echo "// Date generated:             "`date`
echo "////////////////////////////////////////////////////////////////"
echo '#include <vector>'
echo '#include <string>'
echo
echo '// Mapping of DB types to C++ types'
echo 'using FLOAT = float;'
echo 'using REAL = double;'
echo 'using INTEGER = int;'
echo 'using BLOB = std::vector<uint8_t>;'
echo 'using TEXT = std::string;'
echo 'using VARCHAR = std::string;'
echo
echo '// Declare visitor interface'
echo 'template <typename VISITOR, typename T>'
echo 'void visit(VISITOR& visitor, T& item);'
echo
echo "select * from sqlite_master;" | sqlite3 ${1} | grep -v "CREATE TABLE sqlite_" | grep "^table" | while read LINE
do
  # echo "Line -${LINE}-"
  TABLE_NAME=`echo "$LINE" | sed 's/^table.*CREATE TABLE \([^( ]*\) *(\(.*\))$/\1/g'`
  TABLE_ARGS=`echo "$LINE" | sed 's/^table.*CREATE TABLE \([^( ]*\) *(\(.*\))$/\2/g'`

  # echo "Table -${TABLE_NAME}-  with args: -${TABLE_ARGS}-"
  echo "////////////////////////////////////////////////////////////////"
  echo "// ${TABLE_NAME} table row"
  echo "struct ${TABLE_NAME}"
  echo "{"
  echo "${TABLE_ARGS}," | sed 's/\(.*\)([^(]*)\(.*\)/\1\2/g' | while read -d ',' ARG
  do
    # echo "Arg -${ARG}-"
    if [ "${ARG}" != "PRIMARY KEY" ] && [ "${ARG}" != "UNIQUE" ]
    then
      ARG_NAME=`echo "${ARG}" | sed 's/ *\([^ ]*\) \([^ ]*\).*/\1/g'`
      ARG_TYPE=`echo "${ARG}" | sed 's/ *\([^ ]*\) \([^ ]*\).*/\2/g'`
      echo "  ${ARG_TYPE} m_${ARG_NAME};"
    fi
  done
  echo "};"
  echo
  echo "// ${TABLE_NAME} row visitor"
  echo 'template <typename VISITOR>'
  echo "void visit(VISITOR& visitor, ${TABLE_NAME}& item)"
  echo "{"
  echo "${TABLE_ARGS}," | sed 's/\(.*\)([^(]*)\(.*\)/\1\2/g' | while read -d ',' ARG
  do
    # echo "Arg -${ARG}-"
    if [ "${ARG}" != "PRIMARY KEY" ] && [  "${ARG}" != "UNIQUE" ]
    then
      ARG_NAME=`echo "${ARG}" | sed 's/ *\([^ ]*\) \([^ ]*\).*/\1/g'`
      ARG_TYPE=`echo "${ARG}" | sed 's/ *\([^ ]*\) \([^ ]*\).*/\2/g'`
      echo "  visitor(\"${ARG_NAME}\", item.m_${ARG_NAME});"
    fi
  done
  echo "}"
  echo
done

echo "////////////////////////////////////////////////////////////////"
echo "// Database ${DATABASE_NAME}"
echo "struct ${DATABASE_NAME}"
echo "{"
echo "select * from sqlite_master;" | sqlite3 ${1} | grep -v "CREATE TABLE sqlite_" | grep "^table" | while read LINE
do
  # echo "Line -${LINE}-"
  TABLE_NAME=`echo "$LINE" | sed 's/^table.*CREATE TABLE \([^( ]*\) *(\(.*\))$/\1/g'`
  echo "  std::vector<${TABLE_NAME}> m_${TABLE_NAME};"
done
echo "};"
echo
echo "// ${DATABASE_NAME} Visitor"
echo 'template <typename VISITOR>'
echo "void visit(VISITOR& visitor, ${DATABASE_NAME}& item)"
echo "{"
echo "select * from sqlite_master;" | sqlite3 ${1} | grep -v "CREATE TABLE sqlite_" | grep "^table" | while read LINE
do
  # echo "Line -${LINE}-"
  TABLE_NAME=`echo "$LINE" | sed 's/^table.*CREATE TABLE \([^( ]*\) *(\(.*\))$/\1/g'`
  echo "  visitor(\"${TABLE_NAME}\", item.m_${TABLE_NAME});"
done
echo "}"
echo



