Skip to content

Commit e3101b8

Browse files
Add commands and functions to enhance the support of DBC / VFP in VFP Dialect (#1955)
* [XSharp.VFP] Add CLOSE DATABASES, CLOSE TABLE commands * [XSharp.Core / XSharp.VFP] Add commands CLOSE DATABASES, CLOSE TABLES * [XSharp.Core] Fix visibility to give access to the ActiveDataBase for CLOSE DATABASES * [UDC] Merged CLOSE DATABASES and CLOSE TABLES variants into single UDC * [XSharp.Core / XSharp.VFP] Add support for ADD TABLE, REMOVE TABLE, RENAME TABLE in DBCs * [XSharp.Core/Data/VFP] CREATE TABLE: long field name support via DBC * [UDC] Fix an error in CLOSE DATABASE syntax * [DBC Support] Add several Tests in FoxTest project. Fix some related functions * [VFP] Fix SUM and AVERAGE UDCs clause must appear before TO * [VFP] Add support for COPY MEMO command * [VFP] Add support of REPLACE ... ADDITIVE command --------- Co-authored-by: Robert van der Hulst <robert@xsharp.eu>
1 parent db13ab0 commit e3101b8

21 files changed

Lines changed: 2013 additions & 51 deletions

src/Common/FoxProCmd.xh

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,32 @@
562562
#command CREATE DATABASE <(db)> => XSharp.RDD.Dbc.Create( <(db)>)
563563
#command DELETE DATABASE <(db)> [<del:DELETETABLES>] [<rec:RECYCLE>] => XSharp.RDD.Dbc.Delete( <(db)>, <.del.>, <.rec.>)
564564

565+
// CLOSE DATABASES [ALL] and CLOSE TABLES [ALL]
566+
// Implemented in XSharp.VFP\Database\DatabaseCommands.prg
567+
568+
#command CLOSE DATABASES [<all:ALL>] => __VFPCloseDatabases( <.all.> )
569+
#command CLOSE TABLES [<all:ALL>] => __VFPCloseTables( <.all.> )
570+
571+
// ADD TABLE TableName [NAME LongTableName]
572+
// Links an existing free .DBF to the currently active database.
573+
// Implemented in XSharp.VFP\Database\DatabaseCommands.prg
574+
// The NAME variant is defined last (tried first) to correctly consume the NAME clause.
575+
#command ADD TABLE <(file)> => __VFPAddTable( <(file)>, "")
576+
#command ADD TABLE <(file)> NAME <(name)> => __VFPAddTable( <(file)>, <(name)>)
577+
578+
// REMOVE TABLE TableName [DELETE] [RECYCLE]
579+
// Unlinks a table from the active database; optionally deletes the .DBF file.
580+
// Implemented in XSharp.VFP\Database\DatabaseCommands.prg
581+
// Precedence: most-specific forms defined last = tried first.
582+
#command REMOVE TABLE <(name)> => __VFPRemoveTable( <(name)>, .F., .F.)
583+
#command REMOVE TABLE <(name)> DELETE => __VFPRemoveTable( <(name)>, .T., .F.)
584+
#command REMOVE TABLE <(name)> RECYCLE => __VFPRemoveTable( <(name)>, .F., .T.)
585+
586+
// RENAME TABLE OldName TO NewName
587+
// Changes the logical name in the DBC; does not rename the physical .DBF.
588+
// Implemented in XSharp.VFP\Database\DatabaseCommands.prg
589+
#command RENAME TABLE <(old)> TO <(new)> => __VFPRenameTable( <(old)>, <(new)>)
590+
565591
// connection commands
566592
#command CREATE CONNECTION <(conn)> ;
567593
[DATASOURCE <(Dsn)>] ;

src/Common/dbcmd.xh

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -432,29 +432,31 @@
432432
<{lfor}>, <{lwhile}>, <nnext>, <rec>, <.rest.>, <.noopt.>;
433433
)
434434

435-
#command SUM <x1> [, <xn>] TO <v1> [, <vn>] ;
435+
#command SUM <x1> [, <xn>] ;
436436
[FOR <lfor>] ;
437437
[WHILE <lwhile>] ;
438438
[NEXT <nnext>] ;
439439
[RECORD <rec>] ;
440-
[<rest:REST>] ;
440+
[<REST:REST>] ;
441441
[<noopt: NOOPTIMIZE>] ;
442-
[ALL] ;
442+
[all] ;
443+
TO <v1> [, <vN>] ;
443444
;
444-
=> <v1> := [ <vn> := ] 0 ;
445+
=> <v1> := [ <vN> := ] 0 ;
445446
; DbEval( ;
446-
{|| <v1> += <x1> [, <vn> += <xn> ]}, ;
447+
{|| <v1> += <x1> [, <vN> += <xn> ]}, ;
447448
<{lfor}>, <{lwhile}>, <nnext>, <rec>, <.rest.>, <.noopt.>;
448449
)
449450

450-
#command AVERAGE [<x1> [, <xn>] TO <v1> [, <vn>]] ;
451+
#command AVERAGE [<x1> [, <xn>] ;
451452
[FOR <lfor>] ;
452453
[WHILE <lwhile>] ;
453454
[NEXT <nnext>] ;
454455
[RECORD <rec>] ;
455456
[<rest:REST>] ;
456457
[<noopt: NOOPTIMIZE>] ;
457-
[ALL] ;
458+
[all] ;
459+
TO <v1> [, <vN>]] ;
458460
;
459461
=> M->__Avg := <v1> := [ <vn> := ] 0 ;
460462
;
@@ -487,6 +489,34 @@
487489
#command SET MEMOBLOCKSIZE TO => RDDInfo(_SET_MEMOBLOCKSIZE, 512)
488490
#command SET OPTIMIZE <x:ON,OFF,&> => RDDInfo(_SET_OPTIMIZE, <(x)>)
489491

492+
#command COPY MEMO <field> TO <(file)> <add:ADDITIVE> [AS <nCP>] ;
493+
=> DbCopyMemo( <"field">, <(file)>, <ADD>[, <nCP>] )
494+
495+
// REPLACE ... [ADDITIVE] � without IN clause
496+
#command REPLACE <(f1)> WITH <x1> [<add1:ADDITIVE>] ;
497+
[, <(fn)> WITH <xn> [<addn:ADDITIVE>]] ;
498+
[FOR <lfor>] [WHILE <lwhile>] [NEXT <nnext>] [RECORD <rec>] ;
499+
[<REST:REST>] [<noopt:NOOPTIMIZE>] [all] ;
500+
=> DbEval( ;
501+
{|| DbAutoLock(), ;
502+
__FieldSetAdd(<(f1)>, <x1>, <.add1.>) ;
503+
[, __FieldSetAdd(<(fn)>, <xn>, <.addn.>)], ;
504+
DbAutoUnLock() }, ;
505+
<{lfor}>, <{lwhile}>, <nnext>, <rec>, <.rest.>, <.noopt.> ;
506+
)
507+
508+
// REPLACE ... [ADDITIVE] IN workarea � defined LAST, tried FIRST
509+
#command REPLACE <(f1)> WITH <x1> [<add1:ADDITIVE>] ;
510+
[, <(fn)> WITH <xn> [<addn:ADDITIVE>]] ;
511+
[FOR <lfor>] [WHILE <lwhile>] [NEXT <nnext>] [RECORD <rec>] ;
512+
[<REST:REST>] IN <(wa)> [<noopt:NOOPTIMIZE>] [all] ;
513+
=> __VfpReplaceIn( <(wa)>, ;
514+
{|| DbAutoLock(), ;
515+
__FieldSetAdd(<(f1)>, <x1>, <.add1.>) ;
516+
[, __FieldSetAdd(<(fn)>, <xn>, <.addn.>)], ;
517+
DbAutoUnLock() }, ;
518+
<{lfor}>, <{lwhile}>, <nnext>, <rec>, <.rest.>, <.noopt.> ;
519+
)
490520

491521
#endif // DBCMD_XH
492522

0 commit comments

Comments
 (0)