# $Header: /home/cvsroot/tcldb/ucodb/Tlib/chkPriv,v 1.1.1.1 1996/10/12 01:08:25 de Exp $
# tcl procs saved on Sun Sep 03 16:18:55 PDT 1995

proc chkPriv {table priv} {

        global uname sybmsg 

        case $priv in {
        {sel} {
                set code 193
        }
        {ins} {
                set code 195
        }
        {del} {
                set code 196
        }
        {upd} {
                set code 197
        }
        {ctbl} {
                set code 198
        }
        {crul} {
                set code 236
        }
        {cvuw} {
                set code 207
        }
        {cpro} {
                set code 222
        }
        }

#       echo "chkPriv looking for protection code $code on table $table for user $uname"

        set temp [split $table .]
	set pref ""
	if {[llength $temp] == 3} {
		lassign $temp dbs usr tbl
		set pref "$dbs.."
	} else {
		lassign $temp usr tbl
	}

#       get my real server uid

        set sqlcmd "select suser_id('$uname'), user_id('$usr')"

	set sqt "functions"
#        echo "chkPriv sqlcmd is\n$sqlcmd"

        set res [doSQL 1]
        if {[lindex $res 0] == "ERROR"} {
                startMsg "chkPriv problem : $res"
                echo "$sqlcmd"
                echo "$res"
                return NO 
        }

        set line [sybNext 1]
        set usuid [lindex $line 0]
        set odbuid [lindex $line 1]

#        echo "user $uname server uid is $usuid, owner db uid is $odbuid"

        set sqlcmd "select uid, gid from ${pref}sysusers where suid = $usuid"

#        echo "chkPriv sqlcmd is\n$sqlcmd"
	set sqt "${pref}sysusers"

        set res [doSQL 1]
        if {[lindex $res 0] == "ERROR"} {
                startMsg "chkPriv problem : $res"
                echo "$sqlcmd"
                echo "$res"
                return NO 
        }

        set line [sybNext 1]

        set udbuid [lindex $line 0]
        set udbgid [lindex $line 1]

#        echo "user $uname local db userid is $udbuid and groupid is $udbgid"

#       You are sa, or equivalent, if your suid is 1;  you are dbo if your
#       user id is 1.  dbo does not automatically have all privs!  if you
#       are sa or the object owner then you can do anything, of course.

return "YES"
        if {($udbuid == $odbuid) || ($usuid == 1)} {
                return "YES"
        }

#       Otherwise, check for uid and gid granted perms on
#       object: do I belong to a group granted perms?

#        echo "table name was $table, owner $usr, user $uname, grp $udbgid, tbl $tbl priv $priv code $code"

#       check to see if I or my group have the requested permission on
#       the current object or if 'public' has the requested permission on
#       this object (public is grp 0) -- this is a parsimonious but somewhat
#       obscure method that Sybase uses to code protection bits.

        set cando NO

	# Tom, what on earth were you doing here?  I'm taking this back out --de 9/2/95
	#   hack -just return yes --tp
	#   return YES



        set sqlcmd "select a.* from ${pref}sysprotects a, ${pref}sysobjects b  where a.action = $code and b.name = '$tbl' and b.uid = user_id('$usr') and  (a.uid = $udbuid or a.uid = $udbgid or a.uid = 0) and a.id = b.id"

#        echo "chkPriv sql cmd was\n$sqlcmd"
	set sqt "${pref}sysprotects"

	set res [doSQL 1]
	if {[lindex $res 0] == "ERROR"} {
		startMsg "chkPriv problem: $res"
		echo "$sqlcmd"
		echo "$res"
		return NO
	}

        while {1 == 1} {
                if {$sybmsg(nextrow) == "NO_MORE_RESULTS"} {break}
                set able [sybNext 1]
#                echo "got $able from sysprotects etc"
                if {$able != ""} {
                        set cando YES
                        return $cando
                }
        }

        return $cando

}

