class Mysql2::Result - mysql2-0.3.17 Documentation

# class Mysql2::Result

### Public Instance Methods

count() click to toggle source

    static VALUE rb_mysql_result_count(VALUE self) {
      mysql2_result_wrapper *wrapper;

      GetMysql2Result(self, wrapper);
      if(wrapper->resultFreed) {
        if (wrapper->streamingComplete){
          return LONG2NUM(wrapper->numberOfRows);
        } else {
          return LONG2NUM(RARRAY_LEN(wrapper->rows));
        }
      } else {
        return INT2FIX(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;
      mysql2_result_wrapper * wrapper;
      unsigned long i;
      const char * errstr;
      int symbolizeKeys = 0, asArray = 0, castBool = 0, cacheRows = 1, cast = 1, streaming = 0;
      MYSQL_FIELD * fields = NULL;

      GetMysql2Result(self, wrapper);

      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;
      }

      if (rb_hash_aref(opts, sym_symbolize_keys) == Qtrue) {
        symbolizeKeys = 1;
      }

      if (rb_hash_aref(opts, sym_as) == sym_array) {
        asArray = 1;
      }

      if (rb_hash_aref(opts, sym_cast_booleans) == Qtrue) {
        castBool = 1;
      }

      if (rb_hash_aref(opts, sym_cache_rows) == Qfalse) {
        cacheRows = 0;
      }

      if (rb_hash_aref(opts, sym_cast) == Qfalse) {
        cast = 0;
      }

      if(rb_hash_aref(opts, sym_stream) == Qtrue) {
        streaming = 1;
      }

      if(streaming && cacheRows) {
        rb_warn("cacheRows is ignored if streaming 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->lastRowProcessed == 0) {
        if (streaming) {
          /* We can't get number of rows if we're streaming, */
          /* until we've finished fetching all rows */
          wrapper->numberOfRows = 0;
          wrapper->rows = rb_ary_new();
        } else {
          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);
        }
      }

      if (streaming) {
        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 (block != Qnil && row != Qnil) {
              rb_yield(row);
              wrapper->lastRowProcessed++;
            }
          } while(row != Qnil);

          rb_mysql_result_free_result(wrapper);

          wrapper->numberOfRows = wrapper->lastRowProcessed;
          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 (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 */
              rb_mysql_result_free_result(wrapper);
              return Qnil;
            }

            if (block != Qnil) {
              rb_yield(row);
            }
          }
          if (wrapper->lastRowProcessed == wrapper->numberOfRows) {
            /* 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) {
      mysql2_result_wrapper * wrapper;
      unsigned int i = 0;
      short int symbolizeKeys = 0;
      VALUE defaults;

      GetMysql2Result(self, wrapper);

      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