void MTable::fieldSet( TConfig &cfg ) { vector< vector<string> > tbl; if( tblStrct.empty() ) fieldFix(cfg); mLstUse = time(NULL); string sid, sval; bool isVarTextTransl = (!Mess->lang2CodeBase().empty() && !cfg.noTransl() && Mess->lang2Code() != Mess->lang2CodeBase()); //> Get config fields list vector<string> cf_el; cfg.cfgList(cf_el); //> Check for translation present bool trPresent = isVarTextTransl, trDblDef = false; for( unsigned i_fld = 1; i_fld < tblStrct.size(); i_fld++ ) { if( (trPresent || cfg.noTransl()) && (!isVarTextTransl || trDblDef) ) break; sid = tblStrct[i_fld][1]; if( sid.size() > 3 ) { if( !trPresent && sid.substr(0,3) == (Mess->lang2Code()+"#") ) trPresent = true; if( Mess->lang2Code() == Mess->lang2CodeBase() && !trDblDef && sid.compare(0,3,Mess->lang2CodeBase()+"#") == 0 ) trDblDef = true; } } if( trDblDef ) fieldFix(cfg); //> Get present fields list string req_where = "WHERE "; //>> Add key list to queue bool next = false; for( unsigned i_el = 0; i_el < cf_el.size(); i_el++ ) { TCfg &u_cfg = cfg.cfg(cf_el[i_el]); if( !(u_cfg.fld().flg()&TCfg::Key) ) continue; req_where = req_where + (next?" AND \"":"\"") + mod->sqlReqCode(cf_el[i_el],'"') + "\"='" + mod->sqlReqCode(getVal(u_cfg)) + "' "; next = true; } //> Prepare query string req = "SELECT 1 FROM '" + mod->sqlReqCode(name()) + "' " + req_where + ";"; try{ owner().sqlReq(req, &tbl, true); } catch(TError err) { if( (err.cod-100) == SQLITE_READONLY ) return; fieldFix(cfg); owner().sqlReq(req, NULL, true); } if( tbl.size() < 2 ) { //> Add new record req = "INSERT INTO '" + mod->sqlReqCode(name()) + "' "; string ins_name, ins_value; next = false; for( unsigned i_el = 0; i_el < cf_el.size(); i_el++ ) { TCfg &u_cfg = cfg.cfg(cf_el[i_el]); if( !(u_cfg.fld().flg()&TCfg::Key) && !u_cfg.view() ) continue; bool isTransl = (u_cfg.fld().flg()&TCfg::TransltText && trPresent && !u_cfg.noTransl()); ins_name = ins_name + (next?",\"":"\"") + mod->sqlReqCode(cf_el[i_el],'"') + "\" " + (isTransl ? (",\"" + mod->sqlReqCode(Mess->lang2Code()+"#"+cf_el[i_el],'"') + "\" ") : ""); sval = getVal(u_cfg); ins_value = ins_value + (next?",'":"'") + mod->sqlReqCode(sval) + "' " + (isTransl ? (",'" + mod->sqlReqCode(sval) + "' ") : ""); next = true; } req = req + "("+ins_name+") VALUES ("+ins_value+")"; } else { //> Update present record req = "UPDATE '" + mod->sqlReqCode(name()) + "' SET "; next = false; for( unsigned i_el = 0; i_el < cf_el.size(); i_el++ ) { TCfg &u_cfg = cfg.cfg(cf_el[i_el]); if( u_cfg.fld().flg()&TCfg::Key || !u_cfg.view() ) continue; bool isTransl = (u_cfg.fld().flg()&TCfg::TransltText && trPresent && !u_cfg.noTransl()); sid = isTransl ? (Mess->lang2Code()+"#"+cf_el[i_el]) : cf_el[i_el]; sval = getVal(u_cfg); req = req + (next?",\"":"\"") + mod->sqlReqCode(sid,'"') + "\"='" + mod->sqlReqCode(sval) + "' "; next = true; } req = req + req_where; } req += ";"; //> Query try { owner().sqlReq(req, NULL, true); } catch(TError err) { if( (err.cod-100) == SQLITE_READONLY ) return; fieldFix(cfg); owner().sqlReq(req, NULL, true); } }