I am getting this error when connecting to mysql with PHP:
Lost connection to MySQL server during query

This happens only when I use this procedure, but it doesn't necessarily
fail when this procedure is called.  The error will happen frequently,
however it is not consistent.  This is my first procedure I've written, so
I'm sure I've done something wrong here.  I assume the error message means
I'm hitting some kind of timeout?

Any ideas would be welcome.  Thanks.

create procedure getElement (IN n VARCHAR(255),IN ptime DOUBLE)
        BEGIN
                DECLARE mfid INT UNSIGNED;
                DECLARE pid INT UNSIGNED;
                DECLARE foffset INT UNSIGNED;
                DECLARE flength INT UNSIGNED;
                DECLARE vid INT UNSIGNED;
                DECLARE rfid INT UNSIGNED;
                DECLARE tpid INT UNSIGNED;
                DECLARE fdata BLOB;
                DECLARE fdata_tmp BLOB;
                DECLARE fdata_bigint BIGINT UNSIGNED;
                DECLARE fdata_signed INT;
                DECLARE fdata_unsigned INT UNSIGNED;
                DECLARE fdata_float DOUBLE;
                DECLARE data_type VARCHAR(20);
                DECLARE byte_order VARCHAR(20);
                DECLARE conv_param VARCHAR(255);

                SELECT major_frame_desc_id, parent_id, frame_offset,
frame_length,
version_id, top_level_parent_id
                FROM MajorFrameDescription
                WHERE name=n
                INTO mfid,pid,foffset,flength,vid,tpid;

                SELECT attribute_value FROM MajorFrameAttributes
                WHERE major_frame_desc_id=mfid AND
attribute_name="NormalizedType"
                INTO data_type;

                SELECT attribute_value FROM MajorFrameAttributes
                WHERE major_frame_desc_id=mfid AND
attribute_name="ConvParams"
                INTO conv_param;

                SELECT attribute_value FROM MajorFrameAttributes
                WHERE major_frame_desc_id=mfid AND attribute_name="ByteOrder"
                INTO byte_order;

                SELECT MAX(raw_major_frame_id)
                FROM RawMajorFrames
                WHERE major_frame_desc_id=tpid
                INTO rfid;

                IF rfid >0 THEN

                        SELECT payload_time,
                        SUBSTR(BINARY(frame_data),
                        FLOOR(foffset/8)+1,
                        CEIL((flength + (foffset %8 ))/8))
                        FROM RawMajorFrames
                        WHERE raw_major_frame_id=rfid
                        INTO ptime,fdata;

                        call toBigInt(fdata,fdata_bigint);
                        IF (foffset %8) >0 THEN
                           SET @mask_off=foffset%8;
                                call mask_data(fdata,@mask_off,fdata_bigint);
                        END IF;
                        IF (8-((flength+(foffset%8)) %8)) > 0 THEN
                                        SELECT (fdata_bigint >>
(8-((flength+(foffset%8)) %8)))
INTO
fdata_bigint;
                        END IF;
                        CASE data_type
                                WHEN "Float"
                                        THEN
                                                call
toFloat(fdata_bigint,fdata_float);
                                                IF(!ISNULL(conv_param)) THEN
                                                        call
polyConv(fdata_float,conv_param,fdata_float);
                                                END IF;
                                                SET
@fdata_converted=fdata_float;

                                WHEN "Double"
                                        THEN
                                                call
toFloat(fdata_bigint,fdata_float);
                                                IF(!ISNULL(conv_param)) THEN
                                                        call
polyConv(fdata_float,conv_param,fdata_float);
                                                END IF;
                                                SET
@fdata_converted=fdata_float;

                                WHEN "Signed"
                                        THEN
                                                call
toSigned(fdata_bigint,fdata_signed);
                                                SET
@fdata_converted=fdata_signed;
                                WHEN "Unsigned"
                                        THEN
                                                SET
@fdata_converted=fdata_bigint;
                                ELSE
                                        SET @fdata_converted=HEX(fdata);
                        END CASE;
                        call enumConv(fdata_bigint,mfid,@fdata_enum);
                        IF(!ISNULL(@fdata_enum)) THEN
                                SET @[EMAIL PROTECTED];
                        END IF;

                        SELECT
                                mfid AS major_frame_desc_id,
                                n    AS name,
                                pid AS parent_id,
                                tpid AS top_level_parent_id,
                                rfid AS raw_major_frame_id,
                                foffset AS frame_offset,
                                flength AS frame_length,
                                vid AS version_id,
                                ptime AS payload_time,
                                HEX(fdata) AS raw_data,
                                @fdata_converted AS converted_data;

                        ELSE
                                SELECT rfid;
                END IF;
        END


Some procedures it uses are:
CREATE PROCEDURE toBigInt (IN fdata BLOB,OUT fdata_int BIGINT UNSIGNED)
        BEGIN
                SET @string_data=CONCAT('0x',HEX(fdata));
                DROP TEMPORARY TABLE IF EXISTS make_conversion;
                CREATE TEMPORARY TABLE make_conversion(toint BIGINT
UNSIGNED);
                SET @q=CONCAT('INSERT INTO make_conversion set
toint=(',@string_data,'+0)');
                PREPARE st1 from @q;
                EXECUTE st1;
                DEALLOCATE PREPARE st1;
                SELECT toint from make_conversion into fdata_int;
        END
$$

CREATE PROCEDURE toUnsigned (IN fdata BIGINT UNSIGNED,OUT fdata_int INT
UNSIGNED)
        BEGIN
                SET @string_data=CONCAT('0x',HEX(fdata));
                DROP TEMPORARY TABLE IF EXISTS make_conversion;
                CREATE TEMPORARY TABLE make_conversion(toint INT UNSIGNED);
                SET @q=CONCAT('INSERT INTO make_conversion set
toint=(',@string_data,'+0)');
                PREPARE st1 from @q;
                EXECUTE st1;
                DEALLOCATE PREPARE st1;
                SELECT toint from make_conversion into fdata_int;
        END
$$

CREATE PROCEDURE toSigned (IN fdata BIGINT UNSIGNED,OUT fdata_int INT)
        BEGIN
                SET @string_data=CONCAT('0x',HEX(fdata));
                DROP TEMPORARY TABLE IF EXISTS make_conversion;
                CREATE TEMPORARY TABLE make_conversion(toint INT);
                SET @q=CONCAT('INSERT INTO make_conversion set
toint=(',@string_data,'+0)');
                PREPARE st1 from @q;
                EXECUTE st1;
                DEALLOCATE PREPARE st1;
                SELECT toint from make_conversion into fdata_int;
        END
$$


CREATE PROCEDURE toFloat (IN fdata BIGINT UNSIGNED,OUT fdata_float DOUBLE)
        BEGIN
                SET @string_data=CONCAT('0x',HEX(fdata));
                DROP TEMPORARY TABLE IF EXISTS make_conversion;
                CREATE TEMPORARY TABLE make_conversion(tofloat DOUBLE);
                SET @q=CONCAT('INSERT INTO make_conversion set
tofloat=(',@string_data,'+0)');
                PREPARE st1 from @q;
                EXECUTE st1;
                DEALLOCATE PREPARE st1;
                SELECT tofloat from make_conversion into fdata_float;
        END
$$

CREATE PROCEDURE shift_right(IN fdata_bigint BIGINT UNSIGNED,IN shift INT
UNSIGNED,OUT fdata_bigint2 BIGINT UNSIGNED)
        BEGIN
                SELECT fdata_bigint >> shift INTO fdata_bigint2;
        END
$$

CREATE PROCEDURE mask_data(IN fdata BLOB,IN mask_off INT UNSIGNED,OUT
fdata_bigint2 BIGINT UNSIGNED)
        BEGIN
                DECLARE top_byte TINYBLOB;
                DECLARE top_int BIGINT UNSIGNED;
                SELECT SUBSTR(BINARY(fdata),1,1) INTO top_byte;
                call toBigInt(top_byte,top_int);
                SELECT ((top_int << mask_off) & 0xFF) >> mask_off INTO
top_int;
                SET
@string_data=CONCAT('0x',HEX(top_int),HEX(SUBSTR(BINARY(fdata),2)));
                DROP TEMPORARY TABLE IF EXISTS make_conversion;
                CREATE TEMPORARY TABLE make_conversion(toint INT);
                SET @q=CONCAT('INSERT INTO make_conversion set
toint=(',@string_data,'+0)');
                PREPARE st1 from @q;
                EXECUTE st1;
                DEALLOCATE PREPARE st1;
                SELECT toint FROM make_conversion INTO fdata_bigint2;
        END
$$
CREATE PROCEDURE polyConv(IN fdata DOUBLE,IN conv_param VARCHAR(255),OUT
fdata_converted DOUBLE)
        BEGIN
                DECLARE beginning VARCHAR(255);
                DECLARE end_of    VARCHAR(255);
                DECLARE query     VARCHAR(255);
                SELECT SUBSTR(conv_param,1,POSITION('x' in conv_param)-1)
INTO beginning;
                SELECT SUBSTR(conv_param,POSITION('x' in conv_param)+1)
INTO end_of;
                SET @string_query=CONCAT("SELECT
",beginning,fdata,end_of,"INTO
                @fdata_converted");
                PREPARE st1 FROM @string_query;
                EXECUTE st1;
                DEALLOCATE PREPARE st1;
                SELECT @fdata_converted INTO fdata_converted;
        END
$$

CREATE PROCEDURE enumConv(IN fdata INT UNSIGNED,mfid INT UNSIGNED,OUT
fdata_converted
VARCHAR(100))
        BEGIN
                SELECT name FROM EnumLiterals
                WHERE major_frame_desc_id=mfid AND value=fdata
                INTO fdata_converted;
        END


Accomplishing the impossible means only that the boss will add it to your
regular duties.

David Godsey


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to