r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[Core] Discuss core issues

Brock
20-Apr-2005
[932x3]
I was thinking of adding a Cookbook entry along the following topic....
; Sorting Unordered Key/Value Pairs

;unordered key/value pairs, keys in each record aren't in the same 
order
data: [
	[fld1 "c" fld2 "1" fld3 "b2"]
	[fld1 "b" fld3 "a1" fld2 "3"]
	[fld3 "c" fld2 "2"  fld1 "a"]
]

; sorts on first text found, value is not sorted
sort data

; notice reverse sort on first text found, value is not sorted
sort/reverse data

; sort on value for fld1 key - ascending order
sort/compare data func[a b] [a/fld1 < b/fld1]

; sort on value for fld1 key - descending order
sort/compare data func[a b] [a/fld1 > b/fld1]

; sort on value for fld2 key - ascending order
sort/compare data func[a b] [a/fld2 < b/fld2]

; sort on value for fld2 key - descending order
sort/compare data func[a b] [a/fld2 > b/fld2]
Any comments or suggestions of items to include/change prior to submitting.
Tomc
20-Apr-2005
[935]
when your compare func returns -1 0 1 instead of a bool you get stable 
sorts
Brock
20-Apr-2005
[936]
Tom, not sure I follow.  How do I check the return value of the compare 
func?
Ammon
20-Apr-2005
[937]
Your /compare func is returning a boolean value because '< returns 
a boolean value.  If you have it return -1 0 1 then you get a stable 
sort.
Brock
21-Apr-2005
[938x3]
Okay, I think I am following.  If my parameters to the function were 
numbers, then using the [sign? a/1 - b/1] would provide a more accurate 
sort due to the tri-state return of the sign? function.  However, 
since I am sorting strings and can AFAIK only compare using <>=, 
are you suggesting I should test all of the states and return 1,0,-1 
as appropriate?
By the way, I was lead to my above solution and similar comments 
thanks to responses by Tom and Volker to Graham's question on AltME 
Rebol world - Core Group, 13 Aug,2004 @ 7:47pm.  Thanks all.
; is this what I am after for the compare function?
[ if a/1 > b/1 [return 1]
  if a/1 = b/1 [return 0]
  if a/1 < b/1 [return -1]
]
Sunanda
21-Apr-2005
[941]
You got it!.
And a little shorter, and maybe faster:
  [ if a/1 > b/1 [return 1]
    if a/1 < b/1 [return -1]
    return 0
  ]

Of course, you only need to worry about stable sorting if you have 
duplicate keys and need to retain the original entry sequence for 
them. Other wise [return a/1 < b/1] is fine and fast.
Tomc
21-Apr-2005
[942]
i.e.  sorted by first name  within  sorted last name groups
Alek_K
26-Apr-2005
[943]
I'm planning doing a database - in year it will be about 3000 records 
(30 fields each)

What to use - some kind of  rebol blocks (as here http://www.rebol.net/cookbook/recipes/0012.html
) or should I doing it with "mysql-protocol" by DocKimbel?
Allen
26-Apr-2005
[944]
There is also http://www.dobeash.com/it/rebdb/
Sunanda
26-Apr-2005
[945]
REBOL.org holds nearly 42,000 emails in some kind of REBOL block 
-- plus various indexes. About 75meg (uncompressed) of data.
So it's doable.

Depends how much fun you want to have. Databases like MySQL are boring 
but straight-forward. Also *may* limit the platform you can run the 
application on.
Alek_K
26-Apr-2005
[946]
I will do it rebol way. Thanks for answers!
Claude
26-Apr-2005
[947x7]
hello
i use rebol/command to connect a database (Iseries) by ODBC..
i do like this
db: open odbc://iseries
stm: first db
insert stm {select * from filexxx}
well, my statement copy return data
Alek_K
26-Apr-2005
[954]
well - because my project is "at start" and budget is really low, 
i'm limited to Rebol/View functionality :o)
Claude
26-Apr-2005
[955x5]
it is ok and good. But i would like to have the resultset metadata 
too !!!!
how can i have metadata of my resultset with rebol.command
Alek_k, hi, i think there is already a little database name is DB.R
wait a minute !!! a seek to it
yes a have it, here is http://www.dobeash.com/it/rebdb/
Alek_K
26-Apr-2005
[960]
(yes - i have it)
Claude
26-Apr-2005
[961x2]
the real name is rebdb
hello, someone a idea for me please !!
Ingo
26-Apr-2005
[963]
Hi Claude, I'm sorry I can't help you, but maybe the /core group 
is not the ideal place to ask about /command? Anyway, what metadata 
are you hinting at?
sqlab
27-Apr-2005
[964]
Hi Claude, 
do you want to get the names of the columns?

You do not get them by default.

If you want just the names of the columns of a table, you should 
do like this
insert stm ['columns "filexxx"]
foreach column copy stm [probe column]

look at 
sdk/doc/database.html#section-4.2


But beware, Rebol/Command does not support all datatypes, so maybe 
you will get some problems.

Also depending how strict/relaxed your db system is "filexxx" should 
be written "FILEXXX" or as a fully qualified name.
So better check with 
insert stm ['tables] 
what your db system expects.


If you write a program, it is recommended, to name every column you 
want to get in your result set. Then you know the names too .
Claude
28-Apr-2005
[965]
thank you sqlab
Micha
28-Apr-2005
[966x3]
plis help ?
port: make port! tcp://219.147.198.195:1080
>> port/timeout
== none
>> port/timeout: 0:00:30
== 0:00:30
>> open/binary port
** Access Error: Cannot connect to 219.147.198.195
** Near: open/binary port
how to  enlarge the time of expectation on connection ?
Vincent
28-Apr-2005
[969]
does 
port: open/binary tcp://219.147.198.195:1085
work?
Anton
28-Apr-2005
[970]
>> system/schemes/default/timeout
== 30
Micha
28-Apr-2005
[971x5]
open 219.147.198.195 1080 ping: 6312
how do to check  loam time it will to flow away when port opens ?
handler: func [port action arg /local cmd send ping] [ 


                                    
        switch action [ 

            init   [print "init"
                    set-modes port [timeout: 00:05:00]]
            adress [print arg ]

            open   [ping: to-integer  (0:05:00 - get-modes port 'timeout )* 1000 
            ]
                    
                  
         
            close [print "close"         close port]
           
          
        ]
    ]





check: func [ p h] [  open/direct/binary/async  join tcp://  [ p 
":" h ]  :handler ]





check 219.147.198.195 1080 

   

    halt
how do to write this using harbour / awake ?
without using from  port / async ?
handler: func [port action arg /local  ping] [ 


                                    
        switch action [ 

            init   [print "init"
                    set-modes port [timeout: 00:05:00]]
            adress [print arg ]
            open   [print "open"

                    ping: to-integer  (0:05:00 - get-modes port 'timeout )* 1000 ]
                    
                  
         
            close [print "close"         close port]
           
          
        ]
    ]





check: func [ p h] [  port: open/direct/binary/async  join tcp:// 
 [ p ":" h ]  :handler ]





check 219.147.198.195 1080
Anton
28-Apr-2005
[976x2]
gm: func [port][reform ["timeout:" get-modes port 'timeout]]

handler: func [port action arg /local cmd send time] [ 
	time: now/time/precise
	switch action [ 
		init    [
			print [time gm port "--- init"]
			set-modes port [timeout: 0:00:05] ; five seconds
		]
		address [print [time gm port "--- address lookup: " arg]]
		open    [print [time gm port "--- open:" now/precise]]
		close   [print [time gm port "--- close"] close port]

  error   [print [time gm port "-- error:" mold disarm :arg] close 
  port]
	]
]

check: func [p h][
	open/direct/binary/async  join tcp://  [ p ":" h ]  :handler
]

check 219.147.198.195 1080
I do not know how to do it non-async.
Micha
28-Apr-2005
[978x3]
how I use open / async harbour this after a dozen or so minutes application 
be closes
handler: func [port ] [ 
                                    
       

          ping: to-integer  (0:00:30 - get-modes port 'timeout )* 1000
                                     

                    print [ "open" port/remote-ip  port/remote-port  "ping:" ping ]

                   insert port join  #{0401} [debase/base  skip to-hex 80 4 16 to-binary 
                   193.238.73.117 #{00} ]
           
    ]


port: make port! tcp://219.147.198.195:1080 

set-modes port [timeout: 00:01:00]

port/awake: :handler

insert tail system/ports/wait-list  port



open/binary port
how do to  send to portu  data when it is open ?
Pekr
30-Apr-2005
[981]
You can send data to your port using 'insert .... syntax is: insert 
port "hello"