pgsOperand pgsRemoveLine::eval(pgsVarMap &vars) const { if (vars.find(m_rec) != vars.end() && vars[m_rec]->is_record()) { pgsRecord &rec = dynamic_cast<pgsRecord &>(*vars[m_rec]); // Evaluate parameter pgsOperand line(m_line->eval(vars)); if (line->is_integer()) { long aux_line; line->value().ToLong(&aux_line); if (!rec.remove_line(aux_line)) { throw pgsParameterException(wxString() << wxT("an error ") << wxT("occurred while executing ") << value()); } } else { throw pgsParameterException(wxString() << line->value() << wxT(" is not a valid line number")); } return vars[m_rec]; } else { throw pgsParameterException(wxString() << m_rec << wxT(" is not a record")); } }
pgsOperand pgsGenReference::eval(pgsVarMap &vars) const { // Evaluate parameters pgsOperand table(m_table->eval(vars)); pgsOperand column(m_column->eval(vars)); pgsOperand sequence(m_sequence->eval(vars)); pgsOperand seed(m_seed->eval(vars)); // Check parameters and create the generator if (table->is_string() && !table->value().IsEmpty() && column->is_string() && !column->value().IsEmpty() && sequence->is_integer() && seed->is_integer()) { // Check wheter the table and the column do exist pgsOperand result = pgsExecute(wxString() << wxT("SELECT 1 FROM ") << table->value() << wxT(" WHERE ") << column->value() << wxT(" = ") << column->value(), 0, m_app).eval(vars); if (result->pgs_is_true()) { long aux_sequence, aux_seed; sequence->value().ToLong(&aux_sequence); seed->value().ToLong(&aux_seed); return pnew pgsGenerator(pgsVariable::pgsTString, pnew pgsReferenceGen(m_app, table->value(), column->value(), aux_sequence != 0, aux_seed)); } else { throw pgsParameterException(wxString() << value() << wxT(":\ntable/column does not exist")); } } else { // Deal with errors if (!table->is_string() || table->value().IsEmpty()) { throw pgsParameterException(wxString() << value() << wxT(":\ntable should be a non-empty string")); } else if (!column->is_string() || column->value().IsEmpty()) { throw pgsParameterException(wxString() << value() << wxT(":\ncolumn should be a non-empty string")); } else if (!sequence->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nsequence should be an integer")); } else { throw pgsParameterException(wxString() << value() << wxT(":\nseed should be an integer")); } } }
pgsOperand pgsGenDictionary::eval(pgsVarMap &vars) const { // Evaluate parameters pgsOperand file_path(m_file_path->eval(vars)); pgsOperand sequence(m_sequence->eval(vars)); pgsOperand seed(m_seed->eval(vars)); pgsOperand wx_conv(m_wx_conv->eval(vars)); // Check parameters and create the generator if (file_path->is_string() && sequence->is_integer() && seed->is_integer() && wx_conv->is_string()) { wxFileName file(file_path->value()); if (file.FileExists() && file.IsFileReadable()) { long aux_sequence, aux_seed; sequence->value().ToLong(&aux_sequence); seed->value().ToLong(&aux_seed); return pnew pgsGenerator(pgsVariable::pgsTString, pnew pgsDictionaryGen(file_path->value(), aux_sequence != 0, aux_seed, wxCSConv(wx_conv->value()))); } else { throw pgsParameterException(wxString() << value() << wxT(":\nFile <") << file_path->value() << wxT("> does not exist")); } } else { // Deal with errors if (!file_path->is_string()) { throw pgsParameterException(wxString() << value() << wxT(":\nfile should be a string")); } else if (!sequence->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nsequence should be an integer")); } else if (!seed->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nseed should be an integer")); } else { throw pgsParameterException(wxString() << value() << wxT(":\nencoding should be a string")); } } }
pgsOperand pgsGenDate::eval(pgsVarMap &vars) const { // Evaluate parameters pgsOperand min(m_min->eval(vars)); pgsOperand max(m_max->eval(vars)); pgsOperand sequence(m_sequence->eval(vars)); pgsOperand seed(m_seed->eval(vars)); // Check parameters and create the generator if (min->is_string() && max->is_string() && sequence->is_integer() && seed->is_integer()) { wxDateTime aux_min, aux_max; if (aux_min.ParseDate(min->value()) != 0 && aux_max.ParseDate(max->value()) != 0 && aux_min.IsValid() && aux_max.IsValid()) { long aux_sequence, aux_seed; sequence->value().ToLong(&aux_sequence); seed->value().ToLong(&aux_seed); return pnew pgsGenerator(pgsVariable::pgsTString, pnew pgsDateGen(aux_min, aux_max, aux_sequence != 0, aux_seed)); } else { throw pgsParameterException(wxString() << value() << wxT(":\nmin and/or max dates are not valid")); } } else { // Deal with errors if (!min->is_string()) { throw pgsParameterException(wxString() << value() << wxT(":\nmin should be a string")); } else if (!max->is_string()) { throw pgsParameterException(wxString() << value() << wxT(":\nmax should be a string")); } else if (!sequence->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nsequence should be an integer")); } else { throw pgsParameterException(wxString() << value() << wxT(":\nseed should be an integer")); } } }
pgsOperand pgsGenReal::eval(pgsVarMap &vars) const { // Evaluate parameters pgsOperand min(m_min->eval(vars)); pgsOperand max(m_max->eval(vars)); pgsOperand precision(m_precision->eval(vars)); pgsOperand sequence(m_sequence->eval(vars)); pgsOperand seed(m_seed->eval(vars)); // Check parameters and create the generator if (min->is_number() && max->is_number() && sequence->is_integer() && seed->is_integer() && precision->is_integer()) { long aux_sequence, aux_seed, aux_precision; sequence->value().ToLong(&aux_sequence); seed->value().ToLong(&aux_seed); precision->value().ToLong(&aux_precision); return pnew pgsGenerator(pgsVariable::pgsTReal, pnew pgsRealGen(pgsVariable::num(min), pgsVariable::num(max), aux_precision, aux_sequence != 0, aux_seed)); } else { // Deal with errors if (!min->is_number()) { throw pgsParameterException(wxString() << value() << wxT(":\nmin should be a number")); } else if (!max->is_number()) { throw pgsParameterException(wxString() << value() << wxT(":\nmax should be a number")); } else if (!precision->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nprecision should be an integer")); } else if (!sequence->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nsequence should be an integer")); } else { throw pgsParameterException(wxString() << value() << wxT(":\nseed should be an integer")); } } }
pgsOperand pgsGenString::eval(pgsVarMap &vars) const { // Evaluate parameters pgsOperand min(m_min->eval(vars)); pgsOperand max(m_max->eval(vars)); pgsOperand nb_words(m_nb_words->eval(vars)); pgsOperand seed(m_seed->eval(vars)); // Check parameters and create the generator if (min->is_integer() && max->is_integer() && nb_words->is_integer() && seed->is_integer()) { long aux_min, aux_max, aux_nb_words, aux_seed; min->value().ToLong(&aux_min); max->value().ToLong(&aux_max); nb_words->value().ToLong(&aux_nb_words); seed->value().ToLong(&aux_seed); return pnew pgsGenerator(pgsVariable::pgsTString, pnew pgsStringGen(aux_min, aux_max, aux_nb_words, aux_seed)); } else { // Deal with errors if (!min->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nmin should be an integer")); } else if (!max->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nmax should be an integer")); } else if (!nb_words->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nnb_words should be an integer")); } else { throw pgsParameterException(wxString() << value() << wxT(":\nseed should be an integer")); } } }
pgsOperand pgsGenRegex::eval(pgsVarMap & vars) const { // Evaluate parameters pgsOperand regex(m_regex->eval(vars)); pgsOperand seed(m_seed->eval(vars)); // Check parameters and create the generator if (regex->is_string() && seed->is_integer()) { long aux_seed; seed->value().ToLong(&aux_seed); pgsRegexGen * gen = pnew pgsRegexGen(regex->value(), aux_seed); if (!gen->is_valid()) { pdelete(gen); throw pgsParameterException(wxString() << value() << wxT(":\nregex is not a valid regular expression")); } else { return pnew pgsGenerator(pgsVariable::pgsTString, gen); } } else { // Deal with errors if (!regex->is_string()) { throw pgsParameterException(wxString() << value() << wxT(":\nregex should be a string")); } else { throw pgsParameterException(wxString() << value() << wxT(":\nseed should be an integer")); } } }
pgsOperand pgsAssignToRecord::eval(pgsVarMap &vars) const { if (vars.find(m_name) != vars.end() && vars[m_name]->is_record()) { // Get the operand as a record pgsRecord &rec = dynamic_cast<pgsRecord &>(*vars[m_name]); // Get the value to assign pgsOperand var(m_var->eval(vars)); if (!var->is_record()) { // Evaluate parameters pgsOperand line(m_line->eval(vars)); pgsOperand column(m_column->eval(vars)); if (line->is_integer()) { long aux_line; line->value().ToLong(&aux_line); if (column->is_integer() || column->is_string()) { bool success = false; if (column->is_integer()) { long aux_column; column->value().ToLong(&aux_column); if (aux_column < rec.count_columns()) { success = rec.insert(aux_line, aux_column, var); } } else if (column->is_string()) { USHORT aux_column = rec.get_column(column->value()); if (aux_column < rec.count_columns()) { success = rec.insert(aux_line, aux_column, var); } } if (success == false) { throw pgsParameterException(wxString() << wxT("An error ") << wxT("occurred in record affectation: ") << value() << wxT("\n") << wxT("One possible reason is a ") << wxT("column index out of range")); } } else { throw pgsParameterException(wxString() << column->value() << wxT(" is not a valid column number/name")); } } else { throw pgsParameterException(wxString() << line->value() << wxT(" is not a valid line number")); } } else { throw pgsParameterException(wxString() << wxT("Cannot assign a record") << wxT(" into a record: right member is a record")); } } else { throw pgsParameterException(wxString() << m_name << wxT(" is not a record")); } return pgsIdentRecord(m_name, m_line->clone(), m_column->clone()).eval(vars); }