{"id":13743774,"url":"https://github.com/robinrodricks/as3mysql","last_synced_at":"2025-04-13T17:07:52.871Z","repository":{"id":66331392,"uuid":"73711032","full_name":"robinrodricks/as3mysql","owner":"robinrodricks","description":"An AS3 driver for the MySQL open source database.","archived":false,"fork":false,"pushed_at":"2016-11-14T15:38:32.000Z","size":48,"stargazers_count":16,"open_issues_count":0,"forks_count":4,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-13T17:07:48.202Z","etag":null,"topics":["as3","flash","mysql","mysql-driver","sql"],"latest_commit_sha":null,"homepage":"","language":"ActionScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/robinrodricks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-11-14T14:11:42.000Z","updated_at":"2024-10-14T21:45:31.000Z","dependencies_parsed_at":"2023-02-20T21:15:47.509Z","dependency_job_id":null,"html_url":"https://github.com/robinrodricks/as3mysql","commit_stats":null,"previous_names":["hgupta9/as3mysql"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robinrodricks%2Fas3mysql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robinrodricks%2Fas3mysql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robinrodricks%2Fas3mysql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robinrodricks%2Fas3mysql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robinrodricks","download_url":"https://codeload.github.com/robinrodricks/as3mysql/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248750109,"owners_count":21155686,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["as3","flash","mysql","mysql-driver","sql"],"created_at":"2024-08-03T05:00:56.895Z","updated_at":"2025-04-13T17:07:52.854Z","avatar_url":"https://github.com/robinrodricks.png","language":"ActionScript","readme":"# as3-mysql\n\nActionscript 3 MySQL Driver (originally known as asSQL)\n\nas3-mysql is an Actionscript 3 MySQL Driver that allows you to work with MySQL databases directly from your AIR app.\n\n\n## Example Usage\n\nSample usage of the MySQL driver.\n\nDeclare the database connection object\n```\nprivate var con:Connection;\n```\n\nConnect to the database server\n```\nprivate function onCreationComplete():void {\n\tcon = new Connection(\"localhost\", 3306, \"root\", \"password\", \"database name\");\n\ton.addEventListener(Event.CONNECT, handleConnect);\n\tcon.addEventListener(MySqlErrorEvent.SQL_ERROR, handleConnectionError);\n\tcon.connect();\n}\n\nprivate function handleConnect(e:Event):void { \n\t//woop! were connected, do something here\n}\n\nprivate function handleConnectionError(e:MySqlErrorEvent):void {\n\tAlert.show(\"Connection Error: \" + e.text, \"Error\");\n}\n```\n\nQuery using a statement and responders\n```\nprivate function sampleQuery1():void {\n\tvar st:Statement = con.createStatement();\n\tst.executeQuery(\"SELECT * FROM users\", new MySqlResponser(\n\n\t\t// when done \n\t\tfunction (e:MySqlEvent):void {\n\t\t\tAlert.show(\"Returned: \" + e.resultSet.size() + \" rows!\");\n\t\t},\n\t\t\n\t\t// when error\n\t\tfunction (e:MySqlErrorEvent):void {\n\t\t\tAlert.show(\"Error: \" + e.text);\n\t\t}\n\t));\n}\n```\n\nQuery using a statement, responders, and parameters\n```\nprivate function sampleQuery2():void {\n\tvar st:Statement = con.createStatement();\n\tst.sql = \"SELECT * FROM users WHERE userID = ?\";\n\tst.setNumber(1, 5);\n\tst.executeQuery(null, new MySqlResponser(\n\n\t\t// when done \n\t\tfunction (e:MySqlEvent):void {\n\t\t\tAlert.show(\"Returned: \" + e.resultSet.size() + \" rows!\");\n\t\t},\n\n\t\t// when error\n\t\tfunction (e:MySqlErrorEvent):void {\n\t\t\tAlert.show(\"Error: \" + e.text);\n\t\t}\n\t)); \n}\n```\n\nQuery using a statement and event listeners\n\n```\nprivate function sampleQuery3():void {\n\tvar st:Statement = con.createStatement();\n\tst.addEventListener(MySqlEvent.RESULT, handleResult);\n\tst.executeQuery(\"SELECT * FROM users\");\n}\n```\n\n\n## Examples\n\n### MySqlService Example\n\nThis example is using MySqlService and DataGrid. The data grid's columns property and dataProvider property are bound to the MySqlService lastResult (ArrayCollection of Rows) and lastResultSet (The actual ResultSet).\n\n```\n\n    \u003cmx:Script\u003e\n    \u003c![CDATA[\n        import mx.controls.Alert;\n        import com.maclema.mysql.events.MySqlErrorEvent;\n        import com.maclema.util.ResultsUtil;\n\n        private function handleConnected(e:Event):void {\n            service.send(\"SELECT * FROM employees2 LIMIT 10\");\n        }\n\n        private function handleError(e:MySqlErrorEvent):void {\n            Alert.show(e.text);\n        }\n    ]]\u003e\n    \u003c/mx:Script\u003e\n\n    \u003cassql:MySqlService id=\"service\"\n            hostname=\"localhost\" \n            username=\"root\"\n            password=\"\"\n            database=\"assql-test\"\n            autoConnect=\"true\"\n            connect=\"handleConnected(event)\" \n            sqlError=\"handleError(event)\" /\u003e\n\n    \u003cmx:DataGrid id=\"grid\" left=\"10\" right=\"10\" top=\"10\" bottom=\"10\"\n            dataProvider=\"{service.lastResult}\"\n            columns=\"{ResultsUtil.getDataGridColumns(service.lastResultSet)}\" /\u003e\n```\n\n### Token Responder Example 1\n\nThis is an example of using an AsyncResponder to handle a query.\n\n```\nimport com.maclema.mysql.Statement; import com.maclema.mysql.Connection; import com.maclema.mysql.ResultSet; import mx.controls.Alert; import mx.rpc.AsyncResponder; import com.maclema.mysql.MySqlToken; import com.maclema.util.ResultsUtil;\n\n//The MySql Connection private var con:Connection;\n\nprivate function onCreationComplete():void { con = new Connection(\"localhost\", 3306, \"root\", \"\", \"assql-test\"); con.addEventListener(Event.CONNECT, handleConnected); con.connect(); }\n\nprivate function handleConnected(e:Event):void { var st:Statement = con.createStatement();\n\nvar token:MySqlToken = st.executeQuery(\"SELECT * FROM employees\");\n\ntoken.addResponder(new AsyncResponder(\n    function(data:Object, token:Object):void {\n        var rs:ResultSet = ResultSet(data);\n        Alert.show(\"Found \" + rs.size() + \" employees!\");\n    },\n\n    function(info:Object, token:Object):void {\n        Alert.show(\"Error: \" + info);\n    },\n\n    token\n));\n}\n```\n\n### Token Responder Example 2\n\nThis is a more in depth example. With each statement, an info property is set on the MySqlToken. This way all queries and responses can be handled with the same result and fault handlers. This example also uses a statement that uses parameters.\n\n```\nimport com.maclema.mysql.Statement;\nimport com.maclema.mysql.Connection;\nimport com.maclema.mysql.ResultSet;\nimport mx.controls.Alert;\nimport mx.rpc.AsyncResponder;\nimport com.maclema.mysql.MySqlToken;\nimport com.maclema.util.ResultsUtil;\n\n//The MySql Connection\nprivate var con:Connection;\n\nprivate function onCreationComplete():void {\n\tcon = new Connection(\"localhost\", 3306, \"root\", \"\", \"assql-test\");\n\tcon.addEventListener(Event.CONNECT, handleConnected);\n\tcon.connect();\n}\n\nprivate function handleConnected(e:Event):void {\n\tgetAllEmployees();\n}\n\nprivate function getAllEmployees():void {\n\tvar st:Statement = con.createStatement();\n\n\tvar token:MySqlToken = st.executeQuery(\"SELECT * FROM employees\");\n\ttoken.info = \"GetAllEmployees\";\n\ttoken.addResponder(new AsyncResponder(result, fault, token));\n}\n\nprivate function getEmployee(employeeID:int):void {\n\tvar st:Statement = con.createStatement();\n\tst.sql = \"SELECT * FROM employees WHERE employeeID = ?\";\n\tst.setNumber(1, employeeID);\n\n\tvar token:MySqlToken = st.executeQuery();\n\ttoken.info = \"GetEmployee\";\n\ttoken.employeeID = employeeID;\n\ttoken.addResponder(new AsyncResponder(result, fault, token));\n}\n\nprivate function result(data:Object, token:Object):void { var rs:ResultSet;\n\n\tif ( token.info == \"GetAllEmployees\" ) {\n\t\trs = ResultSet(data);\n\t\tAlert.show(\"Found \" + rs.size() + \" employees!\");   \n\t}\n\telse if ( token.info == \"GetEmployee\" ) {\n\t\trs = ResultSet(data);\n\t\tif ( rs.next() ) {\n\t\t\tAlert.show(\"Employee \" + token.employeeID + \" username is '\" + rs.getString(\"username\") + \"'\");\n\t\t}\n\t\telse {\n\t\t\tAlert.show(\"No such employee for id \" + token.employeeID);\n\t\t}\n\t}\n}\n\nprivate function fault(info:Object, token:Object):void {\n\tAlert.show(token.info + \" Error: \" + info);\n}\n```\n\n### Inserting Binary Data Example\n\nThis is an example of inserting binary data.\n\n```\nimport com.maclema.mysql.Statement;\nimport com.maclema.mysql.Connection;\nimport com.maclema.mysql.ResultSet;\nmport mx.controls.Alert;\nimport mx.rpc.AsyncResponder;\nimport com.maclema.mysql.MySqlToken;\nimport com.maclema.util.ResultsUtil;\n\n//The MySql Connection private var con:Connection;\n\nprivate function onCreationComplete():void {\n\tcon = new Connection(\"localhost\", 3306, \"root\", \"\", \"assql-test\");\n\tcon.addEventListener(Event.CONNECT, handleConnected);\n\tcon.connect();\n}\n\nprivate function handleConnected(e:Event):void {\n\t//do something here\n}\n\nprivate function setEmployeePhoto(employeeID:int, photoFile:File):void {\n\t//the file bytes var filedata:ByteArray = new ByteArray();\n\n\t//read the file\n\tvar fs:FileStream = new FileStream();\n\tfs.open(photoFile, FileMode.READ);\n\tfs.readBytes(filedata);\n\tfs.close();\n\n\t//execute the query\n\tvar st:Statement = con.createStatement();\n\tst.sql = \"UPDATE employees SET photo = ? WHERE employeeID = ?\";\n\tst.setBinary(1, filedata);\n\tst.setNumber(2, employeeID);\n\n\tvar token:MySqlToken = st.executeQuery();\n\ttoken.employeeID = employeeID;\n\ttoken.addResponder(new AsyncResponder(\n\t\tfunction (data:Object, token:Object):void {\n\t\t\tAlert.show(\"Employee \" + token.employeeID + \"'s photo updated! Affected Rows: \" + data.affectedRows);\n\t\t},\n\t\tfunction (info:Object, token:Object):void {\n\t\t\tAlert.show(\"Error updating photo: \" + info);\n\t\t},\n\t\ttoken\n\t));\n}\n```\n\n### Selecting Binary Data Example\n\nThis is an example of selecting binary data.\n\n```\nimport com.maclema.mysql.Statement;\nimport com.maclema.mysql.Connection;\nimport com.maclema.mysql.ResultSet;\nimport mx.controls.Alert;\nimport mx.rpc.AsyncResponder;\nimport com.maclema.mysql.MySqlToken;\nimport com.maclema.util.ResultsUtil;\n\n//The MySql Connection\nprivate var con:Connection;\n\nprivate function onCreationComplete():void {\n\tcon = new Connection(\"localhost\", 3306, \"root\", \"\", \"assql-test\");\n\tcon.addEventListener(Event.CONNECT, handleConnected);\n\tcon.connect();\n}\n\nprivate function handleConnected(e:Event):void {\n\t//do something here\n}\n\nprivate function getEmployeePhoto(employeeID:int, writeToFile:File):void {\n\t//execute the query var st:Statement = con.createStatement();\n\tst.sql = \"SELECT photo FROM employees WHERE employeeID = ?\";\n\tst.setNumber(1, employeeID);\n\n\tvar token:MySqlToken = st.executeQuery();\n\ttoken.employeeID = employeeID;\n\ttoken.writeToFile = writeToFile;\n\ttoken.addResponder(new AsyncResponder(\n\t\tfunction (data:Object, token:Object):void {\n\t\t\tvar rs:ResultSet = ResultSet(data);\n\t\t\tif ( rs.next() ) {\n\t\t\t\t//get the outFile from the token\n\t\t\t\tvar outFile:File = token.writeToFile;\n\n\t\t\t\t//get the file data from the result set\n\t\t\t\tvar filedata:ByteArray = rs.getBinary(\"photo\");\n\n\t\t\t\t//write the file\n\t\t\t\tvar fs:FileStream = new FileStream();\n\t\t\t\tfs.open(outFile, FileMode.WRITE);\n\t\t\t\tfs.writeBytes(filedata);\n\t\t\t\tfs.close();\n\n\t\t\t\tAlert.show(\"Photo written to: \" + outFile.nativePath);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tAlert.show(\"Employee \" + token.employeeID + \" not found!\");\n\t\t\t}\n\t\t},\n\t\tfunction (info:Object, token:Object):void {\n\t\t\tAlert.show(\"Error getting photo: \" + info);\n\t\t},\n\t\ttoken\n\t));\n}\n```\n\n### Stored Procedure Example\n\nThis is an example of calling a stored procedure that returns a ResultSet as well as output parameters.\n\n```\nimport com.maclema.mysql.Statement;\nimport com.maclema.mysql.Connection;\nimport com.maclema.mysql.ResultSet;\nimport mx.controls.Alert;\nimport mx.rpc.AsyncResponder;\nimport com.maclema.mysql.MySqlToken;\nimport com.maclema.mysql.MySqlResponse;\nimport com.maclema.mysql.MySqlOutputParams;\nimport com.maclema.util.ResultsUtil;\n\n//The MySql Connection\nprivate var con:Connection;\n\nprivate function onCreationComplete():void {\n\tcon = new Connection(\"localhost\", 3306, \"root\", \"\", \"assql-test\");\n\tcon.addEventListener(Event.CONNECT, handleConnected);\n\tcon.connect();\n}\n\nprivate function handleConnected(e:Event):void {\n\tvar st:Statement = con.createStatement();\n\tst.sql = \"CALL getEmployeeList(@LastUpdated)\";\n\tst.registerOutputParameter(\"@LastUpdated\");\n\n\tvar token:MySqlToken = st.executeQuery();\n\n\ttoken.addResponder(new AsyncResponder(\n\t\tfunction(data:Object, token:Object):void {\n\t\t\tif ( data is ResultSet ) {\n\t\t\t\t//handle the results returned.\n\t\t\t}\n\t\t\telse if ( data is MySqlResponse ) {\n\t\t\t\t//check the affectedRows of the procedure\n\t\t\t}\n\t\t\telse if ( data is MySqlOutputParams ) {\n\t\t\t\t//get the output parameter.\n\t\t\t\tvar lastUpdated:String = data.getParam(\"@LastUpdated\");\n\t\t\t}\n\t\t},\n\n\t\tfunction(info:Object, token:Object):void {\n\t\t\tAlert.show(\"Error: \" + info);\n\t\t},\n\n\t\ttoken\n\t));\n}\n```\n\n### Streaming Results\n\nThis is an example of streaming a very large ResultSet and updating a DataGrid every time we receive 500 new rows.\n\n```\n\n    \u003cmx:Script\u003e\n    \u003c![CDATA[\n        import mx.controls.Alert;\n        import mx.rpc.AsyncResponder;\n        import mx.collections.ArrayCollection;\n        import com.maclema.mysql.ResultSet;\n        import com.maclema.util.ResultsUtil;\n        import com.maclema.mysql.events.MySqlEvent;\n        import com.maclema.mysql.MySqlToken;\n        import com.maclema.mysql.Statement;\n        import com.maclema.mysql.Connection;\n\n        private var con:Connection;\n\n        private function onCreationComplete():void {\n            con = new Connection(\"localhost\", 3306, \"root\", \"\", \"assql-test\");\n            con.addEventListener(Event.CONNECT, handleConnected);\n            con.connect();  \n        }\n\n        private function handleConnected(e:Event):void {\n            var st:Statement = con.createStatement();\n\n            //turn on results streaming\n            st.streamResults = true;\n\n            //dispatch new rows event every 500 new rows\n            st.streamingInterval = 500;\n\n            //execute a query\n            var token:MySqlToken = st.executeQuery(\"SELECT * FROM employees\");\n\n            //listen for our result set columns\n            token.addEventListener(MySqlEvent.COLUMNDATA, function(e:MySqlEvent):void {\n                grid.columns = ResultsUtil.getDataGridColumns( e.resultSet );\n                grid.dataProvider = new ArrayCollection();\n            });\n\n            //listen for new rows\n            token.addEventListener(MySqlEvent.ROWDATA, function(e:MySqlEvent):void {\n                addNewRows(e.resultSet);\n            });             \n\n            //add a responder\n            token.addResponder(new AsyncResponder(\n                function(data:Object, token:Object):void {\n                    //call add new rows again to ensure we have all the rows\n                    addNewRows(ResultSet(data));\n                },\n                function(info:Object, token:Object):void {\n                    Alert.show(\"Error: \" + info);\n                },\n                token\n            ));\n        }\n\n        private function addNewRows(rs:ResultSet):void {\n            //get our data provider\n            var dp:ArrayCollection = grid.dataProvider as ArrayCollection;\n\n            //get the collection of new rows\n            var newRows:ArrayCollection = rs.getRows(false, dp.length, (rs.size()-dp.length));\n\n            //concat our current source, and our new rows source\n            dp.source = dp.source.concat( newRows.source );\n\n            //refresh our data provider\n            dp.refresh();\n        }\n    ]]\u003e\n    \u003c/mx:Script\u003e\n\n    \u003cmx:DataGrid id=\"grid\" left=\"10\" right=\"10\" top=\"10\" bottom=\"10\" /\u003e\n```\n\n## Flash Player Policy Server\n\nIf you are using Flash Player, then to use this library you need to connect to a \"policy server\" that allows the sockets.\n\nHere is the absolute simplest configuration for the socket policy file:\n\n\t\u003c?xml version=\"1.0\"?\u003e \u003c!DOCTYPE cross-domain-policy SYSTEM \"/xml/dtds/cross-domain-policy.dtd\"\u003e \u003ccross-domain-policy\u003e \u003callow-access-from domain=\"*\" to-ports=\"3306\" /\u003e \u003c/cross-domain-policy\u003e\n\nThe policy file needs to be served from a socket, listening on port 843 (TCP). Flash will send the request `\"\u003cpolicy-file-request/\u003e\\0\"`, when the server receives this string, it should return the policy file, followed by a null byte.\n\nPHP Flash Policy Daemon:\n\nhttp://ammonlauritzen.com/blog/2008/04/22/flash-policy-service-daemon/\n\nC# Flash Policy Server:\n\nhttp://giantflyingsaucer.com/blog/?p=15\n\nVB.NET Flash Policy Server:\n\nhttp://www.gamedev.net/community/forums/topic.asp?topic_id=455949\n\nPython / Perl Flash Policy Servers:\n\nhttp://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html\n\nMore Information:\n\nhttp://www.adobe.com/devnet/flashplayer/articles/fplayer9_security_04.html\n\n\n### Sample Java Flash Policy File Server\n\nThis is a simple Java servlet, that opens a server socket on port 843 when the web application is started. It listens for `\u003cpolicy-file-request/\u003e\\0` requests, and writes the policy file to the connected client.\n\nThe policy file is read from \"/tomcat/policyserver/ROOT/flashpolicy.xml\", this can be changed in the servlet code.\n\nHere is what you will need in web.xml:\n\n```\nPolicyServerServlet com.maclema.flash.PolicyServerServlet 1\nPolicyServerServlet /policyserver\n```\n\nand here is the servlet code:\n\n```\npackage com.maclema.flash;\n\nimport java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket;\n\nimport javax.servlet.http.HttpServlet;\n\npublic class PolicyServerServlet extends HttpServlet { private static final long serialVersionUID = 1L;\n\nprivate static ServerSocket serverSock;\nprivate static boolean listening = true;\nprivate static Thread serverThread;\n\nstatic {\n    try {\n        serverThread = new Thread(new Runnable(){\n            public void run() {\n                try {\n                    System.out.println(\"PolicyServerServlet: Starting...\");\n                    serverSock = new ServerSocket(843, 50);\n\n                    while ( listening ) {\n                        System.out.println(\"PolicyServerServlet: Listening...\");\n                        final Socket sock = serverSock.accept();\n\n                        Thread t = new Thread(new Runnable() {\n                            public void run() {\n                                try {\n                                    System.out.println(\"PolicyServerServlet: Handling Request...\");\n\n                                    sock.setSoTimeout(10000);\n\n                                    InputStream in = sock.getInputStream();\n\n                                    byte[] buffer = new byte[23];\n\n                                    if ( in.read(buffer) != -1 \u0026\u0026 (new String(buffer)).startsWith(\"\u003cpolicy-file-request/\u003e\") ) {\n                                        System.out.println(\"PolicyServerServlet: Serving Policy File...\");\n\n                                        //get the local tomcat path, and the path to our flashpolicy.xml file\n                                        File policyFile = new File(\"/tomcat/policyserver/ROOT/flashpolicy.xml\");\n\n                                        BufferedReader fin = new BufferedReader(new FileReader(policyFile));\n\n                                        OutputStream out = sock.getOutputStream();\n\n                                        String line;\n                                        while ( (line=fin.readLine()) != null ) {\n                                            out.write(line.getBytes());\n                                        }\n\n                                        fin.close();\n\n                                        out.write(0x00);\n\n                                        out.flush();\n                                        out.close();\n                                    }\n                                    else {\n                                        System.out.println(\"PolicyServerServlet: Ignoring Invalid Request\");\n                                        System.out.println(\"  \" + (new String(buffer)));\n                                    }\n\n                                }\n                                catch ( Exception ex ) {\n                                    System.out.println(\"PolicyServerServlet: Error: \" + ex.toString());\n                                }\n                                finally {\n                                    try { sock.close(); } catch ( Exception ex2 ) {}\n                                }\n                            }\n                        });\n                        t.start();\n                    }\n                }\n                catch ( Exception ex ) {\n                    System.out.println(\"PolicyServerServlet: Error: \" + ex.toString());\n                }\n            }\n        });\n        serverThread.start();\n\n    }\n    catch ( Exception ex ) {\n        System.out.println(\"PolicyServerServlet Error---\");\n        ex.printStackTrace(System.out);\n    }\n}\n\npublic void destroy() {\n    System.out.println(\"PolicyServerServlet: Shutting Down...\");\n\n    if ( listening ) {\n        listening = false;\n    }\n\n    if ( !serverSock.isClosed() ) {\n        try { serverSock.close(); } catch ( Exception ex ) {}\n    }\n}\n}\n```\n\nand this is my flashpolicy.xml:\n\n```\n\u003c?xml version=\"1.0\"?\u003e \u003c!DOCTYPE cross-domain-policy SYSTEM \"/xml/dtds/cross-domain-policy.dtd\"\u003e \u003ccross-domain-policy\u003e \u003callow-access-from domain=\"*\" to-ports=\"3306\" /\u003e \u003c/cross-domain-policy\u003e\n```\n","funding_links":[],"categories":["Networking"],"sub_categories":["Database"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobinrodricks%2Fas3mysql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frobinrodricks%2Fas3mysql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobinrodricks%2Fas3mysql/lists"}