#!/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