wxString Model_Report::get_html(const Data* r) { mm_html_template report(r->TEMPLATECONTENT); r->to_template(report); loop_t contents; loop_t errors; row_t error; wxSQLite3ResultSet q; int columnCount = 0; wxString sql = r->SQLCONTENT; std::map <wxString, wxString> rep_params; try { PrepareSQL(sql, rep_params); wxSQLite3Statement stmt = this->db_->PrepareStatement(sql); if (!stmt.IsReadOnly()) { return wxString::Format(_("The SQL script:\n%s \nwill modify database! aborted!"), r->SQLCONTENT); } else { q = stmt.ExecuteQuery(); columnCount = q.GetColumnCount(); } } catch (const wxSQLite3Exception& e) { return e.GetMessage(); } std::map <std::wstring, int> colHeaders; loop_t columns; for (int i = 0; i < columnCount; ++i) { int col_type = q.GetColumnType(i); const std::wstring col_name = q.GetColumnName(i).ToStdWstring(); colHeaders[col_name] = col_type; row_t row; row(L"COLUMN") = col_name; columns += row; } report(L"COLUMNS") = columns; LuaGlue state; state. Class<Record>("Record"). ctor("new"). method("get", &Record::get). method("set", &Record::set). end().open().glue(); bool skip_lua = r->LUACONTENT.IsEmpty(); bool lua_status = state.doString(std::string(r->LUACONTENT.ToUTF8())); if (!skip_lua && !lua_status) { error(L"ERROR") = wxString("failed to doString : ") + r->LUACONTENT + wxString(" err: ") + wxString(state.lastError()); errors += error; } while (q.NextRow()) { Record rec; for (int i = 0; i < columnCount; ++i) { const wxString column_name = q.GetColumnName(i); rec[column_name.ToStdWstring()] = q.GetAsString(i); } if (lua_status && !skip_lua) { try { state.invokeVoidFunction("handle_record", &rec); } catch (const std::runtime_error& e) { error(L"ERROR") = wxString("failed to call handle_record : ") + wxString(e.what()); errors += error; } catch (const std::exception& e) { error(L"ERROR") = wxString("failed to call handle_record : ") + wxString(e.what()); errors += error; } catch (...) { error(L"ERROR") = L"failed to call handle_record "; errors += error; } } row_t row; for (const auto& item : rec) { row(item.first) = item.second; } contents += row; } q.Finalize(); Record result; if (lua_status && !skip_lua) { try { state.invokeVoidFunction("complete", &result); } catch (const std::runtime_error& e) { error(L"ERROR") = wxString("failed to call complete: ") + wxString(e.what()); errors += error; } catch (const std::exception& e) { error(L"ERROR") = wxString("failed to call complete: ") + wxString(e.what()); errors += error; } catch (...) { error(L"ERROR") = L"failed to call complete"; errors += error; } } for (const auto& item : result) report(item.first) = item.second; report(L"CONTENTS") = contents; { for (const auto& item : rep_params) { report(item.first.Upper().ToStdWstring()) = item.second; } auto p = mmex::getPathAttachment(mmAttachmentManage::InfotablePathSetting()); //javascript does not handle backslashs p.Replace("\\", "\\\\"); report(L"ATTACHMENTSFOLDER") = p; auto s = wxString(wxFileName::GetPathSeparator()); s.Replace("\\", "\\\\"); report(L"FILESEPARATOR") = s; report(L"LANGUAGE") = Option::instance().LanguageISO6391(); report(L"HTMLSCALE") = wxString::Format("%d", Option::instance().HtmlFontSize()); } report(L"ERRORS") = errors; wxString out = wxEmptyString; try { out = report.Process(); } catch (const syntax_ex& e) { return e.what(); } catch (...) { return _("Caught exception"); } return out; }
wxString Model_Report::get_html(const Data* r) { mm_html_template report(r->TEMPLATECONTENT); r->to_template(report); loop_t contents; json::Array jsoncontents; loop_t errors; row_t error; wxSQLite3ResultSet q; int columnCount = 0; try { wxString sql = r->SQLCONTENT; sql.Trim(); if (!sql.empty() && sql.Last() != ';') sql += ';'; wxSQLite3Statement stmt = this->db_->PrepareStatement(sql); if (!stmt.IsReadOnly()) { return wxString::Format(_("The SQL script:\n%s \nwill modify database! aborted!"), r->SQLCONTENT); } else { q = stmt.ExecuteQuery(); columnCount = q.GetColumnCount(); } } catch (const wxSQLite3Exception& e) { return e.GetMessage(); } std::map <std::wstring, int> colHeaders; loop_t columns; for (int i = 0; i < columnCount; ++i) { int col_type = q.GetColumnType(i); const std::wstring col_name = q.GetColumnName(i).ToStdWstring(); colHeaders[col_name] = col_type; row_t row; row(L"COLUMN") = col_name; columns += row; } report(L"COLUMNS") = columns; LuaGlue state; state. Class<Record>("Record"). ctor("new"). method("get", &Record::get). method("set", &Record::set). end().open().glue(); bool skip_lua = r->LUACONTENT.IsEmpty(); bool lua_status = state.doString(std::string(r->LUACONTENT.ToUTF8())); if (!skip_lua && !lua_status) { error(L"ERROR") = wxString("failed to doString : ") + r->LUACONTENT + wxString(" err: ") + wxString(state.lastError()); errors += error; } while (q.NextRow()) { Record rec; for (int i = 0; i < columnCount; ++i) { const wxString column_name = q.GetColumnName(i); rec[column_name.ToStdWstring()] = q.GetAsString(i); } if (lua_status && !skip_lua) { try { state.invokeVoidFunction("handle_record", &rec); } catch (const std::runtime_error& e) { error(L"ERROR") = wxString("failed to call handle_record : ") + wxString(e.what()); errors += error; } catch (const std::exception& e) { error(L"ERROR") = wxString("failed to call handle_record : ") + wxString(e.what()); errors += error; } catch (...) { error(L"ERROR") = L"failed to call handle_record "; errors += error; } } row_t row; json::Object o; for (const auto& item : rec) { row(item.first) = item.second; double v; if ((colHeaders[item.first] == WXSQLITE_INTEGER || colHeaders[item.first] == WXSQLITE_FLOAT) && wxString(item.second).ToDouble(&v)) { o[wxString(item.first).ToStdWstring()] = json::Number(v); } else o[wxString(item.first).ToStdWstring()] = json::String(wxString(item.second).ToStdWstring()); } contents += row; jsoncontents.Insert(o); } q.Finalize(); Record result; if (lua_status && !skip_lua) { try { state.invokeVoidFunction("complete", &result); } catch (const std::runtime_error& e) { error(L"ERROR") = wxString("failed to call complete: ") + wxString(e.what()); errors += error; } catch (const std::exception& e) { error(L"ERROR") = wxString("failed to call complete: ") + wxString(e.what()); errors += error; } catch (...) { error(L"ERROR") = L"failed to call complete"; errors += error; } } for (const auto& item : result) report(item.first) = item.second; report(L"CONTENTS") = contents; { std::wstringstream ss; json::Writer::Write(jsoncontents, ss); report(L"JSONCONTENTS") = wxString(ss.str()); auto p = mmex::getPathAttachment(mmAttachmentManage::InfotablePathSetting()); //javascript does not handle backslashs p.Replace("\\", "\\\\"); report(L"ATTACHMENTSFOLDER") = p; auto s = wxString(wxFileName::GetPathSeparator()); s.Replace("\\", "\\\\"); report(L"FILESEPARATOR") = s; report(L"LANGUAGE") = Model_Setting::instance().GetStringSetting(LANGUAGE_PARAMETER, "english"); report(L"HTMLSCALE") = wxString::Format("%d", mmIniOptions::instance().html_font_size_); } report(L"ERRORS") = errors; wxString out = wxEmptyString; try { out = report.Process(); } catch (const syntax_ex& e) { out = e.what(); } catch (...) { // TODO } outputReportFile(out); return out; }