# class Mysql2::Result

### Public Instance Methods

count() click to toggle source

    static VALUE rb_mysql_result_count(VALUE self) {
      GET_RESULT(self);

      if (wrapper->is_streaming) {
        /* This is an unsigned long per result.h */
        return ULONG2NUM(wrapper->numberOfRows);
      }

      if (wrapper->resultFreed) {
        /* Ruby arrays have platform signed long length */
        return LONG2NUM(RARRAY_LEN(wrapper->rows));
      } else {
        /* MySQL returns an unsigned 64-bit long here */
        return ULL2NUM(mysql_num_rows(wrapper->result));
      }
    }

Also aliased as: size
each(p1 = v1, &block) click to toggle source

    static VALUE rb_mysql_result_each(int argc, VALUE * argv, VALUE self) {
      VALUE defaults, opts, block;
      ID db_timezone, app_timezone, dbTz, appTz;
      unsigned long i;
      const char * errstr;
      int symbolizeKeys, asArray, castBool, cacheRows, cast;
      MYSQL_FIELD * fields = NULL;

      GET_RESULT(self);

      defaults = rb_iv_get(self, "@query_options");
      Check_Type(defaults, T_HASH);
      if (rb_scan_args(argc, argv, "01&", &opts, &block) == 1) {
        opts = rb_funcall(defaults, intern_merge, 1, opts);
      } else {
        opts = defaults;
      }

      symbolizeKeys = RTEST(rb_hash_aref(opts, sym_symbolize_keys));
      asArray       = rb_hash_aref(opts, sym_as) == sym_array;
      castBool      = RTEST(rb_hash_aref(opts, sym_cast_booleans));
      cacheRows     = RTEST(rb_hash_aref(opts, sym_cache_rows));
      cast          = RTEST(rb_hash_aref(opts, sym_cast));

      if (wrapper->is_streaming && cacheRows) {
        rb_warn(":cache_rows is ignored if :stream is true");
      }

      dbTz = rb_hash_aref(opts, sym_database_timezone);
      if (dbTz == sym_local) {
        db_timezone = intern_local;
      } else if (dbTz == sym_utc) {
        db_timezone = intern_utc;
      } else {
        if (!NIL_P(dbTz)) {
          rb_warn(":database_timezone option must be :utc or :local - defaulting to :local");
        }
        db_timezone = intern_local;
      }

      appTz = rb_hash_aref(opts, sym_application_timezone);
      if (appTz == sym_local) {
        app_timezone = intern_local;
      } else if (appTz == sym_utc) {
        app_timezone = intern_utc;
      } else {
        app_timezone = Qnil;
      }

      if (wrapper->is_streaming) {
        /* When streaming, we will only yield rows, not return them. */
        if (wrapper->rows == Qnil) {
          wrapper->rows = rb_ary_new();
        }

        if (!wrapper->streamingComplete) {
          VALUE row;

          fields = mysql_fetch_fields(wrapper->result);

          do {
            row = rb_mysql_result_fetch_row(self, db_timezone, app_timezone, symbolizeKeys, asArray, castBool, cast, fields);
            if (row != Qnil) {
              wrapper->numberOfRows++;
              if (block != Qnil) {
                rb_yield(row);
              }
            }
          } while(row != Qnil);

          rb_mysql_result_free_result(wrapper);
          wrapper->streamingComplete = 1;

          // Check for errors, the connection might have gone out from under us
          // mysql_error returns an empty string if there is no error
          errstr = mysql_error(wrapper->client_wrapper->client);
          if (errstr[0]) {
            rb_raise(cMysql2Error, "%s", errstr);
          }
        } else {
          rb_raise(cMysql2Error, "You have already fetched all the rows for this query and streaming is true. (to reiterate you must requery).");
        }
      } else {
        if (wrapper->lastRowProcessed == 0) {
          wrapper->numberOfRows = mysql_num_rows(wrapper->result);
          if (wrapper->numberOfRows == 0) {
            wrapper->rows = rb_ary_new();
            return wrapper->rows;
          }
          wrapper->rows = rb_ary_new2(wrapper->numberOfRows);
        } else if (!cacheRows && wrapper->lastRowProcessed == wrapper->numberOfRows) {
          mysql_data_seek(wrapper->result, 0);
          wrapper->lastRowProcessed = 0;
          wrapper->rows = rb_ary_new2(wrapper->numberOfRows);
        }

        if (cacheRows && wrapper->lastRowProcessed == wrapper->numberOfRows) {
          /* we've already read the entire dataset from the C result into our */
          /* internal array. Lets hand that over to the user since it's ready to go */
          for (i = 0; i < wrapper->numberOfRows; i++) {
            rb_yield(rb_ary_entry(wrapper->rows, i));
          }
        } else {
          unsigned long rowsProcessed = 0;
          rowsProcessed = RARRAY_LEN(wrapper->rows);
          fields = mysql_fetch_fields(wrapper->result);

          for (i = 0; i < wrapper->numberOfRows; i++) {
            VALUE row;
            if (cacheRows && i < rowsProcessed) {
              row = rb_ary_entry(wrapper->rows, i);
            } else {
              row = rb_mysql_result_fetch_row(self, db_timezone, app_timezone, symbolizeKeys, asArray, castBool, cast, fields);
              if (cacheRows) {
                rb_ary_store(wrapper->rows, i, row);
              }
              wrapper->lastRowProcessed++;
            }

            if (row == Qnil) {
              /* we don't need the mysql C dataset around anymore, peace it */
              if (cacheRows) {
                rb_mysql_result_free_result(wrapper);
              }
              return Qnil;
            }

            if (block != Qnil) {
              rb_yield(row);
            }
          }
          if (wrapper->lastRowProcessed == wrapper->numberOfRows && cacheRows) {
            /* we don't need the mysql C dataset around anymore, peace it */
            rb_mysql_result_free_result(wrapper);
          }
        }
      }

      return wrapper->rows;
    }

fields() click to toggle source

    static VALUE rb_mysql_result_fetch_fields(VALUE self) {
      unsigned int i = 0;
      short int symbolizeKeys = 0;
      VALUE defaults;

      GET_RESULT(self);

      defaults = rb_iv_get(self, "@query_options");
      Check_Type(defaults, T_HASH);
      if (rb_hash_aref(defaults, sym_symbolize_keys) == Qtrue) {
        symbolizeKeys = 1;
      }

      if (wrapper->fields == Qnil) {
        wrapper->numberOfFields = mysql_num_fields(wrapper->result);
        wrapper->fields = rb_ary_new2(wrapper->numberOfFields);
      }

      if (RARRAY_LEN(wrapper->fields) != wrapper->numberOfFields) {
        for (i=0; i<wrapper->numberOfFields; i++) {
          rb_mysql_result_fetch_field(self, i, symbolizeKeys);
        }
      }

      return wrapper->fields;
    }

size()
Alias for: count