示例#1
0
docstring const InsetListings::buttonLabel(BufferView const & bv) const
{
	// FIXME UNICODE
	if (decoration() == InsetLayout::CLASSIC)
		return isOpen(bv) ? _("Listing") : getNewLabel(_("Listing"));
	else
		return getNewLabel(_("Listing"));
}
示例#2
0
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 "";
}
示例#3
0
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("");
}