summaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/sqlitestudiocli/commands/clicommanddesc.cpp
blob: f32b75e18d565438feb26a35fe27da4b0f013fdf (plain) (blame)
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")).arg(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 QString();
}

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