int swTableColumn_add(swTable *table, char *name, int len, int type, int size) { swTableColumn *col = sw_malloc(sizeof(swTableColumn)); if (!col) { return SW_ERR; } col->name = swString_dup(name, len); if (!col->name) { sw_free(col); return SW_ERR; } switch(type) { case SW_TABLE_INT: switch(size) { case 1: col->size = 1; col->type = SW_TABLE_INT8; break; case 2: col->size = 2; col->type = SW_TABLE_INT16; break; #ifdef __x86_64__ case 8: col->size = 8; col->type = SW_TABLE_INT64; break; #endif default: col->size = 4; col->type = SW_TABLE_INT32; break; } break; case SW_TABLE_FLOAT: col->size = sizeof(double); col->type = SW_TABLE_FLOAT; break; case SW_TABLE_STRING: col->size = size + sizeof(swTable_string_length_t); col->type = SW_TABLE_STRING; break; default: swWarn("unkown column type."); swTableColumn_free(col); return SW_ERR; } col->index = table->item_size; table->item_size += col->size; table->column_num ++; return swHashMap_add(table->columns, name, len, col); }
int swTableColumn_add(swTable *table, char *name, int len, int type, int size) { swTableColumn *col = sw_malloc(sizeof(swTableColumn)); col->name = swString_dup(name, len); if (!col->name) { return SW_ERR; } switch(type) { case SW_TABLE_INT: switch(size) { case 1: col->size = 1; col->type = SW_TABLE_INT8; break; case 2: col->size = 2; col->type = SW_TABLE_INT16; break; case 4: col->size = 4; col->type = SW_TABLE_INT32; break; default: col->size = 8; col->type = SW_TABLE_INT64; break; } break; case SW_TABLE_FLOAT: col->size = 8; col->type = SW_TABLE_FLOAT; break; default: col->size = size + sizeof(uint16_t); col->type = SW_TABLE_STRING; break; } col->index = table->item_size; table->item_size += col->size; table->column_num ++; return swHashMap_add(table->columns, name, len, col, NULL); }
int swWebSocket_dispatch_frame(swConnection *conn, char *data, uint32_t length) { swString frame; bzero(&frame, sizeof(frame)); frame.str = data; frame.length = length; swString send_frame; bzero(&send_frame, sizeof(send_frame)); char buf[128]; send_frame.str = buf; send_frame.size = sizeof(buf); swWebSocket_frame ws; swWebSocket_decode(&ws, &frame); swString *frame_buffer; int frame_length; swListenPort *port; size_t offset; switch (ws.header.OPCODE) { case WEBSOCKET_OPCODE_CONTINUATION_FRAME: frame_buffer = conn->websocket_buffer; if (frame_buffer == NULL) { swWarn("bad frame[opcode=0]. remote_addr=%s:%d.", swConnection_get_ip(conn), swConnection_get_port(conn)); return SW_ERR; } offset = length - ws.payload_length; frame_length = length - offset; port = swServer_get_port(SwooleG.serv, conn->fd); //frame data overflow if (frame_buffer->length + frame_length > port->protocol.package_max_length) { swWarn("websocket frame is too big, remote_addr=%s:%d.", swConnection_get_ip(conn), swConnection_get_port(conn)); return SW_ERR; } //merge incomplete data swString_append_ptr(frame_buffer, data + offset, frame_length); //frame is finished, do dispatch if (ws.header.FIN) { swReactorThread_dispatch(conn, frame_buffer->str, frame_buffer->length); swString_free(frame_buffer); conn->websocket_buffer = NULL; } break; case WEBSOCKET_OPCODE_TEXT_FRAME: case WEBSOCKET_OPCODE_BINARY_FRAME: offset = length - ws.payload_length - 2; data[offset] = 1; data[offset + 1] = ws.header.OPCODE; if (!ws.header.FIN) { if (conn->websocket_buffer) { swWarn("merging incomplete frame, bad request. remote_addr=%s:%d.", swConnection_get_ip(conn), swConnection_get_port(conn)); return SW_ERR; } conn->websocket_buffer = swString_dup(data + offset, length - offset); } else { swReactorThread_dispatch(conn, data + offset, length - offset); } break; case WEBSOCKET_OPCODE_PING: if (length >= (sizeof(buf) - 2)) { swWarn("ping frame application data is too big. remote_addr=%s:%d.", swConnection_get_ip(conn), swConnection_get_port(conn)); return SW_ERR; } else if (length == 2) { swWebSocket_encode(&send_frame, NULL, 0, WEBSOCKET_OPCODE_PONG, 1, 0); } else { swWebSocket_encode(&send_frame, data += 2, length - 2, WEBSOCKET_OPCODE_PONG, 1, 0); } swConnection_send(conn, send_frame.str, send_frame.length, 0); break; case WEBSOCKET_OPCODE_PONG: break; case WEBSOCKET_OPCODE_CONNECTION_CLOSE: if (0x7d < (length - 2)) { return SW_ERR; } send_frame.str[0] = 0x88; send_frame.str[1] = 0x00; send_frame.length = 2; swConnection_send(conn, send_frame.str, 2, 0); return SW_ERR; default: swWarn("unknown opcode [%d].", ws.header.OPCODE); break; } return SW_OK; }