Ejemplo n.º 1
0
int CMySQLDynamicRecordSet::MovePrevious()
{
	if(m_hStmt)
	{		
		if(m_CacheAllData)
		{
			MYSQL_ROW_OFFSET Offset=mysql_stmt_row_tell(m_hStmt);
			Offset--;
			mysql_stmt_row_seek(m_hStmt,Offset);
			int Ret=FetchRow();
			if(Ret==DBERR_NO_RECORDS)
			{
				m_IsBOF=true;
				return DBERR_IS_RECORDSET_HEAD;
			}
			else
			{
				return Ret;
			}
		}
		else
		{
			return DBERR_NOT_IMPLEMENT;
		}
	}
	else
	{
		return DBERR_NO_RECORDS;
	}
}
Ejemplo n.º 2
0
VALUE db_mysql_result_from_statement(VALUE self, VALUE statement) {
    int n, row, cols;
    MYSQL_STMT *s;
    MYSQL_FIELD *fields;
    MYSQL_RES *result;
    Result *r = db_mysql_result_handle(self);

    if (!rb_obj_is_kind_of(statement, cDMS))
        rb_raise(eSwiftArgumentError, "invalid Mysql::Statement");

    r->statement = statement;
    s = db_mysql_statement_handle_safe(statement)->statement;

    mysql_stmt_store_result(s);
    result = mysql_stmt_result_metadata(s);
    db_mysql_result_load(self, result, mysql_stmt_insert_id(s), mysql_stmt_affected_rows(s));

    if (result) {
        cols       = mysql_num_fields(result);
        fields     = mysql_fetch_fields(result);
        r->bind    = (MYSQL_BIND *)malloc(sizeof(MYSQL_BIND) * cols);
        r->lengths = (unsigned long *)malloc(sizeof(unsigned long) * cols);
        r->is_null = (my_bool *)malloc(sizeof(my_bool) * cols);
        memset(r->bind, 0, sizeof(MYSQL_BIND) * cols);

        for (n = 0; n < cols; n++) {
            r->bind[n].length      = &r->lengths[n];
            r->bind[n].is_null     = &r->is_null[n];
            r->bind[n].buffer_type = fields[n].type;

            switch(fields[n].type) {
                case MYSQL_TYPE_NULL:
                    r->bind[n].buffer        = malloc(1);
                    r->bind[n].buffer_length = 1;
                    break;
                case MYSQL_TYPE_TINY:
                case MYSQL_TYPE_SHORT:
                case MYSQL_TYPE_YEAR:
                case MYSQL_TYPE_INT24:
                case MYSQL_TYPE_LONG:
                case MYSQL_TYPE_LONGLONG:
                case MYSQL_TYPE_FLOAT:
                case MYSQL_TYPE_DOUBLE:
                    r->bind[n].buffer        = malloc(8);
                    r->bind[n].buffer_length = 8;
                    memset(r->bind[n].buffer, 0, 8);
                    break;
                case MYSQL_TYPE_DECIMAL:
                case MYSQL_TYPE_STRING:
                case MYSQL_TYPE_VAR_STRING:
                case MYSQL_TYPE_TINY_BLOB:
                case MYSQL_TYPE_BLOB:
                case MYSQL_TYPE_MEDIUM_BLOB:
                case MYSQL_TYPE_LONG_BLOB:
                case MYSQL_TYPE_NEWDECIMAL:
                case MYSQL_TYPE_BIT:
                    r->bind[n].buffer        = malloc(fields[n].length);
                    r->bind[n].buffer_length = fields[n].length;
                    memset(r->bind[n].buffer, 0, fields[n].length);
                    if (!(fields[n].flags & BINARY_FLAG))
                         r->bind[n].buffer_type = MYSQL_TYPE_STRING;
                    break;
                case MYSQL_TYPE_TIME:
                case MYSQL_TYPE_DATE:
                case MYSQL_TYPE_DATETIME:
                case MYSQL_TYPE_TIMESTAMP:
                    r->bind[n].buffer        = malloc(sizeof(MYSQL_TIME));
                    r->bind[n].buffer_length = sizeof(MYSQL_TIME);
                    memset(r->bind[n].buffer, 0, sizeof(MYSQL_TIME));
                    break;
                default:
                    rb_raise(rb_eTypeError, "unknown buffer_type: %d", fields[n].type);
            }
        }

        if (mysql_stmt_bind_result(s, r->bind) != 0)
            rb_raise(eSwiftRuntimeError, "%s", mysql_stmt_error(s));
    }

    r->start    = mysql_stmt_row_tell(s);
    r->selected = mysql_stmt_num_rows(s);
    r->affected = mysql_stmt_affected_rows(s);
    return self;
}