📄 databaselib.java
字号:
//=============================================================================//=== Copyright (C) 2001-2007 Food and Agriculture Organization of the//=== United Nations (FAO-UN), United Nations World Food Programme (WFP)//=== and United Nations Environment Programme (UNEP)//===//=== This program is free software; you can redistribute it and/or modify//=== it under the terms of the GNU General Public License as published by//=== the Free Software Foundation; either version 2 of the License, or (at//=== your option) any later version.//===//=== This program is distributed in the hope that it will be useful, but//=== WITHOUT ANY WARRANTY; without even the implied warranty of//=== MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU//=== General Public License for more details.//===//=== You should have received a copy of the GNU General Public License//=== along with this program; if not, write to the Free Software//=== Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA//===//=== Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2,//=== Rome - Italy. email: geonetwork@osgeo.org//==============================================================================package org.fao.gast.lib;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.sql.SQLException;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import java.util.StringTokenizer;import java.util.UUID;import jeeves.resources.dbms.Dbms;import jeeves.utils.BinaryFile;import org.fao.gast.lib.druid.Import;import org.fao.geonet.kernel.AccessManager;import org.fao.geonet.kernel.DataManager;import org.fao.geonet.kernel.XmlSerializer;import org.fao.geonet.util.ISODate;import org.jdom.Document;import org.jdom.Element;//=============================================================================public class DatabaseLib{ //--------------------------------------------------------------------------- //--- //--- Interfaces //--- //--------------------------------------------------------------------------- public static interface CallBack { public void schemaObjects(int count); public void removed(String object, String type); public void cyclicRefs(List<String> objects); public void creating(String object, String type); public void skipping(String table); public void filling (String table, String file); } //--------------------------------------------------------------------------- public static interface Mapper { public Object map(String field, Object value); } //--------------------------------------------------------------------------- //--- //--- Constructor //--- //--------------------------------------------------------------------------- public DatabaseLib(String appPath) { this.appPath = appPath; } //--------------------------------------------------------------------------- //--- //--- API methods //--- //--------------------------------------------------------------------------- /** Transactional */ public void setup(Resource resource, CallBack cb) throws Exception { Dbms dbms = (Dbms) resource.open(); try { removeObjects(dbms, cb); createSchema (dbms, cb); //--- needed for PostgreSQL dbms.commit(); fillTables (dbms, cb); setupSiteId (dbms); setupVersion (dbms); //--- the commit is needed by subsequent addTemplates method dbms.commit(); addTemplates(dbms); Lib.metadata.clearIndexes(); resource.close(); } catch(Exception e) { resource.abort(); throw e; } } //--------------------------------------------------------------------------- /** NOT Transactional */ public String getSetting(Dbms dbms, String path) throws SQLException { String query = "SELECT id, value FROM Settings WHERE parentId=? AND name=?"; StringTokenizer st = new StringTokenizer(path , "/"); int parent = 0; String value = null; while (st.hasMoreTokens()) { String name = st.nextToken(); List list = dbms.select(query, parent, name).getChildren(); if (list.size() == 0) return null; Element sett = (Element) list.get(0); parent = Integer.parseInt(sett.getChildText("id")); value = sett.getChildText("value"); } return value; } //--------------------------------------------------------------------------- /** NOT Transactional */ public void insert(Dbms dbms, String table, List records, String fields[], Mapper mapper) throws SQLException { for(Object rec : records) insert(dbms, table, (Element) rec, fields, mapper); } //--------------------------------------------------------------------------- /** NOT Transactional */ public void insert(Dbms dbms, String table, Element rec, Mapper mapper) throws SQLException { Map<String, Object> fields = new HashMap<String, Object>(); for(Object e : rec.getChildren()) { Element elem = (Element) e; String name = elem.getName(); String value= elem.getText(); fields.put(name, value); } insert(dbms, table, fields, mapper); } //--------------------------------------------------------------------------- /** NOT Transactional */ public void insert(Dbms dbms, String table, Element rec, String fields[], Mapper mapper) throws SQLException { Map<String, Object> map = new HashMap<String, Object>(); for(String field : fields) map.put(field, rec.getChildText(field.toLowerCase())); insert(dbms, table, map, mapper); } //--------------------------------------------------------------------------- /** NOT Transactional */ public void insert(Dbms dbms, String table, Map<String,Object> fields, Mapper mapper) throws SQLException { StringBuffer names = new StringBuffer(); StringBuffer marks = new StringBuffer(); ArrayList<Object> values = new ArrayList<Object>(); for(Iterator<String> i=fields.keySet().iterator(); i.hasNext();) { String name = i.next(); Object value= fields.get(name); names.append(name); marks.append("?"); if (mapper != null) value = mapper.map(name, value); values.add(value); if (i.hasNext()) { names.append(", "); marks.append(", "); } } String query = "INSERT INTO "+ table +"("+ names +") VALUES ("+ marks +")"; dbms.execute(query, values.toArray()); } //--------------------------------------------------------------------------- public void insert(Dbms dbms, String table, Set<String> langs, String id, String label) throws SQLException { Map<String, Object> hm = new HashMap<String, Object>(); hm.put("idDes", new Integer(id)); hm.put("label", label); for (String lang : langs) { hm.put("langId", lang); Lib.database.insert(dbms, table, hm, null); } } //--------------------------------------------------------------------------- /** NOT Transactional */ public int getNextSerial(Dbms dbms, String table) throws SQLException { List list = dbms.select("SELECT max(id) as maxid FROM "+table).getChildren(); if (list.size() == 0) return 1; Element rec = (Element) list.get(0); return Integer.parseInt(rec.getChildText("maxid")) +1; } //--------------------------------------------------------------------------- //--- //--- Private setup methods //--- //--------------------------------------------------------------------------- /** Transactional */ private void removeObjects(Dbms dbms, CallBack cb) throws FileNotFoundException, IOException { Lib.log.info("Removing database objects"); List<String> schema = loadSchemaFile(dbms.getURL()); //--- step 1 : collect objects to remove ArrayList<ObjectInfo> objects = new ArrayList<ObjectInfo>(); for (String row : schema) if (row.toUpperCase().startsWith("CREATE ")) { ObjectInfo oi = new ObjectInfo(); oi.name = getObjectName(row); oi.type = getObjectType(row); if (!oi.type.toLowerCase().equals("index")) objects.add(oi); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -