/** * Sets a property, metadata, or data value with the characters in the given array of characters, * starting with the array element indicated by <code>start</code> and continuing for <code>length * </code> number of characters. * * <p>The SAX parser invokes this method and supplies the character array, start position, and * length parameter values it got from parsing the XML document. An application programmer never * invokes this method directly. * * @param ch an array of characters supplied by the SAX parser, all or part of which will be used * to set a value * @param start the position in the given array at which to start * @param length the number of consecutive characters to use */ public void characters(char[] ch, int start, int length) throws SAXException { try { switch (getState()) { case PROPERTIES: propertyValue = new String(ch, start, length); /** * This has been added for handling of special characters. When special characters are * encountered the characters function gets called for each of the characters so we need * to append the value got in the previous call as it is the same data present between the * start and the end tag. */ tempCommand = tempCommand.concat(propertyValue); propertyValue = tempCommand; // Added the following check for handling of type tags in maps if (tag == PropTypeTag) { Key_map = propertyValue; } // Added the following check for handling of class tags in maps else if (tag == PropClassTag) { Value_map = propertyValue; } break; case METADATA: // The parser will come here after the endElement as there is // "\n" in the after endTag is printed. This will cause a problem // when the data between the tags is an empty string so adding // below condition to take care of that situation. if (tag == -1) { break; } metaDataValue = new String(ch, start, length); break; case DATA: setDataValue(ch, start, length); break; default:; } } catch (SQLException ex) { throw new SAXException( resBundle.handleGetObject("xmlrch.chars").toString() + ex.getMessage()); } }
private void applyUpdates() throws SAXException { // now handle any updates if (updates.size() > 0) { try { Object upd[]; Iterator<?> i = updates.iterator(); while (i.hasNext()) { upd = (Object[]) i.next(); idx = ((Integer) upd[0]).intValue(); if (!(lastval.equals(upd[1]))) { insertValue((String) (upd[1])); } } rs.updateRow(); } catch (SQLException ex) { throw new SAXException( MessageFormat.format( resBundle.handleGetObject("xmlrch.errupdrow").toString(), ex.getMessage())); } updates.removeAllElements(); } }
/** * ** Returns true if the specified key attribute exists in the table ** @param altIndexName The * alternate index name, or null to use the primary index ** @param whereKeyType The partial key * match type ** @return True if the specified key attribute exists in the table, false otherwise */ protected boolean _exists(String altIndexName, int whereKeyType) throws SQLException, DBException { /* key fields */ boolean usePrimaryKey = StringTools.isBlank(altIndexName); DBField kfld[] = usePrimaryKey ? this.getKeyFields() : this.getAltKeyFields(altIndexName); if (ListTools.isEmpty(kfld)) { throw new DBException("No keys found!"); } /* check last key for "auto_increment" */ if (whereKeyType == DBWhere.KEY_FULL) { DBField lastField = kfld[kfld.length - 1]; if (lastField.isAutoIncrement() && !this.getFieldValues().hasFieldValue(lastField.getName())) { // full key requested and last key is auto_increment, which is missing return false; } } // DBSelect: SELECT <Keys> FROM <TableName> <KeyWhere> String firstKey = kfld[0].getName(); DBSelect<gDBR> dsel = new DBSelect<gDBR>(this.getFactory()); dsel.setSelectedFields(firstKey); dsel.setWhere(this._getWhereClause(altIndexName, whereKeyType)); /* get keyed record */ DBConnection dbc = null; Statement stmt = null; ResultSet rs = null; boolean exists = false; try { dbc = DBConnection.getDefaultConnection(); stmt = dbc.execute(dsel.toString()); // may throw DBException rs = stmt.getResultSet(); exists = rs.next(); } catch (SQLException sqe) { if (sqe.getErrorCode() == DBFactory.SQLERR_TABLE_NOTLOCKED) { // MySQL: This case has been seen on rare occasions. Not sure what causes it. Print.logError("SQL Lock Error: " + sqe); Print.logError("Hackery! Forcing lock on table: " + this.getTableName()); if (DBProvider.lockTableForRead(this.getTableName(), true)) { // may throw DBException stmt = dbc.execute(dsel.toString()); // may throw SQLException, DBException rs = stmt.getResultSet(); // SQLException exists = rs.next(); // SQLException DBProvider.unlockTables(); // DBException } } else { throw sqe; } } finally { if (rs != null) { try { rs.close(); } catch (Throwable t) { } } if (stmt != null) { try { stmt.close(); } catch (Throwable t) { } } DBConnection.release(dbc); } return exists; }
/** * Sets the value for the given element if <code>name</code> is one of the array elements in the * fields <code>properties</code>, <code>colDef</code>, or <code>data</code> and this <code> * XmlReaderContentHandler</code> object's state is not <code>INITIAL</code>. If the state is * <code>INITIAL</code>, this method does nothing. * * <p>If the state is <code>METADATA</code> and the argument supplied is <code>"metadata"</code>, * the rowset's metadata is set. If the state is <code>PROPERTIES</code>, the appropriate property * is set using the given name to determine the appropriate value. If the state is <code>DATA * </code> and the argument supplied is <code>"data"</code>, this method sets the state to <code> * INITIAL</code> and returns. If the argument supplied is one of the elements in the field <code> * data</code>, this method makes the appropriate changes to the rowset's data. * * @param lName the name of the element; either (1) one of the array elements in the fields <code> * properties</code>, <code>colDef</code>, or <code>data</code> or (2) one of the <code>RowSet * </code> elements <code>"properties"</code>, <code>"metadata"</code>, or <code>"data"</code> * @exception SAXException if a general SAX error occurs */ @SuppressWarnings("fallthrough") public void endElement(String uri, String lName, String qName) throws SAXException { int tag; String name = ""; name = lName; switch (getState()) { case PROPERTIES: if (name.equals("properties")) { state = INITIAL; break; } try { tag = propMap.get(name); switch (tag) { case KeycolsTag: if (keyCols != null) { int i[] = new int[keyCols.size()]; for (int j = 0; j < i.length; j++) i[j] = Integer.parseInt(keyCols.elementAt(j)); rs.setKeyColumns(i); } break; case PropClassTag: // Added the handling for Class tags to take care of maps // Makes an entry into the map upon end of class tag try { typeMap.put(Key_map, j86.sun.reflect.misc.ReflectUtil.forName(Value_map)); } catch (ClassNotFoundException ex) { throw new SAXException( MessageFormat.format( resBundle.handleGetObject("xmlrch.errmap").toString(), ex.getMessage())); } break; case MapTag: // Added the handling for Map to take set the typeMap rs.setTypeMap(typeMap); break; default: break; } if (getNullValue()) { setPropertyValue(null); setNullValue(false); } else { setPropertyValue(propertyValue); } } catch (SQLException ex) { throw new SAXException(ex.getMessage()); } // propertyValue need to be reset to an empty string propertyValue = ""; setTag(-1); break; case METADATA: if (name.equals("metadata")) { try { rs.setMetaData(md); state = INITIAL; } catch (SQLException ex) { throw new SAXException( MessageFormat.format( resBundle.handleGetObject("xmlrch.errmetadata").toString(), ex.getMessage())); } } else { try { if (getNullValue()) { setMetaDataValue(null); setNullValue(false); } else { setMetaDataValue(metaDataValue); } } catch (SQLException ex) { throw new SAXException( MessageFormat.format( resBundle.handleGetObject("xmlrch.errmetadata").toString(), ex.getMessage())); } // metaDataValue needs to be reset to an empty string metaDataValue = ""; } setTag(-1); break; case DATA: if (name.equals("data")) { state = INITIAL; return; } if (dataMap.get(name) == null) { tag = NullTag; } else { tag = dataMap.get(name); } switch (tag) { case ColTag: try { idx++; if (getNullValue()) { insertValue(null); setNullValue(false); } else { insertValue(tempStr); } // columnValue now need to be reset to the empty string columnValue = ""; } catch (SQLException ex) { throw new SAXException( MessageFormat.format( resBundle.handleGetObject("xmlrch.errinsertval").toString(), ex.getMessage())); } break; case RowTag: try { rs.insertRow(); rs.moveToCurrentRow(); rs.next(); // Making this as the original to turn off the // rowInserted flagging rs.setOriginalRow(); applyUpdates(); } catch (SQLException ex) { throw new SAXException( MessageFormat.format( resBundle.handleGetObject("xmlrch.errconstr").toString(), ex.getMessage())); } break; case DelTag: try { rs.insertRow(); rs.moveToCurrentRow(); rs.next(); rs.setOriginalRow(); applyUpdates(); rs.deleteRow(); } catch (SQLException ex) { throw new SAXException( MessageFormat.format( resBundle.handleGetObject("xmlrch.errdel").toString(), ex.getMessage())); } break; case InsTag: try { rs.insertRow(); rs.moveToCurrentRow(); rs.next(); applyUpdates(); } catch (SQLException ex) { throw new SAXException( MessageFormat.format( resBundle.handleGetObject("xmlrch.errinsert").toString(), ex.getMessage())); } break; case InsDelTag: try { rs.insertRow(); rs.moveToCurrentRow(); rs.next(); rs.setOriginalRow(); applyUpdates(); } catch (SQLException ex) { throw new SAXException( MessageFormat.format( resBundle.handleGetObject("xmlrch.errinsdel").toString(), ex.getMessage())); } break; case UpdTag: try { if (getNullValue()) { insertValue(null); setNullValue(false); } else if (getEmptyStringValue()) { insertValue(""); setEmptyStringValue(false); } else { updates.add(upd); } } catch (SQLException ex) { throw new SAXException( MessageFormat.format( resBundle.handleGetObject("xmlrch.errupdate").toString(), ex.getMessage())); } break; default: break; } default: break; } }