pdostatement.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 1,549 行 · 第 1/3 页

JAVA
1,549
字号
      {        String value = _resultSet.getString(column);        if (value == null || _resultSet.wasNull())          return NullValue.NULL;        else          return _env.createString(value);      }      case Types.DOUBLE:      {        double value = _resultSet.getDouble(column);        if (_resultSet.wasNull())          return NullValue.NULL;        else          return (new DoubleValue(value)).toStringValue();      }      // XXX: lob      default:      {        String value = _resultSet.getString(column);        if (value == null || _resultSet.wasNull())          return NullValue.NULL;        else          return _env.createString(value);      }    }  }  private ResultSetMetaData getResultSetMetaData()    throws SQLException  {    if (_resultSetMetaData == null)      _resultSetMetaData = _resultSet.getMetaData();    return _resultSetMetaData;  }  /**   * Returns an iterator of the values.   */  public Iterator<Value> iterator()  {    Value value = fetchAll(0, -1);    if (value instanceof ArrayValue)      return ((ArrayValue) value).values().iterator();    else {      Set<Value> emptySet = Collections.emptySet();      return emptySet.iterator();    }  }  String lastInsertId(String name)  {    if (!(name == null || name.length() == 0))      throw new UnimplementedException("lastInsertId with name ");    if (_lastInsertId != null)      return _lastInsertId;    String lastInsertId = null;    Statement stmt;    if (_preparedStatement != null)      stmt = _preparedStatement;    else      stmt = _statement;    ResultSet resultSet = null;    try {      resultSet = stmt.getGeneratedKeys();      if (resultSet.next())        lastInsertId = resultSet.getString(1);    }    catch (SQLException ex) {      _error.error(ex);    }    finally {      try {        if (resultSet != null)          resultSet.close();      }      catch (SQLException ex) {        log.log(Level.WARNING, ex.toString(), ex);      }    }    _lastInsertId = lastInsertId == null ? "0" : lastInsertId;    return _lastInsertId;  }  public boolean nextRowset()  {    throw new UnimplementedException();  }  private int resolveParameter(Value parameter)  {    int index = -1;    if (parameter instanceof LongValue) {      // slight optimization for normal case      index = parameter.toInt();    }    else {      String name = parameter.toString();      if (name.length() > 1 && name.charAt(0) == ':') {        name = name.substring(1);        if (_parameterNameMap != null)          index = _parameterNameMap.get(name);      }      else        index = parameter.toInt();    }    return index;  }  public int rowCount()  {    if (_resultSet == null)      return 0;    try {      int row = _resultSet.getRow();      try {        _resultSet.last();        return _resultSet.getRow();      }      finally {        if (row == 0)          _resultSet.beforeFirst();        else          _resultSet.absolute(row);      }    }    catch (SQLException ex) {      _error.error(ex);      return 0;    }  }  public boolean setAttribute(int attribute, Value value)  {    return setAttribute(attribute, value, false);  }  public boolean setAttribute(int attribute, Value value, boolean isFromConstructor)  {    if (isFromConstructor) {      switch (attribute) {        case PDO.CURSOR_FWDONLY:        case PDO.CURSOR_SCROLL:          return setCursor(attribute);      }    }    _error.unsupportedAttribute(attribute);    return false;  }  private boolean setCursor(int attribute)  {    switch (attribute) {      case PDO.CURSOR_FWDONLY:        throw new UnimplementedException();      case PDO.CURSOR_SCROLL:        throw new UnimplementedException();      default:        _error.unsupportedAttribute(attribute);        return false;    }  }  /**   * Sets the fetch mode, the default is {@link PDO.FETCH_BOTH}.   */  public boolean setFetchMode(int fetchMode, Value[] args)  {    _fetchMode = PDO.FETCH_BOTH;    _fetchModeArgs = NULL_VALUES;    int fetchStyle = fetchMode;    boolean isGroup = (fetchMode & PDO.FETCH_GROUP) != 0;    boolean isUnique = (fetchMode & PDO.FETCH_UNIQUE) != 0;    if (isGroup)      throw new UnimplementedException("PDO.FETCH_GROUP");    if (isUnique)      throw new UnimplementedException("PDO.FETCH_UNIQUE");    fetchStyle = fetchStyle & (~(PDO.FETCH_GROUP | PDO.FETCH_UNIQUE));    boolean isClasstype = (fetchMode & PDO.FETCH_CLASSTYPE) != 0;    boolean isSerialize = (fetchMode & PDO.FETCH_SERIALIZE) != 0;    fetchStyle = fetchStyle & (~(PDO.FETCH_CLASSTYPE | PDO.FETCH_SERIALIZE));    switch (fetchStyle) {      case PDO.FETCH_ASSOC:      case PDO.FETCH_BOTH:      case PDO.FETCH_BOUND:      case PDO.FETCH_LAZY:      case PDO.FETCH_NAMED:      case PDO.FETCH_NUM:      case PDO.FETCH_OBJ:        break;      case PDO.FETCH_CLASS:        if (args.length < 1 || args.length > 2)          return false;        if (_env.findClass(args[0].toString()) == null)          return false;        if (args.length == 2 && !(args[1].isNull() || args[1].isArray())) {          _env.warning(L.l("constructor args must be an array"));          return false;        }        break;      case PDO.FETCH_COLUMN:        if (args.length != 1)          return false;        break;     case PDO.FETCH_FUNC:       _error.warning(L.l("PDO::FETCH_FUNC can only be used with PDOStatement::fetchAll()"));       return false;      case PDO.FETCH_INTO:        if (args.length != 1 || !args[0].isObject())          return false;        break;      default:        _error.warning(L.l("invalid fetch mode"));        break;    }    _fetchModeArgs = args;    _fetchMode = fetchMode;    return true;  }  /**   * @param index 1-based position number   * @param value the value for the parameter   *   * @return true for success, false for failure   */  private boolean setLobParameter(int index, Value value, long length)  {    try {      if (value == null || value.isNull()) {        _preparedStatement.setObject(index, null);      }      else if (value instanceof StringValue) {        if (length < 0) {          _preparedStatement.setBinaryStream(index, value.toInputStream(), value.toString().length());        }        else          _preparedStatement.setBinaryStream(index, value.toInputStream(), (int) length);      }      else {        InputStream inputStream = value.toInputStream();        if (inputStream == null) {          _error.warning(L.l("type {0} ({1}) for parameter index {2} cannot be used for lob", value.getType(), value.getClass(), index));          return false;        }        if (length < 0 && (value instanceof FileReadValue)) {          length = ((FileReadValue) value).getLength();          if (length <= 0)            length = -1;        }        if (length < 0) {          TempBuffer tempBuffer = TempBuffer.allocate();          try {            byte[] bytes = new byte[1024];            int len;            while ((len = inputStream.read(bytes, 0, 1024)) != -1)              tempBuffer.write(bytes, 0, len);          }          catch (IOException ex) {            _error.error(ex);            return false;          }          TempReadStream tempReadStream = new TempReadStream(tempBuffer);          tempReadStream.setFreeWhenDone(true);          _preparedStatement.setBinaryStream(index, new ReadStream(tempReadStream), tempBuffer.getLength());        }        else          _preparedStatement.setBinaryStream(index, inputStream, (int) length);      }    }    catch (SQLException ex) {      _error.error(ex);      return false;    }    return true;  }  /**   * @param index 1-based position number   * @param value the value for the parameter   *   * @return true for success, false for failure   */  private boolean setParameter(int index, Value value, long length)  {    try {      if (value instanceof DoubleValue) {        _preparedStatement.setDouble(index, value.toDouble());      }      else if (value instanceof LongValue) {	long v = value.toLong();	_preparedStatement.setLong(index, v);      }      else if (value instanceof StringValue) {        String string = value.toString();        if (length >= 0)          string = string.substring(0, (int) length);        _preparedStatement.setString(index, string);      }      else if (value instanceof NullValue) {        _preparedStatement.setObject(index, null);      }      else {        _error.warning(L.l("unknown type {0} ({1}) for parameter index {2}", value.getType(), value.getClass(), index));        return false;      }    }    catch (SQLException ex) {      _error.error(ex);      return false;    }    return true;  }  public String toString()  {    return "PDOStatement[" + _query + "]";  }  /**   * Bind a value from a resultSet to a variable.   */  private class BindColumn {    private final String _columnAsName;    private final Value _var;    private final int _type;    private int _column;    private int _jdbcType;    private boolean _isInit;    private boolean _isValid;    /**     * @param column 1-based column index     * @param var reference that receives the value     * @param type a PARM_* type, -1 for default     */    private BindColumn(Value column, Value var, int type)      throws SQLException    {      assert column != null;      assert var != null;      if (column.isNumberConvertible()) {        _column = column.toInt();        _columnAsName = null;      }      else {        _columnAsName = column.toString();      }      _var = var;      _type = type;      if (_resultSet != null)        init();    }    private boolean init()      throws SQLException    {      if (_isInit)        return true;      ResultSetMetaData resultSetMetaData = getResultSetMetaData();      int columnCount = resultSetMetaData.getColumnCount();      if (_columnAsName != null) {        for (int i = 1; i <= columnCount; i++) {          String name = resultSetMetaData.getColumnName(i);          if (name.equals(_columnAsName)) {            _column = i;            break;          }        }      }      _isValid = _column > 0 && _column <= columnCount;      if (_isValid) {        _jdbcType = resultSetMetaData.getColumnType(_column);      }      _isInit = true;      return true;    }    public boolean bind()      throws SQLException    {      if (!init())        return false;      if (!_isValid) {        // this matches php behaviour        _var.set(_env.getEmptyString());      }      else {        Value value = getColumnValue(_column, _jdbcType, _type);        _var.set(value);      }      return true;    }  }  /**   * Bind a value to a parameter when the statement is executed.   */  private class BindParam {    private final int _index;    private final Value _value;    private final int _dataType;    private final int _length;    private final Value _driverOptions;    public BindParam(Value parameter, Value value, int dataType, int length, Value driverOptions)    {      int index = resolveParameter(parameter);      _index = index;      _value = value;      _dataType = dataType;      _length = length;      _driverOptions = driverOptions;    }    public boolean apply()      throws SQLException    {      switch (_dataType) {      case PDO.PARAM_BOOL:      case PDO.PARAM_INT:      case PDO.PARAM_STR:	return setParameter(_index, _value.toValue(), _length);      case PDO.PARAM_LOB:	return setLobParameter(_index, _value.toValue(), _length);      case PDO.PARAM_NULL:	return setParameter(_index, NullValue.NULL, _length);      case PDO.PARAM_STMT:	throw new UnimplementedException("PDO.PARAM_STMT");      default:	throw new AssertionError();      }    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?