pdostatement.java

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

JAVA
1,549
字号
    if (fetchMode == 0) {      effectiveFetchMode = _fetchMode;    }    else {      effectiveFetchMode = 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");    effectiveFetchMode = effectiveFetchMode & (~(PDO.FETCH_GROUP | PDO.FETCH_UNIQUE));    switch (effectiveFetchMode) {      case PDO.FETCH_COLUMN:        break;      case PDO.FETCH_LAZY:        _error.warning(L.l("PDO::FETCH_LAZY can't be used with PDOStatement::fetchAll()"));        return BooleanValue.FALSE;      default:        if (columnIndex != -1) {          _error.warning(L.l("unexpected arguments"));          return BooleanValue.FALSE;        }    }    ArrayValueImpl rows = new ArrayValueImpl();    while (true) {      Value value = fetchImpl(effectiveFetchMode, columnIndex);      if (_fetchErrorCode == FETCH_FAILURE) {        rows.clear();        return rows;      }      if (_fetchErrorCode == FETCH_EXHAUSTED)        break;      if (_fetchErrorCode == FETCH_CONTINUE)        continue;      rows.put(value);    }    return rows;  }  private Value fetchAssoc()  {    try {      if (!advanceResultSet()) {        _fetchErrorCode = FETCH_EXHAUSTED;                return BooleanValue.FALSE;      }      if (_fetchModeArgs.length != 0) {        _error.notice(L.l("unexpected arguments"));                _fetchErrorCode = FETCH_FAILURE;                return BooleanValue.FALSE;      }      ArrayValueImpl array = new ArrayValueImpl();      int columnCount = getResultSetMetaData().getColumnCount();      for (int i = 1; i <= columnCount; i++) {        String name = getResultSetMetaData().getColumnName(i);        Value value = getColumnValue(i);        array.put(_env.createString(name), value);      }      return array;    }    catch (SQLException ex) {      _error.error(ex);            _fetchErrorCode = FETCH_FAILURE;            return BooleanValue.FALSE;    }  }  private Value fetchBoth()  {    try {      if (! advanceResultSet()) {        _fetchErrorCode = FETCH_EXHAUSTED;                return BooleanValue.FALSE;      }      if (_fetchModeArgs.length != 0) {        _error.notice(L.l("unexpected arguments"));                _fetchErrorCode = FETCH_FAILURE;                return BooleanValue.FALSE;      }      ArrayValueImpl array = new ArrayValueImpl();      int columnCount = getResultSetMetaData().getColumnCount();      for (int i = 1; i <= columnCount; i++) {        String name = getResultSetMetaData().getColumnName(i);        Value value = getColumnValue(i);        array.put(_env.createString(name), value);        array.put(new LongValue(i - 1), value);      }      return array;    }    catch (SQLException ex) {      _error.error(ex);            _fetchErrorCode = FETCH_FAILURE;            return BooleanValue.FALSE;    }  }  private Value fetchBound()  {    if (!advanceResultSet()) {      _fetchErrorCode = FETCH_EXHAUSTED;            return BooleanValue.FALSE;    }    _fetchErrorCode = FETCH_SUCCESS;        return BooleanValue.TRUE;  }  private Value fetchClass()  {    String className;    Value[] ctorArgs;    if (_fetchModeArgs.length == 0 || _fetchModeArgs.length > 2)      return fetchBoth();    className = _fetchModeArgs[0].toString();    if (_fetchModeArgs.length == 2) {      if (_fetchModeArgs[1].isArray()) {        // XXX: inefiicient, but args[1].getValueArray(_env) doesn't handle references        ArrayValue argsArray = (ArrayValue) _fetchModeArgs[1];        ctorArgs = new Value[argsArray.getSize()];        int i = 0;        for (Value key : argsArray.keySet())          ctorArgs[i++] = argsArray.getRef(key);      }      else        return fetchBoth();    }    else      ctorArgs = NULL_VALUES;    return fetchObject(className, ctorArgs);  }  /**   * @param column 0-based column number   */  public Value fetchColumn(@Optional int column)  {    if (!advanceResultSet()) {      _fetchErrorCode = FETCH_EXHAUSTED;            return BooleanValue.FALSE;    }    if (column < 0 && _fetchModeArgs.length > 0)      column = _fetchModeArgs[0].toInt();    try {      if (column < 0 || column >= getResultSetMetaData().getColumnCount()) {        _fetchErrorCode = FETCH_CONTINUE;                return BooleanValue.FALSE;      }      return getColumnValue(column + 1);    }    catch (SQLException ex) {      _error.error(ex);            _fetchErrorCode = FETCH_FAILURE;            return BooleanValue.FALSE;    }  }  private Value fetchFunc()  {    throw new UnimplementedException();  }  /**   * Fetch the next row.   *   * @param fetchMode the mode, 0 to use the value set by {@link #setFetchMode}.   * @return a value, BooleanValue.FALSE if there are no more rows or an error occurs.   */  private Value fetchImpl(int fetchMode, int columnIndex)  {    if (fetchMode == 0) {      fetchMode = _fetchMode;      fetchMode = fetchMode & (~(PDO.FETCH_GROUP | PDO.FETCH_UNIQUE));    }    else {      if ((fetchMode & PDO.FETCH_GROUP) != 0) {        _error.warning(L.l("FETCH_GROUP is not allowed"));        return BooleanValue.FALSE;      }      else if ((fetchMode & PDO.FETCH_UNIQUE) != 0) {        _error.warning(L.l("FETCH_UNIQUE is not allowed"));        return BooleanValue.FALSE;      }    }    boolean isClasstype = (fetchMode & PDO.FETCH_CLASSTYPE) != 0;    boolean isSerialize = (fetchMode & PDO.FETCH_SERIALIZE) != 0;    fetchMode = fetchMode & (~(PDO.FETCH_CLASSTYPE | PDO.FETCH_SERIALIZE));    _fetchErrorCode = FETCH_SUCCESS;        switch (fetchMode) {      case PDO.FETCH_ASSOC:        return fetchAssoc();      case PDO.FETCH_BOTH:        return fetchBoth();      case PDO.FETCH_BOUND:        return fetchBound();      case PDO.FETCH_COLUMN:        return fetchColumn(columnIndex);      case PDO.FETCH_CLASS:        return fetchClass();      case PDO.FETCH_FUNC:        return fetchFunc();      case PDO.FETCH_INTO:        return fetchInto();      case PDO.FETCH_LAZY:        return fetchLazy();      case PDO.FETCH_NAMED:        return fetchNamed();      case PDO.FETCH_NUM:        return fetchNum();      case PDO.FETCH_OBJ:        return fetchObject();    default:      _error.warning(L.l("invalid fetch mode {0}",  fetchMode));      closeCursor();      return BooleanValue.FALSE;    }  }  private Value fetchInto()  {    assert _fetchModeArgs.length > 0;    assert _fetchModeArgs[0].isObject();    Value var = _fetchModeArgs[0];    if (!advanceResultSet()) {      _fetchErrorCode = FETCH_EXHAUSTED;            return BooleanValue.FALSE;    }    try {      int columnCount = getResultSetMetaData().getColumnCount();      for (int i = 1; i <= columnCount; i++) {        String name = getResultSetMetaData().getColumnName(i);        Value value = getColumnValue(i);        var.putField(_env, name, value);      }    }    catch (SQLException ex) {      _error.error(ex);            _fetchErrorCode = FETCH_FAILURE;            return BooleanValue.FALSE;    }    return var;  }  private Value fetchLazy()  {    // XXX: need to check why lazy is no different than object    return fetchObject(null, NULL_VALUES);  }  private Value fetchNamed()  {    try {      if (!advanceResultSet()) {        _fetchErrorCode = FETCH_EXHAUSTED;                return BooleanValue.FALSE;      }      ArrayValue array = new ArrayValueImpl();      int columnCount = getResultSetMetaData().getColumnCount();      for (int i = 1; i <= columnCount; i++) {        Value name = _env.createString(getResultSetMetaData().getColumnName(i));        Value value = getColumnValue(i);        Value existingValue = array.get(name);        if (! (existingValue instanceof UnsetValue)) {          if (! existingValue.isArray()) {            ArrayValue arrayValue = new ArrayValueImpl();            arrayValue.put(existingValue);            array.put(name, arrayValue);            existingValue = arrayValue;          }          existingValue.put(value);        }        else          array.put(name, value);      }      return array;    }    catch (SQLException ex) {      _error.error(ex);      _fetchErrorCode = FETCH_FAILURE;            return BooleanValue.FALSE;    }  }  private Value fetchNum()  {    try {      if (!advanceResultSet()) {        _fetchErrorCode = FETCH_EXHAUSTED;                return BooleanValue.FALSE;      }      if (_fetchModeArgs.length != 0) {        _error.notice(L.l("unexpected arguments"));                _fetchErrorCode = FETCH_FAILURE;                return BooleanValue.FALSE;      }      ArrayValueImpl array = new ArrayValueImpl();      int columnCount = getResultSetMetaData().getColumnCount();      for (int i = 1; i <= columnCount; i++) {        Value value = getColumnValue(i);        array.put(value);      }      return array;    }    catch (SQLException ex) {      _error.error(ex);      _fetchErrorCode = FETCH_FAILURE;            return BooleanValue.FALSE;    }  }  private Value fetchObject()  {    return fetchObject(null, NULL_VALUES);  }  public Value fetchObject(@Optional String className, @Optional Value[] args)  {    QuercusClass cl;    if (className != null) {      cl = _env.findAbstractClass(className);      if (cl == null)        return fetchBoth();    }    else {      cl = null;      if (args.length != 0) {        advanceResultSet();        _error.warning(L.l("unexpected arguments"));        return BooleanValue.FALSE;      }    }    if (!advanceResultSet()) {      _fetchErrorCode = FETCH_EXHAUSTED;            return BooleanValue.FALSE;    }    try {      Value object;      if (cl != null)        object = cl.callNew(_env, args);      else        object = _env.createObject();      int columnCount = getResultSetMetaData().getColumnCount();      for (int i = 1; i <= columnCount; i++) {        String name = getResultSetMetaData().getColumnName(i);        Value value = getColumnValue(i);        object.putField(_env, name, value);      }      return object;    }    catch (Throwable ex) {      _error.error(ex);      _fetchErrorCode = FETCH_FAILURE;            return BooleanValue.FALSE;    }  }  public Value getAttribute(int attribute)  {    _error.unsupportedAttribute(attribute);    return BooleanValue.FALSE;  }  /**   * @param column 0-based column index   */  public Value getColumnMeta(int column)  {    throw new UnimplementedException();  }  /**   * @param column 1-based column index   */  private Value getColumnValue(int column)    throws SQLException  {    return getColumnValue(column, -1, -1);  }  /**   * @param column 1-based column index   * @param jdbcType a jdbc type, or -1 if it is unknown   * @param returnType a PDO.PARAM_* type, or -1   */  private Value getColumnValue(int column, int jdbcType, int returnType)    throws SQLException  {    if (returnType != -1)      throw new UnimplementedException("parm type " + returnType);    if (jdbcType == -1)      jdbcType = getResultSetMetaData().getColumnType(column);    // XXX: needs tests    switch (jdbcType) {      case Types.NULL:        return NullValue.NULL;      case Types.BIT:      case Types.TINYINT:      case Types.SMALLINT:      case Types.INTEGER:      case Types.BIGINT:

⌨️ 快捷键说明

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