Высоты ООП
Date: 04/12/07
(Code WTF) Keywords: sql
/**
* @param sql
* @param tpl
* @param id - ==0 это корневой шаблон, >0 - это обновление строки подшаблона, <0 - это добавление строки подшаблона
* @param pid
* @param values
* @param tableNameSuffix
* @return
* @throws Exception
*/
public static long storeTplValues(
SqlDb sql,
UnitTemplate tpl,
long id,
long pid,
Map< Long, Object> values,
String tableNameSuffix) throws SQLException {
Object params[] = new Object[tpl.getNumFieldsNotTemplate() + 1/*for pid*/ + (id!=0?1:0)/*for insert or update*/];
StringBuffer fieldsBuf = new StringBuffer();
StringBuffer valuesBuf = new StringBuffer();
int i = 0;
for(UnitTemplateField f : tpl.fields) {
if(!f.isTemplate()) {
if(i>0) fieldsBuf.append(',');
fieldsBuf.append("field").append(f.id);
if(id >= 0) fieldsBuf.append("=?"); // for update or root-template
valuesBuf.append("?,");
//System.out.println(f.id + ": "+ values.get(f.id).getClass().getName());
params[i++] = f.getValue(values);
}
}
params[i++] = pid;
String tableName = TemplateTable.getTableName(tpl, tableNameSuffix);
if(id < 0) {
// new sub-template item
id = GlobalId.getId(sql);
params[i++] = id;
sql.insert(
"INSERT INTO "+tableName+
" ("+fieldsBuf.toString()+", pid, id)" +
"VALUES("+valuesBuf.toString()+"?,?);",
params
);
return id; // уровни тройной вложенности пока не поддерживаются!
} else
if(id > 0) {
// update sup-template item
params[i++] = id;
sql.update(
"UPDATE "+tableName+" SET "+fieldsBuf.toString()+",pid=? WHERE id=?;",
params);
return id; // уровни тройной вложенности пока не поддерживаются!
} else {
// main-template item
id = pid;
if(0 == sql.update("UPDATE "+tableName+" SET "+fieldsBuf.toString()+" WHERE pid=?;", params)) {
sql.insert(
"INSERT INTO "+tableName+
" ("+fieldsBuf.toString().replaceAll("=\\?", "")+",pid) " +
"VALUES("+valuesBuf.toString()+"?);",
params);
}
}
for(UnitTemplateField f : tpl.fields) {
if(f.isTemplate()) {
Map< Long, Map< Long, Object>> list = (Map< Long, Map< Long, Object>>)values.get(f.id);
if(list == null) continue;
Vector>> listCopy = new Vector< Map.Entry< Long, Map< Long, Object>>>();
listCopy.addAll(list.entrySet());
// имя таблицы подшаблона
String subTableName = TemplateTable.getTableNameSuffix(f.id, tableNameSuffix);
// подшаблон
UnitTemplate subTpl = UnitTemplate.getTemplate(Long.parseLong(f.defValue));
for(Map.Entry> e : listCopy) {
if(e.getValue() == null) {
// строку подшаблона удалили
sql.update("DELETE FROM " + TemplateTable.getTableName(subTpl, subTableName) + " WHERE id=?", e.getKey());
continue;
}
long key = storeTplValues(
sql,
subTpl,
e.getKey(),
id,
e.getValue(),
subTableName
);
if(e.getKey() < 0) {
list.put(key, e.getValue());
list.remove(e.getKey());
}
}
}
}
return id;
}
Если кто не понимает "где WTF" ответьте на вопрос почему
ERROR: column "field21053265" of relation "place21053089" does not exist
Source: http://community.livejournal.com/code_wtf/80468.html