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, '-'));
}
|