#!/usr/bin/python

# IIstoreClient.py
#       --copyright--                   Copyright 2007 (C) Tranzoa, Co. All rights reserved.    Warranty: You're free and on your own here. This code is not necessarily up-to-date or of public quality.
#       --url--                         http://www.tranzoa.net/tzpython/
#       --email--                       pycode is the name to send to. tranzoa.com is the place to send to.
#       --bodstamps--
#       September 23, 2006      bar
#       October 31, 2006        bar     TZCommandLineAtFile
#       November 18, 2007       bar     turn on doxygen
#       November 27, 2007       bar     insert boilerplate copyright
#       May 17, 2008            bar     email adr
#       November 29, 2011       bar     pyflake cleanup
#       --eodstamps--
##      \file
#
#
#       Be a client to an II (Instant Information) IIstore provider.
#
#

from    IIclient                import  *
from    tgcmsg                  import  *


class an_iistore_client(an_ii_client) :

    def __init__(me, host = "localhost", port = None, user_name = None, password = None, iiname = None, precede_str = "", timeout = None) :

        host    = host or "localhost"
        port    = port or None

        if  not precede_str :
            precede_str = ""
        me.precede_str  = precede_str

        an_ii_client.__init__(me, host, port, user_name, password, iiname, timeout)




    def make_query(me, q) :
        """
            Make an IIstore query.
        """

        r   = an_ii_client.make_query(me, me.precede_str + " " + q)

        return(r)




    def store_value(me, key, value) :
        """
            Store a value in IIstore.
        """

        r   = me.make_query("%%set " + tgc_msg( [ key, value ] ))

        if  not r :
            return(False)

        return(r.startswith("Q:"))



    def forget_value(me, key) :
        """
            Forget a stored IIstore value.
        """

        r   = me.make_query('%%forget ' + tgc_msg( [ key ] ))

        if  not r :
            return(False)

        if  r.endswith(" was not known!") :
            return(True)

        return(r.endswith(" forgotten!"))


    def list_values(me, key = None) :
        """
            Return a list of (some) IIstore keys.
            Or return information about a key.
        """

        if  key :
            r   = me.make_query('%%stats ' + tgc_msg( [ key ] ))

            # !!!! e.g. r eq "By: tzemail::tzemail at Sun Sep 24 00:34:31 2006 Q: "george" -> "no" cnt 1 by tzemail::tzemail at Sun Sep 24 00:34:38 2006"

            return( [] )


        r   = me.make_query('%%stats')

        if  not r :
            return( [] )

        if  r == "No stored information!" :
            return( [] )

        if  not r.endswith(" more.") :
            return( [] )

        r   = re.sub(r" and \d+ more\.", "", r)

        r   = parse_tgc_msg(r)

        keys    = []

        if  r :
            i   = 0
            while i < len(r) :
                if  r[i] == "%%set" :
                    i    += 2                               # skip over "%%set by"
                else :
                    keys.append(r[i])
                    i   += 1
                pass
            pass

        return(keys)

    pass                                                    # end of class an_ii_client



#
#
#   Test code.
#
#
if __name__ == '__main__' :
    import  sys

    import  TZCommandLineAtFile


    del(sys.argv[0])

    TZCommandLineAtFile.expand_at_sign_command_line_files(sys.argv)


    if  len(sys.argv) < 7 :
        print "Tell me a server and port to connect to and user name and password and ii_name and precede_str and key and value or key only!"
    else :
        clt             = an_iistore_client(sys.argv[0], sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5])
        clt.screen_info = True

        while True :
            clt.do_it()
            if  clt.logged_on :

                if  len(sys.argv) > 7 :

                    if  sys.argv[7].lower() == "stats" :
                        r   = clt.list_values(sys.argv[6] or None)
                        if  not r :
                            print "no stats"
                            sys.exit(101)
                        print r
                        sys.exit(0)

                    if  sys.argv[7].lower() == "forget" :
                        r   = clt.forget_value(sys.argv[6])
                        if  not r :
                            print sys.argv[6], "not forgotten"
                            sys.exit(101)
                        print "forgotten"
                        sys.exit(0)

                    r   = clt.store_value(sys.argv[6], sys.argv[7])
                    if  not r :
                        print sys.argv[6], "not stored"
                        sys.exit(101)
                    print "stored"
                    sys.exit(0)

                r   = clt.make_query(sys.argv[6])
                if  r == None :
                    print "No reply"
                    sys.exit(101)

                print "reply: [" + r + "]"

                sys.exit(0)
            pass

    pass



__all__ = [
            'an_iistore_client',
          ]


#
#
#
# eof

