docstring const InsetListings::buttonLabel(BufferView const & bv) const { // FIXME UNICODE if (decoration() == InsetLayout::CLASSIC) return isOpen(bv) ? _("Listing") : getNewLabel(_("Listing")); else return getNewLabel(_("Listing")); }
QString MUsers::set(QString userId, StrMap& data) { QSqlQuery qry; // validation // basic if (data["firstname"].toString().isEmpty() || data["lastname"].toString().isEmpty()) return QObject::tr("User name is required."); if (! data["national_id"].toString().isEmpty() && data["national_id"].toInt() == 0) return QObject::tr("National id is not valid."); if (! (data["birth_date"].toString().isEmpty() || data["birth_date"].toDate().isValid())) return QObject::tr("Birth date is not valid."); /* // used name user["firstname"] = refineText(user["firstname"].toString().trimmed()); user["lastname"] = refineText(user["lastname"].toString().trimmed()); qry.exec(QString("select id, firstname ||' '|| lastname as name from users where name = '%1'").arg(data["firstname"].toString() +" "+ data["lastname"].toString())); if (qry.next()) if (qry.value(0).toString() != userId) return QObject::tr("There is another user with this name."); */ // used national id qry.exec("select id, firstname ||' '|| lastname from users where national_id = "+ data["national_id"].toString()); if (qry.next()) if (qry.value(0).toString() != userId) return QObject::tr("%1 has exact same national id.").arg(qry.value(1).toString()); // set user label if (userId.isEmpty()) data["label"] = getNewLabel(); // store bool create = userId.isEmpty(); StrMap permission; permission["account_id"] = data.take("account_id"); permission["label"] = data.take("label"); if (! qry.exec(getReplaceQuery("users", data, userId))) return qry.lastError().text(); if (create) insertLog("users", "insert", userId); else insertLog("users", "update", userId); data["id"] = userId; // store permission permission["user_id"] = userId; if (create) permission["permission"] = "user"; QString permissionId; qry.exec("select id from permissions where user_id = "+ userId); if (qry.next()) permissionId = qry.value(0).toString(); if (! qry.exec(getReplaceQuery("permissions", permission, permissionId))) return qry.lastError().text(); if (permissionId.isEmpty()) { permissionId = qry.lastInsertId().toString(); insertLog("permissions", "insert", permissionId); } else insertLog("permissions", "update", permissionId); return ""; }
string CodeGenerator::generate(const SyntaxTreePtr &tree) { switch (StrHasher::hash(tree->tree_name->name())) { case StrHasher::hash_const(STR("VAR")): if (tree->nodes.size() > 3) { auto var_name = std::dynamic_pointer_cast<TreeElementLeaf>(tree->nodes[0])->leaf->name(); auto expression = generate(std::dynamic_pointer_cast<TreeElementNode>(tree->nodes[3])->node); Emit(STR("= ") + var_name + STR(" ") + expression); } break; case StrHasher::hash_const(STR("BOOL_EXPRESSION")): { auto op = std::dynamic_pointer_cast<TreeElementLeaf>(tree->nodes[1])->leaf->name(); auto expression1 = generate(std::dynamic_pointer_cast<TreeElementNode>(tree->nodes[0])->node); auto expression2 = generate(std::dynamic_pointer_cast<TreeElementNode>(tree->nodes[2])->node); return Emit(op + STR(" ") + expression1 + STR(" ") + expression2); } case StrHasher::hash_const(STR("CASE_EXPRESSION")): { static int case_temp_count = 1; auto selector = generate(std::dynamic_pointer_cast<TreeElementNode>(tree->nodes[1])->node); auto cases = std::dynamic_pointer_cast<TreeElementNode>(tree->nodes[2])->node->nodes; auto endLabel = getNewLabel(); std::vector<string> caseLabels; for (auto case_statement : cases) { caseLabels.push_back(getNewLabel()); auto node = std::dynamic_pointer_cast<TreeElementNode>(case_statement)->node; auto caseExpr = generate(std::dynamic_pointer_cast<TreeElementNode>(node->nodes[1])->node); auto res = Emit(STR("== ") + selector + STR(" ") + caseExpr); Emit(STR("IFTRUE ") + res + STR(" ") + caseLabels.back()); } if (tree->nodes.size() > 4) { auto elseExpr = generate(std::dynamic_pointer_cast<TreeElementNode>(tree->nodes[4])->node); Emit(STR("= _CASETEMP") + to_string(++case_temp_count) + STR(" ") + elseExpr); Emit(STR("GOTO ") + endLabel); } int i = 0; for (auto case_statement : cases) { auto node = std::dynamic_pointer_cast<TreeElementNode>(case_statement)->node; auto caseResult = generate(std::dynamic_pointer_cast<TreeElementNode>(node->nodes[3])->node); Emit(caseLabels[i++] + STR(":")); Emit(STR("= _CASETEMP") + to_string(case_temp_count) + STR(" ") + caseResult); Emit(STR("GOTO ") + endLabel); } Emit(endLabel + STR(":")); return STR("_CASETEMP") + to_string(case_temp_count--); } case StrHasher::hash_const(STR("EXPRESSION")): { if (tree->nodes.size() == 1) { // id or literal or other expression if (std::dynamic_pointer_cast<TreeElementLeaf>(tree->nodes[0])) return std::dynamic_pointer_cast<TreeElementLeaf>(tree->nodes[0])->leaf->name(); if (std::dynamic_pointer_cast<TreeElementNode>(tree->nodes[0])) return generate(std::dynamic_pointer_cast<TreeElementNode>(tree->nodes[0])->node); } else { return STR("Unknown expression."); } } case StrHasher::hash_const(STR("ASSIGN_STATEMENT")): { auto var_name = std::dynamic_pointer_cast<TreeElementLeaf>(tree->nodes[0])->leaf->name(); auto expression = generate(std::dynamic_pointer_cast<TreeElementNode>(tree->nodes[2])->node); Emit(STR("= ") + var_name + STR(" ") + expression); break; } case StrHasher::hash_const(STR("FOR_STATEMENT")): { auto for_var = std::dynamic_pointer_cast<TreeElementLeaf>(tree->nodes[1])->leaf->name(); bool is_reversed = tree->nodes[3]->type() == TreeElementType::LEAF; auto from = generate(std::dynamic_pointer_cast<TreeElementNode>(tree->nodes[is_reversed ? 4 : 3])->node); auto to = generate(std::dynamic_pointer_cast<TreeElementNode>(tree->nodes[is_reversed ? 6 : 5])->node); auto start_label = getNewLabel(); Emit(STR("= ") + for_var + STR(" ") + from); Emit(start_label + STR(":")); generate(std::dynamic_pointer_cast<TreeElementNode>(tree->nodes[is_reversed ? 8 : 7])->node); Emit(STR("+ ") + for_var + (is_reversed ? STR(" -1") : STR(" 1"))); auto loop_condition = Emit(STR("== ") + for_var + STR(" ") + to); Emit(STR("IFFALSE ") + loop_condition + STR(" ") + start_label); } default: for(auto node : tree->nodes) if (node->type() == TreeElementType::NODE) generate(std::dynamic_pointer_cast<TreeElementNode>(node)->node); break; } return STR(""); }