libdrizzle Developer Documentation

libdrizzle/state.c
Go to the documentation of this file.
00001 /*
00002  * Drizzle Client & Protocol Library
00003  *
00004  * Copyright (C) 2008 Eric Day (eday@oddments.org)
00005  * All rights reserved.
00006  *
00007  * Use and distribution licensed under the BSD license.  See
00008  * the COPYING file in this directory for full text.
00009  */
00010 
00016 #include "common.h"
00017 
00018 drizzle_return_t drizzle_state_loop(drizzle_con_st *con)
00019 {
00020   drizzle_return_t ret;
00021 
00022   while (!drizzle_state_none(con))
00023   {
00024     ret= con->state_stack[con->state_current - 1](con);
00025     if (ret != DRIZZLE_RETURN_OK)
00026     {
00027       if (ret != DRIZZLE_RETURN_IO_WAIT && ret != DRIZZLE_RETURN_PAUSE &&
00028           ret != DRIZZLE_RETURN_ERROR_CODE)
00029       {
00030         drizzle_con_close(con);
00031       }
00032 
00033       return ret;
00034     }
00035   }
00036 
00037   return DRIZZLE_RETURN_OK;
00038 }
00039 
00040 drizzle_return_t drizzle_state_packet_read(drizzle_con_st *con)
00041 {
00042   drizzle_log_debug(con->drizzle, "drizzle_state_packet_read");
00043 
00044   if (con->buffer_size < 4)
00045   {
00046     drizzle_state_push(con, drizzle_state_read);
00047     return DRIZZLE_RETURN_OK;
00048   }
00049 
00050   con->packet_size= drizzle_get_byte3(con->buffer_ptr);
00051 
00052   if (con->packet_number != con->buffer_ptr[3])
00053   {
00054     drizzle_set_error(con->drizzle, "drizzle_state_packet_read",
00055                       "bad packet number:%u:%u", con->packet_number,
00056                       con->buffer_ptr[3]);
00057     return DRIZZLE_RETURN_BAD_PACKET_NUMBER;
00058   }
00059 
00060   drizzle_log_debug(con->drizzle, "packet_size= %zu, packet_number= %u",
00061                     con->packet_size, con->packet_number);
00062 
00063   con->packet_number++;
00064 
00065   con->buffer_ptr+= 4;
00066   con->buffer_size-= 4;
00067 
00068   drizzle_state_pop(con);
00069   return DRIZZLE_RETURN_OK;
00070 }