1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
#include "clicommanddesc.h"
#include "cli.h"
#include "schemaresolver.h"
#include "parser/ast/sqlitecreatevirtualtable.h"
#include "cliutils.h"
CliCommandDesc::CliCommandDesc()
{
}
void CliCommandDesc::execute()
{
if (!cli->getCurrentDb())
{
println(tr("No working database is set.\n"
"Call %1 command to set working database.\n"
"Call %2 to see list of all databases.")
.arg(cmdName("use"), cmdName("dblist")));
return;
}
Db* db = cli->getCurrentDb();
if (!db || !db->isOpen())
{
println(tr("Database is not open."));
return;
}
QString table = syntax.getArgument(TABLE);
SchemaResolver resolver(db);
SqliteQueryPtr query = resolver.getParsedObject(table, SchemaResolver::TABLE);
if (!query || (!query.dynamicCast<SqliteCreateTable>() && !query.dynamicCast<SqliteCreateVirtualTable>()))
{
println(tr("Cannot find table named: %1").arg(table));
return;
}
SqliteCreateTablePtr createTable = query.dynamicCast<SqliteCreateTable>();
if (createTable)
{
printTable(createTable.data());
return;
}
SqliteCreateVirtualTablePtr virtualTable = query.dynamicCast<SqliteCreateVirtualTable>();
printVirtualTable(virtualTable.data());
}
QString CliCommandDesc::shortHelp() const
{
return tr("shows details about the table");
}
QString CliCommandDesc::fullHelp() const
{
return shortHelp();
}
void CliCommandDesc::defineSyntax()
{
syntax.setName("desc");
syntax.addArgument(TABLE, tr("table"));
}
void CliCommandDesc::printTable(SqliteCreateTable *table)
{
int termCols = getCliColumns();
println(pad("", termCols, '-'));
println(tr("Table: %1").arg(table->table));
// Header
QString msg;
msg = pad(tr("Column name"), 20, ' ');
msg += "|";
msg += pad(tr("Data type"), 10, ' ');
msg += "|";
int lgt3rd = termCols - msg.length();
printHorizontalLine(lgt3rd);
msg += pad(tr("Constraints"), lgt3rd, ' ');
println(msg);
printHorizontalLine(lgt3rd);
// Rows
QString constrJoinStr = "\n" + pad("", 20, ' ') + "|" + pad("", 10, ' ') + "|";
QStringList constrList;
for (SqliteCreateTable::Column*& column : table->columns)
{
msg = pad(column->name.left(20), 20, ' ');
msg += "|";
msg += pad((column->type ? column->type->detokenize().left(10) : ""), 10, ' ');
msg += "|";
constrList.clear();
for (SqliteCreateTable::Column::Constraint* constr : column->constraints)
constrList << pad(constr->detokenize().left(lgt3rd), lgt3rd, ' ');
msg += constrList.join(constrJoinStr);
println(msg);
}
}
void CliCommandDesc::printVirtualTable(SqliteCreateVirtualTable *table)
{
println(tr("Virtual table: %1").arg(table->table));
if (table->args.size() > 0)
{
int i = 1;
println(tr("Construction arguments:"));
for (const QString& arg : table->args)
println(pad(QString::number(i++), 2, ' ') + ". " + arg);
}
else
println(tr("No construction arguments were passed for this virtual table."));
}
void CliCommandDesc::printHorizontalLine(int lgt3rd)
{
println(pad("", 20, '-') + "+" + pad("", 10, '-') + "+" + pad("", lgt3rd, '-'));
}
|