2010-01-12 14:40:57 -05:00
|
|
|
! Copyright (C) 2010 Sascha Matzke.
|
2009-01-03 06:48:11 -05:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2010-01-12 14:40:57 -05:00
|
|
|
USING: accessors arrays assocs bson.constants byte-arrays
|
|
|
|
calendar combinators.short-circuit fry hashtables io io.binary
|
2010-06-18 06:51:35 -04:00
|
|
|
io.encodings.utf8 io.encodings io.streams.byte-array
|
2010-02-28 08:09:40 -05:00
|
|
|
kernel linked-assocs literals math math.parser namespaces byte-vectors
|
2010-01-12 14:40:57 -05:00
|
|
|
quotations sequences serialize strings vectors dlists alien.accessors ;
|
|
|
|
FROM: words => word? word ;
|
|
|
|
FROM: typed => TYPED: ;
|
|
|
|
FROM: combinators => cond ;
|
2009-01-03 06:48:11 -05:00
|
|
|
IN: bson.writer
|
|
|
|
|
2009-03-07 07:54:53 -05:00
|
|
|
<PRIVATE
|
|
|
|
|
2010-04-13 03:58:12 -04:00
|
|
|
CONSTANT: INT32-SIZE { 0 1 2 3 }
|
|
|
|
CONSTANT: INT64-SIZE { 0 1 2 3 4 5 6 7 }
|
2009-03-07 07:54:53 -05:00
|
|
|
|
|
|
|
PRIVATE>
|
|
|
|
|
2010-03-24 03:28:22 -04:00
|
|
|
TYPED: get-output ( -- stream: byte-vector )
|
|
|
|
output-stream get ; inline
|
|
|
|
|
2010-02-28 08:09:40 -05:00
|
|
|
TYPED: with-length ( quot -- bytes-written: integer start-index: integer )
|
2010-03-24 03:28:22 -04:00
|
|
|
[ get-output [ length ] [ ] bi ] dip
|
2009-06-05 08:31:40 -04:00
|
|
|
call length swap [ - ] keep ; inline
|
2009-03-07 07:54:53 -05:00
|
|
|
|
2010-03-24 03:28:22 -04:00
|
|
|
: (with-length-prefix) ( quot: ( .. -- .. ) length-quot: ( bytes-written -- length ) -- )
|
2009-06-05 08:31:40 -04:00
|
|
|
[ [ B{ 0 0 0 0 } write ] prepose with-length ] dip swap
|
2010-03-24 03:28:22 -04:00
|
|
|
[ call( written -- length ) get-output underlying>> ] dip set-alien-unsigned-4 ; inline
|
2009-01-03 06:48:11 -05:00
|
|
|
|
2010-03-15 01:44:23 -04:00
|
|
|
: with-length-prefix ( quot: ( .. -- .. ) -- )
|
2010-01-12 14:40:57 -05:00
|
|
|
[ ] (with-length-prefix) ; inline
|
2009-06-05 08:31:40 -04:00
|
|
|
|
2010-03-15 01:44:23 -04:00
|
|
|
: with-length-prefix-excl ( quot: ( .. -- .. ) -- )
|
2010-04-13 03:58:12 -04:00
|
|
|
[ 4 - ] (with-length-prefix) ; inline
|
|
|
|
|
|
|
|
: (>le) ( x n -- )
|
|
|
|
[ nth-byte write1 ] with each ; inline
|
2009-03-25 13:22:28 -04:00
|
|
|
|
2009-01-03 06:48:11 -05:00
|
|
|
<PRIVATE
|
|
|
|
|
2010-04-13 03:58:12 -04:00
|
|
|
TYPED: write-int32 ( int: integer -- ) INT32-SIZE (>le) ; inline
|
2010-01-12 14:40:57 -05:00
|
|
|
|
2010-04-13 03:58:12 -04:00
|
|
|
TYPED: write-double ( real: float -- ) double>bits INT64-SIZE (>le) ; inline
|
2010-01-12 14:40:57 -05:00
|
|
|
|
2010-06-18 06:51:35 -04:00
|
|
|
TYPED: write-utf8-string ( string: string -- )
|
2010-07-16 04:31:20 -04:00
|
|
|
get-output utf8 encode-string ; inline
|
2010-06-18 06:51:35 -04:00
|
|
|
|
2010-04-13 03:58:12 -04:00
|
|
|
TYPED: write-cstring ( string: string -- )
|
2010-06-18 06:51:35 -04:00
|
|
|
write-utf8-string 0 write1 ; inline
|
2010-01-12 14:40:57 -05:00
|
|
|
|
2010-04-13 03:58:12 -04:00
|
|
|
: write-longlong ( object -- ) INT64-SIZE (>le) ; inline
|
2009-01-03 06:48:11 -05:00
|
|
|
|
2009-06-23 07:58:20 -04:00
|
|
|
: write-eoo ( -- ) T_EOO write1 ; inline
|
2009-01-03 06:48:11 -05:00
|
|
|
|
2010-02-28 08:09:40 -05:00
|
|
|
TYPED: write-header ( name: string object type: integer -- object )
|
2010-01-12 14:40:57 -05:00
|
|
|
write1 [ write-cstring ] dip ; inline
|
2009-01-03 06:48:11 -05:00
|
|
|
|
2010-01-12 14:40:57 -05:00
|
|
|
DEFER: write-pair
|
2009-03-06 08:37:11 -05:00
|
|
|
|
2010-02-28 08:09:40 -05:00
|
|
|
TYPED: write-byte-array ( binary: byte-array -- )
|
2010-01-12 14:40:57 -05:00
|
|
|
[ length write-int32 ]
|
2010-06-17 00:45:16 -04:00
|
|
|
[ T_Binary_Default write1 write ] bi ; inline
|
2009-01-03 06:48:11 -05:00
|
|
|
|
2010-02-28 08:09:40 -05:00
|
|
|
TYPED: write-mdbregexp ( regexp: mdbregexp -- )
|
2009-03-25 13:22:28 -04:00
|
|
|
[ regexp>> write-cstring ]
|
2010-01-12 14:40:57 -05:00
|
|
|
[ options>> write-cstring ] bi ; inline
|
2009-05-11 09:37:47 -04:00
|
|
|
|
2010-01-12 14:40:57 -05:00
|
|
|
TYPED: write-sequence ( array: sequence -- )
|
|
|
|
'[
|
|
|
|
_ [ number>string swap write-pair ] each-index
|
|
|
|
write-eoo
|
|
|
|
] with-length-prefix ; inline recursive
|
|
|
|
|
|
|
|
TYPED: write-oid ( oid: oid -- )
|
|
|
|
[ a>> write-longlong ] [ b>> write-int32 ] bi ; inline
|
|
|
|
|
|
|
|
: write-oid-field ( assoc -- )
|
|
|
|
[ MDB_OID_FIELD dup ] dip at
|
|
|
|
[ dup oid? [ T_OID write-header write-oid ] [ write-pair ] if ]
|
|
|
|
[ drop ] if* ; inline
|
|
|
|
|
|
|
|
: skip-field? ( name value -- name value boolean )
|
|
|
|
over { [ MDB_OID_FIELD = ] [ MDB_META_FIELD = ] } 1|| ; inline
|
|
|
|
|
|
|
|
UNION: hashtables hashtable linked-assoc ;
|
|
|
|
|
|
|
|
TYPED: write-assoc ( assoc: hashtables -- )
|
|
|
|
'[ _ [ write-oid-field ] [
|
|
|
|
[ skip-field? [ 2drop ] [ write-pair ] if ] assoc-each
|
|
|
|
] bi write-eoo
|
|
|
|
] with-length-prefix ; inline recursive
|
|
|
|
|
|
|
|
UNION: code word quotation ;
|
|
|
|
|
|
|
|
TYPED: (serialize-code) ( code: code -- )
|
2010-02-28 05:41:15 -05:00
|
|
|
object>bytes
|
2010-01-12 14:40:57 -05:00
|
|
|
[ length write-int32 ]
|
|
|
|
[ T_Binary_Custom write1 write ] bi ; inline
|
|
|
|
|
2010-06-18 06:51:35 -04:00
|
|
|
: write-string-length ( string -- )
|
|
|
|
[ length>> 1 + ]
|
|
|
|
[ aux>> [ length ] [ 0 ] if* ] bi + write-int32 ; inline
|
|
|
|
|
2010-01-12 14:40:57 -05:00
|
|
|
TYPED: write-string ( string: string -- )
|
2010-06-18 06:51:35 -04:00
|
|
|
dup write-string-length write-cstring ; inline
|
2010-01-12 14:40:57 -05:00
|
|
|
|
|
|
|
TYPED: write-boolean ( bool: boolean -- )
|
|
|
|
[ 1 write1 ] [ 0 write1 ] if ; inline
|
|
|
|
|
2010-02-28 08:09:40 -05:00
|
|
|
TYPED: write-pair ( name: string obj -- )
|
2010-01-12 14:40:57 -05:00
|
|
|
{
|
|
|
|
{
|
|
|
|
[ dup { [ hashtable? ] [ linked-assoc? ] } 1|| ]
|
|
|
|
[ T_Object write-header write-assoc ]
|
|
|
|
} {
|
|
|
|
[ dup { [ array? ] [ vector? ] [ dlist? ] } 1|| ]
|
|
|
|
[ T_Array write-header write-sequence ]
|
|
|
|
} {
|
|
|
|
[ dup byte-array? ]
|
|
|
|
[ T_Binary write-header write-byte-array ]
|
|
|
|
} {
|
|
|
|
[ dup string? ]
|
|
|
|
[ T_String write-header write-string ]
|
|
|
|
} {
|
|
|
|
[ dup oid? ]
|
|
|
|
[ T_OID write-header write-oid ]
|
|
|
|
} {
|
|
|
|
[ dup integer? ]
|
|
|
|
[ T_Integer write-header write-int32 ]
|
|
|
|
} {
|
|
|
|
[ dup boolean? ]
|
|
|
|
[ T_Boolean write-header write-boolean ]
|
|
|
|
} {
|
|
|
|
[ dup real? ]
|
|
|
|
[ T_Double write-header >float write-double ]
|
|
|
|
} {
|
|
|
|
[ dup timestamp? ]
|
|
|
|
[ T_Date write-header timestamp>millis write-longlong ]
|
|
|
|
} {
|
|
|
|
[ dup mdbregexp? ]
|
|
|
|
[ T_Regexp write-header write-mdbregexp ]
|
|
|
|
} {
|
|
|
|
[ dup quotation? ]
|
|
|
|
[ T_Binary write-header (serialize-code) ]
|
|
|
|
} {
|
|
|
|
[ dup word? ]
|
|
|
|
[ T_Binary write-header (serialize-code) ]
|
|
|
|
} {
|
|
|
|
[ dup dbref? ]
|
|
|
|
[ T_Object write-header dbref>assoc write-assoc ]
|
|
|
|
} {
|
|
|
|
[ dup f = ]
|
|
|
|
[ T_NULL write-header drop ]
|
|
|
|
}
|
|
|
|
} cond ;
|
2009-01-03 06:48:11 -05:00
|
|
|
|
|
|
|
PRIVATE>
|
2009-03-07 07:54:53 -05:00
|
|
|
|
2010-02-28 08:09:40 -05:00
|
|
|
TYPED: assoc>bv ( assoc: hashtables -- byte-vector: byte-vector )
|
2010-02-28 05:41:15 -05:00
|
|
|
[ BV{ } clone dup ] dip '[ _ write-assoc ] with-output-stream* ; inline
|
2009-01-03 06:48:11 -05:00
|
|
|
|
2010-01-12 14:40:57 -05:00
|
|
|
TYPED: assoc>stream ( assoc: hashtables -- )
|
|
|
|
write-assoc ; inline
|
2009-01-03 06:48:11 -05:00
|
|
|
|
2010-02-28 08:09:40 -05:00
|
|
|
TYPED: mdb-special-value? ( value -- ?: boolean )
|
2009-04-05 14:11:35 -04:00
|
|
|
{ [ timestamp? ] [ quotation? ] [ mdbregexp? ]
|
2010-02-28 08:09:40 -05:00
|
|
|
[ oid? ] [ byte-array? ] } 1|| ; inline
|