GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — SqliteTypes: Move PK flag from table to field · feiva/sqlitebrowser@63cf871

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
  • src
    • EditTableDialog.cpp
    • sqlitetypes.cpp
    • sqlitetypes.h
    • tests
      • testsqlobjects.cpp
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎src/EditTableDialog.cpp‎

Copy file name to clipboardExpand all lines: src/EditTableDialog.cpp
+13-18Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ void EditTableDialog::populateFields()
7575
tbitem->setText(kName, f->name());
7676
QComboBox* typeBox = new QComboBox(ui->treeWidget);
7777
typeBox->setProperty("column", f->name());
78-
connect(typeBox, SIGNAL(activated(int)), this, SLOT(updateTypes()));
7978
typeBox->setEditable(false);
8079
typeBox->addItems(sqlb::Field::Datatypes);
8180
int index = typeBox->findText(f->type(), Qt::MatchExactly);
@@ -86,10 +85,11 @@ void EditTableDialog::populateFields()
8685
index = typeBox->count() - 1;
8786
}
8887
typeBox->setCurrentIndex(index);
88+
connect(typeBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateTypes()));
8989
ui->treeWidget->setItemWidget(tbitem, kType, typeBox);
9090

9191
tbitem->setCheckState(kNotNull, f->notnull() ? Qt::Checked : Qt::Unchecked);
92-
tbitem->setCheckState(kPrimaryKey, m_table.primarykey().contains(f) ? Qt::Checked : Qt::Unchecked);
92+
tbitem->setCheckState(kPrimaryKey, f->primaryKey() ? Qt::Checked : Qt::Unchecked);
9393
tbitem->setCheckState(kAutoIncrement, f->autoIncrement() ? Qt::Checked : Qt::Unchecked);
9494
tbitem->setText(kDefault, f->defaultValue());
9595
tbitem->setText(kCheck, f->check());
@@ -204,28 +204,21 @@ void EditTableDialog::itemChanged(QTreeWidgetItem *item, int column)
204204
break;
205205
case kPrimaryKey:
206206
{
207-
sqlb::FieldVector pks = m_table.primarykey();
207+
field->setPrimaryKey(item->checkState(column) == Qt::Checked);
208208
if(item->checkState(column) == Qt::Checked)
209209
{
210-
pks.append(field);
211-
// this will unset any set autoincrement
210+
// this will unset any other autoincrement
212211
for(int i = 0; i < ui->treeWidget->topLevelItemCount(); ++i)
213212
{
214213
QTreeWidgetItem* tbitem = ui->treeWidget->topLevelItem(i);
215214
if(tbitem != item)
216-
{
217215
tbitem->setCheckState(kAutoIncrement, Qt::Unchecked);
218-
}
219216
}
220-
}
221-
else
222-
{
217+
} else {
223218
item->setCheckState(kAutoIncrement, Qt::Unchecked);
224-
int index = pks.indexOf(field);
225-
if(index != -1)
226-
pks.remove(index);
227219
}
228-
m_table.setPrimaryKey(pks);
220+
if(!m_bNewTable)
221+
callRenameColumn = true;
229222
}
230223
break;
231224
case kNotNull:
@@ -255,13 +248,14 @@ void EditTableDialog::itemChanged(QTreeWidgetItem *item, int column)
255248
case kAutoIncrement:
256249
{
257250
bool ischecked = item->checkState(column) == Qt::Checked;
258-
field->setAutoIncrement(ischecked);
259251
if(ischecked)
260252
{
261-
item->setCheckState(kPrimaryKey, Qt::Checked);
253+
QComboBox* comboType = qobject_cast<QComboBox*>(ui->treeWidget->itemWidget(item, kType));
254+
comboType->setCurrentIndex(comboType->findText("INTEGER"));
255+
item->setCheckState(kPrimaryKey, Qt::Checked);
262256

263-
// this will reset all other primary keys unset
264-
// there can't be more then one autoincrement pk
257+
// this will unset all other primary keys
258+
// there can't be more than one autoincrement pk
265259
for(int i = 0; i < ui->treeWidget->topLevelItemCount(); ++i)
266260
{
267261
QTreeWidgetItem* tbitem = ui->treeWidget->topLevelItem(i);
@@ -272,6 +266,7 @@ void EditTableDialog::itemChanged(QTreeWidgetItem *item, int column)
272266
}
273267
}
274268
}
269+
field->setAutoIncrement(ischecked);
275270

276271
if(!m_bNewTable)
277272
callRenameColumn = true;
Collapse file

‎src/sqlitetypes.cpp‎

Copy file name to clipboardExpand all lines: src/sqlitetypes.cpp
+18-51Lines changed: 18 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ bool Field::isInteger() const
5555
void Table::clear()
5656
{
5757
m_fields.clear();
58-
m_primarykey.clear();
5958
}
6059

6160
Table::~Table()
@@ -95,31 +94,6 @@ int Table::findField(const QString &sname)
9594
return -1;
9695
}
9796

98-
bool Table::setPrimaryKey(const FieldVector& pk)
99-
{
100-
foreach(FieldPtr f, pk) {
101-
if(!m_fields.contains(f))
102-
return false;
103-
}
104-
105-
m_primarykey = pk;
106-
return true;
107-
}
108-
109-
bool Table::setPrimaryKey(FieldPtr pk, bool autoincrement)
110-
{
111-
if(m_fields.contains(pk))
112-
{
113-
if(pk->isInteger() && autoincrement)
114-
pk->setAutoIncrement(true);
115-
m_primarykey.clear();
116-
m_primarykey.append(pk);
117-
return true;
118-
}
119-
120-
return false;
121-
}
122-
12397
QStringList Table::fieldList() const
12498
{
12599
QStringList sl;
@@ -175,12 +149,10 @@ QString Table::emptyInsertStmt() const
175149
if(f->notnull())
176150
{
177151
fields << f->name();
178-
if( m_primarykey.contains(f) && f->isInteger() )
152+
if( f->primaryKey() && f->isInteger() )
179153
{
180154
vals << "NULL";
181-
}
182-
else
183-
{
155+
} else {
184156
if(f->isInteger())
185157
vals << "0";
186158
else
@@ -220,18 +192,21 @@ QString Table::sql() const
220192
sql += fieldList().join(",\n");
221193

222194
// primary key
223-
if( m_primarykey.size() > 0 && !hasAutoIncrement())
195+
if(!hasAutoIncrement())
224196
{
225-
sql += ",\n\tPRIMARY KEY(";
226-
for(FieldVector::ConstIterator it = m_primarykey.constBegin();
227-
it != m_primarykey.constEnd();
228-
++it)
197+
QString pk = ",\n\tPRIMARY KEY(";
198+
bool pks_found = false;
199+
foreach(FieldPtr f, m_fields)
229200
{
230-
sql += (*it)->name();
231-
if(*it != m_primarykey.last())
232-
sql += ",";
201+
if(f->primaryKey())
202+
{
203+
pk += f->name() + ",";
204+
pks_found = true;
205+
}
233206
}
234-
sql += ")";
207+
pk.chop(1);
208+
if(pks_found)
209+
sql += pk + ")";
235210
}
236211

237212
return sql + "\n);";
@@ -281,16 +256,12 @@ Table CreateTableWalker::table()
281256
while(column != antlr::nullAST && column->getType() == sqlite3TokenTypes::COLUMNDEF)
282257
{
283258
FieldPtr f;
284-
bool pk = parsecolumn(f, column->getFirstChild());
259+
parsecolumn(f, column->getFirstChild());
285260
tab.addField(f);
286-
if(pk)
287-
pks.append(FieldPtr(f));
288261
column = column->getNextSibling(); //COMMA or RPAREN
289262
column = column->getNextSibling(); //null or tableconstraint
290263
}
291264

292-
tab.setPrimaryKey(pks);
293-
294265
// now we are finished or it is a tableconstraint
295266
while(s != antlr::nullAST)
296267
{
@@ -305,18 +276,15 @@ Table CreateTableWalker::table()
305276
{
306277
tc = tc->getNextSibling()->getNextSibling(); // skip primary and key
307278
tc = tc->getNextSibling(); // skip LPAREN
308-
pks.clear();
309279
do
310280
{
311281
QString col = identifier(tc);
312282
int fieldindex = tab.findField(col);
313283
if(fieldindex != -1)
314-
pks.append(tab.fields().at(fieldindex));
284+
tab.fields().at(fieldindex)->setPrimaryKey(true);
315285
tc = tc->getNextSibling(); // skip ident and comma
316286
tc = tc->getNextSibling();
317287
} while(tc != antlr::nullAST && tc->getType() != sqlite3TokenTypes::RPAREN);
318-
319-
tab.setPrimaryKey(pks);
320288
}
321289
break;
322290
default: break;
@@ -330,7 +298,7 @@ Table CreateTableWalker::table()
330298
return tab;
331299
}
332300

333-
bool CreateTableWalker::parsecolumn(FieldPtr& f, antlr::RefAST c)
301+
void CreateTableWalker::parsecolumn(FieldPtr& f, antlr::RefAST c)
334302
{
335303
QString columnname;
336304
QString type = "TEXT";
@@ -396,9 +364,8 @@ bool CreateTableWalker::parsecolumn(FieldPtr& f, antlr::RefAST c)
396364
c = c->getNextSibling();
397365
}
398366

399-
f = FieldPtr( new Field(columnname, type, notnull, defaultvalue, check));
367+
f = FieldPtr( new Field(columnname, type, notnull, defaultvalue, check, primarykey));
400368
f->setAutoIncrement(autoincrement);
401-
return primarykey;
402369
}
403370

404371
} //namespace sqlb
Collapse file

‎src/sqlitetypes.h‎

Copy file name to clipboardExpand all lines: src/sqlitetypes.h
+9-8Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@ class Field
1818
const QString& type,
1919
bool notnull = false,
2020
const QString& defaultvalue = "",
21-
const QString& check = "")
21+
const QString& check = "",
22+
bool pk = false)
2223
: m_name(name)
2324
, m_type(type)
2425
, m_notnull(notnull)
2526
, m_check(check)
2627
, m_defaultvalue(defaultvalue)
27-
, m_autoincrement(false) {}
28+
, m_autoincrement(false)
29+
, m_primaryKey(pk)
30+
{}
2831

2932
QString toString(const QString& indent = "\t", const QString& sep = "\t") const;
3033

@@ -34,6 +37,7 @@ class Field
3437
void setCheck(const QString& check) { m_check = check; }
3538
void setDefaultValue(const QString& defaultvalue) { m_defaultvalue = defaultvalue; }
3639
void setAutoIncrement(bool autoinc) { m_autoincrement = autoinc; }
40+
void setPrimaryKey(bool pk) { m_primaryKey = pk; }
3741

3842
bool isText() const;
3943
bool isInteger() const;
@@ -44,6 +48,7 @@ class Field
4448
const QString& check() const { return m_check; }
4549
const QString& defaultValue() const { return m_defaultvalue; }
4650
bool autoIncrement() const { return m_autoincrement; }
51+
bool primaryKey() const { return m_primaryKey; }
4752

4853
static QStringList Datatypes;
4954
private:
@@ -53,6 +58,7 @@ class Field
5358
QString m_check;
5459
QString m_defaultvalue;
5560
bool m_autoincrement; //! this is stored here for simplification
61+
bool m_primaryKey;
5662
};
5763

5864
typedef QSharedPointer<Field> FieldPtr;
@@ -67,7 +73,6 @@ class Table
6773

6874
const QString& name() const { return m_name; }
6975
const FieldVector& fields() const { return m_fields; }
70-
const FieldVector& primarykey() const { return m_primarykey; }
7176

7277
/**
7378
* @brief Creates an empty insert statement.
@@ -94,9 +99,6 @@ class Table
9499
*/
95100
int findField(const QString& sname);
96101

97-
bool setPrimaryKey(const FieldVector& pk);
98-
bool setPrimaryKey(FieldPtr pk, bool autoincrement = false);
99-
100102
static Table parseSQL(const QString& sSQL);
101103
private:
102104
QStringList fieldList() const;
@@ -105,7 +107,6 @@ class Table
105107
private:
106108
QString m_name;
107109
FieldVector m_fields;
108-
FieldVector m_primarykey;
109110
};
110111

111112
/**
@@ -121,7 +122,7 @@ class CreateTableWalker
121122
Table table();
122123

123124
private:
124-
bool parsecolumn(FieldPtr& f, antlr::RefAST c);
125+
void parsecolumn(FieldPtr& f, antlr::RefAST c);
125126

126127
private:
127128
antlr::RefAST m_root;

0 commit comments

Comments
0 (0)
You are visitor 01402520 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.