PROCEDURE SaveData
LPARAMETERS tcAlias, tnMode, tlForce
tlForce = IIF(PARAMETERS()<3, .T., tlForce) && Default to .T.
tnMode = IIF(VARTYPE(tnMode)='N',tnMode,2) && Default to 2
IF ( CURSORGETPROP("Buffering",tcAlias)>1 )
logmodification(tcAlias)
RETURN ( TABLEUPDATE(tnMode,tlForce,tcAlias) )
endif
Procedure _XMLUPDATEGRAM
Lparameters tcAlias
Local lnRec As Integer, Operation As String, ;
tablename As String, lcUpdateGramXml As String, ;
ix as integer, jx as Integer
LOCAL ARRAY arrStruc[1]
Select(tcAlias)
Locate
Afields(arrStruc) && Afields return 16 columns
LOCAL ARRAY arrDataGram[ALEN(arrStruc,1)+2,ALEN(arrStruc,2)]
* Fill first 2 rows from first row of arrStruc
ACOPY(arrStruc,arrDataGram,1,ALEN(arrStruc,2),1)
ACOPY(arrStruc,arrDataGram,1,ALEN(arrStruc,2),ALEN(arrStruc,2)+1)
* Fill rest with arrStruc
ACOPY(arrStruc,arrDataGram,1,-1,ALEN(arrStruc,2)*2+1)
* Modify name and types for first 2 rows
arrDataGram[1,1]="Tablename"
arrDataGram[1,2]="C"
arrDataGram[1,3]=30
arrDataGram[1,4]=0
arrDataGram[2,1]="Operation"
arrDataGram[2,2]="C"
arrDataGram[2,3]=10
arrDataGram[2,4]=0
FOR ix=1 TO 2 && Clear out data like database name, default
FOR jx = 7 TO 16
arrDataGram[ix,jx] = ""
endfor
endfor
Create Cursor _DataGram_ From Array arrDataGram
m.tablename = Upper(tcAlias)
Select (tcAlias)
lnRec = 0
Do While .T.
lnRec=Getnextmodified(lnRec,tcAlias,.T.)
If lnRec=0
Exit
Endif
Go lnRec
Scatter MEMVAR memo
Do Case
Case Deleted()
m.Operation = "DELETED"
Case lnRec>0
m.Operation = "UPDATED"
Case lnRec<0
m.Operation = "INSERTED"
Otherwise
Exit
Endcase
Insert Into _DataGram_ From MEMVAR
Enddo
Select _DataGram_
Cursortoxml('_datagram_','lcUpdateGramXml',2,0,0,"")
Use In '_DataGram_'
Return lcUpdateGramXml
Procedure LogModification
Lparameters tcAlias
Local lcAlias
lcAlias = Alias()
If !(CursorGetProp("Buffering",tcAlias)>1 And Set("Multilocks")='ON')
Return
Endif
Local lcXML As String, oZipper As 'Zipit' Of 'Zipper.prg'
lcXML = _XMLUPDATEGRAM(tcAlias)
oZipper = Newobject('ZipIt','Zipper.prg')
If oZipper.CompressString(lcXML)
Insert Into rollcaller!bkplog ;
(tablename, ucrc, usize, ccrc, csize, backup) ;
VALUES ;
(Upper(tcAlias), Sys(2007,lcXML), Len(lcXML), ;
SYS(2007,oZipper.cCOMPRESSED), oZipper.nCOMPRESSEDSIZE, ;
oZipper.cCOMPRESSED)
Use In 'bkplog'
Endif
If !Empty(lcAlias) And Used(lcAlias)
Select (lcAlias)
Endif
Endproc