@@ -138,7 +138,7 @@ static int httpsqs_read_putpos(const char* httpsqs_input_name)
138138{
139139 int queue_value = 0 ;
140140 char * queue_value_tmp ;
141- char * queue_name = ( char * ) malloc ( 300 ) ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
141+ char queue_name [ 300 ] ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
142142 memset (queue_name , '\0' , 300 );
143143
144144 sprintf (queue_name , "%s:%s" , httpsqs_input_name , "putpos" );
@@ -148,7 +148,6 @@ static int httpsqs_read_putpos(const char* httpsqs_input_name)
148148 queue_value = atoi (queue_value_tmp );
149149 free (queue_value_tmp );
150150 }
151- free (queue_name );
152151
153152 return queue_value ;
154153}
@@ -158,7 +157,7 @@ static int httpsqs_read_getpos(const char* httpsqs_input_name)
158157{
159158 int queue_value = 0 ;
160159 char * queue_value_tmp ;
161- char * queue_name = ( char * ) malloc ( 300 ) ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
160+ char queue_name [ 300 ] ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
162161 memset (queue_name , '\0' , 300 );
163162
164163 sprintf (queue_name , "%s:%s" , httpsqs_input_name , "getpos" );
@@ -168,7 +167,6 @@ static int httpsqs_read_getpos(const char* httpsqs_input_name)
168167 queue_value = atoi (queue_value_tmp );
169168 free (queue_value_tmp );
170169 }
171- free (queue_name );
172170
173171 return queue_value ;
174172}
@@ -178,7 +176,7 @@ static int httpsqs_read_maxqueue(const char* httpsqs_input_name)
178176{
179177 int queue_value = 0 ;
180178 char * queue_value_tmp ;
181- char * queue_name = ( char * ) malloc ( 300 ) ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
179+ char queue_name [ 300 ] ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
182180 memset (queue_name , '\0' , 300 );
183181
184182 sprintf (queue_name , "%s:%s" , httpsqs_input_name , "maxqueue" );
@@ -190,7 +188,6 @@ static int httpsqs_read_maxqueue(const char* httpsqs_input_name)
190188 } else {
191189 queue_value = 1000000 ; /* 默认队列长度为100万条 */
192190 }
193- free (queue_name );
194191
195192 return queue_value ;
196193}
@@ -213,14 +210,14 @@ static int httpsqs_maxqueue(const char* httpsqs_input_name, int httpsqs_input_nu
213210
214211 /* 设置的最大的队列数量必须大于等于”当前队列写入位置点“和”当前队列读取位置点“,并且”当前队列写入位置点“必须大于等于”当前队列读取位置点“ */
215212 if (queue_maxnum_int >= queue_put_value && queue_maxnum_int >= queue_get_value && queue_put_value >= queue_get_value ) {
216- char * queue_name = ( char * ) malloc ( 300 ) ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
213+ char queue_name [ 300 ] ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
217214 char * queue_maxnum = (char * )malloc (16 );
218215 memset (queue_name , '\0' , 300 );
219216 memset (queue_maxnum , '\0' , 16 );
220217 sprintf (queue_name , "%s:%s" , httpsqs_input_name , "maxqueue" );
221218 sprintf (queue_maxnum , "%d" , queue_maxnum_int );
222219 tcbdbput2 (httpsqs_db_tcbdb , queue_name , queue_maxnum );
223- free ( queue_name );
220+
224221 free (queue_maxnum );
225222 return queue_maxnum_int ;
226223 }
@@ -231,7 +228,7 @@ static int httpsqs_maxqueue(const char* httpsqs_input_name, int httpsqs_input_nu
231228/* 重置队列,0表示重置成功 */
232229static int httpsqs_reset (const char * httpsqs_input_name )
233230{
234- char * queue_name = ( char * ) malloc ( 300 ) ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
231+ char queue_name [ 300 ] ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
235232
236233 memset (queue_name , '\0' , 300 );
237234 sprintf (queue_name , "%s:%s" , httpsqs_input_name , "putpos" );
@@ -245,22 +242,19 @@ static int httpsqs_reset(const char* httpsqs_input_name)
245242 sprintf (queue_name , "%s:%s" , httpsqs_input_name , "maxqueue" );
246243 tcbdbout2 (httpsqs_db_tcbdb , queue_name );
247244
248- free (queue_name );
249-
250245 return 0 ;
251246}
252247
253248/* 查看单条队列内容 */
254249char * httpsqs_view (const char * httpsqs_input_name , int pos )
255250{
256251 char * queue_value ;
257- char * queue_name = ( char * ) malloc ( 300 ) ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
252+ char queue_name [ 300 ] ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
258253 memset (queue_name , '\0' , 300 );
259254
260255 sprintf (queue_name , "%s:%d" , httpsqs_input_name , pos );
261256
262257 queue_value = tcbdbget2 (httpsqs_db_tcbdb , queue_name );
263- free (queue_name );
264258
265259 return queue_value ;
266260}
@@ -269,38 +263,40 @@ char *httpsqs_view(const char* httpsqs_input_name, int pos)
269263static int httpsqs_now_putpos (const char * httpsqs_input_name )
270264{
271265 int maxqueue_num = 0 ;
272- int queue_value = 0 ;
273- char * queue_name = (char * )malloc (300 ); /* 队列名称的总长度,用户输入的队列长度少于256字节 */
266+ int queue_put_value = 0 ;
267+ int queue_get_value = 0 ;
268+ char queue_name [300 ]; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
274269 char * queue_input = (char * )malloc (32 );
275270
276271 /* 获取最大队列数量 */
277272 maxqueue_num = httpsqs_read_maxqueue (httpsqs_input_name );
278273
279274 /* 读取当前队列写入位置点 */
280- queue_value = httpsqs_read_putpos (httpsqs_input_name );
275+ queue_put_value = httpsqs_read_putpos (httpsqs_input_name );
276+
277+ /* 读取当前队列读取位置点 */
278+ queue_get_value = httpsqs_read_getpos (httpsqs_input_name );
281279
282280 memset (queue_name , '\0' , 300 );
283281 sprintf (queue_name , "%s:%s" , httpsqs_input_name , "putpos" );
284282
285283 /* 队列写入位置点加1 */
286- queue_value = queue_value + 1 ;
287- if (queue_value > maxqueue_num ) { /* 如果队列ID大于最大队列数量,则重置队列写入位置点的值为1 */
284+ queue_put_value = queue_put_value + 1 ;
285+ if (queue_put_value == queue_get_value ) { /* 如果队列写入ID+1之后追上队列读取ID,则说明队列已满,返回0,拒绝继续写入 */
286+ queue_put_value = 0 ;
287+ }
288+ else if (queue_put_value > maxqueue_num ) { /* 如果队列写入ID大于最大队列数量,则重置队列写入位置点的值为1 */
288289 if (tcbdbput2 (httpsqs_db_tcbdb , queue_name , "1" )) {
289- queue_value = 1 ;
290- memset (queue_name , '\0' , 300 );
291- sprintf (queue_name , "%s:%s" , httpsqs_input_name , "puttimes" );
292- tcbdbput2 (httpsqs_db_tcbdb , queue_name , "yes" ); /* 如果队列写入位置 */
290+ queue_put_value = 1 ;
293291 }
294292 } else { /* 队列写入位置点加1后的值,回写入数据库 */
295293 memset (queue_input , '\0' , 32 );
296- sprintf (queue_input , "%d" , queue_value );
294+ sprintf (queue_input , "%d" , queue_put_value );
297295 tcbdbput2 (httpsqs_db_tcbdb , queue_name , queue_input );
298296 free (queue_input );
299297 }
300298
301- free (queue_name );
302-
303- return queue_value ;
299+ return queue_put_value ;
304300}
305301
306302/* 获取本次“出队列”操作的队列读取点,返回值为0时队列全部读取完成 */
@@ -309,7 +305,7 @@ static int httpsqs_now_getpos(const char* httpsqs_input_name)
309305 int maxqueue_num = 0 ;
310306 int queue_put_value = 0 ;
311307 int queue_get_value = 0 ;
312- char * queue_name = ( char * ) malloc ( 300 ) ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
308+ char queue_name [ 300 ] ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
313309
314310 /* 获取最大队列数量 */
315311 maxqueue_num = httpsqs_read_maxqueue (httpsqs_input_name );
@@ -352,8 +348,6 @@ static int httpsqs_now_getpos(const char* httpsqs_input_name)
352348 queue_get_value = 0 ;
353349 }
354350
355- free (queue_name );
356-
357351 return queue_get_value ;
358352}
359353
@@ -407,42 +401,48 @@ void httpsqs_handler(struct evhttp_request *req, void *arg)
407401 buffer_data_len = EVBUFFER_LENGTH (req -> input_buffer );
408402 if (buffer_data_len > 0 ) {
409403 int queue_put_value = httpsqs_now_putpos ((char * )httpsqs_input_name );
410- char * queue_name = (char * )malloc (300 ); /* 队列名称的总长度,用户输入的队列长度少于256字节 */
411- memset (queue_name , '\0' , 300 );
412- sprintf (queue_name , "%s:%d" , httpsqs_input_name , queue_put_value );
413- char * httpsqs_input_postbuffer ;
414- char * buffer_data = (char * )malloc (buffer_data_len + 1 );
415- memset (buffer_data , '\0' , buffer_data_len + 1 );
416- memcpy (buffer_data , EVBUFFER_DATA (req -> input_buffer ), buffer_data_len );
417- httpsqs_input_postbuffer = urldecode (buffer_data );
418- tcbdbput2 (httpsqs_db_tcbdb , queue_name , httpsqs_input_postbuffer );
419- memset (queue_name , '\0' , 300 );
420- sprintf (queue_name , "%d" , queue_put_value );
421- evhttp_add_header (req -> output_headers , "Pos" , queue_name );
422- evbuffer_add_printf (buf , "%s" , "HTTPSQS_PUT_OK" );
423- free (queue_name );
424- free (httpsqs_input_postbuffer );
425- free (buffer_data );
404+ if (queue_put_value > 0 ) {
405+ char queue_name [300 ]; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
406+ memset (queue_name , '\0' , 300 );
407+ sprintf (queue_name , "%s:%d" , httpsqs_input_name , queue_put_value );
408+ char * httpsqs_input_postbuffer ;
409+ char * buffer_data = (char * )malloc (buffer_data_len + 1 );
410+ memset (buffer_data , '\0' , buffer_data_len + 1 );
411+ memcpy (buffer_data , EVBUFFER_DATA (req -> input_buffer ), buffer_data_len );
412+ httpsqs_input_postbuffer = urldecode (buffer_data );
413+ tcbdbput2 (httpsqs_db_tcbdb , queue_name , httpsqs_input_postbuffer );
414+ memset (queue_name , '\0' , 300 );
415+ sprintf (queue_name , "%d" , queue_put_value );
416+ evhttp_add_header (req -> output_headers , "Pos" , queue_name );
417+ evbuffer_add_printf (buf , "%s" , "HTTPSQS_PUT_OK" );
418+ free (httpsqs_input_postbuffer );
419+ free (buffer_data );
420+ } else {
421+ evbuffer_add_printf (buf , "%s" , "HTTPSQS_PUT_END" );
422+ }
426423 /* 如果POST正文无内容,则取URL中data参数的值 */
427424 } else if (httpsqs_input_data != NULL ) {
428425 int queue_put_value = httpsqs_now_putpos ((char * )httpsqs_input_name );
429- char * queue_name = (char * )malloc (300 ); /* 队列名称的总长度,用户输入的队列长度少于256字节 */
430- memset (queue_name , '\0' , 300 );
431- sprintf (queue_name , "%s:%d" , httpsqs_input_name , queue_put_value );
432- buffer_data_len = strlen (httpsqs_input_data );
433- char * httpsqs_input_postbuffer ;
434- char * buffer_data = (char * )malloc (buffer_data_len + 1 );
435- memset (buffer_data , '\0' , buffer_data_len + 1 );
436- memcpy (buffer_data , httpsqs_input_data , buffer_data_len );
437- httpsqs_input_postbuffer = urldecode (buffer_data );
438- tcbdbput2 (httpsqs_db_tcbdb , queue_name , buffer_data );
439- memset (queue_name , '\0' , 300 );
440- sprintf (queue_name , "%d" , queue_put_value );
441- evhttp_add_header (req -> output_headers , "Pos" , queue_name );
442- evbuffer_add_printf (buf , "%s" , "HTTPSQS_PUT_OK" );
443- free (queue_name );
444- free (httpsqs_input_postbuffer );
445- free (buffer_data );
426+ if (queue_put_value > 0 ) {
427+ char queue_name [300 ]; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
428+ memset (queue_name , '\0' , 300 );
429+ sprintf (queue_name , "%s:%d" , httpsqs_input_name , queue_put_value );
430+ buffer_data_len = strlen (httpsqs_input_data );
431+ char * httpsqs_input_postbuffer ;
432+ char * buffer_data = (char * )malloc (buffer_data_len + 1 );
433+ memset (buffer_data , '\0' , buffer_data_len + 1 );
434+ memcpy (buffer_data , httpsqs_input_data , buffer_data_len );
435+ httpsqs_input_postbuffer = urldecode (buffer_data );
436+ tcbdbput2 (httpsqs_db_tcbdb , queue_name , buffer_data );
437+ memset (queue_name , '\0' , 300 );
438+ sprintf (queue_name , "%d" , queue_put_value );
439+ evhttp_add_header (req -> output_headers , "Pos" , queue_name );
440+ evbuffer_add_printf (buf , "%s" , "HTTPSQS_PUT_OK" );
441+ free (httpsqs_input_postbuffer );
442+ free (buffer_data );
443+ } else {
444+ evbuffer_add_printf (buf , "%s" , "HTTPSQS_PUT_END" );
445+ }
446446 } else {
447447 evbuffer_add_printf (buf , "%s" , "HTTPSQS_PUT_ERROR" );
448448 }
@@ -454,7 +454,7 @@ void httpsqs_handler(struct evhttp_request *req, void *arg)
454454 if (queue_get_value == 0 ) {
455455 evbuffer_add_printf (buf , "%s" , "HTTPSQS_GET_END" );
456456 } else {
457- char * queue_name = ( char * ) malloc ( 300 ) ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
457+ char queue_name [ 300 ] ; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
458458 memset (queue_name , '\0' , 300 );
459459 sprintf (queue_name , "%s:%d" , httpsqs_input_name , queue_get_value );
460460 char * httpsqs_output_value ;
@@ -468,7 +468,6 @@ void httpsqs_handler(struct evhttp_request *req, void *arg)
468468 } else {
469469 evbuffer_add_printf (buf , "%s" , "HTTPSQS_GET_END" );
470470 }
471- free (queue_name );
472471 }
473472 }
474473 /* 查看队列状态 */
0 commit comments