2 Star 13 Fork 0

不得闲/DxValue

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
DxRecord.go 61.90 KB
一键复制 编辑 原始数据 按行查看 历史
不得闲 提交于 2019-08-22 21:24 . 1、增加Clone功能
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345
/*
DxValue的Record记录集对象
可以用来序列化反序列化Json,MsgPack等,并提供一系列的操作函数
Autor: 不得闲
QQ:75492895
*/
package DxValue
import (
"sort"
"unsafe"
"bytes"
"reflect"
"github.com/suiyunonghen/DxCommonLib"
"strings"
"math"
"strconv"
"io/ioutil"
"io"
"bufio"
"os"
"time"
"github.com/suiyunonghen/DxValue/Coders"
"github.com/suiyunonghen/DxValue/Coders/DxMsgPack"
)
/******************************************************
* DxRecord
******************************************************/
type(
DxBaseRecord struct {
DxBaseValue
PathSplitChar byte
}
DxRecord struct{
DxBaseRecord
fRecords map[string]*DxBaseValue
}
)
func (r *DxRecord)ClearValue(clearInner bool) {
if r.fRecords != nil{
for _,v := range r.fRecords{
if v != nil{
v.ClearValue(true)
v.fParent = nil
}
}
}
if clearInner{
r.fRecords = nil
return
}
if r.fRecords == nil || len(r.fRecords) > 0{
r.fRecords = make(map[string]*DxBaseValue,32)
}
}
func (r *DxRecord)splitPathFields(charrune rune) bool {
if r.PathSplitChar == 0{
r.PathSplitChar = DefaultPathSplit
}
return charrune == rune(r.PathSplitChar)
}
func (r *DxRecord)getSize()int {
result := 0
if r.fRecords != nil {
for k,v := range r.fRecords{
result += len(k)+v.Size()
}
}
return result
}
func (r *DxRecord)NewRecord(keyName string)(rec *DxRecord) {
if keyName == ""{
return nil
}
if r.fRecords != nil{
if value,ok := r.fRecords[keyName];ok && value != nil{
if value.fValueType == DVT_Record{
rec = (*DxRecord)(unsafe.Pointer(value))
rec.ClearValue(false)
rec.fParent = &r.DxBaseValue
return
}
value.ClearValue(true)
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
rec = new(DxRecord)
rec.fValueType = DVT_Record
rec.PathSplitChar = r.PathSplitChar
rec.fRecords = make(map[string]*DxBaseValue,32)
r.fRecords[keyName] = &rec.DxBaseValue
rec.fParent = &r.DxBaseValue
return
}
func (r *DxRecord)NewIntRecord(keyName string)(rec *DxIntKeyRecord) {
if keyName == ""{
return nil
}
if r.fRecords != nil{
if value,ok := r.fRecords[keyName];ok && value != nil{
if value.fValueType == DVT_RecordIntKey{
rec = (*DxIntKeyRecord)(unsafe.Pointer(value))
rec.ClearValue(false)
rec.fParent = &r.DxBaseValue
return
}
value.ClearValue(true)
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
rec = new(DxIntKeyRecord)
rec.fValueType = DVT_RecordIntKey
rec.PathSplitChar = r.PathSplitChar
rec.fRecords = make(map[int64]*DxBaseValue,32)
r.fRecords[keyName] = &rec.DxBaseValue
rec.fParent = &r.DxBaseValue
return
}
func (r *DxRecord)Find(keyName string)*DxBaseValue {
if keyName == "" || r.fRecords == nil{
return nil
}
if v,ok := r.fRecords[keyName];ok{
return v
}
return nil
}
func (r *DxRecord)ForcePathRecord(path string) *DxRecord{
fields := strings.FieldsFunc(path,r.splitPathFields)
vlen := len(fields)
if vlen == 0{
return nil
}
vbase := r.Find(fields[0])
if vbase == nil || vbase.fValueType != DVT_Record{
vbase = &r.NewRecord(fields[0]).DxBaseValue
}
for i := 1;i<vlen;i++{
oldbase := vbase
switch vbase.fValueType {
case DVT_Record:
vbase = (*DxRecord)(unsafe.Pointer(vbase)).Find(fields[i])
if vbase == nil || vbase.fValueType != DVT_Record{
vbase = &(*DxRecord)(unsafe.Pointer(oldbase)).NewRecord(fields[i]).DxBaseValue
}
case DVT_RecordIntKey:
if intkey,er := strconv.ParseInt(fields[i],10,64);er == nil{
vbase = (*DxIntKeyRecord)(unsafe.Pointer(vbase)).Find(intkey)
if vbase == nil || vbase.fValueType != DVT_Record{
vbase = &(*DxIntKeyRecord)(unsafe.Pointer(oldbase)).NewRecord(intkey).DxBaseValue
}
}else{
vbase = vbase.Parent()
vbase = &(*DxRecord)(unsafe.Pointer(vbase)).NewRecord(fields[i - 1]).NewRecord(fields[i]).DxBaseValue
}
default:
vbase = vbase.Parent()
if vbase == nil{
vbase = &(NewRecord().DxBaseValue)
}
vbase = &(*DxRecord)(unsafe.Pointer(vbase)).NewRecord(fields[i - 1]).NewRecord(fields[i]).DxBaseValue
}
}
return (*DxRecord)(unsafe.Pointer(vbase))
}
func (r *DxRecord)ForcePathArray(path string) *DxArray{
fields := strings.FieldsFunc(path,r.splitPathFields)
vlen := len(fields)
if vlen == 0{
return nil
}
vbase := r.Find(fields[0])
if vbase == nil || vbase.fValueType != DVT_Record{
vbase = &r.NewRecord(fields[0]).DxBaseValue
}
for i := 1;i<vlen - 1;i++{
oldbase := vbase
switch vbase.fValueType {
case DVT_Record:
vbase = (*DxRecord)(unsafe.Pointer(vbase)).Find(fields[i])
if vbase == nil || vbase.fValueType != DVT_Record{
vbase = &(*DxRecord)(unsafe.Pointer(oldbase)).NewRecord(fields[i]).NewRecord(fields[i]).DxBaseValue
}
case DVT_RecordIntKey:
if intkey,er := strconv.ParseInt(fields[i],10,64);er == nil{
vbase = (*DxIntKeyRecord)(unsafe.Pointer(vbase)).Find(intkey)
if vbase == nil || vbase.fValueType != DVT_Record{
vbase = &(*DxIntKeyRecord)(unsafe.Pointer(oldbase)).NewRecord(intkey).DxBaseValue
}
}else{
vbase = vbase.Parent()
vbase = &(*DxRecord)(unsafe.Pointer(vbase)).NewRecord(fields[i - 1]).NewRecord(fields[i]).DxBaseValue
}
default:
vbase = vbase.Parent()
if vbase == nil{
vbase = &(NewRecord().DxBaseValue)
}
vbase = &(*DxRecord)(unsafe.Pointer(vbase)).NewRecord(fields[i - 1]).NewRecord(fields[i]).DxBaseValue
}
}
return (*DxRecord)(unsafe.Pointer(vbase)).NewArray(fields[vlen-1])
}
func (r *DxRecord)ForcePath(path string,v interface{}) {
fields := strings.FieldsFunc(path,r.splitPathFields)
vlen := len(fields)
if vlen == 0{
return
}
vbase := r.Find(fields[0])
if vbase == nil{
vbase = &r.NewRecord(fields[0]).DxBaseValue
}
for i := 1;i<vlen - 1;i++{
if vbase != nil {
if vbase.fValueType == DVT_Record{
vbase = (*DxRecord)(unsafe.Pointer(vbase)).Find(fields[i])
}else{
if intkey,er := strconv.ParseInt(fields[i],10,64);er == nil{
vbase = (*DxIntKeyRecord)(unsafe.Pointer(vbase)).Find(intkey)
}else{
vbase = vbase.Parent()
vbase = &(*DxRecord)(unsafe.Pointer(vbase)).NewRecord(fields[i - 1]).NewRecord(fields[i]).DxBaseValue
}
}
}
}
if vbase.fValueType == DVT_Record{
(*DxRecord)(unsafe.Pointer(vbase)).SetValue(fields[vlen - 1],v)
}else{
if intkey,er := strconv.ParseInt(fields[vlen - 1],10,64);er == nil{
(*DxIntKeyRecord)(unsafe.Pointer(vbase)).SetValue(intkey,v)
}else{
vbase = vbase.Parent()
if vlen > 2{
vbase = &(*DxRecord)(unsafe.Pointer(vbase)).NewRecord(fields[vlen - 2]).NewRecord(fields[vlen - 1]).DxBaseValue
}else{
vbase = &r.NewRecord(fields[vlen - 2]).DxBaseValue
}
(*DxRecord)(unsafe.Pointer(vbase)).SetValue(fields[vlen - 1],v)
}
}
}
func (r *DxRecord)NewArray(keyName string)(arr *DxArray) {
if keyName == ""{
return nil
}
if r.fRecords != nil{
if value,ok := r.fRecords[keyName];ok && value != nil{
if value.fValueType == DVT_Array{
arr = (*DxArray)(unsafe.Pointer(value))
arr.ClearValue(false)
arr.fParent = &r.DxBaseValue
return
}
value.ClearValue(true)
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
arr = new(DxArray)
arr.fValueType = DVT_Array
arr.fParent = &r.DxBaseValue
r.fRecords[keyName] = &arr.DxBaseValue
return
}
func (r *DxRecord)SetInt(KeyName string,v int) {
if KeyName == ""{
return
}
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
switch value.fValueType {
case DVT_Int:
(*DxIntValue)(unsafe.Pointer(value)).fvalue = v
return
case DVT_Int32:
if v <= math.MaxInt32 && v >= math.MinInt32{
(*DxInt32Value)(unsafe.Pointer(value)).fvalue = int32(v)
return
}
case DVT_Int64:
(*DxInt64Value)(unsafe.Pointer(value)).fvalue = int64(v)
return
}
value.ClearValue(true)
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
var m DxIntValue
m.fvalue = v
m.fValueType = DVT_Int
m.fParent = &r.DxBaseValue
r.fRecords[KeyName] = &m.DxBaseValue
}
func (r *DxRecord)SetInt32(KeyName string,v int32) {
if KeyName == ""{
return
}
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
switch value.fValueType {
case DVT_Int:
(*DxIntValue)(unsafe.Pointer(value)).fvalue = int(v)
return
case DVT_Int32:
(*DxInt32Value)(unsafe.Pointer(value)).fvalue = v
return
case DVT_Int64:
(*DxInt64Value)(unsafe.Pointer(value)).fvalue = int64(v)
return
}
value.ClearValue(true)
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
var m DxInt32Value
m.fvalue = v
m.fValueType = DVT_Int32
m.fParent = &r.DxBaseValue
r.fRecords[KeyName] = &m.DxBaseValue
}
func (r *DxRecord)SetInt64(KeyName string,v int64) {
if KeyName == ""{
return
}
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
switch value.fValueType {
case DVT_Int:
if DxCommonLib.IsAmd64 || v <= math.MaxInt32 && v >= math.MinInt32{
(*DxIntValue)(unsafe.Pointer(value)).fvalue = int(v)
return
}
case DVT_Int32:
if v <= math.MaxInt32 && v >= math.MinInt32{
(*DxInt32Value)(unsafe.Pointer(value)).fvalue = int32(v)
return
}
case DVT_Int64:
(*DxInt64Value)(unsafe.Pointer(value)).fvalue = v
return
}
value.ClearValue(true)
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
if v <= math.MaxInt32 && v >= math.MinInt32{
var m DxInt32Value
m.fvalue = int32(v)
m.fValueType = DVT_Int32
m.fParent = &r.DxBaseValue
r.fRecords[KeyName] = &m.DxBaseValue
}else{
var m DxInt64Value
m.fvalue = v
m.fValueType = DVT_Int64
m.fParent = &r.DxBaseValue
r.fRecords[KeyName] = &m.DxBaseValue
}
}
func (r *DxRecord)SetBool(KeyName string,v bool) {
if KeyName == ""{
return
}
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
if value.fValueType == DVT_Bool {
(*DxBoolValue)(unsafe.Pointer(value)).fvalue = v
return
}
value.ClearValue(true)
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
var m DxBoolValue
m.fvalue = v
m.fParent = &r.DxBaseValue
m.fValueType = DVT_Bool
r.fRecords[KeyName] = &m.DxBaseValue
}
func (r *DxRecord)SetNull(KeyName string) {
if KeyName == ""{
return
}
if r.fRecords != nil{
if v,ok := r.fRecords[KeyName];ok && v != nil{
v.fParent = nil
v.ClearValue(true)
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
r.fRecords[KeyName] = nil
}
func (r *DxRecord)SetFloat(KeyName string,v float32) {
if KeyName == ""{
return
}
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
if value.fValueType == DVT_Float{
(*DxFloatValue)(unsafe.Pointer(value)).fvalue = v
return
}else if value.fValueType == DVT_Double || value.fValueType == DVT_DateTime{
(*DxDoubleValue)(unsafe.Pointer(value)).fvalue = float64(v)
return
}
value.ClearValue(true)
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
var m DxFloatValue
m.fvalue = v
m.fParent = &r.DxBaseValue
m.fValueType = DVT_Float
r.fRecords[KeyName] = &m.DxBaseValue
}
func (r *DxRecord)SetDouble(KeyName string,v float64) {
if KeyName == ""{
return
}
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
if value.fValueType == DVT_Double || value.fValueType == DVT_DateTime{
(*DxDoubleValue)(unsafe.Pointer(value)).fvalue = v
return
}else if value.fValueType == DVT_Float{
if v <= math.MaxFloat32 && v >= math.MinInt32{
(*DxFloatValue)(unsafe.Pointer(value)).fvalue = float32(v)
return
}
}
value.ClearValue(true)
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
var m DxDoubleValue
m.fvalue = v
m.fParent = &r.DxBaseValue
m.fValueType = DVT_Double
r.fRecords[KeyName] = &m.DxBaseValue
}
func (r *DxRecord)SetDateTime(KeyName string,v DxCommonLib.TDateTime) {
if KeyName == ""{
return
}
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
if value.fValueType == DVT_DateTime{
(*DxDoubleValue)(unsafe.Pointer(value)).fvalue = float64(v)
return
}
value.ClearValue(true)
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
var m DxDoubleValue
m.fvalue = float64(v)
m.fValueType = DVT_DateTime
r.fRecords[KeyName] = &m.DxBaseValue
}
func (r *DxRecord)AsDateTime(keyName string,defavalue DxCommonLib.TDateTime)DxCommonLib.TDateTime {
if r.fRecords == nil{
return defavalue
}
if value,ok := r.fRecords[keyName];ok && value != nil{
switch value.fValueType {
case DVT_Int: return DxCommonLib.TDateTime((*DxIntValue)(unsafe.Pointer(value)).fvalue)
case DVT_Int32: return DxCommonLib.TDateTime((*DxInt32Value)(unsafe.Pointer(value)).fvalue)
case DVT_Int64: return DxCommonLib.TDateTime((*DxInt64Value)(unsafe.Pointer(value)).fvalue)
case DVT_Bool:
if (*DxBoolValue)(unsafe.Pointer(value)).fvalue{
return 1
}
return 0
case DVT_Double,DVT_DateTime:return DxCommonLib.TDateTime((*DxDoubleValue)(unsafe.Pointer(value)).fvalue)
case DVT_Float:return DxCommonLib.TDateTime((*DxFloatValue)(unsafe.Pointer(value)).fvalue)
case DVT_String:
if result,err := value.AsDateTime();err == nil{
return result
}else{
panic("can not convert Type to TDateTime")
}
default:
panic("can not convert Type to TDateTime")
}
}
return defavalue
}
func (r *DxRecord)SetString(KeyName string,v string) {
if KeyName == ""{
return
}
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
switch value.fValueType {
case DVT_String:
(*DxStringValue)(unsafe.Pointer(value)).fvalue = v//DxCommonLib.EscapeJsonStr(v)
return
case DVT_DateTime:
if jt := DxCommonLib.ParserJsonTime(v);jt >= 0{
(*DxDoubleValue)(unsafe.Pointer(value)).fvalue = float64(jt)
return
}
t,err := time.Parse("2006-01-02T15:04:05Z",v)
if err == nil{
(*DxDoubleValue)(unsafe.Pointer(value)).fvalue = float64(DxCommonLib.Time2DelphiTime(&t))
return
}
t,err = time.Parse("2006-01-02 15:04:05",v)
if err == nil{
(*DxDoubleValue)(unsafe.Pointer(value)).fvalue = float64(DxCommonLib.Time2DelphiTime(&t))
return
}
t,err = time.Parse("2006/01/02 15:04:05",v)
if err == nil{
(*DxDoubleValue)(unsafe.Pointer(value)).fvalue = float64(DxCommonLib.Time2DelphiTime(&t))
return
}
case DVT_Bool:
if v == "true" || strings.ToLower(v) == "true"{
(*DxBoolValue)(unsafe.Pointer(value)).fvalue = true
return
}else if v == "false" || strings.ToLower(v) == "false" {
(*DxBoolValue)(unsafe.Pointer(value)).fvalue = false
return
}
case DVT_Int:
if iv,err := strconv.Atoi(v);err == nil{
(*DxIntValue)(unsafe.Pointer(value)).fvalue = iv
return
}
case DVT_Int32:
if iv,err := strconv.Atoi(v);err == nil{
(*DxInt32Value)(unsafe.Pointer(value)).fvalue = int32(iv)
return
}
case DVT_Int64:
if iv,err := strconv.ParseInt(v,10,64);err == nil{
(*DxInt64Value)(unsafe.Pointer(value)).fvalue = iv
return
}
case DVT_Float:
if iv,err := strconv.ParseFloat(v,32);err == nil{
(*DxFloatValue)(unsafe.Pointer(value)).fvalue = float32(iv)
return
}
case DVT_Double:
if iv,err := strconv.ParseFloat(v,64);err == nil{
(*DxDoubleValue)(unsafe.Pointer(value)).fvalue = iv
return
}
}
value.ClearValue(true)
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
var m DxStringValue
m.fvalue = v//DxCommonLib.EscapeJsonStr(v)
m.fValueType = DVT_String
r.fRecords[KeyName] = &m.DxBaseValue
}
func (r *DxRecord)SetBinary(KeyName string,v []byte,reWrite bool,encodeType DxBinaryEncodeType) {
if KeyName == ""{
return
}
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
if value.fValueType == DVT_Binary{
bv := (*DxBinaryValue)(unsafe.Pointer(value))
bv.EncodeType = encodeType
if reWrite{
bv.SetBinary(v,true)
}else{
bv.Append(v)
}
return
}
value.ClearValue(true)
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
var m DxBinaryValue
m.fbinary = v
m.fParent = &r.DxBaseValue
m.fValueType = DVT_Binary
m.EncodeType = encodeType
r.fRecords[KeyName] = &m.DxBaseValue
}
func (r *DxRecord)SetExtValue(keyName string,extbt []byte) {
if keyName == ""{
return
}
if r.fRecords != nil{
if value,ok := r.fRecords[keyName];ok && value != nil{
if value.fValueType == DVT_Ext{
value.SetExtValue(extbt)
return
}
value.ClearValue(true)
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
var m DxExtValue
m.fdata = extbt
m.fParent = &r.DxBaseValue
if extbt != nil && len(extbt) > 0{
m.fExtType = extbt[0]
}
m.fValueType = DVT_Ext
r.fRecords[keyName] = &m.DxBaseValue
}
func (r *DxRecord)AsExtValue(keyName string)(*DxExtValue) {
if r.fRecords == nil{
return nil
}
if value,ok := r.fRecords[keyName];ok && value != nil && value.fValueType == DVT_Ext{
return (*DxExtValue)(unsafe.Pointer(value))
}
return nil
}
func (r *DxRecord)AsBytes(keyName string)[]byte {
if r.fRecords == nil{
return nil
}
if value,ok := r.fRecords[keyName];ok && value != nil{
bt,_ := value.AsBytes()
return bt
}
return nil
}
type targetBuffer interface {
WriteString(string)(int, error)
WriteByte(c byte) error
}
func (r *DxRecord)EncodeJson2Writer(w io.Writer) {
var buffer targetBuffer
if buf,ok := w.(targetBuffer);ok{
buffer = buf
} else {
buffer = bufio.NewWriter(w)
}
buffer.WriteByte('{')
isFirst := true
if r.fRecords != nil{
for k,v := range r.fRecords{
if !isFirst{
buffer.WriteString(`,"`)
}else{
isFirst = false
buffer.WriteByte('"')
}
buffer.WriteString(k)
buffer.WriteString(`":`)
if v != nil{
vt := v.fValueType
if vt == DVT_String || vt == DVT_Binary || vt == DVT_DateTime || vt == DVT_Ext{
buffer.WriteByte('"')
}
if vt == DVT_DateTime{
buffer.WriteString("/Date(")
buffer.WriteString(strconv.Itoa(int(DxCommonLib.TDateTime((*DxDoubleValue)(unsafe.Pointer(v)).fvalue).ToTime().Unix())*1000))
buffer.WriteString(")/")
}else{
buffer.WriteString(v.ToString())
}
if vt == DVT_String || vt == DVT_Binary || vt == DVT_DateTime || vt == DVT_Ext{
buffer.WriteByte('"')
}
}else{
buffer.WriteString("null")
}
}
}
buffer.WriteByte('}')
}
func(r *DxRecord)BytesWithSort()[]byte{
buffer := bytes.NewBuffer(make([]byte,0,512))
buffer.WriteByte('{')
if r.fRecords != nil{
keys := make([]string,len(r.fRecords))
idx := 0
for k,_ := range r.fRecords{
keys[idx] = k
idx++
}
sort.Strings(keys)
for i := 0;i<idx;i++{
if i!=0{
buffer.WriteString(`,"`)
}else{
buffer.WriteByte('"')
}
v := r.fRecords[keys[i]]
buffer.WriteString(keys[i])
buffer.WriteString(`":`)
if v != nil{
vt := v.fValueType
if vt == DVT_String || vt == DVT_Binary || vt == DVT_DateTime || vt == DVT_Ext{
buffer.WriteByte('"')
}
switch vt {
case DVT_DateTime:
buffer.WriteString("/Date(")
buffer.WriteString(strconv.Itoa(int(DxCommonLib.TDateTime((*DxDoubleValue)(unsafe.Pointer(v)).fvalue).ToTime().Unix())*1000))
buffer.WriteString(")/")
case DVT_RecordIntKey:
buffer.Write((*DxIntKeyRecord)(unsafe.Pointer(v)).BytesWithSort())
case DVT_Record:
buffer.Write((*DxRecord)(unsafe.Pointer(v)).BytesWithSort())
case DVT_Array:
buffer.Write((*DxArray)(unsafe.Pointer(v)).BytesWithSort())
case DVT_String:
buffer.WriteString(DxCommonLib.EscapeJsonStr((*DxStringValue)(unsafe.Pointer(v)).fvalue))
default:
buffer.WriteString(v.ToString())
}
if vt == DVT_String || vt == DVT_Binary || vt == DVT_DateTime || vt == DVT_Ext{
buffer.WriteByte('"')
}
}else{
buffer.WriteString("null")
}
}
}
buffer.WriteByte('}')
return buffer.Bytes()
}
func (r *DxRecord)Bytes()[]byte {
buffer := bytes.NewBuffer(make([]byte,0,512))
buffer.WriteByte('{')
if r.fRecords != nil{
isFirst := true
for k,v := range r.fRecords{
if !isFirst{
buffer.WriteString(`,"`)
}else{
isFirst = false
buffer.WriteByte('"')
}
buffer.WriteString(k)
buffer.WriteString(`":`)
if v != nil{
vt := v.fValueType
if vt == DVT_String || vt == DVT_Binary || vt == DVT_DateTime || vt == DVT_Ext{
buffer.WriteByte('"')
}
switch vt {
case DVT_DateTime:
buffer.WriteString("/Date(")
buffer.WriteString(strconv.Itoa(int(DxCommonLib.TDateTime((*DxDoubleValue)(unsafe.Pointer(v)).fvalue).ToTime().Unix())*1000))
buffer.WriteString(")/")
case DVT_String:
buffer.WriteString(DxCommonLib.EscapeJsonStr((*DxStringValue)(unsafe.Pointer(v)).fvalue))
default:
buffer.WriteString(v.ToString())
}
if vt == DVT_String || vt == DVT_Binary || vt == DVT_DateTime || vt == DVT_Ext{
buffer.WriteByte('"')
}
}else{
buffer.WriteString("null")
}
}
}
buffer.WriteByte('}')
return buffer.Bytes()
}
func (r *DxRecord)findPathNode(path string)(rec *DxBaseValue,keyName string) {
fields := strings.FieldsFunc(path,r.splitPathFields)
vlen := len(fields)
if vlen == 0{
return nil,""
}
rParent := &r.DxBaseValue
for i := 0;i < vlen - 1;i++{
switch rParent.fValueType {
case DVT_Record:
rParent = (*DxRecord)(unsafe.Pointer(rParent)).Find(fields[i])
case DVT_RecordIntKey:
if intkey,err := strconv.ParseInt(fields[i],10,64);err == nil{
rParent = (*DxIntKeyRecord)(unsafe.Pointer(rParent)).Find(intkey)
}else{
panic("can not Convert to IntKey")
}
case DVT_Array:
if intkey,err := strconv.ParseInt(fields[i],10,64);err == nil{
values := (*DxArray)(unsafe.Pointer(rParent)).fValues
if values != nil && intkey >= 0 && intkey < int64(len(values)){
rParent = values[intkey]
}else{
panic("KeyIndex Out bands of Array")
}
}else{
panic("can not Convert to Int Index")
}
default:
return nil,""
}
if rParent==nil{
return nil,""
}
}
return rParent,fields[vlen - 1]
}
func (r *DxRecord)AsBytesByPath(Path string)[]byte {
parentBase,keyName := r.findPathNode(Path)
if parentBase != nil {
if keyName != ""{
switch parentBase.fValueType {
case DVT_Array:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
panic("can not Convert to IntKey")
}else{
values := (*DxArray)(unsafe.Pointer(parentBase)).fValues
if values != nil && intkey >= 0 && intkey < int64(len(values)){
bt,_ := values[intkey].AsBytes()
return bt
}else{
panic("KeyIndex Out bands of Array")
}
}
case DVT_RecordIntKey:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
panic("can not Convert to IntKey")
}else{
return (*DxIntKeyRecord)(unsafe.Pointer(parentBase)).AsBytes(intkey)
}
case DVT_Record:
return (*DxRecord)(unsafe.Pointer(parentBase)).AsBytes(keyName)
}
}
}
return nil
}
func getBaseType(vt reflect.Type)reflect.Kind {
if vt.Kind() == reflect.Ptr{
return getBaseType(vt.Elem())
}
return vt.Kind()
}
func getRealValue(v *reflect.Value)*reflect.Value {
if !v.IsValid(){
return nil
}
if v.Kind() == reflect.Ptr{
if !v.IsNil(){
va := v.Elem()
return getRealValue(&va)
}else{
return nil
}
}
return v
}
func (r *DxRecord)SetRecordValue(keyName string,v *DxRecord) {
if v != nil && v.fParent != nil {
panic("Must Set A Single Record(no Parent)")
}
if keyName == ""{
return
}
if r.fRecords != nil{
if value, ok := r.fRecords[keyName]; ok && value != nil {
value.ClearValue(true)
value.fParent = nil
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
if v != nil {
r.fRecords[keyName] = &v.DxBaseValue
v.PathSplitChar = r.PathSplitChar
v.fParent = &r.DxBaseValue
}else{
r.fRecords[keyName] = nil
}
}
func (r *DxRecord) Decode(decoder Coders.Decoder) error{
var err error
switch decoder.Name() {
case "msgpack":
if msgpacker,ok := decoder.(*DxMsgPackDecoder);ok{
return msgpacker.DecodeStrMap(DxMsgPack.CodeUnkonw, r)
}
}
return err
}
//增加值编码器
func (r *DxRecord) Encode(valuecoder Coders.Encoder) error{
var err error
switch valuecoder.Name() {
case "msgpack":
if msgpacker,ok := valuecoder.(*DxMsgPackEncoder);ok{
return msgpacker.EncodeRecord(r)
}
encoder := valuecoder.(*DxMsgPack.MsgPackEncoder)
maplen := uint(r.Length())
if maplen <= DxMsgPack.Max_fixmap_len{ //fixmap
err = encoder.WriteByte(0x80 | byte(maplen))
}else if maplen <= DxMsgPack.Max_map16_len{
//写入长度
err = encoder.WriteUint16(uint16(maplen),DxMsgPack.CodeMap16)
}else{
if maplen > DxMsgPack.Max_map32_len{
maplen = DxMsgPack.Max_map32_len
}
err = encoder.WriteUint32(uint32(maplen),DxMsgPack.CodeMap32)
}
if err != nil{
return err
}
//写入对象信息,Kv对
if r.fRecords != nil{
for k,v := range r.fRecords{
if err = encoder.EncodeString(k);err!=nil{
return err
}
if v != nil{
err = v.Encode(encoder)
}else{
err = encoder.WriteByte(0xc0) //null
}
if err!=nil{
return err
}
}
}
case "json":
}
return nil
}
func (r *DxRecord)SetBaseValue(keyName string,v *DxBaseValue) {
if v != nil{
switch v.fValueType {
case DVT_RecordIntKey,DVT_Record,DVT_Array:
if v != nil && v.fParent != nil {
panic("Must Set A Single Record(no Parent)")
}
if r.fRecords != nil{
if value, ok := r.fRecords[keyName]; ok && value != nil {
value.ClearValue(true)
value.fParent = nil
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
if v != nil {
r.fRecords[keyName] = v
v.fParent = &r.DxBaseValue
}else{
r.fRecords[keyName] = nil
}
case DVT_Int:
r.SetInt(keyName,(*DxIntValue)(unsafe.Pointer(v)).fvalue)
case DVT_Int32:
r.SetInt32(keyName,(*DxInt32Value)(unsafe.Pointer(v)).fvalue)
case DVT_Int64:
r.SetInt64(keyName,(*DxInt64Value)(unsafe.Pointer(v)).fvalue)
case DVT_Binary:
r.SetBinary(keyName,(*DxBinaryValue)(unsafe.Pointer(v)).fbinary,true,(*DxBinaryValue)(unsafe.Pointer(v)).EncodeType)
case DVT_Ext:
r.SetExtValue(keyName,(*DxExtValue)(unsafe.Pointer(v)).ExtData())
}
}else {
r.SetNull(keyName)
}
}
func (r *DxRecord)SetIntRecordValue(keyName string,v *DxIntKeyRecord) {
if v != nil && v.fParent != nil {
panic("Must Set A Single Record(no Parent)")
}
if r.fRecords != nil{
if value, ok := r.fRecords[keyName]; ok && value != nil {
value.ClearValue(true)
value.fParent = nil
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
if v != nil {
r.fRecords[keyName] = &v.DxBaseValue
v.fParent = &r.DxBaseValue
}else{
r.fRecords[keyName] = nil
}
}
func (r *DxRecord)SetArray(KeyName string,v *DxArray) {
if v != nil && v.fParent != nil {
panic("Must Set A Single Array(no Parent)")
}
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
value.ClearValue(true)
value.fParent = nil
}
}else{
r.fRecords = make(map[string]*DxBaseValue,32)
}
if v!=nil{
r.fRecords[KeyName] = &v.DxBaseValue
v.fParent = &r.DxBaseValue
}else{
r.fRecords[KeyName] = nil
}
}
func (r *DxRecord)AsBaseValue(keyName string)*DxBaseValue{
if r.fRecords != nil{
return r.fRecords[keyName]
}
return nil
}
func (r *DxRecord)SetValue(keyName string,v interface{}) {
if v == nil{
r.SetNull(keyName)
return
}
switch value := v.(type) {
case int: r.SetInt(keyName,value)
case int32: r.SetInt32(keyName,value)
case int64: r.SetInt64(keyName,value)
case int8: r.SetInt(keyName,int(value))
case uint8: r.SetInt(keyName,int(value))
case int16: r.SetInt(keyName,int(value))
case uint16: r.SetInt(keyName,int(value))
case uint32: r.SetInt(keyName,int(value))
case *int: r.SetInt(keyName,*value)
case *int32: r.SetInt32(keyName,*value)
case *int64: r.SetInt64(keyName,*value)
case *int8: r.SetInt(keyName,int(*value))
case *uint8: r.SetInt(keyName,int(*value))
case *int16: r.SetInt(keyName,int(*value))
case *uint16: r.SetInt(keyName,int(*value))
case *uint32: r.SetInt(keyName,int(*value))
case string: r.SetString(keyName,value)
case []byte: r.SetBinary(keyName,value,true,BET_Base64)
case *[]byte: r.SetBinary(keyName,*value,true,BET_Base64)
case bool: r.SetBool(keyName,value)
case *bool: r.SetBool(keyName,*value)
case *string: r.SetString(keyName,*value)
case float32: r.SetFloat(keyName,value)
case float64: r.SetDouble(keyName,value)
case *float32: r.SetFloat(keyName,*value)
case *float64: r.SetDouble(keyName,*value)
case time.Time: r.SetDateTime(keyName,DxCommonLib.Time2DelphiTime(&value))
case *time.Time: r.SetDateTime(keyName,DxCommonLib.Time2DelphiTime(value))
case *DxRecord: r.SetRecordValue(keyName,value)
case DxRecord: r.SetRecordValue(keyName,&value)
case *DxIntKeyRecord: r.SetIntRecordValue(keyName,value)
case DxIntKeyRecord: r.SetIntRecordValue(keyName,&value)
case DxArray: r.SetArray(keyName,&value)
case *DxArray: r.SetArray(keyName,value)
case DxInt64Value: r.SetInt64(keyName,value.fvalue)
case *DxInt64Value: r.SetInt64(keyName,value.fvalue)
case DxInt32Value: r.SetInt32(keyName,value.fvalue)
case *DxInt32Value: r.SetInt32(keyName,value.fvalue)
case DxFloatValue: r.SetFloat(keyName,value.fvalue)
case *DxFloatValue: r.SetFloat(keyName,value.fvalue)
case DxDoubleValue: r.SetDouble(keyName,value.fvalue)
case *DxDoubleValue: r.SetDouble(keyName,value.fvalue)
case DxBoolValue: r.SetBool(keyName,value.fvalue)
case *DxBoolValue: r.SetBool(keyName,value.fvalue)
case DxIntValue: r.SetInt(keyName,value.fvalue)
case *DxIntValue: r.SetInt(keyName,value.fvalue)
case DxStringValue: r.SetString(keyName,value.fvalue)
case *DxStringValue: r.SetString(keyName,value.fvalue)
case DxBinaryValue: r.SetBinary(keyName,value.Bytes(),true,BET_Base64)
case *DxBinaryValue: r.SetBinary(keyName,value.Bytes(),true,BET_Base64)
default:
reflectv := reflect.ValueOf(v)
rv := getRealValue(&reflectv)
if rv == nil{
if r.fRecords != nil{
if _,ok := r.fRecords[keyName];!ok{
r.fRecords[keyName] = nil
}
}
return
}
switch rv.Kind(){
case reflect.Struct:
rec := r.NewRecord(keyName)
rtype := rv.Type()
for i := 0;i < rtype.NumField();i++{
sfield := rtype.Field(i)
fv := rv.Field(i)
fieldvalue := getRealValue(&fv)
if fieldvalue != nil{
switch fieldvalue.Kind() {
case reflect.Int,reflect.Uint32:
rec.SetInt(sfield.Name,int(fieldvalue.Int()))
case reflect.Bool:
rec.SetBool(sfield.Name,fieldvalue.Bool())
case reflect.Int64:
rec.SetInt64(sfield.Name,fieldvalue.Int())
case reflect.Int32,reflect.Int8,reflect.Int16,reflect.Uint8,reflect.Uint16:
rec.SetInt32(sfield.Name,int32(fieldvalue.Int()))
case reflect.Float32:
rec.SetFloat(sfield.Name,float32(fieldvalue.Float()))
case reflect.Float64:
rec.SetDouble(sfield.Name,fieldvalue.Float())
case reflect.String:
rec.SetString(sfield.Name,fieldvalue.String())
default:
if fieldvalue.CanInterface(){
rec.SetValue(sfield.Name,fieldvalue.Interface())
}
}
}
}
case reflect.Map:
mapkeys := rv.MapKeys()
if len(mapkeys) == 0{
return
}
keytype := rv.Type().Key()
var rbase *DxBaseValue
switch getBaseType(keytype) {
case reflect.String:
rbase = &r.NewRecord(keyName).DxBaseValue
case reflect.Int,reflect.Int8,reflect.Int16,reflect.Int32,reflect.Int64,reflect.Uint,reflect.Uint8,reflect.Uint16,reflect.Uint32,reflect.Uint64:
rbase = &r.NewIntRecord(keyName).DxBaseValue
default:
panic("Invalidate Record Key,Can Only Int or String")
}
rvalue := rv.MapIndex(mapkeys[0])
//获得Value类型
valueKind := getBaseType(rvalue.Type())
for _,kv := range mapkeys{
rvalue = rv.MapIndex(kv)
prvalue := getRealValue(&rvalue)
if prvalue != nil{
switch valueKind {
case reflect.Int,reflect.Uint32:
if rbase.fValueType == DVT_Record{
(*DxRecord)(unsafe.Pointer(rbase)).SetInt(kv.String(),int(prvalue.Int()))
}else{
(*DxIntKeyRecord)(unsafe.Pointer(rbase)).SetInt(kv.Int(),int(prvalue.Int()))
}
case reflect.Bool:
if rbase.fValueType == DVT_Record{
(*DxRecord)(unsafe.Pointer(rbase)).SetBool(kv.String(),prvalue.Bool())
}else {
(*DxIntKeyRecord)(unsafe.Pointer(rbase)).SetBool(kv.Int(),prvalue.Bool())
}
case reflect.Int64:
if rbase.fValueType == DVT_Record{
(*DxRecord)(unsafe.Pointer(rbase)).SetInt64(kv.String(),prvalue.Int())
}else{
(*DxIntKeyRecord)(unsafe.Pointer(rbase)).SetInt64(kv.Int(),prvalue.Int())
}
case reflect.Int32,reflect.Int8,reflect.Int16,reflect.Uint8,reflect.Uint16:
if rbase.fValueType == DVT_Record{
(*DxRecord)(unsafe.Pointer(rbase)).SetInt32(kv.String(),int32(prvalue.Int()))
}else{
(*DxIntKeyRecord)(unsafe.Pointer(rbase)).SetInt32(kv.Int(),int32(prvalue.Int()))
}
case reflect.Float32:
if rbase.fValueType == DVT_Record{
(*DxRecord)(unsafe.Pointer(rbase)).SetFloat(kv.String(),float32(prvalue.Float()))
}else{
(*DxIntKeyRecord)(unsafe.Pointer(rbase)).SetFloat(kv.Int(),float32(prvalue.Float()))
}
case reflect.Float64:
if rbase.fValueType == DVT_Record {
(*DxRecord)(unsafe.Pointer(rbase)).SetDouble(kv.String(), prvalue.Float())
}else{
(*DxIntKeyRecord)(unsafe.Pointer(rbase)).SetDouble(kv.Int(), prvalue.Float())
}
case reflect.String:
if rbase.fValueType == DVT_Record {
(*DxRecord)(unsafe.Pointer(rbase)).SetString(kv.String(), prvalue.String())
}else{
(*DxIntKeyRecord)(unsafe.Pointer(rbase)).SetString(kv.Int(), prvalue.String())
}
default:
if prvalue.CanInterface(){
if rbase.fValueType == DVT_Record {
(*DxRecord)(unsafe.Pointer(rbase)).SetValue(kv.String(), prvalue.Interface())
}else{
(*DxIntKeyRecord)(unsafe.Pointer(rbase)).SetValue(kv.Int(), prvalue.Interface())
}
}
}
}
}
case reflect.Slice,reflect.Array:
arr := r.NewArray(keyName)
vlen := rv.Len()
for i := 0;i< vlen;i++{
av := rv.Index(i)
arrvalue := getRealValue(&av)
switch arrvalue.Kind() {
case reflect.Int,reflect.Uint32:
arr.SetInt(i,int(arrvalue.Int()))
case reflect.Bool:
arr.SetBool(i,arrvalue.Bool())
case reflect.Int64:
arr.SetInt64(i,arrvalue.Int())
case reflect.Int32,reflect.Int8,reflect.Int16,reflect.Uint8,reflect.Uint16:
arr.SetInt32(i,int32(arrvalue.Int()))
case reflect.Float32:
arr.SetFloat(i,float32(arrvalue.Float()))
case reflect.Float64:
arr.SetDouble(i,arrvalue.Float())
case reflect.String:
arr.SetString(i,arrvalue.String())
default:
if arrvalue.CanInterface(){
arr.SetValue(i,arrvalue.Interface())
}
}
}
}
}
}
func (r *DxRecord)KeyValueType(KeyName string)DxValueType {
if r.fRecords != nil{
return DVT_Null
}
if value,ok := r.fRecords[KeyName];ok && value != nil{
return value.fValueType
}
return DVT_Null
}
func (r *DxRecord)AsInt32(KeyName string,defavalue int32)int32 {
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
switch value.fValueType {
case DVT_Int: return int32((*DxIntValue)(unsafe.Pointer(value)).fvalue)
case DVT_Int32: return int32((*DxInt32Value)(unsafe.Pointer(value)).fvalue)
case DVT_Int64: return int32((*DxInt64Value)(unsafe.Pointer(value)).fvalue)
case DVT_Bool:
if (*DxBoolValue)(unsafe.Pointer(value)).fvalue{
return 1
}else{
return 0
}
case DVT_Double,DVT_DateTime:return int32((*DxDoubleValue)(unsafe.Pointer(value)).fvalue)
case DVT_Float:return int32((*DxFloatValue)(unsafe.Pointer(value)).fvalue)
case DVT_String:
v,err := strconv.ParseInt((*DxStringValue)(unsafe.Pointer(value)).fvalue,0,0)
if err != nil{
panic(err)
}else{
return int32(v)
}
default:
panic("can not convert Type to int32")
}
}
}
return defavalue
}
func (r *DxRecord)AsInt32ByPath(path string,defavalue int32)int32 {
parentBase,keyName := r.findPathNode(path)
if parentBase != nil && keyName != ""{
switch parentBase.fValueType {
case DVT_Record:
return (*DxRecord)(unsafe.Pointer(parentBase)).AsInt32(keyName,defavalue)
case DVT_RecordIntKey:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
return (*DxIntKeyRecord)(unsafe.Pointer(parentBase)).AsInt32(intkey,defavalue)
}else{
panic(err)
}
case DVT_Array:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
if values := (*DxArray)(unsafe.Pointer(parentBase)).fValues;values != nil{
if intkey >= 0 && intkey < int64(len(values)){
v,err := values[intkey].AsInt32()
if err != nil{
panic(err)
}
return v
}else{
panic("array Index out of bounds")
}
}
}else{
panic(err)
}
default:
panic("Path not A Parent Node")
}
}
return defavalue
}
func (r *DxRecord)AsIntByPath(path string,defavalue int)int {
parentBase,keyName := r.findPathNode(path)
if parentBase != nil && keyName != ""{
switch parentBase.fValueType {
case DVT_Record:
return (*DxRecord)(unsafe.Pointer(parentBase)).AsInt(keyName,defavalue)
case DVT_RecordIntKey:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
return (*DxIntKeyRecord)(unsafe.Pointer(parentBase)).AsInt(intkey,defavalue)
}else{
panic(err)
}
case DVT_Array:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
if values := (*DxArray)(unsafe.Pointer(parentBase)).fValues;values != nil{
if intkey >= 0 && intkey < int64(len(values)){
v,err := values[intkey].AsInt()
if err != nil{
panic(err)
}
return v
}else{
panic("array Index out of bounds")
}
}
}else{
panic(err)
}
default:
panic("Path not A Parent Node")
}
}
return defavalue
}
func (r *DxRecord)AsInt(KeyName string,defavalue int)int {
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
switch value.fValueType {
case DVT_Int: return (*DxIntValue)(unsafe.Pointer(value)).fvalue
case DVT_Int32: return int((*DxInt32Value)(unsafe.Pointer(value)).fvalue)
case DVT_Int64: return int((*DxInt64Value)(unsafe.Pointer(value)).fvalue)
case DVT_Bool:
if (*DxBoolValue)(unsafe.Pointer(value)).fvalue{
return 1
}else{
return 0
}
case DVT_Double,DVT_DateTime:return int((*DxDoubleValue)(unsafe.Pointer(value)).fvalue)
case DVT_Float:return int((*DxFloatValue)(unsafe.Pointer(value)).fvalue)
case DVT_String:
v,err := strconv.Atoi((*DxStringValue)(unsafe.Pointer(value)).fvalue)
if err != nil{
panic(err)
}else{
return v
}
default:
panic("can not convert Type to int")
}
}
}
return defavalue
}
func (r *DxRecord)AsInt64ByPath(path string,defavalue int64)int64 {
parentBase,keyName := r.findPathNode(path)
if parentBase != nil && keyName != ""{
switch parentBase.fValueType {
case DVT_Record:
return (*DxRecord)(unsafe.Pointer(parentBase)).AsInt64(keyName,defavalue)
case DVT_RecordIntKey:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
return (*DxIntKeyRecord)(unsafe.Pointer(parentBase)).AsInt64(intkey,defavalue)
}else{
panic(err)
}
case DVT_Array:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
if values := (*DxArray)(unsafe.Pointer(parentBase)).fValues;values != nil{
if intkey >= 0 && intkey < int64(len(values)){
v,err := values[intkey].AsInt64()
if err != nil{
panic(err)
}
return v
}else{
panic("array Index out of bounds")
}
}
}else{
panic(err)
}
default:
panic("Path not A Parent Node")
}
}
return defavalue
}
func (r *DxRecord)AsInt64(KeyName string,defavalue int64)int64 {
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
switch value.fValueType {
case DVT_Int: return int64((*DxIntValue)(unsafe.Pointer(value)).fvalue)
case DVT_Int32: return int64((*DxInt32Value)(unsafe.Pointer(value)).fvalue)
case DVT_Int64: return int64((*DxInt64Value)(unsafe.Pointer(value)).fvalue)
case DVT_Bool:
if (*DxBoolValue)(unsafe.Pointer(value)).fvalue{
return 1
}else{
return 0
}
case DVT_Double,DVT_DateTime:return int64((*DxDoubleValue)(unsafe.Pointer(value)).fvalue)
case DVT_Float:return int64((*DxFloatValue)(unsafe.Pointer(value)).fvalue)
case DVT_String:
v,err := strconv.ParseInt((*DxStringValue)(unsafe.Pointer(value)).fvalue,0,0)
if err != nil{
panic(err)
}else{
return v
}
default:
panic("can not convert Type to int64")
}
}
}
return defavalue
}
func (r *DxRecord)AsBoolByPath(path string,defavalue bool)bool {
parentBase,keyName := r.findPathNode(path)
if parentBase != nil && keyName != ""{
switch parentBase.fValueType {
case DVT_Record:
return (*DxRecord)(unsafe.Pointer(parentBase)).AsBool(keyName,defavalue)
case DVT_RecordIntKey:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
return (*DxIntKeyRecord)(unsafe.Pointer(parentBase)).AsBool(intkey,defavalue)
}else{
panic(err)
}
case DVT_Array:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
if values := (*DxArray)(unsafe.Pointer(parentBase)).fValues;values != nil{
if intkey >= 0 && intkey < int64(len(values)){
v,err := values[intkey].AsBool()
if err != nil{
panic(err)
}
return v
}else{
panic("array Index out of bounds")
}
}
}else{
panic(err)
}
default:
panic("Path not A Parent Node")
}
}
return defavalue
}
func (r *DxRecord)AsBool(KeyName string,defavalue bool)bool {
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
switch value.fValueType {
case DVT_Int: return (*DxIntValue)(unsafe.Pointer(value)).fvalue != 0
case DVT_Int32: return (*DxInt32Value)(unsafe.Pointer(value)).fvalue != 0
case DVT_Int64: return (*DxInt64Value)(unsafe.Pointer(value)).fvalue != 0
case DVT_Bool: return bool((*DxBoolValue)(unsafe.Pointer(value)).fvalue)
case DVT_Double,DVT_DateTime:return float64((*DxDoubleValue)(unsafe.Pointer(value)).fvalue) != 0
case DVT_Float:return float32((*DxFloatValue)(unsafe.Pointer(value)).fvalue) != 0
case DVT_String:
return strings.ToUpper((*DxStringValue)(unsafe.Pointer(value)).fvalue) == "TRUE"
default:
panic("can not convert Type to Bool")
}
}
}
return defavalue
}
func (r *DxRecord)AsFloatByPath(path string,defavalue float32)float32 {
parentBase,keyName := r.findPathNode(path)
if parentBase != nil && keyName != ""{
switch parentBase.fValueType {
case DVT_Record:
return (*DxRecord)(unsafe.Pointer(parentBase)).AsFloat(keyName,defavalue)
case DVT_RecordIntKey:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
return (*DxIntKeyRecord)(unsafe.Pointer(parentBase)).AsFloat(intkey,defavalue)
}else{
panic(err)
}
case DVT_Array:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
if values := (*DxArray)(unsafe.Pointer(parentBase)).fValues;values != nil{
if intkey >= 0 && intkey < int64(len(values)){
v,err := values[intkey].AsFloat()
if err != nil{
panic(err)
}
return v
}else{
panic("array Index out of bounds")
}
}
}else{
panic(err)
}
default:
panic("Path not A Parent Node")
}
}
return defavalue
}
func (r *DxRecord)AsFloat(KeyName string,defavalue float32)float32 {
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
switch value.fValueType {
case DVT_Int: return float32((*DxIntValue)(unsafe.Pointer(value)).fvalue)
case DVT_Int32: return float32((*DxInt32Value)(unsafe.Pointer(value)).fvalue)
case DVT_Int64: return float32((*DxInt64Value)(unsafe.Pointer(value)).fvalue)
case DVT_Bool:
if (*DxBoolValue)(unsafe.Pointer(value)).fvalue{
return 1
}
return 0
case DVT_String: {
v,e := strconv.ParseFloat((*DxStringValue)(unsafe.Pointer(value)).fvalue,2)
if e == nil{
return float32(v)
}
panic("can not convert Type to Float")
}
case DVT_Double,DVT_DateTime:return float32((*DxDoubleValue)(unsafe.Pointer(value)).fvalue)
case DVT_Float:return (*DxFloatValue)(unsafe.Pointer(value)).fvalue
default:
panic("can not convert Type to Float")
}
}
}
return defavalue
}
func (r *DxRecord)AsDoubleByPath(path string,defavalue float64)float64 {
parentBase,keyName := r.findPathNode(path)
if parentBase != nil && keyName != ""{
switch parentBase.fValueType {
case DVT_Record:
return (*DxRecord)(unsafe.Pointer(parentBase)).AsDouble(keyName,defavalue)
case DVT_RecordIntKey:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
return (*DxIntKeyRecord)(unsafe.Pointer(parentBase)).AsDouble(intkey,defavalue)
}else{
panic(err)
}
case DVT_Array:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
if values := (*DxArray)(unsafe.Pointer(parentBase)).fValues;values != nil{
if intkey >= 0 && intkey < int64(len(values)){
v,err := values[intkey].AsDouble()
if err != nil{
panic(err)
}
return v
}else{
panic("array Index out of bounds")
}
}
}else{
panic(err)
}
default:
panic("Path not A Parent Node")
}
}
return defavalue
}
func (r *DxRecord)AsDouble(KeyName string,defavalue float64)float64 {
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
switch value.fValueType {
case DVT_Int: return float64((*DxIntValue)(unsafe.Pointer(value)).fvalue)
case DVT_Int32: return float64((*DxInt32Value)(unsafe.Pointer(value)).fvalue)
case DVT_Int64: return float64((*DxInt64Value)(unsafe.Pointer(value)).fvalue)
case DVT_Bool:
if (*DxBoolValue)(unsafe.Pointer(value)).fvalue{
return 1
}
return 0
case DVT_String: {
v,e := strconv.ParseFloat((*DxStringValue)(unsafe.Pointer(value)).fvalue,2)
if e == nil{
return v
}
panic("can not convert Type to Double")
}
case DVT_Double:return float64((*DxDoubleValue)(unsafe.Pointer(value)).fvalue)
case DVT_Float,DVT_DateTime:return float64((*DxFloatValue)(unsafe.Pointer(value)).fvalue)
default:
panic("can not convert Type to Double")
}
}
}
return defavalue
}
func (r *DxRecord)AsStringByPath(path string,defavalue string)string {
parentBase,keyName := r.findPathNode(path)
if parentBase != nil && keyName != ""{
switch parentBase.fValueType {
case DVT_Record:
return (*DxRecord)(unsafe.Pointer(parentBase)).AsString(keyName,defavalue)
case DVT_RecordIntKey:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
return (*DxIntKeyRecord)(unsafe.Pointer(parentBase)).AsString(intkey,defavalue)
}else{
panic(err)
}
case DVT_Array:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
if values := (*DxArray)(unsafe.Pointer(parentBase)).fValues;values != nil{
if intkey >= 0 && intkey < int64(len(values)){
return values[intkey].AsString()
}else{
panic("array Index out of bounds")
}
}
}else{
panic(err)
}
default:
panic("Path not A Parent Node")
}
}
return defavalue
}
func (r *DxRecord)AsString(KeyName string,defavalue string)string {
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
return value.ToString()
}
}
return defavalue
}
func (r *DxRecord)AsRecordByPath(path string)*DxRecord {
parentBase,keyName := r.findPathNode(path)
if parentBase != nil && keyName != ""{
switch parentBase.fValueType {
case DVT_Record:
return (*DxRecord)(unsafe.Pointer(parentBase)).AsRecord(keyName)
case DVT_RecordIntKey:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
return (*DxIntKeyRecord)(unsafe.Pointer(parentBase)).AsRecord(intkey)
}else{
panic(err)
}
case DVT_Array:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
if values := (*DxArray)(unsafe.Pointer(parentBase)).fValues;values != nil{
if intkey >= 0 && intkey < int64(len(values)){
v,err := values[intkey].AsRecord()
if err != nil{
panic(err)
}
return v
}else{
panic("array Index out of bounds")
}
}
}else{
panic(err)
}
default:
panic("Path not A Parent Node")
}
}
return nil
}
func (r *DxRecord)AsRecord(KeyName string)*DxRecord {
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
if value.fValueType == DVT_Record{
return (*DxRecord)(unsafe.Pointer(value))
}
panic("not Record Value")
}
}
return nil
}
func (r *DxRecord)AsIntRecord(KeyName string)*DxIntKeyRecord {
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
if value.fValueType == DVT_RecordIntKey{
return (*DxIntKeyRecord)(unsafe.Pointer(value))
}
panic("not Record Value")
}
}
return nil
}
func (r *DxRecord)AsIntRecordByPath(path string)*DxIntKeyRecord {
parentBase,keyName := r.findPathNode(path)
if parentBase != nil && keyName != ""{
switch parentBase.fValueType {
case DVT_Record:
return (*DxRecord)(unsafe.Pointer(parentBase)).AsIntRecord(keyName)
case DVT_RecordIntKey:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
return (*DxIntKeyRecord)(unsafe.Pointer(parentBase)).AsIntRecord(intkey)
}else{
panic(err)
}
case DVT_Array:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
if values := (*DxArray)(unsafe.Pointer(parentBase)).fValues;values != nil{
if intkey >= 0 && intkey < int64(len(values)){
v,err := values[intkey].AsIntRecord()
if err != nil{
panic(err)
}
return v
}else{
panic("array Index out of bounds")
}
}
}else{
panic(err)
}
default:
panic("Path not A Parent Node")
}
}
return nil
}
func (r *DxRecord)Clone()*DxRecord {
result := NewRecord()
result.PathSplitChar = r.PathSplitChar
if r.fRecords != nil{
for k,v := range r.fRecords{
vbase := v.Clone()
vbase.fParent = &result.DxBaseValue
result.fRecords[k] = vbase
}
}
return result
}
func (r *DxRecord)AsArray(KeyName string)*DxArray {
if r.fRecords != nil{
if value,ok := r.fRecords[KeyName];ok && value != nil{
if value.fValueType == DVT_Array{
return (*DxArray)(unsafe.Pointer(value))
}
panic("not Array Value")
}
}
return nil
}
func (r *DxRecord)AsArrayByPath(path string)*DxArray {
parentBase,keyName := r.findPathNode(path)
if parentBase != nil && keyName != ""{
switch parentBase.fValueType {
case DVT_Record:
return (*DxRecord)(unsafe.Pointer(parentBase)).AsArray(keyName)
case DVT_RecordIntKey:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
return (*DxIntKeyRecord)(unsafe.Pointer(parentBase)).AsArray(intkey)
}else{
panic(err)
}
case DVT_Array:
if intkey,err := strconv.ParseInt(keyName,10,64);err == nil{
if values := (*DxArray)(unsafe.Pointer(parentBase)).fValues;values != nil{
if intkey >= 0 && intkey < int64(len(values)){
v,err := values[intkey].AsArray()
if err != nil{
panic(err)
}
return v
}else{
panic("array Index out of bounds")
}
}
}else{
panic(err)
}
default:
panic("Path not A Parent Node")
}
}
return nil
}
func (r *DxRecord)Length()int {
if r.fRecords != nil{
return len(r.fRecords)
}
return 0
}
func (r *DxRecord)Contains(keyName string)bool {
if r.fRecords != nil{
if vr,vk := r.findPathNode(keyName);vr!=nil{
switch vr.fValueType {
case DVT_Record:
_,ok := (*DxRecord)(unsafe.Pointer(vr)).fRecords[vk]
return ok
case DVT_RecordIntKey:
if intkey,err := strconv.ParseInt(vk,10,64);err!=nil{
return false
}else{
_,ok := (*DxIntKeyRecord)(unsafe.Pointer(vr)).fRecords[intkey]
return ok
}
case DVT_Array:
if intkey,err := strconv.ParseInt(vk,10,64);err!=nil{
return false
}else{
arr := (*DxArray)(unsafe.Pointer(vr))
return arr.fValues != nil && intkey >= 0 && intkey < int64(len(arr.fValues))
}
}
}
}
return false
}
func (r *DxRecord)Remove(keyOrPath string) {
if r.fRecords != nil{
if vr,vk := r.findPathNode(keyOrPath);vr!=nil{
switch vr.fValueType {
case DVT_Record:
if v,ok := (*DxRecord)(unsafe.Pointer(vr)).fRecords[vk];ok{
v.ClearValue(true)
v.fParent = nil
delete((*DxRecord)(unsafe.Pointer(vr)).fRecords,vk)
}
case DVT_RecordIntKey:
if intkey,err := strconv.ParseInt(vk,10,64);err!=nil{
panic(err)
}else if v,ok := (*DxIntKeyRecord)(unsafe.Pointer(vr)).fRecords[intkey];ok{
v.ClearValue(true)
v.fParent = nil
delete((*DxIntKeyRecord)(unsafe.Pointer(vr)).fRecords,intkey)
}
case DVT_Array:
if intkey,err := strconv.ParseInt(vk,10,64);err!=nil{
panic(err)
}else{
arr := (*DxArray)(unsafe.Pointer(vr))
arr.Delete(int(intkey))
}
}
}
}
}
func (r *DxRecord)Delete(key string) {
if r.fRecords != nil{
if v,ok := r.fRecords[key];ok{
v.ClearValue(true)
v.fParent = nil
delete(r.fRecords,key)
}
}
}
func (r *DxRecord)Range(iteafunc func(keyName string,value *DxBaseValue,params ...interface{})bool,params ...interface{}){
if r.fRecords != nil && iteafunc!=nil{
for k,v := range r.fRecords{
if !iteafunc(k,v,params...){
return
}
}
}
}
func (r *DxRecord)ToString()string {
return DxCommonLib.FastByte2String(r.Bytes())
}
func (r *DxRecord)parserValue(keyName string, b []byte,ConvertEscape,structRest bool)(parserlen int, err error) {
blen := len(b)
i := 0
valuestart := -1
validCharIndex := -1
startValue := false
for i<blen {
if !IsSpace(b[i]){
switch b[i] {
case ':':
startValue = true
//valuestart = i //自己记录有效的开始位置,和有效的结束位置,省去一个trim
case '{':
var rec DxRecord
rec.PathSplitChar = r.PathSplitChar
rec.fValueType = DVT_Record
rec.fRecords = make(map[string]*DxBaseValue,32)
if parserlen,err = rec.JsonParserFromByte(b[i:blen],ConvertEscape,structRest);err == nil{
r.SetRecordValue(keyName,&rec)
}
parserlen+=i+1 //会多解析一个{
return
case '[':
var arr DxArray
arr.fValueType = DVT_Array
if parserlen,err = arr.JsonParserFromByte(b[i:],ConvertEscape,structRest);err == nil{
r.SetArray(keyName,&arr)
}
parserlen+=i+1
return
case ',','}':
var bvalue []byte
if validCharIndex == -1 {
bvalue = bytes.Trim(b[valuestart:i]," \r\n\t")
}else{
bvalue = b[valuestart: validCharIndex+1]
}
if len(bvalue) == 0{
return i,ErrInvalidateJson
}
if bytes.IndexByte(bvalue,'.') > -1{
if vf,err := strconv.ParseFloat(DxCommonLib.FastByte2String(bvalue),64);err!=nil{
return i,ErrInvalidateJson
}else{
r.SetDouble(keyName,vf)
}
}else {
st := DxCommonLib.FastByte2String(bvalue)
if st == "true" || strings.ToUpper(st) == "TRUE"{
r.SetBool(keyName,true)
}else if st == "false" || strings.ToUpper(st) == "FALSE"{
r.SetBool(keyName,false)
}else if st == "null" || strings.ToUpper(st) == "NULL"{
r.SetNull(keyName)
}else{
if vf,err := strconv.Atoi(st);err!=nil{
return i,ErrInvalidateJson
}else{
r.SetInt(keyName,vf)
}
}
}
return i,nil
case '"': //string
plen := bytes.IndexByte(b[i+1:blen],'"')
//还需要判断一下前一个字符,防止\"转义
if plen > -1{
for{
if b[i+plen]=='\\'{ //查找到的是\"
//需要判断转义
oldp := i+plen
willCheckBefore := false
//判断下一个字符,是否是结束的字符
for k := oldp+2;k<blen;k++{
if !IsSpace(b[k]){
if b[k] == ',' || b[k] == ']' || b[k] == '}'{
break
}else{
willCheckBefore = true
break
}
}else{
//判断前面一系列是否是正常的转义
willCheckBefore = true
break
}
}
if willCheckBefore{
escapcount := 0
for k := oldp - 1;k > i;k--{
if b[k] == '\\'{
escapcount ++
}else{
break
}
}
if escapcount % 2 == 0{ //是转义字符,然后还需要判断后面一个"
plen = bytes.IndexByte(b[oldp+2:blen],'"')
if plen < 0{
return oldp+2,ErrInvalidateJson
}
plen += oldp
}else{
return oldp,ErrInvalidateJson
}
}else{
break
}
}else{
//非转义字符,那么就需要判定
for k := i+plen+2;k<blen;k++{
if !IsSpace(b[k]){
if b[k] == ',' || b[k] == ']' || b[k] == '}' {
break
}else{
return i+plen+2,ErrInvalidateJson
}
}
}
break
}
}
bvalue := b[i+1:plen+i+1]
st := ""
if ConvertEscape{
st = DxCommonLib.ParserEscapeStr(bvalue)
jt := DxCommonLib.ParserJsonTime(st)
if jt >= 0{
r.SetDateTime(keyName,jt)
return plen + i + 2,nil
}
}else{
st = DxCommonLib.FastByte2String(bvalue)
}
r.SetString(keyName,st)
return plen + i + 2,nil
}
return i,ErrInvalidateJson
default:
if !startValue && valuestart == -1{
return i,ErrInvalidateJson
}
if valuestart == -1{
valuestart = i
startValue = false
}else{
validCharIndex = i
}
}
}
i += 1
}
return blen,ErrInvalidateJson
}
func (r *DxRecord)LoadJsonFile(fileName string,ConvertEscape,structRest bool)error {
databytes, err := ioutil.ReadFile(fileName)
if err != nil {
return err
}
if databytes[0] == 0xEF && databytes[1] == 0xBB && databytes[2] == 0xBF{//BOM
databytes = databytes[3:]
}
_,err = r.JsonParserFromByte(databytes,ConvertEscape,structRest)
return err
}
func (r *DxRecord)SaveJsonWriter(w io.Writer)error {
writer := bufio.NewWriter(w)
err := writer.WriteByte('{')
if err != nil{
return err
}
isFirst := true
if r.fRecords != nil{
for k,v := range r.fRecords{
if !isFirst{
_,err = writer.WriteString(`,"`)
}else{
isFirst = false
err = writer.WriteByte('"')
}
if err != nil{
return err
}
_,err = writer.WriteString(k)
if err!=nil{
return err
}
_, err = writer.WriteString(`":`)
if err!=nil{
return err
}
if v != nil{
vt := v.fValueType
if vt == DVT_String || vt == DVT_Binary || vt == DVT_DateTime{
err = writer.WriteByte('"')
}
if err != nil{
return err
}
if vt == DVT_DateTime{
_,err = writer.WriteString("/Date(")
_,err = writer.WriteString(strconv.Itoa(int(DxCommonLib.TDateTime((*DxDoubleValue)(unsafe.Pointer(v)).fvalue).ToTime().Unix())*1000))
_,err = writer.WriteString(")/")
}else{
_,err = writer.WriteString(v.ToString())
}
if err == nil && (vt == DVT_String || vt == DVT_Binary || vt == DVT_DateTime) {
err = writer.WriteByte('"')
}
}else{
_,err = writer.WriteString("null")
}
if err != nil{
return err
}
}
}
writer.WriteByte('}')
err = writer.Flush()
return err
}
func (r *DxRecord)SaveJsonFile(fileName string,BOMFile bool)error {
if file,err := os.OpenFile(fileName,os.O_CREATE | os.O_TRUNC,0644);err == nil{
defer file.Close()
if BOMFile{
file.Write([]byte{0xEF,0xBB,0xBF})
}
return r.SaveJsonWriter(file)
}else{
return err
}
}
func (r *DxRecord)LoadJsonReader(reader io.Reader)error {
return nil
}
func (r *DxRecord)SaveMsgPackFile(fileName string)error {
if file,err := os.OpenFile(fileName,os.O_CREATE | os.O_TRUNC,0644);err == nil{
defer file.Close()
return NewEncoder(file).EncodeRecord(r)
}else{
return err
}
}
func (r *DxRecord)LoadMsgPackReader(reader io.Reader)error {
return NewDecoder (reader).Decode(&r.DxBaseValue)
}
func (r *DxRecord)LoadIni(iniFile string)error {
if file, err := os.Open(iniFile); err == nil {
defer file.Close()
var bt [3]byte
filecodeType := DxCommonLib.File_Code_Unknown
if _,err := file.Read(bt[:3]);err==nil{
if bt[0] == 0xFF && bt[1] == 0xFE { //UTF-16(Little Endian)
file.Seek(-1,io.SeekCurrent)
filecodeType = DxCommonLib.File_Code_Utf16LE
}else if bt[0] == 0xFE && bt[1] == 0xFF{ //UTF-16(big Endian)
file.Seek(-1,io.SeekCurrent)
filecodeType = DxCommonLib.File_Code_Utf16BE
}else if bt[0] == 0xEF && bt[1] == 0xBB && bt[2] == 0xBF { //UTF-8
filecodeType = DxCommonLib.File_Code_Utf8
}else{
file.Seek(-3,io.SeekCurrent)
}
}
decoder := NewIniDecoder(bufio.NewReader(file),filecodeType)
return decoder.Decode(r)
}else{
return err
}
}
func (r *DxRecord)Encode2Ini()[]byte {
if r.fRecords != nil && len(r.fRecords) > 0{
var buffer bytes.Buffer
for k,v := range r.fRecords{
if v != nil && v.fValueType == DVT_Record{
buffer.WriteByte('[')
buffer.WriteString(k)
buffer.WriteByte(']')
record := (*DxRecord)(unsafe.Pointer(v))
for key,value := range record.fRecords{
buffer.WriteString(key)
buffer.WriteByte('=')
buffer.WriteString(value.ToString())
}
}
}
return buffer.Bytes()
}
return nil
}
func (r *DxRecord)LoadMsgPackFile(fileName string)error {
f, err := os.Open(fileName)
if err != nil {
return err
}
defer f.Close()
return NewDecoder (f).Decode(&r.DxBaseValue)
}
func (r *DxRecord)JsonParserFromByte(JsonByte []byte,ConvertEscape,structRest bool)(parserlen int, err error) {
i := 0
if structRest{
r.ClearValue(false)
}
objStart := false
keyStart := false
btlen := len(JsonByte)
plen := -1
keyName := ""
for i < btlen{
if IsSpace(JsonByte[i]){
i++
continue
}
if !objStart && JsonByte[i] != '{' {
return 0,ErrInvalidateJson
}
switch JsonByte[i]{
case '{':
objStart = true
keyStart = true
case '}':
if keyStart && !objStart {
return i,ErrInvalidateJson
}
objStart = false
return i,nil
case '"': //keyName
if keyStart{
//获取string
plen = bytes.IndexByte(JsonByte[i+1:btlen],'"')
if plen > -1{
keyName = DxCommonLib.FastByte2String(JsonByte[i+1:i+1+plen])
}
i += plen+2
keyStart = false
//解析Value
if ilen,err := r.parserValue(keyName,JsonByte[i:btlen],ConvertEscape,structRest);err!=nil{
return ilen + i,err
}else{
i += ilen
continue
}
}
case ',': //next key
if keyStart{
return i,ErrInvalidateJson
}
keyStart = true
case ':': //value
if keyStart || objStart{
return i,ErrInvalidateJson
}
case '[':
if objStart || keyStart{
return i,ErrInvalidateJson
}
objStart = false
case ']':
if objStart || keyStart{
return i,ErrInvalidateJson
}
default:
}
i+=1
}
return btlen,ErrInvalidateJson
}
func NewRecord()*DxRecord {
result := new(DxRecord)
result.PathSplitChar = DefaultPathSplit
result.fValueType = DVT_Record
result.fRecords = make(map[string]*DxBaseValue,32)
return result
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/dxsoft/DxValue.git
git@gitee.com:dxsoft/DxValue.git
dxsoft
DxValue
DxValue
master

搜索帮助

23e8dbc6 1850385 7e0993f3 1850385