《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 業界動態 > GKD-Base PL/SQL存儲函數實現的關鍵技術研究

GKD-Base PL/SQL存儲函數實現的關鍵技術研究

2008-10-24
作者:高朝瑞 熊偉 陳宏盛  翟玉人

  摘 要: 介紹具有自主知識產權的某安全數據庫管理系統" title="管理系統">管理系統GKD-Base" title="GKD-Base">GKD-Base的PL/SQL引擎,基于該引擎研究GKD-Base存儲函數機制實現的關鍵技術。設計了函數管理器" title="管理器">管理器和執行狀態堆棧,通過語法樹表示存儲函數編譯后生成的中間代碼,并解決了中間代碼的執行問題。最后實現了IN、OUT、INOUT三種參數模式函數的參數傳遞機制。
  關鍵詞: 存儲函數 過程式SQL語言 PL/SQL 函數管理器 執行狀態堆棧


  GKD-Base是一個具有自主知識產權的安全數據庫管理系統。經過十幾年的發展和試點應用,已經證明該系統是穩定和安全可靠的。但是,隨著應用需求向深度和廣度的發展,GKD-Base在很多方面暴露出不足,如不支持過程式SQL語言、不支持存儲過程和函數、缺少觸發器功能,這都為GKD-Base數據庫管理系統的進一步推廣應用帶來了不小的障礙。由于目前數據庫管理系統產品大都支持過程式的SQL語言,如Oracle的PL/SQL、SQL Server的T-SQL、PostgreSQL的PL/pgSQL等,其中又以Oracle的PL/SQL使用最為廣泛。因此,為使GKD-Base適應應用需求的發展,滿足數據庫管理和開發人員的需求,筆者開發了GKD-Base PL/SQL引擎,進而在引擎的基礎上實現了GKD-Base存儲函數機制。GKD-Base PL/SQL引擎兼容了Oracle PL/SQL V2.3語言規范,可以使用變量、類型、表達式、條件和循環、過程和函數等過程式語言中的通用機制進行程序設計,同時也可以使用SQL 語句進行數據操作。
  存儲函數是獨立存在于表之外的數據庫對象,是由用戶按照存儲函數語言規范編寫的經過數據庫分析和編譯的PL/SQL程序,它有輸入/輸出參數和返回值,可以被其它應用程序調用。存儲函數可以避免重復編碼,具有更高的可靠性和效率,是數據庫管理系統的重要功能擴充。本文在介紹GKD-Base PL/SQL引擎設計框架的基礎上,重點探討GKD-Base存儲函數實現的關鍵技術。
1 GKD-Base PL/SQL引擎的體系結構
  GKD-Base采用客戶服務器結構,以多線程機制支持客戶訪問,登錄到數據庫的用戶實際上是運行數據庫管理系統映像的一個線程。GKD-Base支持TCP/IP協議,客戶可以在任何TCP/IP網絡和服務器建立連接訪問數據庫。GKD-Base API提供了用戶應用、實用程序和第三方開發工具三種接入數據庫的方式,并提供了兩個級別的接口,即GKD-Base內部接口GKD-API和GKD-Base ODBC Driver。GKD-API是用戶訪問數據庫的高效調用方式,用戶可利用GKD-API實現實時性要求較高的數據庫應用,起到比較理想的效果。GKD-Base ODBC Driver是GKD-Base開放連接的手段,符合ODBC擴展一級。在GKD-Base的ODBC驅動程序支持下,用戶可利用各種第三方開發工具,方便地開發GKD-Base數據庫應用程序。
  GKD-Base PL/SQL引擎應用模式如圖1。PL/SQL語句塊通過PL/SQL編譯器編譯成語法樹形式表示的中間代碼,中間代碼信息可以保存在DBMS的中間代碼庫中??蛻魬贸绦蛑械恼埱笥蒅KD-Base預處理器分離成為過程語句部分和SQL命令部分。過程語句解釋執行器" title="執行器">執行器解釋執行過程語句的中間代碼,SQL命令則直接調用GKD-API執行。


  根據PL/SQL語言兼有過程式語句和SQL語句的特點,GKD-Base PL/SQL引擎把過程式語句和SQL語句分開處理。為了降低引擎實現的復雜程度,盡可能地從功能性的角度將整個引擎劃分為不同的處理模塊,每個處理模塊盡可能地降低相互間的耦合程度。其中最主要的劃分是將整個引擎劃分為前端編譯器和后端解釋執行器。
  前端編譯器包括語言預處理、SQL語句分析、過程語句分析以及中間代碼生成等功能。PL/SQL語句塊輸入后,由語言預處理功能分離成SQL語句和過程語句。對于SQL語句,由GKD-Base SQL引擎解析后,建立SQL語句結點,進行相應的變量綁定和語法檢查,檢查無誤后產生語法樹形式的中間代碼。對于過程語句,將語句成分進行語法分析,在分析中把聲明的變量和數據類型加入到符號表中,同時也產生語法樹形式的中間代碼。
  后端解釋執行器的功能就是對前端編譯器生成的中間代碼進行解釋執行。因此在結構上,解釋執行器與編譯器對應,也有過程語句執行模塊和SQL語句執行模塊。過程語句解釋執行器解釋執行過程語句的中間代碼,SQL命令則直接由SQL引擎執行。另外,解釋器還包括例外處理模塊,負責錯誤檢查和報告。
  符號表是一個包含程序中的變量、自定義類型和函數信息的數據庫,它是GKD-Base PL/SQL引擎的核心數據結構。它以一個關鍵字域(通常是一個符號的名字)為索引,一個關鍵字域的值對應于庫中的一條記錄。每條記錄,即數據庫的一個項目,都對應著一個符號的信息,如變量的類型或函數的返回值等。
2 GKD-Base PL/SQL過程與函數語言成分設計
  子程序" title="子程序">子程序把功能獨立并需要反復用到的代碼加以參數化處理,從而整合為一個命名模塊,在要使用這個模塊時就傳入具體參數值(如果需要)進行調用。與第三代語言中的子程序一樣,GKD-Base PL/SQL過程與函數是特定功能的邏輯抽象,由子程序定義和引用組成,可以分為過程和函數兩種類別。PL/SQL子程序可以分開編譯并存儲到數據庫中,用CREATE 語句建立,并成為模式對象的一部分。存儲過程/函數可以位于包結構中,包分為包聲明和包體實現部分。本地過程/函數在DECLARE 節中的最后部分進行,而作為存儲過程和存儲函數將存儲在數據庫中,它們是命名的PL/SQL塊。這樣它們在結構上也就沒有特別之處了。下面主要討論形參和實參的綁定設計。
  PL/SQL 函數中的參數說明帶有輸入和輸出描述,需要在編譯時刻進行處理,并對調用時的參數類型是否相容進行檢查。但在PL/SQL過程和函數的聲明中,限制CHAR、VARCHAR2參數的長度以及限制NUMBER的精度都是非法的。這是由于在調用一個函數時,實際參數的取值被傳遞進去,在函數內部通過使用形式參數來引用這些實際參數,不僅實際數值被傳遞進去,而且作為參數傳遞機制的一部分,對于這些變量的限制也被傳遞進去。例如:
  創建函數:
  CREATE OR REPLACE FUNCTION ParameterLength (p_Var1 IN OUT VARCHAR2)
  RETURN VARCHAR2 AS
  BEGIN
    p_Var1:=′This is an example′;
    RETURN p_Var1; 
  END ParameterLength;
  調用函數:
  DECLARE
  v_Variable1 VARCHAR (30);
  v_Variable2 VARCHAR (30);
  BEGIN
    v_Variable2:= ParameterLength (v_Variable1);
  END;
  上述調用將使p_Var1變量的最大長度為30(來自實參)。而如果將v_Variable1的長度定義成10,將產生錯誤。這個錯誤的產生不是過程設計不好,而是因為調用該過程的代碼發生了問題。值得注意的是:在過程定義中如果使用%TYPE作為形參類型的限制,而基準類型又是受限的,那么該限制將作用于形式參數而不是實際參數。
  在缺省參數值的處理方式上,即當調用時,沒有指明實際值時,就用缺省值。對使用缺省值的形式參數,通常需要把它們放到參數表的末尾,這樣無論使用位置標識法還是帶名標識法都可以。
3 GKD-Base存儲函數實現的關鍵技術
3.1函數管理器

  GKD-Base PL/SQL引擎對PL/SQL程序的解釋執行都通過一個內部統一的入口,解釋器把語法樹載入到入口內部的一個默認的主控函數,由這個函數驅動對其解釋執行。這樣處理的主要目的是為了兼容子程序的語法分析和保持解釋器運轉機制的一致性。因為子程序就是PL/SQL程序中命名的語句塊,用戶調用子程序時,PL/SQL引擎可以再次調用內部主控函數對其進行處理,并提交解釋器執行。
  PL/SQL子程序包括局部聲明子程序和存儲子程序。為了管理和調用局部聲明子程序,設計了函數管理器,如圖2。函數管理器內部定義了一系列數據結構來描述局部聲明子程序調用的各種屬性,提供各種宏調用來獲取局部聲明子程序調用的參數和返回值,并提供必要的支持函數。從某種角度看,函數管理器也是用來存放各種局部聲明函數和過程信息的“符號表”,因為在管理器中還包括對聲明子程序聲明和調用信息的存儲、查找等功能。函數管理器提供一種結構化的處理手段,以一種統一的方式實現對局部聲明子程序的調用。這種“統一”表現在:每個局部聲明子程序都在函數管理器中獲得一個識別號(Oid),這個識別號唯一標識該局部聲明子程序;函數管理器維持一份記錄表格,其中存放所有局部聲明子程序的識別號、子程序名、子程序地址、參數個數和返回值類型等信息,同時接口還提供相應的查找功能,源程序中的局部聲明子程序調用會被轉換成為子程序的識別號并通過該識別號查找得到子程序的詳細信息。


  所有局部聲明子程序都在函數管理器中進行注冊,存儲子程序并不在函數管理器中注冊,而是保存在數據庫中。對于一個子程序調用,首先根據子程序名到函數管理器中查找;如果沒有在函數管理器中找到再去查找數據庫,這樣就兼容了Oracle PL/SQL V2.3局部聲明子程序的定義優先于存儲子程序的規則。
3.2 執行狀態堆棧
  在GKD-Base PL/SQL引擎的解釋執行器中,設計了一個 “執行狀態”的數據結構,其中記載了存儲函數的執行狀態信息,如函數中的聲明變量、函數的參數個數、函數的參數類型、函數每個參數的值、函數的返回值等。解釋器中所有的解釋函數都擁有一個指針參數指向這個結構,需要在這些函數間傳遞的信息(包括全局變量信息)將被拷貝到這個結構??紤]到存儲函數是個單獨的PL/SQL語句塊層次,因此設計了執行狀態堆棧。在調用存儲函數前,對當前的現場進行保存,也就是將當前的執行狀態壓棧;在存儲函數調用結束之后恢復保存的現場,彈出當前執行狀態,回到上一層執行狀態繼續執行,如圖3。


3.3 存儲函數的創建和調用
  用戶創建的存儲函數經過編譯得到中間代碼并保存在GKD-Base的中間代碼庫中。函數調用時,根據函數名到GKD-Base的中間代碼庫中查找相應存儲函數的中間代碼對其解釋執行,最后得到返回值。GKD-Base存儲函數的創建和調用分別對應中間代碼的產生和執行過程。
  PL/SQL引擎對存儲函數的創建的具體處理過程如下:
  ①編譯器得到用戶創建的存儲函數;
 ?、趯τ脩魟摻ǖ拇鎯^程進行編譯,如果編譯通過則生成該存儲函數的語法樹;否則向用戶報告錯誤;
 ?、蹖⒋鎯瘮抵虚g代碼保存在中間代碼庫中;存儲函數的源代碼保存在GKD-Base的系統表中,如表1;
 ?、芟蛴脩舴祷叵ⅰ?BR>  根據Oracle PL/SQL V2.3 語言規范,存儲函數調用本身不是一個語句,它只能作為其它語句的一部分。PL/SQL引擎對存儲函數的調用的具體過程如圖4:
  ①解釋器中語句鏈的解釋函數調用存儲函數的解釋函數;
 ?、诮忉屍髟趫绦写鎯瘮抵?,對當前的現場進行保存,即將當前的執行狀態壓棧;
 ?、鄣綌祿斓闹虚g代碼庫中找到存儲函數的語法樹,把存儲函數的語法樹掛在整個PL/SQL語句塊語法樹的過程調用節點上,并提交解釋器;
 ?、芙忉屍鲌绦写鎯瘮抵虚g代碼;
 ?、萁忉屍髟诖鎯瘮嫡{用結束后,將返回值返回給調用它的語句,并恢復保存的現場,彈出當前執行狀態,回到上一層執行狀態繼續執行。


3.4 存儲函數的參數傳遞機制
  上述存儲函數調用過程中的一個主要難點就是實際參數和形式參數之間值的傳遞。與其它第三代語言一樣,用戶可以創建帶參數的PL/SQL存儲函數。這些參數可以通過值進行傳遞,也可以通過引用進行傳遞。
  GKD-Base PL/SQL引擎對存儲函數的形式參數的處理與對變量的處理是一致的,每個形式參數的屬性信息對應著符號表中的一條記錄,形式參數的名字信息保存在相應的名字堆棧層次內。如本文第三部分所述,存儲函數的語法樹也是由解釋器載入到一個內部默認的主控函數,由這個函數驅動對其解釋執行。解釋器內部的主控函數驅動存儲函數中所有變量的初始化,也驅動實際參數和形式參數之間值的傳遞。編譯器解析過程調用語句得到實際參數信息,首先判斷實際參數和形式參數的數據類型是否匹配,經過類型檢查后,如果實際參數是常量或普通變量,直接將實際參數的值拷貝給形式參數;如果實際參數是表達式,計算表達式的值傳給形式參數;如果存儲函數的形式參數個數大于解析得到的實際參數個數,二者之差為n,那么前面的形式參數取實際參數的值,后n個形式參數取語法樹中對應的缺省值。
  在Oracle PL/SQL V2.3中,存儲函數的形式參數有三種模式:IN、OUT或INOUT。當調用函數時,對IN參數,實際參數的值傳遞給過程,函數結束后,實際參數沒有被改變;對OUT參數,實際參數的任何值都被忽略,形式參數有一個NULL值,函數結束后,形式參數的內容賦給實際參數;對INOUT參數,實際參數的值傳遞給過程,函數結束后,形式參數的內容賦給實際參數。同時在存儲函數內部,對IN參數賦值和把OUT參數賦給局部變量都是非法操作。
  在GKD-Base PL/SQL引擎中實現存儲函數三種形式參數模式的關鍵是執行前后實際參數和形式參數的值的相互正確傳遞。在執行存儲函數中間代碼前,判斷每個形式參數的模式,如果參數模式是IN或INOUT,直接把實際參數的值傳遞給形式參數;如果模式是OUT,直接賦給形式參數一個初始的NULL值。對函數執行體內的賦值語句進行判斷檢查,如果賦值目標是IN參數或把OUT參數賦給其它變量,都報告相應的執行錯誤。函數執行結束后,解釋器彈出當前執行狀態,回到上一層執行狀態繼續執行。對IN參數,實際參數直接取其本身的值,即實際參數沒有改變;對OUT參數和INOUT參數,根據執行前形式參數和實際參數的對應關系,用執行完畢后的形式參數的值替代原來實際參數的值,即執行完后形式參數的內容賦給實際參數。
  PL/SQL 集成了一般過程式語言和說明性SQL 語言的特點,簡潔、高效,而其內容卻十分豐富。這也從一個方面說明了作為過程式數據庫編程語言,在考慮到底層數據庫功能時所面臨的各種選擇的艱難。PL/SQL 語言的某些功能將隨著ORACLE 數據庫的發展而繼續增強,但是該語言的結構是基本穩定的。本文參照Oracle PL/SQL V2.3 語言規范,在某安全數據庫管理系統GKD-Base上開發了PL/SQL引擎作為該系統的重要擴充,并在該引擎基礎上實現了GKD-Base存儲函數機制,提供給用戶一種高效率的編程手段,增強了GKD-Base的功能。希望本文實現的PL/SQL引擎能對國產數據庫的開發起到借鑒作用。當然PL/SQL 語言內容十分豐富,本文不可能涉及到每一個設計細節,PL/SQL 還在進一步發展,值得繼續關注。
  為了進一步擴展GKD-Base在安全保密領域的應用前景,筆者將在對GKD-Base本身進一步完善的同時,繼續對GKD-Base PL/SQL引擎進行完善和改進。一方面在功能上實現封裝函數和過程的包;另一方面,在性能上對原有GKD-Base PL/SQL引擎進行優化以提高編譯和執行效率。
參考文獻
1 Ken Henderson. The Guru′s Guide to Transact-SQL. AddisonWesley PuB Co., 2000
2 PostgreSQL 7.4 Documentation.The PostgreSQL GloBal Development Group, 2003
3 Kenneth C.Louden著,馮博琴譯.編譯原理及實踐.北京:機械工業出版社,2000
4 Hector Garcia-Molina,Jeffrey D. Ullman,Jennifer Widom著.楊東青,唐世渭,徐其鈞譯. 數據庫系統實現. 北京:機械工業出版社,2001
5 Levine,J.R.,lex與yacc(第二版).北京:機械工業出版社,2003

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          欧美国产在线观看| 午夜精品久久久| 狠狠色丁香久久婷婷综合丁香| 亚洲欧洲精品一区二区三区不卡| 欧美国产精品| 亚洲黄色av| 亚洲最新中文字幕| 国产亚洲va综合人人澡精品| 欧美日产一区二区三区在线观看| 亚洲精品国产精品国产自| 日韩视频在线永久播放| 欧美专区第一页| 激情婷婷欧美| 激情久久久久久久| 在线欧美影院| 99在线视频精品| 欧美日韩在线播放三区四区| 国产日本欧美一区二区三区在线| 欧美视频观看一区| 欧美日韩精品免费观看视一区二区| 销魂美女一区二区三区视频在线| 国产欧美一区二区三区沐欲| 欧美一区二区啪啪| 在线亚洲免费| 国产精品乱人伦中文| 欧美日韩国产黄| 91久久国产综合久久蜜月精品| 亚洲开发第一视频在线播放| 久久视频这里只有精品| 欧美日韩国产一区二区| 欧美午夜精品电影| 国产精品久久婷婷六月丁香| 狠狠狠色丁香婷婷综合久久五月| 亚洲人成在线播放网站岛国| 欧美特黄视频| 老司机aⅴ在线精品导航| 欧美成人精品三级在线观看| 亚洲另类一区二区| 亚洲日本成人网| 黄色资源网久久资源365| 国产精品亚洲精品| 亚洲国产婷婷综合在线精品| 亚洲女性喷水在线观看一区| 欧美一区二区在线免费播放| 亚洲国产精品久久久久秋霞影院| 欧美日本乱大交xxxxx| 国产色产综合产在线视频| 久久久久91| 国产一区视频在线观看免费| 国产精品高潮视频| 欧美日韩中文在线| 免费观看在线综合色| 国产精品美女主播在线观看纯欲| 999亚洲国产精| 噜噜噜噜噜久久久久久91| 午夜精品一区二区三区电影天堂| 欧美日本一区二区三区| 久久精品二区亚洲w码| 欧美激情二区三区| 欧美黑人一区二区三区| 国产精品v欧美精品∨日韩| 国产性色一区二区| 亚洲高清色综合| 久久阴道视频| 国产精品久久久久久福利一牛影视| 亚洲视频导航| 好看的av在线不卡观看| 日韩网站免费观看| 欧美在线一二三区| 国产一区二区中文字幕免费看| 亚洲欧美日韩成人高清在线一区| 欧美日韩精品福利| 一本一本久久a久久精品综合麻豆| 国内精品视频666| 久久亚洲精品网站| 久久久久久夜精品精品免费| 欧美精品在欧美一区二区少妇| 亚洲激情中文1区| 99人久久精品视频最新地址| 欧美日韩久久| 99re这里只有精品6| 另类专区欧美制服同性| 欧美精品在线播放| 狠狠爱www人成狠狠爱综合网| 亚洲一区二区成人在线观看| 精品成人一区二区| 国产一区二区日韩| 国产亚洲一区在线| 亚洲国产精品久久久| 亚洲一区二区三区精品在线观看| 欧美激情精品久久久久久久变态| 亚洲日本国产| 国产一区日韩一区| 亚洲经典视频在线观看| 欧美极品色图| 欧美成人综合在线| 性欧美1819sex性高清| 午夜精品免费在线| 欧美黄污视频| 久久这里只精品最新地址| 国产欧美亚洲日本| 欧美激情日韩| 先锋影音国产精品| 国产综合亚洲精品一区二| 影音先锋久久久| 国产欧美日韩中文字幕在线| 亚洲国产成人精品女人久久久| 欧美色精品在线视频| 亚洲欧美制服中文字幕| 亚洲高清一二三区| 亚洲国产天堂久久综合网| 国产日韩av高清| 在线精品高清中文字幕| 国产精品一区二区三区四区| 欧美日韩二区三区| 一区二区三区回区在观看免费视频| 国产女人精品视频| 欧美精品日韩精品| 欧美中文字幕视频在线观看| 久久人91精品久久久久久不卡| 欧美日韩一区二区视频在线观看| 日韩视频在线观看免费| 欧美一区日本一区韩国一区| 国产精品久久久久久久久久久久久久| 国产精品久久久久国产精品日日| 韩日视频一区| 欧美日韩中文在线观看| 欧美国产欧美亚州国产日韩mv天天看完整| 日韩午夜免费视频| 久久久一区二区三区| 日韩网站在线观看| 美女国产一区| 一区二区三区在线免费观看| 欧美影院成人| 一二三区精品福利视频| 宅男噜噜噜66国产日韩在线观看| 欧美日韩国产影院| 亚洲伦理网站| 狠狠色丁香久久婷婷综合_中| 一区二区三区四区五区在线| 欧美日韩国产精品一区二区亚洲| 日韩一区二区免费高清| 久久亚洲综合色| 国产视频一区二区三区在线观看| 午夜精品在线观看| 国产美女精品| 尤物九九久久国产精品的分类| 精品二区视频| 久久精品国产亚洲一区二区三区| 美女主播一区| 久久九九全国免费精品观看| 国产精品专区h在线观看| 午夜精品婷婷| 免费毛片一区二区三区久久久| 欧美精品一区二区三区视频| 国产欧美一区二区精品性色| 一区精品在线播放| 欧美视频中文在线看| 欧美国产精品中文字幕| 午夜免费在线观看精品视频| 国产精品国产三级国产普通话三级| 欧美日韩在线免费视频| 99精品99久久久久久宅男| 欧美极品在线观看| 欧美岛国在线观看| 久久激情综合网| 裸体一区二区| 国产一区二区三区四区hd| 国模精品娜娜一二三区| 欧美人与性动交a欧美精品| 国产日韩av在线播放| 欧美综合国产| 国产精品激情偷乱一区二区∴| 国产精品成人免费| 久久久久久精| 久久一区二区三区四区五区| 亚洲欧洲日夜超级视频| 久久黄色级2电影| 欧美一区二区黄| 国产欧美午夜| 亚洲国产日韩欧美一区二区三区| 国产无遮挡一区二区三区毛片日本| 国产一区二区三区在线观看免费视频| 久久五月激情| 亚洲黄色尤物视频| 欧美黄色网络| 欧美激情亚洲自拍| 欧美日韩高清免费| 久久亚洲美女| 国产日韩亚洲欧美综合| 久久久久国色av免费观看性色| 一本一本久久a久久精品综合麻豆| 狂野欧美性猛交xxxx巴西| 亚洲午夜电影网| 欧美成人午夜影院| 欧美激情一区在线| 一区福利视频| 亚洲精品五月天| 久久久久国产免费免费| 久久综合色婷婷| 99精品国产一区二区青青牛奶| 影音先锋久久| 狼狼综合久久久久综合网| 久久爱www| 亚洲午夜一级| 欧美性猛交视频| 亚洲尤物在线| 激情久久久久久久| 影音先锋成人资源站| 国产精品久久久久久久9999| 欧美久久久久久久久| 亚洲欧美999| 午夜欧美精品久久久久久久| 国产精品久久久久9999高清| 国产一区 二区 三区一级| 黄色在线一区| 最新日韩中文字幕| 妖精视频成人观看www| 欧美色网一区二区| 国产精品一级久久久| 一本色道久久综合亚洲精品小说| 亚洲国产高潮在线观看| 国产精品视频午夜| 亚洲欧美在线观看| 欧美人妖另类| 国产视频综合在线| 欧美欧美午夜aⅴ在线观看| 亚洲精品欧洲精品| 欧美激情国产日韩| 亚洲精品视频中文字幕| 国产欧美日韩亚洲一区二区三区| 午夜精品区一区二区三| 久久这里有精品15一区二区三区| 亚洲精品欧美激情| 久久精品国产清自在天天线| 亚洲毛片网站| 国产精品嫩草99av在线| 亚洲图片在区色| 在线观看欧美日韩| 日韩一级视频免费观看在线| 另类人畜视频在线| 在线亚洲国产精品网站| 亚洲精品在线三区| 欧美日本韩国一区| 欧美一区二区在线免费观看| 欧美肉体xxxx裸体137大胆| 国产精品久久久久一区| 欧美视频在线观看免费网址| 欧美精品在线看| 亚洲日产国产精品| 国产精品一区在线观看你懂的| 美国三级日本三级久久99| 国产精品进线69影院| 蜜臀av在线播放一区二区三区| 久久手机精品视频| 久久免费黄色| 国产综合色在线| 欧美网站大全在线观看| 99re在线精品| 亚洲人成小说网站色在线| 在线精品视频一区二区| 国产一区二区三区网站| 欧美与黑人午夜性猛交久久久| 亚洲精品在线观看免费| 欧美精品在线看| **网站欧美大片在线观看| 久久这里有精品15一区二区三区| 欧美sm极限捆绑bd| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲另类视频| 国产欧美一区二区三区国产幕精品| 欧美精品日韩精品| 国产精品久久久久久久久久久久| 国产精品福利在线观看| 久久成人国产| 亚洲国产高清在线| 久久国产精品99国产| 欧美精品在线一区| 欧美日本在线视频| 亚洲免费中文| 亚洲欧美在线磁力| 欧美一区二区三区在线观看视频| 国产精品二区在线| 亚洲狼人综合| 狠狠色伊人亚洲综合成人| 久久精品亚洲一区二区三区浴池| 在线播放豆国产99亚洲| 欧美亚洲综合另类| 久久网站热最新地址| 欧美日本高清一区| 国产精品99久久久久久人| 国产精品久久久久一区二区三区| 国产精品www网站| 欧美日本高清视频| 亚洲精品乱码久久久久久日本蜜臀| 国产精品igao视频网网址不卡日韩| 国产一区二区丝袜高跟鞋图片| 国产欧美一区二区在线观看| 亚洲福利视频三区| 国产精品私拍pans大尺度在线| 卡一卡二国产精品| 欧美成人一区在线| 欧美一区二区三区在线视频| 午夜视频在线观看一区二区三区| 亚洲每日在线| 美女啪啪无遮挡免费久久网站| 国产精品视频久久| 在线综合亚洲欧美在线视频| 欧美日韩国产综合视频在线| 亚洲品质自拍| 国产精品久久国产愉拍| 亚洲视频在线一区| 性色av香蕉一区二区| 欧美黑人国产人伦爽爽爽| 国内精品视频一区| 激情欧美国产欧美| 亚洲狠狠丁香婷婷综合久久久| 久久精品视频va| 国产欧美日韩视频一区二区| 国产精品盗摄一区二区三区| 国产专区综合网| 免费不卡亚洲欧美| 久久综合给合| 亚洲欧美日本在线| 欧美日本韩国一区| 欧美性猛交99久久久久99按摩| 亚洲欧美成人综合| 欧美日韩免费观看一区=区三区|