mirror of
				https://github.com/40t/go-sniffer.git
				synced 2025-11-04 19:16:25 +08:00 
			
		
		
		
	fixed parse token
This commit is contained in:
		@@ -435,17 +435,24 @@ func readVarLen(typeId int, pos int, buf []byte, column *columnStruct) (count in
 | 
				
			|||||||
	return count
 | 
						return count
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func parseToken(buf []byte) (int, string) {
 | 
					func parseToken(buf []byte) (rowCount int, msg string) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var pos = 0
 | 
						var pos = 0
 | 
				
			||||||
	length := 0
 | 
						length := 0
 | 
				
			||||||
	rowCount := 0
 | 
						rowCount = 0
 | 
				
			||||||
	msg := ""
 | 
						msg = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var columns []columnStruct
 | 
						var columns []columnStruct
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						defer func() {
 | 
				
			||||||
 | 
							if r := recover(); r != nil {
 | 
				
			||||||
 | 
								msg = "parse tds result error"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	currentBuf := buf[:]
 | 
						currentBuf := buf[:]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// fmt.Printf("buf len %x", currentBuf)
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(currentBuf) == 0 {
 | 
							if len(currentBuf) == 0 {
 | 
				
			||||||
@@ -453,7 +460,7 @@ func parseToken(buf []byte) (int, string) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		token := token(currentBuf[0])
 | 
							token := token(currentBuf[0])
 | 
				
			||||||
		// fmt.Printf("item... %x\n", currentBuf[0])
 | 
							// fmt.Printf("item... %x %d\n", currentBuf[0], currentBuf[0])
 | 
				
			||||||
		currentBuf = currentBuf[1:]
 | 
							currentBuf = currentBuf[1:]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch token {
 | 
							switch token {
 | 
				
			||||||
@@ -474,27 +481,30 @@ func parseToken(buf []byte) (int, string) {
 | 
				
			|||||||
		case tokenDoneInProc:
 | 
							case tokenDoneInProc:
 | 
				
			||||||
			currentBuf = currentBuf[4:]
 | 
								currentBuf = currentBuf[4:]
 | 
				
			||||||
			rowCount = int(binary.LittleEndian.Uint64(currentBuf[0:8]))
 | 
								rowCount = int(binary.LittleEndian.Uint64(currentBuf[0:8]))
 | 
				
			||||||
			currentBuf = currentBuf[8+rowCount:]
 | 
								currentBuf = currentBuf[8:]
 | 
				
			||||||
		case tokenDone, tokenDoneProc:
 | 
							case tokenDone, tokenDoneProc:
 | 
				
			||||||
			currentBuf = currentBuf[4:]
 | 
								currentBuf = currentBuf[4:]
 | 
				
			||||||
			rowCount = int(binary.LittleEndian.Uint64(currentBuf[0:8]))
 | 
								rowCount = int(binary.LittleEndian.Uint64(currentBuf[0:8]))
 | 
				
			||||||
			currentBuf = currentBuf[8:]
 | 
								currentBuf = currentBuf[8:]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case tokenError:
 | 
							case tokenError:
 | 
				
			||||||
			currentBuf = currentBuf[8:] //length2+Number4+State1+Class1
 | 
								currentBuf = currentBuf[8:] //length2+Number4+State1+Class1
 | 
				
			||||||
			//message length
 | 
								//message length
 | 
				
			||||||
			msgLength := int(binary.LittleEndian.Uint16(currentBuf[0:2]))
 | 
								msgLength := int(binary.LittleEndian.Uint16(currentBuf[0:2]))
 | 
				
			||||||
 | 
								currentBuf = currentBuf[2:]
 | 
				
			||||||
			msgLength = msgLength * 2
 | 
								msgLength = msgLength * 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			msg, _ = ucs22str(currentBuf[0:msgLength])
 | 
								msg, _ = ucs22str(currentBuf[0:msgLength])
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
		case tokenColMetadata:
 | 
							case tokenColMetadata:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// fmt.Printf("tokenColMetadata1 %x\n", currentBuf)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			//http://msdn.microsoft.com/en-us/library/dd357363.aspx
 | 
								//http://msdn.microsoft.com/en-us/library/dd357363.aspx
 | 
				
			||||||
			count := int(binary.LittleEndian.Uint16(currentBuf[0:2]))
 | 
								count := int(binary.LittleEndian.Uint16(currentBuf[0:2]))
 | 
				
			||||||
			currentBuf = currentBuf[2:]
 | 
								currentBuf = currentBuf[2:]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if count == 0xffff {
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			columns = make([]columnStruct, count)
 | 
								columns = make([]columnStruct, count)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if count > 0 {
 | 
								if count > 0 {
 | 
				
			||||||
@@ -512,14 +522,10 @@ func parseToken(buf []byte) (int, string) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
					//ColName
 | 
										//ColName
 | 
				
			||||||
					l := int(currentBuf[0])
 | 
										l := int(currentBuf[0])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					currentBuf = currentBuf[1:]
 | 
										currentBuf = currentBuf[1:]
 | 
				
			||||||
					//name
 | 
										//name
 | 
				
			||||||
					currentBuf = currentBuf[l*2:]
 | 
										currentBuf = currentBuf[l*2:]
 | 
				
			||||||
					// fmt.Printf("after name: %x\n", currentBuf)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					// fmt.Printf("%d, %d ,%x\n", x, pos, buf[x+1:pos+1])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					// fmt.Print("%v", column)
 | 
					 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				// fmt.Printf("tokenRow %x\n", currentBuf)
 | 
									// fmt.Printf("tokenRow %x\n", currentBuf)
 | 
				
			||||||
@@ -527,13 +533,11 @@ func parseToken(buf []byte) (int, string) {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		case tokenRow:
 | 
							case tokenRow:
 | 
				
			||||||
			count := 0
 | 
								count := 0
 | 
				
			||||||
			// fmt.Printf("tokenRow currentBuf %x %v\n", currentBuf)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for _, column := range columns {
 | 
								for _, column := range columns {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				count = column.Reader(&column, currentBuf)
 | 
									count = column.Reader(&column, currentBuf)
 | 
				
			||||||
				currentBuf = currentBuf[count:]
 | 
									currentBuf = currentBuf[count:]
 | 
				
			||||||
				// fmt.Printf("tokenRow %d %x \n", i, currentBuf)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		case tokenNbcRow:
 | 
							case tokenNbcRow:
 | 
				
			||||||
@@ -553,8 +557,31 @@ func parseToken(buf []byte) (int, string) {
 | 
				
			|||||||
				// fmt.Printf("tokenNbcRow %d %x \n", i, currentBuf)
 | 
									// fmt.Printf("tokenNbcRow %d %x \n", i, currentBuf)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							case tokenEnvChange:
 | 
				
			||||||
 | 
								// http://msdn.microsoft.com/en-us/library/dd303449.aspx
 | 
				
			||||||
 | 
								length = int(binary.LittleEndian.Uint16(currentBuf[0:2]))
 | 
				
			||||||
 | 
								currentBuf = currentBuf[2+length:]
 | 
				
			||||||
 | 
							case tokenInfo:
 | 
				
			||||||
 | 
								// http://msdn.microsoft.com/en-us/library/dd304156.aspx
 | 
				
			||||||
 | 
								length = int(binary.LittleEndian.Uint16(currentBuf[0:2]))
 | 
				
			||||||
 | 
								currentBuf = currentBuf[2+length:]
 | 
				
			||||||
 | 
							case tokenReturnValue:
 | 
				
			||||||
 | 
								// https://msdn.microsoft.com/en-us/library/dd303881.aspx
 | 
				
			||||||
 | 
								currentBuf = currentBuf[2:]
 | 
				
			||||||
 | 
								nameLength := int(currentBuf[0])
 | 
				
			||||||
 | 
								currentBuf = currentBuf[1:]
 | 
				
			||||||
 | 
								currentBuf = currentBuf[nameLength*2:]
 | 
				
			||||||
 | 
								currentBuf = currentBuf[7:] //1byte + 4 byte+2 byt
 | 
				
			||||||
 | 
								col := columnStruct{}
 | 
				
			||||||
 | 
								count := readTypeInfo(0, currentBuf, &col)
 | 
				
			||||||
 | 
								currentBuf = currentBuf[count:] //readTypeInfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								count = col.Reader(&col, currentBuf)
 | 
				
			||||||
 | 
								currentBuf = currentBuf[count:] //column value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			break
 | 
								// fmt.Printf("tokenNbcRow %x \n", currentBuf[0])
 | 
				
			||||||
 | 
								return rowCount, "parse result error"
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user