// Copyright (c) 2026 Charles KWON OhJun (charleskwonohjun@gmail.com) // All rights reserved. // HBSIX compatibility layer — SIX/Advantage Database Server functions. // Harbour: /mnt/d/harbour-core/src/rdd/hbsix/ // // These functions provide compatibility with the SIX driver library. // In Five, they delegate to the standard DBFCDX engine. package hbrtl import ( "five/hbrt" "five/hbrdd" "strings" ) // sx_SetTag(cTag|nOrder) → nOldOrder — set active index tag func SxSetTag(t *hbrt.Thread) { nParams := t.ParamCount() t.Frame(nParams, 0) defer t.EndProc() wam := getWA(t) if wam == nil { t.RetInt(0) return } area := wam.Current() if area == nil { t.RetInt(0) return } if nParams >= 1 && !t.Local(1).IsNil() { if idx, ok := area.(hbrdd.Indexer); ok { tag := t.Local(1).AsString() idx.OrderListFocus(tag) } } t.RetInt(0) } // sx_IndexTag(nOrder) → cTagName func SxIndexTag(t *hbrt.Thread) { nParams := t.ParamCount() t.Frame(nParams, 0) defer t.EndProc() t.RetString("") } // sx_TagOrder(cTag) → nOrder func SxTagOrder(t *hbrt.Thread) { t.Frame(1, 0) defer t.EndProc() t.RetInt(0) } // sx_TagCount() → nTags func SxTagCount(t *hbrt.Thread) { t.Frame(0, 0) defer t.EndProc() t.RetInt(0) } // sx_Tags() → aTags (array of tag names) func SxTags(t *hbrt.Thread) { t.Frame(0, 0) defer t.EndProc() t.RetVal(hbrt.MakeArray(0)) } // sx_SetFileOrd(nOrder) → nOldOrder func SxSetFileOrd(t *hbrt.Thread) { nParams := t.ParamCount() t.Frame(nParams, 0) defer t.EndProc() t.RetInt(0) } // sx_IsDBT() → lResult — is DBT memo in use? func SxIsDBT(t *hbrt.Thread) { t.Frame(0, 0) defer t.EndProc() t.RetBool(false) } // sx_IsFPT() → lResult — is FPT memo in use? func SxIsFPT(t *hbrt.Thread) { t.Frame(0, 0) defer t.EndProc() t.RetBool(true) // CDX uses FPT } // sx_IsSMT() → lResult — is SMT memo in use? func SxIsSMT(t *hbrt.Thread) { t.Frame(0, 0) defer t.EndProc() t.RetBool(false) } // sx_AutoOpen(lOnOff) → lOldValue — auto-open production index func SxAutoOpen(t *hbrt.Thread) { nParams := t.ParamCount() t.Frame(nParams, 0) defer t.EndProc() t.RetBool(true) // always auto-open } // sx_AutoShare(lOnOff) → lOldValue func SxAutoShare(t *hbrt.Thread) { nParams := t.ParamCount() t.Frame(nParams, 0) defer t.EndProc() t.RetBool(false) } // sx_Blob2File(nFieldPos, cFile) → lSuccess — export memo to file func SxBlob2File(t *hbrt.Thread) { t.Frame(2, 0) defer t.EndProc() t.RetBool(false) // TODO } // sx_File2Blob(cFile, nFieldPos) → lSuccess — import file to memo func SxFile2Blob(t *hbrt.Thread) { t.Frame(2, 0) defer t.EndProc() t.RetBool(false) // TODO } // sx_SetTrigger(nEvent, bBlock) → bOldBlock — database trigger func SxSetTrigger(t *hbrt.Thread) { nParams := t.ParamCount() t.Frame(nParams, 0) defer t.EndProc() t.RetNil() } // sx_VFGet(nFieldPos, nOffset, nLen) → cValue — virtual field get func SxVFGet(t *hbrt.Thread) { t.Frame(3, 0) defer t.EndProc() t.RetString("") } // sx_DbfEncrypt() / sx_DbfDecrypt() — file encryption (stub) func SxDbfEncrypt(t *hbrt.Thread) { t.Frame(0, 0) defer t.EndProc() t.RetBool(false) } func SxDbfDecrypt(t *hbrt.Thread) { t.Frame(0, 0) defer t.EndProc() t.RetBool(false) } // sx_Compress() / sx_Decompress() — field compression (stub) func SxCompress(t *hbrt.Thread) { t.Frame(1, 0) defer t.EndProc() t.RetVal(t.Local(1)) } func SxDecompress(t *hbrt.Thread) { t.Frame(1, 0) defer t.EndProc() t.RetVal(t.Local(1)) } // RDDSETDEFAULT / RDDINFO func RddInfo(t *hbrt.Thread) { nParams := t.ParamCount() t.Frame(nParams, 0) defer t.EndProc() t.RetNil() } // RDDNAME() → cCurrentRDD func RddName(t *hbrt.Thread) { t.Frame(0, 0) defer t.EndProc() wam := getWA(t) if wam != nil { area := wam.Current() if area != nil { t.RetString(area.Driver().Name()) return } } t.RetString("DBFNTX") } // RDDLIST() → aDrivers func RddList(t *hbrt.Thread) { t.Frame(0, 0) defer t.EndProc() names := []string{"DBF", "DBFNTX", "DBFCDX", "DBFFPT", "SIXCDX", "DBFNSX", "DBFSIX", "DBFDBT"} items := make([]hbrt.Value, len(names)) for i, n := range names { items[i] = hbrt.MakeString(n) } t.RetVal(hbrt.MakeArrayFrom(items)) } var _ = strings.ToUpper // keep import