CUBRID | Enterprise Open Source DBMS 2025-10-02T01:57:00+00:00 /index.php?module=rss&act=atom XpressEngine <![CDATA[Getting Started With DBeaver for CUBRID]]> /3828101 2022-07-13T14:05:25+00:00 2022-07-13T14:09:35+00:00

Written by Thim Thorn at Phnom Voar Software, Cambodia

 


Introduction 

DBeaver is a free multi-platform database tool for developers, database administrators, analysts and all people who need to work with databases. It supports all popular databases: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Apache Hive, Phoenix, Presto, etc. DBeaver is running on Windows, Mac OS X and Linux. This document summarizes how to get started with DBeaver for CUBRID for Windows users.

 


Installing DBeaver on a Windows 

To install DBeaver, open a web browser and go to dbeaver.io/download/. Click Windows (Installer) under Community Edition.

 

r/CUBRID - Getting Started With DBeaver for CUBRID

 

Follow the instructions on the installation screen. At “Choose Components,” if you already have a Java installed on your machine and you want to use it, uncheck “Include Java.”

 

r/CUBRID - Getting Started With DBeaver for CUBRID

 


Start DBeaver and connect to databases

After starting DBeaver, go to “New databases connection” and select CUBRID.

 

r/CUBRID - Getting Started With DBeaver for CUBRID

You will need to provide CUBRID-specific connection settings as follows:

 

The connection setting displayed, fill the box on CUBRID connection setting (the information secures provided by CUBRID)

  • JDBC URL: URL for CUBRID JDBC driver. It is automatically populated.

  • Host: IP of server on which CUBRID server is running

  • Port: A TCP port for CUBRID, by default, 33000.

  • Database/Schema: A database name. We will use ‘demodb’ for this tutorial.

  • Username: A user name. We will use ‘dba’ for this tutorial.

  • Password: The password of the user. We will leave the password blank in this tutorial.

 

r/CUBRID - Getting Started With DBeaver for CUBRID

Click “Test Connection” to make sure the connection is successful, and then click “Finish."

 


Explore Databases 

You can view the content of a table in the Database Navigator. Select the table that you want to see and select “View Data.”

 

r/CUBRID - Getting Started With DBeaver for CUBRID

 

Another very useful and cool feature is to see the relationship between the tables. Select the table from which you want to see the relationships and select “View Diagram.” It will show an ER diagram of the table and its relationship.

 

r/CUBRID - Getting Started With DBeaver for CUBRID

 


Run SQL queries 

You can run SQL queries against the CUBRID server using DBeaver for CUBRID. Here are a few examples you can try with the ‘demodb’ database. For instance, the following SQL would return the number of countries that participated in the Olympic games each year:

 

select host_year, count(nation_code)
from participant
group by host_year
order by host_year desc;

 

r/CUBRID - Getting Started With DBeaver for CUBRID

 

At the Olympic games, athletes represent their country and they compete with each other to get gold medals. The following SQL would return the number of gold medals each country won in 2004 in the order of the number of medals:

select participant.host_year, nation.name, participant.gold
from participant, nation
where participant.host_year = 2004
and participant.gold > 0
and participant.nation_code = nation.code
order by participant.gold desc;

 

 

r/CUBRID - Getting Started With DBeaver for CUBRID

]]>
<![CDATA[Getting Started with Cubrid Migration Toolkit Console Mode]]> /3828092 2022-07-13T13:51:04+00:00 2022-07-13T13:53:02+00:00

Written by Rathana Va at Phnom Voar Software, Cambodia

 


Introduction 

CUBRID Migration Toolkit (CMT) Console is a tool to migrate the data and the schema from the source DB (MySQL, Oracle, CUBRID, etc) to the target DB (CUBRID). CMT Console mode is a separate product from the CMT GUI version. It could be useful for some cases like automating migration or linux command line mode.

 


Installation 

  • Windows

1. Download through the link: http://ftp.cubrid.org/CUBRID_Tools/CUBRID_Migration_Toolkit/CUBRID-Migration-Toolkit-11.0-latest-windows-x64.zip

2. Extract the Zip file

?

  • Linux

1. Download through the link using web browser or wget command: http://ftp.cubrid.org/CUBRID_Tools/CUBRID_Migration_Toolkit/CUBRID-Migration-Toolkit-11.0-latest-linux-x86_64.tar.gz

2. Extract the tar.gz file

?

tar -xf CUBRID-Migration-Toolkit-11.0-latest-linux-x86_64.tar.gz

 


Using CMT Console

Build Migration Script

It is a feature for exporting the xml script which is used for migrating databases. CMT GUI versions also support this feature.

 

Command Template

  • Windows:

migration.bat script -s <source_configuration> -t <target _configuration> -o <script_file> 
  • Linux:

sh migration.sh script -s <source_configuration>  -t <target _configuration> -o <script_file> 

 

  • source_configuration: It is a configuration name of database source connection.

  • target_configuration: It is a configuration name of data target connection

  • script_file: It is the xml script file name which is going to save after successfully generated.

Open db.conf file which is located inside the CMT console folder, then modify configuration for your database connection. db.conf has prefix configuration names like: db2, db3, db4, mt, demodb. It is just a configuration name when set in command, you can add new or change as for your convenience.

 

Parameters:

  • type: It is a type of database: like MySQL, cubrid …etc.

  • driver: driver file which located in jdbc folder corresponded to type of database, better just leave as default from original db.conf

  • host: IP address of server which database has installed

  • port: Port of database running, for example curbrid running on port 33000 as default.

  • dbname: name of database schema

  • user: username of database

  • password: password of user

  • charset: utf-8

In this example, let pick up mt as source and demodb as target.

Now replace variable in command line to real value.

 

Command Usage

Open terminal or cmd and navigate to the CMT Console folder which you have extracted.

  • Windows

migration.bat script -s mt -t demodb -o script.xml 
  • Linux

sh migration.sh script -s mt -t demodb -o script.xml 

 

After successfully executing, it will generate a script.xml file in the CMT console folder.

 

Migration Database

It is a feature for migrating databases by using xml script.

  • Window

migration.bat start script.xml
  • Linux

sh migration.sh start script.xml

 

After finishing, it shows the results like this.

r/CUBRID - Getting Started with Cubrid Migration Toolkit Console Mode

Finally, we can migrate databases successfully. It will generate a report which is located in the workspace/cmt/report and can be viewed in CMT GUI version.

 

]]>
<![CDATA[CUBRID INSIDE: Subquery and Query Rewriter (View Merging, Subquery Unnest)]]> /3828064 2022-07-08T18:34:33+00:00 2022-07-08T18:34:32+00:00

Written by?SeHun Park?on?08/07/2021

?


What is Subquery?

A subquery is a query that appears inside another query statement. Subquery enables us to extract the desired data with a single query. For example, if you need to extract information about employees who have salary that is higher than last year¡¯s average salary, you can use the following subquery:?

subquery1.png

?

It is possible to write a single query as above without writing another query statement to find out the average salary. Subquery like this has various special properties, and their properties vary depending on where they are written.

subquery2.png

  • scalar subquery: A subquery in a SELECT clause. Only one piece of data can be viewed.
  • inline view: A subquery in the FROM clause. Multiple data inquiry is possible.
  • subquery: A subquery in the WHERE clause. It depends on the operator and the properties of the scalar subquery or inline view.

The use of subqueries makes queries more versatile but it can adversely affect query performance.

?

?


The Sequence of Subquery Execution and Causes of Performance Degradation

?

A subquery is always executed before the main query to store temporary results. And as the main query is executed, the temporarily stored data of the subquery is retrieved to obtain the desired result.

?

For example, the subquery is executed first, the result is stored in the temporary storage, and the final result is extracted by checking the condition 'a.pk = 3'.

ccd42a160a189d65cd6b3d43a5e85199.jpg

?

?

As the number of subquery results increases, useless data will be stored during the process. And also, the index cannot be used because it is searched from the temporary data stored in the middle.

?

This kind of query process is very inefficient. Does DBMS execute the above query as we describe? No.

?


View Merging

Removing the in-line view and merging it into the main query is called view merging.

vewmerging_1.jpg

With view merging, there is no need to store temporary data, and index scans for pk are now possible. No matter how the user writes the subquery, if it is possible to merge with the main query, the DBMS proceeds with the merger. The merging of these views serves to remove the constraint of the execution order before going to the OPTIMIZER phase; which is, putting all the tables on the same level and finding the most optimal execution plan.

viewmerging2.jpg

In the case of the above query, the join of tbl2 and tbl3 in the subquery always proceeds together before the view is merged. For example, a join order such as tbl3->tbl1->tbl2 is not possible. The merging of views is ultimately aimed at removing the constraint of the execution order and allowing OPTIMIZER to find the optimal execution plan.

?

CUBRID supports view merging including in-line views from CUBRID 11.2. In the previous version, view merging was performed only for view objects, but this function has been expanded from CUBRID?11.2.

?

?


Subquery UNNSET

This is a rewriting technique applied to the subquery of the WHERE clause. Typically, it targets IN and EXISTS operators.

subquery unnset1.jpg

How is the above query executed?

?

In CUBRID, the IN operator extracts the data of the main query as the result of the subquery. If you think of it as table join order, tbl2 ==> tbl1 order.

?

Then what about other operators?

susbquery unnset2.jpg

The case for EXISTS operator is the opposite. If we express it in join order, the order will be tbl1 ==> tbl2. Depending on how the query is written, there are restrictions on the order of performance. Depending on the amount of data in the subquery and main query, IN operator may be advantageous or vice versa.

?

Overcoming this situation is the SUBQUERY UNNEST technique.

subqueryunnset3.jpg

If it is converted to a join as above, OPTIMIZER can choose which table to look up first. Rewriting the subquery of the WHERE clause as a join is called SUBQUERY UNNEST.

?

One peculiarity is that the IN and EXISTS operators must not affect the result of the main query even if there is duplicate data in the result of the subquery.

?

For that reason, a Semi Join is performed instead of a normal join. A Semi Join stops the search when the first data is found and proceeds to the next search. Semi Join is a join method used to achieve the same result as an operator such as IN.

(However, CUBRID has not supported SUBQUERY UNNEST yet. It is recommended to use IN and EXISTS operators according to the situation.)

?

By rewriting the query, the DBMS removes the constraint on the execution order implied in the query. Converting an OUTER JOIN to an INNER JOIN, or deleting an unnecessary table or query entry, serves the same purpose.

?

OPTIMIZER will be able to create an optimal execution plan in a situation where there is no restriction on the execution order as much as possible. And it will eventually increase query performance and allow DBMS users to get the data they want quickly.

?

Sometimes, when users check the execution plan of a query, it appears completely different from the query and users are confused. Understanding the query rewrite technique will be a?great help.?Currently, the CUBRID development team is working on rewriting these queries and improving OPTIMIZER. In the next blog, we will talk about what does OPTIMIZER do to find the optimal execution plan.

]]>
<![CDATA[CUBRID DBLink]]> /3828038 2022-06-27T13:19:09+00:00 2022-06-27T13:22:52+00:00

Written by DooHo Kang?on 27/06/2022

?


What is CUBRID DBLink

When retrieving information from a database, it is often necessary to retrieve information from an external database. Therefore, it is necessary to be able to search for information on other databases. CUBRID DBLink allows users to use the information on other databases.

?

CUBRID DBLink provides a function to inquire about information in the databases of homogeneous CUBRID and heterogeneous Oracle and MySQL.

?

* It is possible to set up multiple external databases, but when searching for information, it is possible to inquire about information from only one other database.

?


CUBRID DBLink Configuration

CUBRID DBLink supports DBLink between homogeneous and heterogeneous DBLinks.

?

  • Homogeneous DBLink diagram

?

If you look at the configuration diagram for inquiring about information of a homogeneous database, you can use CCI in Database Server to connect to homogeneous brokers and inquire about information from an external database.

Homogeneous DBLink diagram.png

?

  • Heterogeneous DBLink diagram

If you look at the configuration diagram for inquiring about the information in heterogeneous databases, you can inquire about information in heterogeneous databases through GATEWAY.

Heterogeneous DBLink diagram.png

?

*GATWAY uses ODBC (Open DataBase Connectivity).

Please refer to CUBRID 11.2 manual for detailed information about GATWAY.

?


Setting Up?CUBRID DBLink

  • ?Homogeneous DBLink Setting

If you look at the Homogeneous configuration diagram above, you need to connect to the broker of the external database, so you need to set up the broker for the external database. This setting is the same as the general broker setting.

?

  • Heterogeneous DBLink Setting

It is necessary to set the information to connect to a heterogeneous type (Oracle/MySQL), and the heterogeneous setting value must be written in GATEWAY.

GATEWAY can be configured through the parameters of cubrid_gateway.conf .

(For reference, since GATEWAY uses ODBC, unixODBC Driver Manager must be installed for Linux.)

?

This is an example of DBLink configuration in cubrid_gateway.conf.

gateway configuration example.png

?


How to Use CUBRID DBLink

In the case of setting up homogeneous brokers and heterogeneous gateways, let¡¯s look at how to write Query statements to inquire about database information. There are two ways to write a DBLINK Query statement for data inquiry.

?

First, how to query information from other databases by writing DBLINK syntax in the FROM clause. The Query statement below is a Query statement that inquires about the remote_t table information of another database of IP 192.168.0.1.

?

query1.png

As you can see in the above syntax, you can see the SELECT statement for retrieving connection information and other database information, It is divided into three parts: the virtual table and column name corresponding to the SELECT statement.

?

Secondly, DBLINK Query statement requires connection information to connect to other databases. If the connection information is the same and only the SELECT statement needs to be changed, the connection information is updated every time a Query statement is written. and there is a risk that user information (id, password) is exposed to the outside.

?

Therefore, if you use the CREATE SERVER statement for such trouble and information protection, it is simpler than the Query statement and helps to protect user information.

?

query2.png

If you look at the above syntax, you can replace the Connection information with remote_srv1.

?


Retrieving Information from External Database using CUBRID DBLink

Now that we have completed the setup for using CUBRID DBLink, we can retrieve information from the CUBRID database and other databases.

?

The example below shows CUBRID information and MySQL information by retrieving MySQL information from CUBRID.

  • CUBRID Table Information?

?cubrid table info.png

?

  • MySQL Table Information?

mysql table info.png

  • DBLink Query?

dblink query.png

  • DBLink Query Execution Result?

query result.png

This is the result of searching CUBRID information and MySQL information at the same time.

?

]]>
<![CDATA[CUBRID INTERNAL: CUBRID Double Write Buffer]]> /3827979 2022-03-08T08:13:36+00:00 2022-03-08T08:27:26+00:00

Written by MyungGyu Kim on 03/08/2022

 

INTRODUCTION

Data in the database is allocated from disk to memory, some data is read and then modified, and some data is newly created and allocated to memory. Such data should eventually be stored on disk to ensure that it is permanently stored. In this article, we will introduce one of the methods of storing data on disk in CUBRID to help you understand the CUBRID database.

 

The current version at the time of writing is CUBRID 11.2.

 


DOUBLE WRITE BUFFER

First of all, I would like to give a general description of the definition, purpose, and mechanism of Double Write Buffer.

 

What is Double Write Buffer?

By default, CUBRID stores data on disk through Double Write Buffer. Double Write Buffer is a buffer area composed of both memory and disk. By default, the size is set to 2M, and the size can be adjusted up to 32M in the cubrid.conf file.

*Note: In CUBRID, the user can store the DB page directly to disk or using Double Write Buffer. In this article, we will only focus on the method of storing DB page using Double Write Buffer.

 

The Purpose 

When storing data on a disk, the Double Write Buffer generated in this way may prevent the corrupted DB page from being stored. The DB page-level corruption occurs for the following reasons:

 

1.jpg

 

In this document, it is assumed that 1 DB page existing in memory consists of 4 OS pages of Linux or Windows. When such a DB page is stored on disk, it is stored through a mechanism called flush.

 

When the DB page is stored to the disk through the flush mechanism, the DB page is divided and stored in units of OS pages. As shown in the figure above, if the system is shut down abruptly when the DB page is not stored on the disk, the DB page is broken. (Note: This disk write is called Partial Write.)

 

The Process 

The DB page of CUBRID is stored on disk as follows through the Double Write Buffer.

 

        2.jpg

 

As above, one DB page composed of 4 OS pages is stored in the Double Write Buffer in memory. After that, it is stored once in the DB internal Double Write Buffer and twice in the DB file. 

 

The process of storing in Double Write Buffer in memory can be described in detail as follows:

  • DB pages are stored in one slot in the Double Write Buffer of memory, and these slots are combined to form a block. (The green square in the figure below is one block).
    • These contiguous blocks are called Double Write Buffer in memory.
  • When one block is full of slots, it is stored to the disk through a mechanism called flush, which proceeds in blocks. 

 

         3.jpg

 

The process of storing DB page from the Double Write Buffer in memory to the DB on disk executes the following two processes in order:

  • A single block full of slots is stored in the DB internal Double Write Buffer.
  • Store the page to disk located in the same location as the stored page in a single block.

 

When data storage in the DB internal Double Write Buffer fails

In this case, in order to prevent the broken data from being stored on disk, the CUBRID server is stopped during the process of the server restart or creating a new Double Write Buffer, so that data not yet written to the disk is written.

 

When data storage in the disk internal DB fails

After allocating the Double Write Buffer stored in the DB to the memory, the page inside the block is compared with the page stored inside the DB. It prevents the DB page from being saved to the disk in a broken state by re-flushing only the broken DB page in the DB area.

 

When the DB page is stored in the DB 

The Double Write Buffer inside the DB remains the same, and the next block is overwritten when the DB page is stored on the disk through the flush. That is, the Double Write Buffer is continuously maintained. 

 


CONCLUSION

Through the above process, the DB page using the Double Write Buffer can be stored and the broken DB page can be prevented from being stored. 

 


REFERENCE

  1. CUBRID Manual - /manual/en/11.0/
  2. CUBRID Source Code - https://github.com/CUBRID/cubrid

 

]]>
<![CDATA[Monitoring CUBRID through Scouter]]> /3827915 2022-01-18T10:01:45+00:00 2022-01-18T10:11:29+00:00

Written by TaeHwan Seo on 01/18/2022

 

CUBRID users can monitor items in CUBRID through the Scouter.

It was developed based on CUBRID 11.0 version. Full features are available from CUBRID 10.2.1 Version.

 

Scouter (Server, Client) is available from version 2.15.0, bug fixes and features will be added by participating in Scouter GitHub in the future.

 

The latest version of Scouter (as in 2022.01.18) is Scouter 2.15.0, Multi Agent support and bug fixes are currently in the PR stage. 

 

 

1. What is Scouter?

Scouter is an Open Source Application Performance Management (APM), it provides monitoring function for applications and OS. 

 

  •  Scouter Basic Configuration 

scouter configuration.jpg

 

 

  • Scouter-provided Information

?- WAS Basic Information

Response speed/profiling information for each request, number of server requests/number of responses, number of requests in process, average response speed, JVM memory usage / GC time, CPU usage.

- Profiling Information

Server-to-server request flow, execution time/statistics of each SQL query, API execution time, request header information, method invocation time.

 

 

  •  Representative Agent List 

- Tomcat Agent (Java Agent) : gathering profiles and performance metrics of JVM & Web application server

- Host Agent (OS Agent) : gathering performance metrics of Linux, Windows, and OSX

- MariaDB Plugin : A plugin for monitoring MariaDB (embedded in MariaDB)

- Telegraf Agent : Redis, nginX, apache httpd, haproxy, Kafka, MySQL, MongoDB, RabbitMQ, ElasticSearch, Kube, Mesos ...

 

 

2. CUBRID & Scouter 

  • Composition 

4a1384ba078eb327507cc2977ef929c9.png

 

 

Information on CUBRID is transmitted to CUBRID Agent via CMS to HTTPS; items that are separated by item in CUBRID Agent are transmitted continuously through UDP and requested items are transmitted through TCP. To Scouter Server (Collector).

 

The Server (Collector) stores the data in its own database and the stored data is automatically deleted by the settings (capacity, period).

 

The Client requests the collected data from Server (Collector) by TCP and displays it on the screen using Eclipse RCP.

 

In the above figure, the green circle part is the part modified by the Scouter to monitor the CUBRID.

 

 

  • Available Monitoring Items

The table below is the list of monitoring items that are currently available on Scouter. We plan to add items that can be monitored through CMS (CUBRID Manager Server), Scouter Server, Client, and Agent extensions later. 

 

monitoring item.jpg

 

 

  • Client UI

The picture below is the initial screen in the Client. Installation and Client UI documentation can be found through the Readme document on Scouter Agent GitHub. (Reference URL 2&3). 

 

Client UI.png

 

 

 

3. Reference

  • Scouter Agent GitHub - GitHub - scouter-contrib/scouter-agent-cubrid: scouter cubrid agent
  • Quick Start Guide - https://github.com/scouter-contrib/scouter-agent-cubrid/blob/main/documents/quick_start_KR.md
  • Client UI Guide - scouter-agent-cubrid/client_guide_KR.md at main · scouter-contrib/scouter-agent-cubrid · GitHub
  • Scouter GitHub - GitHub - scouter-project/scouter: Scouter is an open source APM (Application Performance Management) tool.

 

 

 

]]>
<![CDATA[QUERY CACHE Hint]]> /3827902 2021-12-09T14:31:04+00:00 2021-12-09T14:44:26+00:00

Written by MinJong Kim on 12/09/2021

ABOUT QUERY CACHE 

With the release of CUBRID 11.0, the CUBRID DBMS supports QUERY CACHE hint.

In this article, we will take some time to look at QUERY CACHE. 

 

 

1. What is Query Cache?

Query Cache is a DBMS feature that stores the statements together with the retrieved record set in memory using the SELECT query statement and returns the previously cached values when the identical query statement is requested.

 

The query cache can be useful in an environment where you have tables that do not change very often and for which the server receives many identical queries. Queries using the QUERY_CACHE hint are cached in a dedicated memory area, and the results are also cached in separate disk space.  

 

  • Query Cache Features 

1. The QUERY_CACHE hint only applies to SELECT statements.

2. When a table change (INSERT, UPDATE, DELETE) occurs, the information in the Query Cache related to the table is initialized.

3. When the DB is unloaded, the Query Cache is initialized.

4. The cache size can be adjusted through the max_query_cache_entries and query_cache_size_in_pages setting (The default value is all 0). 

max_query_cache_entries is the setting value for the maximum number of queries that can be cached. If it is set to 1 or more, as many queries as the set number are cached.

query_cache_size_in_pages is the setting value for the maximum cacheable result pages. If it is set to 1 or more, the results for the set page are cached.

 

  • Pros for Query Cache

When the hint is set and a new SELECT query is processed, the query cache is looked up if the query appears in the query cache. If the query is found from the cache, the data stored in the cache will be returned immediately without going through the previous 3 steps (Parsing->Optimizing->Executing). Therefore, the higher the cost of the query and the more repeatedly invoked, the greater the resource benefits.

 

 

2. How to use the Query Cache

  • How to use? 

1. Set the values of max_query_cache_entries and query_cache_size_in_pages  in the cubrid.conf file. (Example: if the number of sql statements to cache is 10, set the max_query_cache_entries value to 10, and set query_cache_size_in_pages to 640 when the result size is 10M.)

2. Add the /*+ QUERY_CACHE */ hint to the select statement.

 

  • Procedure 

?
      
1.png

 

  1. When the hint is set and a new SELECT query is processed, the query cache is looked up if the query appears in the query cache.
  2. If the cached query is not found, the query will be processed and then cached newly with its result.

 

  • Result Analysis 

      You can check whether a query is cached by entering the session command ;info qcache in CSQL.
      example) 

     2.png

The cached query is shown as query_string in the middle of the result screen. Each of the n_entries and n_pages represents the number of cached queries and the number of pages in the cached results.

 

The n_entries is limited to the value of configuration parameter max_query_cache_entries and the n_pages is limited to the value of query_cache_size_in_pages.
 

If the n_entries is overflown or the n_pages is overflown, some of the cache entries are selected for deletion. The number of caches deleted is about 20% of max_query_cache_entries value and of the query_cache_size_in_pages value.

 

 

3. Cautions

The hint is applied to SELECT query only; However, for the following cases, the hint does not apply to the query and the hint is meaningless:

 

  • a system time or date related attribute in the query as below
              example) SELECT SYSDATE, ADDDATE (SYSDATE, INTERVAL -24 HOUR), ADDDATE (SYSDATE, -1);
  • a SERIAL related attribute is in the query
  • a column-path related attribute is in the query
  • a method is in the query
  • a stored procedure or a stored function is in the query
  • a system table like dual, _db_attribute, and so on, is in the query
  • a system function like sys_guid() is in the query

 

  • Lock waiting situation may occur due to the table change

    If there is any change (ex. INSERT, UPDATE, DELETE) to the target table, the existing cache is always removed. At this time, other transactions will now lock the data to prevent it from grabbing any more invalid data. Until this lock is released, transactions accessing the Query Cache wait in the lock state. Therefore, the more frequently the table is changed, the more SELECT queries that use the Query Cache, the more time is spent waiting for this lock.

?

4. Conclusion

Query Cache is useful for data that does not change frequently but needs to be accessed frequently, such as street name, address, organization information, department information, etc. In this case, Query Cache can help reduce system resource usage and improve performance. 

]]>
<![CDATA[CUBRID INSIDE: HASH SCAN Method]]> /3827871 2021-11-09T08:09:46+00:00 2022-03-03T14:09:59+00:00

Written by SeHun Park on 11/09/2021

- HASH SCAN


Hash Scan is a scan method for hash join. Hash Scan is applied in view or hierarchical query. When a subquery such as view is joined as inner, index scan cannot be used. In this case, performance degradation occurs due to repeated inquiry of a lot of data. In this situation, Hash Scan is used.

hash scan vs nl.jpg

The picture above shows the difference between Nested Loop join and Hash Scan in the absence of an index. In the case of NL join, the entire data of INNER is scanned as many as the number of rows of OUTER. In contrast, Hash Scan scans INNER data once when building a hash data structure and scans OUTER once when searching. Therefore, you can search for the desired data relatively very quickly.

 

Here, the internal structure of Hash Scan is written as the flow of the program development process.

 

 

 

- IN-MEMORY HASH SCAN


CUBRID's Hash Scan uses in-memory, hybrid, and file hash data structures depending on the amount of data. First, let's look at the in-memory structure.

 

The advantage of the in-memory hash scan structure is there is no performance degradation during random access. However, the disadvantage of this structure is that the memory size is limited. It cannot be used in all cases due to its disadvantages, but it is the fastest method due to its advantages. Because of its advantage, it is suitable for chaining hash structures.

 

in-memory hash table.jpg

If there is a collision of hash key values, a new entry is put into the next pointer. It is a simple and fast structure. However, when implemented in file format, problems with random access or space utilization may occur. More details about this will be discussed in the following File Hash Structure section. CUBRID performs in-memory hash scan only within a limited size. You can change the limit size using the max_hash_list_scan_size system parameter.

 

At this stage, rather than implementing an in-memory hash data structure, it was necessary to analyze OPTIMIZER and EXECUTOR and think more about which part should be modified. You can refer to the following link for details about it. Moreover, you can check the design-related contents in JIRA and the results of code review in GIT.

 

 

JIRA: http://jira.cubrid.org/browse/CBRD-23665

GIT: https://github.com/CUBRID/cubrid/pull/2389

 

 

- HYBRID HASH SCAN


This is a method of storing the OID (Object Identifier) of the temp file, not DATA, in the value of the in-memory hash data structure.
memory hash table with temp file.jpg

 

Because OIDs are smaller than DATA, in-memory hash data structures can be used in larger data sets. This method is relatively slower than the in-memory hash method because data from the temp file must be read at the time of lookup. This is the second scan method considered in the hash scan. Check out the link below for more details.

 

JIRA: http://jira.cubrid.org/browse/CBRD-23828

GIT: https://github.com/CUBRID/cubrid/pull/2537

 

 

- FILE HASH SCAN


A scan method that uses the file hash data structure. The extendible hash data structure is applied.

 


extendible hash.jpg

 

 

The diagram above shows the operation of the extendible hash algorithm. When overflow occurs, the bucket is divided. Because it operates in this way of partitioning, it is an algorithm that can maintain the bucket space utilization rate above 50%. Since one bucket is implemented as a page, which is the smallest unit of disk I/O, the higher the bucket space utilization, the lower the disk I/O. For this reason, file hash scans use an extendible hash algorithm.

 

 


file hash scan.jpg

 

 

This is the implementation of the extendible hash data structure in CUBRID. The Directory file stores the VPID, which is the Page Identifier. One Bucket is implemented as one page. The data in the Bucket is sorted, so the lookup uses a binary search.

 

One drawback of extendible hash data structures is that there are no exceptions for duplicate data values. For example, if overflow occurs because the same value is all stored in one bucket, it is an algorithm that can no longer be stored. For this, a new Duplicate Key Bucket is created and added in the form of chaining. If more than a certain amount of data is duplicated, the data is moved to the DK bucket. Through this, a file hash scan with excellent space utilization while being able to flexibly store duplicate values is completed. Visit the following links for a detailed explanation.

 

 

JIRA: http://jira.cubrid.org/browse/CBRD-23816

GIT: https://github.com/CUBRID/cubrid/pull/2781

 

 

- HASH SCAN for Hierarchical Queries


A hierarchical query has a special limitation in that it is necessary to perform a lookup between the hierarchies after the join. Because of this, index scans cannot be used for hierarchical queries with joins. What you need in this situation is a hash scan, right? It has been modified so that hash scan can be used for hierarchical queries as well. Check the link below for more details.

 

JIRA: http://jira.cubrid.org/browse/CBRD-23749

GIT: https://github.com/CUBRID/cubrid/pull/2520

 

 

- HASH JOIN


The in-memory hash scan is applied in the CUBRID11 version, and the file hash scan is applied in the CUBRID11.2 version which will be released soon. The hash join function is currently under development. The development of the hash join function is to add a new join method to OPTIMIZER. Currently, there are Nested Loop join and Sort Merge Join in CUBRID. The CUBRID development team is planning to improve the overall OPTIMIZER. OPTIMIZER will be able to generate a more optimal execution plan. And with that work, a hash join method will be added. Before the hash join is added, the execution plan cannot check whether a hash scan is used. Instead, you can check whether Hash Scan is used in the trace information.

 

trace.jpg

 


- HASH SCAN Performance


In situations where a hash scan is required, the query performance has become incomparably faster than before.

 

Performance of hash scan.jpg

 

The performance is greatly improved compared to the previous case in cases where subqueries are joined as inner or hierarchical queries with joins. CUBRID analyzes the causes of several other cases and reflects improvements to improve query performance. Among these improvements, there are REWRITER improvements such as View Merging and Subquery unnest, and improvements related to View Merging are currently in progress. Next, we will learn how to transform a query in DBMS and why rewrite techniques such as View Merging and Subquery unnest are necessary.

]]>
<![CDATA[Converting PL/SQL to CUBRID Java SP using ANTLR and StringTemplate]]> /3827819 2021-09-30T10:11:01+00:00 2022-05-23T11:45:07+00:00

Written by Youngjin Joo on 09/30/2021

 

CUBRID DBMS (hereinafter 'CUBRID') does not support PL/SQL.

 

If you want to continue your project by creating functions or subprograms with PL/SQL syntax in CUBRID, you need to convert them to Java Stored Function/Procedure (hereinafter 'Java SP').

 

Database developers, administrators, and engineers are often familiar with PL/SQL syntax but not with programming languages. In addition, application development depends very little on the DBMS used, but converting PL/SQL to Java SP seems difficult because it feels like you're developing a new system.

 

Therefore, while I am looking for an easy way to convert PL/SQL to Java SP, I found out about ANTLR. 

 

ANTLR is a tool for generating parsers.

With the help of contributors around the world, ANTLR supports grammar files for parsing various programming languages.  

 

The official website introduces ANTLR as follows.

 

"ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files. It's widely used to build languages, tools, and frameworks. From a grammar, ANTLR generates a parser that can build and walk parse trees.  (https://www.antlr.org/ - What is ANTLR?)"

 

In this article, we will learn how to configure the ANTLR development environment and how to create parser classes from PL/SQL grammar files.

 

Now, let’s test the class that converts pre-developed PL/SQL to Java SP.

 

The ANTLR development environment can be configured using various IDE tools such as Intellij, NetBeans, Eclipse, Visual Studio Code, Visual Studio, and jEdit. In this article, we will use the Eclipse IDE tool. 

 

 

1. Installing the 'ANTLR 4 IDE' in Eclipse

 

To use ANTLR in Eclipse, you need to install ANTLR 4 IDE from 'Help > Eclipse Marketplace...'.

image1.png

 

 

After installing the ANTLR 4 IDE, create a project with 'General > ANTLR 4 Project'

image2.png

 

 

After creating the ANTLR project, select 'Project Facets > Java' in the project settings.

image3.png

 

 

2. Adding antlr-4.9-complete.jar file to project 'Java Build Path > Libraries'

 

Even though the ANTLR 4 IDE is installed, we still need antlr-4.9-complete.jar file to use ANTLR.

 

This file can be download from ANTLR official website, and it must be added to  'Java Build Path > Libraries'.

 

    - download : https://www.antlr.org/download.html

 

image4.png

 

image9.PNG

 

 

3. How to create parser classes from PL/SQL grammar files

 

Up to this point, the configuration of the ANTLR development environment has been completed.

To create PL/SQL parser classes with ANTLR, we need the PL/SQL grammar file.

 

The grammar file is supported by ANTLR and can be downloaded from GitHub (antlr/grammars-v4).

After creating the parser classes, we also need to download the necessary basic parser class files.

 

  - download: https://github.com/antlr/grammars-v4/tree/master/sql/plsql
  - download file:
    * java/PlSqlLexerBase.java
    * java/PlSqlParserBase.java
    * PlSqlLexer.g4
    * PlSqlParser.g4

 

When parsing a PL/SQL code, an error occurs if it is in lowercase letters. To resolve this issue, ANTLR asks you to capitalize the PL/SQL code before parsing.

 

You can bypass this problem by downloading the CaseChangingCharStream class and using it before parsing.

 

We are using the CaseChangingCharStream class before passing the PL/SQL code to the PlSqlLexerd class, which is shown in the main function. 

 

  - download:  https://github.com/antlr/antlr4/tree/master/doc/resources
  - download file: 
    * CaseChangingCharStream.java

 

image5.PNG

 

 

4. How to create parser classes from PL/SQL grammar file

 

If you add the downloaded grammar files to the ANTLR project and run 'Run AS > Generate ANTLR Recognizer', parser classes for parsing PL/SQL are created.

 

If these class files are in the Default Package state, they cannot be used as an Import when developing separate parser classes.

 

When 'Run AS > Generate ANTLR Recognizer' is executed, if the package setting is added to the Generate ANTLR Recognizer option, *.java files are created.

 

Simply add '-package <package name>' to 'Run As > External Tools Configurations... > ANTLR > Arguments'.

 

The package setting must be done with both grammar files (PlSqlLexer.g4, PlSqlParser.g4).

image6.png

 

When you run 'Run AS > Generate ANTLR Recognizer', the parser classes are created in the 'target > generated-sources > antlr4' directory even if they are bundled into a package.

 

To make Eclipse aware of these files as sources, you must add the directory 'target > generated-source > antlr4' to 'Java Build Path > Source'.

image10.PNG

 

image11.PNG

 

 

5. Parsing PL/SQL with the created parser classes

 

The MigrationPlsqlToJavaSP class reads the PL/SQL code in the compute_bonus.sql file and converts it to Java SP.

 

The PlSqlLexer and PlSqlParser classes are parser class files created by ANTLR using PL/SQL grammar files.

 

PL/SQL parsing starts with the code 'parser.sql_script();'.

 

By following the child class of the Sql_scriptContext class returned as a result of parsing, you can extract and process the data needed to create Java SP.

 

Lastly, the make() method, which is called by the MigrationPlsqlToJavaSP class, uses StringTemplate to create Java SP class file.

 

image7.png

 

6. Testing the class that converts pre-developed PL/SQL to Java SP

 

The following figure is the result of running PL/SQL in the compute_bonus.sql on Oracle. 

image8.png

 

By following the result of parsing the compute_bonus.sql file, we extract and process the data needed to create a Java SP.

 

image14.PNG

 

StringTempate, which provides template syntax, is used to make data to be parsed and extracted into Java SP.

 

The official website introduces StringTemplate as follows.

 

"StringTemplate is a java template engine (with ports for C#, Objective-C, JavaScript, Scala) for generating source code, web pages, emails, or any other formatted text output. (https://www.stringtemplate.org/ - What is StringTemplate?)"

 

image13.PNG

 

Below is the Java code converted to Java SP.

image12.PNG

 

The example table in Oracle was transferred to CUBRID for testing.

image16.PNG

 

It outputs the same result as when running PL/SQL in Oracle.

 

Last but not least...

 

So far, we can only convert the SELECT queries that are executed in the PL/SQL function.

 

The query can be executed from PL/SQL code or returning result value with just simple operations.

 

ANTLR grammar allows us to parse all these parts. However, there are parts that are difficult to convert to Java code, so we haven't been able to proceed yet.

 

In the future, I would like to make a tool that converts PL/SQL to Java SP easily by refining the part that converts PL/SQL to Java SP and adding parts that can only be parsed but cannot be converted.

 

Since ANLTR supports the grammar of various programming languages besides PL/SQL, I think it is a good tool.

 

 

 


 

Reference 

1. ANTLR
  - homepage: https://www.antlr.org/
  -document: https://github.com/antlr/antlr4/blob/master/doc/index.md
  - grammar files:
    * https://github.com/antlr/grammars-v4
    * https://github.com/antlr/grammars-v4/wiki
  - ANTLR IDE
    * https://www.antlr.org/tools.html
    * https://github.com/jknack/antlr4ide

 

2. StringTemplate
  - homepage: https://www.stringtemplate.org/

 

 

 

]]>
<![CDATA[CUBRID Internal: Storage Management (Disk Manager, File Manager)]]> /3827801 2021-08-11T09:33:45+00:00 2021-08-11T09:35:14+00:00

Written by Jaeeun, Kim on 08/11/2021

 

 

Introduction


Database, just as its name implies, it needs spaces to store data. CUBRID, the open source DBMS that operates for the operating system allocates as much space as needed from the operating system and uses it efficiently as needed.

In this article, we will talk about how CUBRID internally manages the storage to store data in the persistent storage device. Through this article, we hope developers can access the open source database CUBRID more easily.

 

- The content of this article is based on version 10.2.0-7094ba. (However, it seems to be no difference in the latest develop branch, 11.0.0-c83e33. )

 


 

CUBRID Storage Management

 

The CUBRID server has multiple modules that operate and manage data complexly and sophisticatedly. Among them, there are Disk Manager and File Manager as modules that manage storage. In order to clarify their roles, it is necessary to know the unit the storage space which is managed in CUBRID first.

 

Page and Sector

Page

Page is the most basic unit of storage space of CUBRID. A page is a series of consecutive bytes, and the default size is 16KB. When a user creates a volume, it can be set to 8K, 4K, etc. A page is also the basic unit of IO.

 

Sector

Sector is a bundle of pages and consists of 64 consecutive pages. When managing storage, it is expensive to perform operations in the units of pages ONLY, so a sector that is larger than page is applied.

 

File and Volume

File

 

A file is a group of sectors reserved for a specific purpose. A page or sector was simply a physical unit for dividing storage space, whereas a file is a logical unit with a specific purpose. For example, when a user creates a table through the "CREATE TABLE .." statement, a space is required to store the table. At this time, a type of file, heap file, is created. Analogically, if there is a need to store data, such as creating an index or saving query results, a file suitable for that purpose is created. The file referred to here is distinct from the OS file created through the open() system call in the OS. Unless it is stated specifically in tis article, the word file we mention in this article will be defined as this type of CUBRID file. 

 

Volume

A volume is an OS file assigned by the operating system to store data in CUBRID. It refers to the database volume created through utilities such as "cubrid createdb ..".

 

Page, Sector, File, and Volume

 

1.png

 

When a user creates a database volume, the CUBRID server divides the volume into sectors and pages as mentioned above and groups them into logical units called files and uses them to store data. If you look at the diagram above, you can see that the volume created as an OS file is divided into several sectors, and depending on the purpose, each sector is bundled and used as a heap file, an index file, etc.

 

Note

- Here, the volume refers only to the data volume where data is stored, not the log volume.

- Volume, page, and sector are physical units, whereas a file is a logical unit, and if one file continues to grow, it may exist across multiple volumes.

 
Disk Manager and File Manager

Disk manager and file manager are modules that manage the storage space units. The role of them are stated as follows.

 

Disk Manager

Manages the entire volume space. When creating a file, it reserves sectors, and if there are insufficient sectors, it plays a role of securing more sectors from the OS.

 

File Manager

Manage the storage of CUBRID files. When a file requires additional space, it allocates pages among reserved sectors, and when there are no more pages to allocate, it reserves additional sectors from the disk manager.

 

The following is a schematic diagram of their relationship: 

 

2.png

 

If other modules, such as heap manager and b-tree manager, need space to store data, other modules create files for their purposes and allocate the storage space as needed.

 

When the file manager secures space for a file, it always secures it in units of sectors and then allocates them internally in units of pages. When a file can no longer allocate pages because all reserved sectors have been used up, the disk manager reserves the sector. When all the storage space in the volume is used up, the disk manager requests additional space from the OS.

 

Let's take a closer look at how each request is handled below.

 


 

What happens if you run out of space in a file?

 

What happens if all the allocated space is used in a file? For example, an insert operation is executed in the heap file where the records of the table are stored, but there is no more space.

 

The answer of this situation is  "Allocate additional pages." To understand the page allocation process, let's first look at the structure of the file.

A file secures storage from the disk manager in units of sectors, allocates, and uses it whenever necessary in units of page. To do this, File Manager tracks the allocation of sectors reserved for each file with a Partial Sector Table and a Full Sector Table.

 

  •  Partial Sector Table: Among reserved sectors, if even one page out of 64 pages of a sector is unallocated, it is registered in this table. Each sector has the following information: (VSID, FILE_ALLOC_BITMAP)
  • Full Sector Table: Among reserved sectors, when all pages in a sector are allocated, it is registered in this table. Each sector has the following information: (VSID)

VSID is a sector ID, and FILE_ALLOC_BITMAP is a bitmap indicating whether 64 pages in each sector are allocated. These two tables are saved in the file header page, and as the file grows, additional system pages are allocated to store the table.

 

The page allocation process is simple. By maintaining the reserved sector information in these two tables (actually, maintaining the information in these two tables is rather complicated), if additional pages are required, the page assignment can be completed by selecting one entry from the partial table and turning on one bit of the bitmap. If there is no entry in the partial sector table, pages of all reserved sectors are allocated and used, so additional sectors must be reserved from the disk manager.

 

Note

- Page allocation is handled as a System Operation (Top operation). This means that when a page is allocated because additional space is needed during a transaction, the page allocation operation is committed first regardless of the transaction's commit or abort. This allows other transactions to use the allocated pages before the transaction ends (without cacading rollbacks or other processing), increasing concurrency.

-  In addition to the two sector tables, a user page table exists in the file header. This is a table for the Numerable property of a file, and it is omitted because it is beyond the scope of this article.

-  Since the size of a file can theoretically grow infinitely, the size of the sector table must be able to keep growing so that it can be tracked. For this purpose, CUBRID has a data structure called File Extendible Data to store a data set of variable size consisting of several pages.

 

What if there are no more pages to allocate in a file£¿

If pages of all reserved sectors are used in a file, additional sectors must be reserved. Before looking at how sector reservations are made, let's take a look at the structure of the volume. The following is a schematic diagram of the structure of the volume.

3.png

 

The system page includes the volume header, sector table of the volume, and the remaining user pages. The sector table, like the partial sector table of a file, holds a bitmap, whether sectors in the volume are reserved nor not.

 

By referring to the page allocation process, you can easily guess the sector reservation process. It checks the bitmap of the sector table and turns on the bit of the unreserved sector. Although this is basically how the process is, the sector reservation should be determined by referring to the sector tables of multiple volumes; and in the process, the disk cache (DISK_CACHE) is performed in two steps as follow for increased efficiency and concurrency.

 

4.jpg

 

Step 1: Pre-Reserve (Change Disk Cache value)

Step 2: Turn on the reserved bit while traversing the sector tables of the actual volumes based on the decision of the pre-reservation.

 

As shown in the figure, if all sectors of the volume itself are exhausted in step 1, the volume is expanded according to the system parameter, and a new volume is added after expanding to the maximum size.

 

The disk cache has pre-calculated values necessary for reservation based on sector reservation information of all volumes. For example, since the number of available sectors of each volume is based on information in the sector tables, it is possible to determine whether reservation is possible in the current volume or whether the volume needs to be extended directly from the current volume.

 

What if the space is no longer needed?

What if the reserved sectors and allocated pages are no longer needed? Of course, we need to return the space so that other data can be stored. The return process basically turns off the bits in the sector table as opposed to turning them on during the reservation or allocation process and reorganizes the sector tables according to the rules.

 

The timing of returning the actual space depends on the policy of the module using pages and sectors. For example, in the case of a heap file, the page is not returned immediately even if all data is deleted. In order to return a page of the heap file, it is not when all records in the page are deleted, but it is when the heap manager determines that data is no longer needed according to the operation of MVCC and Vacuum. In addition, in the case of temporary files, the end of the query does not immediately return the space of the temporary files used during the query because the files are recycled for other purposes rather than being removed immediately according to the policy.

 

Space return is performed by postponing operation (Deferred Database Modification). That is, even if space is returned during a transaction, the return is not processed until the time of commit.

 


Temporary Purpose Data 

The foregoing is the case of data for persistent purposes. Data for temporary purposes is handled slightly differently. These differences are briefly summarized here. Before that, let's first classify the data clearly and talk about the types of volumes. Data can be broadly classified into two categories:

 

  • Persistent purpose data: Permanent purpose data is data that must be permanently preserved and must maintain an intact state even if a failure occurs while the database is running. For example, the heap file that stores table records and the b-tree file that stores indexes are files that store permanent data.
  • Temporary purpose data:Temporary purpose data is data that is temporarily stored according to query execution, and all data becomes meaningless when the database is restarted. For example, there are temporary files written to disk due to insufficient memory while storing query results or temporary files created during External Sorting.

As you can see above, the biggest difference of permanent purpose data and temporary purpose data is whether the data should be kept even when the database is shut down, which, in another word, whether logging for recovery is necessary in CUBRID that follows ARIES. In the case of a permanent file, logging is always performed when data in the permanent file is changed, while in the case of a temporary file, logging is not performed. Additionally, temporary purpose data does not need to be maintained at restart time, which simplifies operations on multiple file operations.

 
Temporary purpose data and volumes

There are two types of data volume, permanent and temporary. The diagram below shows which data is stored in which volume according to the purpose of the data.

 

5.png

 

In the case of persistent data, it is stored only in the persistent type volume. On the other hand, data for temporary purposes can be stored in both temporary type and permanent type volumes. This is because the user can directly add a volume for temporary data to prevent the OS from creating and formatting a new volume whenever temporary data is saved (cubrid createdb -p temp). When creating a file of temporary purpose data, the user first looks for a persistent purpose volume created, and if there is none, a volume of the temporary type is created. Temporary type volumes are all removed when the database is restarted, and all internal files of temporary type permanent volumes are also destroyed when restarting.

 

Temporary purpose data and files

 Files contain temporary purpose data (hereafter temporary files) are simpler to manage than files contains permanent purpose data. Temporary files are mainly used to temporarily store query results or intermediate results when a large amount of data is accessed during query execution. Since these are files to be removed anyway, the overhead for management can be reduced, and the operation itself must be fast because it is a file that is frequently created/removed in a shorter cycle than a permanent file. The difference is:

 

- No logging.

- Do not return pages.

- Reuse files without destroying them even if they are used up.

- Use only one type of sector table.

 

 

Since it is data that is not needed when restarted, it is basic not to log the data, and even if the data in the page is no longer used, the page is not returned separately.

 

The file is also not immediately destroyed, but a certain number of temporary files are cached according to the system parameters, and then the temporary files are reused if necessary. Since the temporary file is cleared only when the cache is full, it can be seen that the disk space used for temporary purpose data during the query is not returned immediately after the query is completed.

 

The sector table we looked at in the page allocation process of persistent files is to quickly find pages that are not allocated in situations where page allocation and return are repeated, and in the case of temporary files, only one table in the form of a partial sector table is used for temporary files. If all pages within a sector are allocated, they are not moved to the full sector table. It is simply used to track the reserved sectors, and which pages they have reserved within them.

 

Other than that, the operation of the disk manager and the file manager described above follows the basic procedure we mentioned above.

 


Reference 

1. CUBRID Manual - /manual/en/10.2/

2. CUBRID Source Code - https://github.com/CUBRID/cubrid

3. Mohan, Chandrasekaran, et al. "ARIES: a transaction recovery method supporting fine-granularity locking and partial rollbacks using write-ahead logging." ACM Transactions on Database Systems (TODS) 17.1 (1992): 94-162.

4. Liskov, Barbara, and Robert Scheifler. "Guardians and actions: Linguistic support for robust, distributed programs." ACM Transactions on Programming Languages and Systems (TOPLAS) 5.3 (1983): 381-404.

5. Silberschatz, Abraham, Henry F. Korth, and Shashank Sudarshan. Database system concepts. Vol. 5. New York: McGraw-Hill, 1997.

]]>
<![CDATA[CUBRID's Development Culture: The Development Process and Improvements Behind]]> /3827744 2021-07-16T13:46:29+00:00 2021-07-16T13:52:38+00:00

Written by?Hyung-Gyu, Ryoo?on?07/16/2021

?

Foreword

Hello, I am Hyung-Gyu Ryoo, I am working in CUBRID as a research engineer in the R&D department. In this post, I would like to introduce the development process of the open source project CUBRID and the efforts we have made to improve the process.

?

It has been almost two and a half years since I joined CUBRID. ?During this period, as many great fellow developers have joined the CUBRID community, the R&D department of CUBRID has grown from one small team to three developments teams along with a QA team.

?

After I participated in the first major version release (CUBRID 11), I was able to look back to the release process and improve the development process with my fellow developers.

?

?

The Development Process of the Open Source Database Project, CUBRID

CUBRID foundation pursues the values of participation, openness, and sharing. In order to realize the core value of the CUBRID foundation, information sharing and process transparency are embedded in CUBRID¡¯s development process and culture.

?

All developers contributing to CUBRID follow the open source project development process. This means that both internal developers of CUBRID and external contributors proceed in the same way. In addition, information created during the development process (function definition, design, source implementation) is naturally shared during the development process.

?

All CUBRID projects, feature additions, and bug fixes are completed through the following general open source project development process:

?

1.png

  • Communication: Suggestions and discussions about projects, feature additions, and bug fixes.
  • Triage: Just as it is impossible to solve all the problems in the world, it is impossible to develop all the functions required for CUBRID at once, or to find and solve all the bugs perfectly. The project maintainer (development leader) decides which tasks need to be addressed and which tasks to start first.
  • Dev (Development): Design, code implementation, and code review are performed by a designated developer.
  • QA: Functional and performance tests are conducted on the implementation results in the CUBRID QA system.

The CUBRID development process is based on JIRA and GitHub collaboration tools. JIRA is a collaboration tool that helps you manage software processes. Each task can be managed as a unit called a JIRA issue. GitHub is a service that provides a remote repository for open source projects, and developer can perform code reviews through a function called Pull Request on the web.

?

JIRA

2.png

Example: http://jira.cubrid.org/browse/CBRD-23629

?

All CUBRID projects, feature additions, and bug fixes start with the JIRA issue creation. In the development process, the issue will naturally record what kind of work to be done (function definition), how to do it (design), and how the work was completed (detail design/implementation) as shown in the figure above.

?

3.png

CUBRID Development Process and Jira Issue Status

?

The [Feature Suggestion/Discussion ¡ú Selection ¡ú Development ¡ú Test] process described above for each JIRA issue has the status of the issue as shown in the figure above: OPEN, CONFIRMED, IN PROGRESS, REVIEW IN PROGRESS, REVIEWED, RESOLVED, CLOSED. By looking at the state name, developers can easily understand which stage they are working on.

?

Github Code Review

Code review is a process in which other developers review and give feedback on the code written by the developer in charge of the issue before it is merged in CUBRID. On Github, code reviews are performed using the Pull Request function for the results developed in each issue. By referring to the shared content (feature specification, design) in JIRA, the developers of CUBRID discuss the implementation logic to find a safer and faster way.

?

4.png

?

?

Development Process Improvement?

Why do we improve the development process?

One day at work, instead of taking a short nap after lunch, I had coffee time with my colleagues; and I realize that this short coffee break chat is the most creative time for our fellow developer. For example, while preparing the latest release of the CUBRID 11 version, we talked about the process and the difficulties we met.

?

However, during our conversation, I realize that even though all developers worked according to the development process described earlier, the details of each of them were slightly different. Now we have successfully released the stable version of CUBRID 11, however, I feel that something is missing.

?

Therefore, I started digging into the developing process of CUBRID with my fellow colleagues. We started to think about the reason behind each step and ask each other ¡®why¡¯: ¡®Why do you have to do this? What does this information you put in each time mean? Is this procedure efficient?¡¯. For these million questions, the answers are mostly ¡®there is a lot of ambiguity, and it definitely needs improvement.¡¯

?

The development process of CUBRID that I described earlier is a process created by someone in the past (many thanks!). However, I thought that if we do not fully understand why and the purpose of operating the development process, this will not be established as a development culture. Moreover, as time goes by, vague rules were quickly forgotten or were not clearly agreed upon, it seems like only a few members knew about it.

?

If each element of the development process was not established with a sufficient understanding from all members, it is natural that the details were understood slightly differently by each member. As time pass, this insufficient understanding might drive the valuable development culture apart from the members and become forgetful.

?

So, I thought about what values ??CUBRID should keep as a development culture. And the answer is the three values introduced in the first paragraph of this post: participation, openness, and sharing. When we interpreted from the perspective of CUBRID¡¯s development culture, it can be interpreted as: ¡®if we want everyone can easily and safely participate in the CUBRID project, the process must be transparently viewed by anyone, and information must be shared well enough¡¯. I realized that keeping these values ??well associates with a higher level of development output.

?

These contents were shared within the company, and a consensus was formed that a well-established development process would maximize work efficiency beyond simply expressing the convenience of management and mature development culture, and of course, the development process was further improved. In the next chapter, we will look at some of the improvements we have done and how it relates to the value of ¡®participation, openness, and sharing.

?

Reorganize the JIRA process?

As explained earlier in the introduction of the CUBRID development process, all CUBRID projects, feature additions, and bug fixes start with the creation of JIRA issues. When creating and managing issues, it is necessary to fill in the items and contents that must be written at each stage of the development process, but users might feel that some of the parts are difficult to understand.

?

5.png

The above figure is the issue creation window before improving the JIRA process. When contributors create a JIRA project, the default screen is applied and had the following problem:

  • When creating an issue, there are too many items to enter, so contributors don't know which one to fill out (?)
  • Contributors just simply don't know what to write (?)

Due to these problems, the necessary content for each issue task was not consistently written, or as a contributor pondered whether or not to include the content whenever he or she started work, productivity was falling.

?

Problem 1:?When creating an issue, there are too many items to enter, so contributors don't know which one to fill out

The most frequently asked question by fellow developers who are new to CUBRID when they create an issue for the first time is ¡®Huh... Do I have to enter everything here??¡¯ When creating an issue, the project maintainer only needed a few things to sort out the issue; however, all fields were displayed using the default setting of JIRA.

?

This situation also raises the threshold for external contributors to participate in CUBRID. If too many fields are displayed at once when an external contributor clicks the ¡®Create Issue¡¯ button, he/she might give up contributing after looking around because of the fear of making a mistake.

?

Therefore, we have organized the necessary contents in each issue¡¯s state and set it to input only the contents that are required when changing to that status.

?

It is difficult to explain all the improvements, however, here is an example. the field related to version was one of the parts that members were most confused about when creating and managing issues. As shown in red in the figure above, the following three version fields are displayed together during the creation of an issue, so there are cases where a value is entered in only one of them or simply contributors just omit one of the fields because it is not clear where to enter it.

  • Affected Version: Version in which the issue creator found a bug or problem during analysis (bug fix type only).
  • Planned Version: Version in which the issue is planned to proceed.
  • Fixed Version: Version with issue results merged.

For each version field, we give a clear meaning and define the different issue status where this value should be entered:

  • Affected Version must be entered when creating an issue (OPEN status),
  • Planned Version when the project maintainer selects an issue (CONFIRMED),
  • Fixed Version when resolving an issue (RESOLVED)

So, as shown in the following figure, whenever the status of an issue changes, only the necessary items and the version that must be entered are shown at each stage, so contributors can naturally follow the development process without omitting content.

?

6.png

?

?

Problem 2:?Contributors just simply don't know what to write?

When creating an issue in CUBRID, issue types are assigned according to the task to be performed.

  • Correct Error: Issue that fixes bugs or errors.
  • Improve Function/Performance: Issue that improves existing features or performance.
  • Development Subject: Issue that adds new features.
  • Refactoring: Issue that changes unnecessary code clean-up, code structure, and repository separation.
  • Internal Management: Issue for internal management.
  • Task: The issue type is applied if there is no category corresponding to the above issue type but is not recommended. (Example of use: release)

Depending on the type of issue, the content to be written will vary. For example, in the case of bug fixes, you should write down what kind of bug occurred, how to reproduce the bug, and how it should behave once the bug is fixed. In addition, in case of functional improvement or new function, a detailed description of which function will be added and how to add it (functional specification and design) is required. If you write and share this content well enough, it will be easier for people involved in the project to understand what is merged in the project. And this well-organized and shared functional specification or design also has the advantage of improving the quality of development work results.

?

we have organized a content template to write down the must-have content for each issue type:

?

Correct Error

Improve Function/Performance

Development Subject

Refactoring

Internal Management

Task

  • Description:?: issue description

  • Test Build:?build version

  • Repro: the procedure to reproduce the bug

  • Expected Result: Expected results (expected results to be fixed)

  • Actual Result: Current results (problematic results)

  • Additional Information: If there is any additional material or content that can be helpful to understand the bug

?Example) CBRD-23903

  • Description: issue description

  • Specification Changes:Organize and write the specifications to be changed

  • Implementation: ?

  • Create design specifications, implementation concepts, and details to address issues.
  • Acceptance Criteria: Define behaviours/results that must be satisfied within the scope of the issue you have chosen while conducting design and implementation according to your requirements

  • Definition of done: Write down the criteria for the completion of the issue.

Example) CBRD-23894

Description: The purpose and description of the work.

?

These contents will greatly help to improve the code review process, which will be discussed in the next chapter. This is because it is difficult to grasp all the contexts with only code changes as CUBRID is a system in which several functions and modules are intricately intertwined.

?

Improve Github code review/ code merge

One of the most important goals in the development process is how to conduct good code reviews. Here are some of the benefits of code review: [3]

  • Better code quality: improve internal code quality and maintainability (readability, uniformity, understandability, etc.)
  • Finding defects:?improve quality regarding external aspects, especially correctness, but also find performance problems, security vulnerabilities, injected malware, ...
  • Learning/Knowledge transfer: help in transferring knowledge about the codebase, solution approaches, expectations regarding quality, etc.; both to the reviewers as well as to the author
  • Increase sense of mutual responsibility: increase a sense of collective code ownership and solidarity
  • Finding better solutions: generate ideas for new and better solutions and ideas that transcend the specific code at hand.

All the members know these advantages, but to what extent should the reviewer review the code? Also, does the author really need this level of review? It can become a bit of an obligatory review while thinking about it.

?

So, in order to induce a more effective/efficient code review, it was necessary to think about how to do a good code review and improve it. Reading code is a task that requires a high level of concentration. Therefore, reviewers should be able to give high-level thought and feedback in a short period of time.

?

Now let¡¯s take a look at the content that has been introduced for better code review in CUBRID.

?

Automation Tool (CI)

Automation tools are introduced to avoid wasting reviewers' mental efforts in areas that are boring, and where computers can do better. For example, a code style, license fixes, or a frequent mistake (such as not initializing a variable, or leaving unnecessary code, etc.).

?

In order to speed up the efficiency of code review, CUBRID introduces the following automation tools:

  • Build: build each environment (CentOS, Ubuntu, Windows) for the code you want to merge and show the result (success or failure).
  • SQL test automation: Build the source and actually run several SQL syntaxes to ensure that the functionality of the database works correctly.

Reference: https://app.circleci.com/pipelines/github/CUBRID

?

These automation tools helped make the code more stable. However, it is not enough to help reviewers focus on the logic of the code to merge or how well the code meets the design. This is because reviewers are likely to be buried during review time due to easy and visible problems such as simple mistakes and code formatting.

?

7.png

?

Therefore, in Pull Request, these low-level reviews were improved using automated tools so that reviewers can focus on high-level reviews only.

  • - license: Make sure you have the correct form of the license header comments.
  • - Pull Request Style: There is a rule that all PRs must be associated with each JIRA issue, and this issue number must be specified at the beginning of the PR title. pr-style will check this and fail if the rule is not followed.
  • - code-style:?Make?sure you follow the defined code style to keep your code consistent. Code style is defined using code formatting tools, and code-style uses these tools to check and correct whether the rules are properly followed. If it is different from the rule, it will fail and report it through PR suggestion.
  • - cppcheck:?cppcheck is a static analysis tool for the C++ language. Static analysis can reveal many problems that developers can cause, such as unused variables and NULL references. These errors are easy to make, but they are obvious, so you can only find them by looking at the code without context. Therefore, it is inefficient for reviewers to find and comment on each one. cppcheck catches these problems. If there is an error, it will fail and report using a comment to the PR.

?

8.png

?

The newly introduced automation tool used GitHub Actions (https://docs.github.com/en/actions), a CI tool directly provided by GitHub. The introduction of this tool makes it easier for contributors to CUBRID to understand and engage with CUBRID's code conventions and the quality of the code they are trying to reach. If the code doesn't pass the automation tool, the code won¡¯t be merged; therefore, you don't have to worry about making a mistake.

?

Divining a large amount of code review?

Because CUBRID is a database system with a complexity of features and modules, the amount of code requested for review is often huge. One Pull Request with too many code changes makes it impossible for reviewers to review effectively.

?

9.gif

As the number of lines of code (LOC) exceeds 400 lines, the code defect detection density decreases. [4]

?

In CUBRID, we try to conduct code reviews in small, meaningful units of features by creating feature branches to avoid Pull Requests with too many changes. For a detailed description of feature branches, refer to [5].

?

?

The Development Process Document: CUBRID Contribution Guide?

To make it a little easier to participate in the development of CUBRID, we needed a way to explain how the development process goes as a whole and share the essentials at each stage. So, we wrote an explanatory guideline document that can be used as a reference for developers who are interested in and want to contribute, as well as the new developers who are joining CUBRID.

https://dev.cubrid.org/dev-guide/v/en/

?

10.png

?

Some of the things we considered while writing this guideline document are:

  • Do not write something that is difficult to read! The development process is a step-by-step process, so let¡¯s make it possible for readers to find the information for each step easily.
  • Everyone can read the latest version.
  • There is no perfectly thorough development process or guide documentation, the documentation should be easy and understandable.

I have thought about several tools and services, such as Word, Jira Wiki, Google Docs, creating a new webpage, Gitbook pages, etc. After several considerations, I decided to go with the Gitbook service (Thank you for Gitbook Team!)

  • By displaying the document structure in tab format, readers can easily view each paragraph.
  • It is distributed as a web page and if we modified and merged in real-time, readers can see the modifications in real-time.
  • Of course, support Open Source Community Plan for open source projects!

If you want to write a contribution guide document for another open source project, you are always welcome to refer to it when you are thinking about how to distribute the document and tools!

?

?

Last but not least... the CUBRID development culture

Many developers, of course, want to work in a good development culture. However, I don't think there is any development organization in the world with a perfect development culture. The development process described above is a means to create a 'development culture', and the more verification processes are added to the development process, the lower the productivity of course. Also, as time passes and circumstances change, the improved process may not work properly.

?

CUBRID continues to search for a ?balance between better quality results and higher productivity. In CUBRID, Members gather to share and discuss the best way to conduct code reviews, such as the following, so that all members can become more natural in the development culture of CUBRID.

  • - How to Do Code Review Like a Human (part 1, part 2)

?

11-min.jpg

?

?

Based on CUBRID¡¯s organizational culture that values horizontal and free communication and knowledge sharing, many people are able to actively join and help to improve the development process.

?

(Special Thanks to CTO, Jaeeun, Kim and Jooho,Kim the research engineers!!).

?

I hope that this article will be an opportunity to introduce the way CUBRID's development organization works and to understand the CUBRID development culture.

?

Thank you. :-)

?

?

Reference

[1] Open source Guide, https://opensource.guide/

[2] Software Policy & Research Institute,?https://spri.kr/posts/view/19821?page=2&code=column

[3] Code Review, Wikipedia,?https://en.wikipedia.org/wiki/Code_review

[4] Best Practices for Code Review,?https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/

[5] Feature branch workflow,?https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow

?

?

?

?

??

]]>
<![CDATA[TDE (Transparent Data Encryption) in CUBRID 11]]> /3827724 2021-07-07T13:28:12+00:00 2021-07-07T13:49:46+00:00

Written by?Jiwon Kim?on?07/07/2021

?Increase the level of database security by utilizing various security features of CUBRID.

CUBRID 11 has enhanced security by providing the?Transparent Data Encryption (henceforth, TDE) feature. So, what is TDE?

TDE means transparently encrypting data from the user¡¯s point of view. This allows users to encrypt data stored on disk with little to no application change.


When a hacker hacks into an organization, the number one thing they want to steal is the important data in the database. Alternatively, there may be a situation where an employee with malicious intention inside the company logs into the database and moves all data to a storage media such as a USB.?

The easiest way to protect data in these situations is to encrypt the database. TDE, a technology that encrypts the database file itself among encryption technologies, would be a decent choice for you to protect your data. An encrypted database cannot be accessed without a key, so if you don't have the key file with you, the stolen file will be a useless dummy file.

?

The TDE feature uses symmetric key algorithms.

??Symmetric key technique: A technique that encrypts and decrypts data with the same key.

?

There are two types of symmetric key encryption algorithms provided by CUBRID: AES and ARIA.

? -?AES: Encryption algorithm established by the National Institute of Standards and Technology (NIST)

? -?ARIA: Standard encryption algorithm adopted by Korea Internet & Security Agency (KISA) ?

?

Keys used for encryption are managed in two levels consisting of master keys and data keys for efficiency. Master keys managed by the user are stored in a separate file, and CUBRID provides a utility to manage it.

?If you want to avoid the situation where all the data is moved to a storage media such as USB, it is recommended to save the master key file in a separate location (refer to the settings below).

image1.jpg

  • Master key: A key used when encrypting and decrypting data keys, and it is managed by DBA user.
  • Data Key: A key used when encrypting user data such as table and log, and it is managed by CUBRID Engine.
?

Managing keys in two levels makes it possible to perform the key change operation efficiently. If there is only a key that encrypts the user data, it takes a long time to work when you change the key. All the data that has been encrypted has to be read, decrypted, and re-encrypted. Also, the overall performance of the database may be degraded during this process.?

?

What does CUBRID's TDE encrypt/decrypt?

In CURBID, the table is set as an encryption target, and the following files are encrypted accordingly.? ?In CUBRID, a table is a unit for TDE-encryption. To use the TDE feature, create a table using the ENCRYPT option as follows: CREATE TABLE tbl_tde (x INT PRIMARY KEY, y VARCHAR(20)) ENCRYPT=AES || ENCRYPT=ARIA;

?

image2.jpg

Encryption Target:

?

1. Permanent/temporary data volume

?? - The encrypted table data and all index data created on the table are encrypted

?? - Temporary data created during queries related to encrypted tables are also encrypted.

?

2. Transaction log

?? - Encrypt all log data related to the encrypted tables.

?? - Encryption is applied to both the active log and the archive log.

?

3. Backup volume

?? - If there are encrypted data in data volumes and log volumes, they are also stored as encrypted in backup volumes.

?

4. DWB (Double Write Buffer)

?? - Persistent data is temporarily written to the Double Write Buffer (DWB) before being written to the data volume. It may be encrypted even at this time because the data for the encrypted table can be included.

?

Precautions when using TDE

1. Key file:?By default, the key file is created with the name of <database-name>_keys at the location where the data volume is created when creating a database using cubrid createdb utility.

$ cubrid createdb testdb ko_KR.utf8
Creating database with 512.0M size using locale ko_KR.utf8. The total amount of disk space needed is 1.5G.

CUBRID 11.0
?

$ ll
total 1050348
drwxrwxr-x. 2 cubrid11 cubrid11 ? ? ? ? 6 ?april 30 16:01 lob
-rw-------. 1 cubrid11 cubrid11 536870912 ?april 30 16:01 testdb
-rw-------. 1 cubrid11 cubrid11 ? ? ? ?65? april?30 16:01 testdb_keys
-rw-------. 1 cubrid11 cubrid11 536870912 ?april 30 16:01 testdb_lgar_t
-rw-------. 1 cubrid11 cubrid11 536870912 ?april 30 16:01 testdb_lgat
-rw-------. 1 cubrid11 cubrid11 ? ? ? 214 ?april 30 16:01 testdb_lginf
-rw-------. 1 cubrid11 cubrid11 ? ? ? 278 ?april 30 16:01 testdb_vinf

2.?TDE-related settings (refer to cubrid.conf)

? -? ?tde_keys_file_path

  • Set the path to the key file.
  • The name of the key file is fixed as [database_name]_keys , and it specifies the directory where the key file exists.
  • If this value is not set, locate the key file in the same location as the database volume.
  • When changing the key file path, this setting value is not dynamically changed, so the service must be restarted. At this time, if you move only the key file and do not modify the path of the key file, an error stating that the TDE module could not be loaded occurs when accessing the encryption table (DDL, DML).

? -? tde_default_algorithm

  • Specify the default encryption algorithm. (If the algorithm is not specified when creating the TDE encryption table, AES is used by default)
  • This default encryption algorithm is used to encrypt logs or temporary data in addition to tables.

3.?Situation when the key file is deleted:

If the database is running, there is no problem with the service even if the master key file is deleted because the contents of the master key are loaded into memory, and service is provided. However, this can be problematic as it re-reads the settings when restarted.

?

csql> SELECT * FROM tbl_tde;

In the command from line 1,


ERROR: TDE Module is not loaded.

4.?Points to note when using TDE


* HA Environment?

In a HA environment, TDE is applied independently to each node (master/slave/replica). This means that for each node, the key file and TDE-related system parameters can be managed independently.

?

However, since encrypted data is replicated between master/slave, if the TDE module of the slave node is not loaded, the replication will stop when attempting to manipulate an encrypted table from the master node. In this case, not only the changes to a TDE-encrypted table but also any subsequent changes cannot be replicated. Therefore, the settings or key files should remain the same.

?

*?TDE on backup?

1.Backup Key File?

$ **cubrid backupdb --separate-keys -D . testdb@localhost**
Backup Volume Label: Level: 0, Unit: 0, Database testdb, Backup Time: Wed May ?5 23:18:38 2021

$ ll
-rw-------. 1 cubrid11 cubrid11 ? ? ? ? 65 ?May? 5 23:18 testdb_bk0_keys
-rw-------. 1 cubrid11 cubrid11 1614820352? May? 5 23:18 testdb_bk0v000

?

The backup volume contains the key file by default, which can be backed up by separating the keys with the --separate-keys option. The separated backup key file is created in the same directory path as the backup volume and has the name <database_name>_bk<backup_level>_keys. However, in the case of separating the key file, it must be managed carefully to prevent losing the key file for database restore.

?

2. A key file is required for backup and recovery, and the key file is found in the following order.

?

The priority of the key file to use for restoring:

1. The backup key file that the backup volume contains.

2. The backup key file created with the \-\-separate-keys option during backup (e.g. testdb_bk0_keys). This key file must exist in the same path as the backup volume.

3. The server key file in the path specified by the tde-keys-file-path system parameter.

4. The server key file in the same path as the data volume (e.g., testdb_keys).

?

You can specify the key file to be used for recovery through the --keys-file-path option, and an error will occur if the key file does not exist in the path.

?

Key file classification:

  • Server key file: A key file that is generally used when running the server. It can be set with the tde_keys_file_path system parameter or in the default path same as the data volume.
  • Backup key file: A key file created during backup included in the backup volume or separated by \-\-separate-keys option.

?

3. Even if the correct key file is not found, the recovery can be successful if there is no encrypted data on the backup volume.? However, since the key file does not exist, subsequent TDE functions cannot be used.

?

4. Basically, if you lose your backup key file, you cannot perform backup recovery. However, if the key has not been changed, recovery is possible by specifying the backup key file of the old volume with the --keys-file-path option. Also, if the backup key of the old volume exists in the default path, it can be used to restore the backup.

?

5.?When performing restoration using multiple level?backup?volumes by?incremental?backup, the backup key file of the level specified by the \-\-level option is used. If the \-\-level option is not specified, the highest level backup key file is used. If only the key file to be used exists, restore can succeed.

?

* When TDE is unavailable

In the following cases, the TDE feature cannot be used, and an error occurs because the TDE module cannot be loaded correctly.

? ERROR: TDE Module is not loaded.

  • When the valid key file cannot be found
  • When the key set on the database cannot be found in the key file

?

Even if the TDE module is not loaded, the server can start normally, and users can access unencrypted tables.

?

However, the case log data that has been encrypted is different. If the log data is encrypted when the TDE module is not loaded and the log is accessed by recovery, HA, VACUUM, etc., the system cannot be properly executed, and the entire server has no option but to stop running the server.

?

* TDE Restrictions

In addition to the restrictions described above, there are the following:

1. The replication log is not encrypted in HA.

2. CUBRID does not support the ALTER TABLE statement to change the TDE table option, which means you cannot set TDE to existing tables. If you want to do that, you need to move the data to the new table created with the TDE table option.

3. SQL log is not encrypted.

?

?


?What other security features does CUBRID support?

SSL

  • To prevent sniffing, the act of someone intercepting data in transit over the Internet, CUBRID provides packet encryption.
  • For the data to be transmitted, the packet is encrypted and transmitted, and the SSL/TLS protocol is used to encrypt this packet.
  • More details can be found in the previous blog: Packet encryption.


ACL

  • A function called access control is used to restrict the list of unauthorized IPs and DB users from accessing the corresponding broker or database server. You can protect the database from problems caused by incorrect external access.

?

Audit Log

  • For auditing the developer's or user's DDL log, CUBRID provides the DDL Audit Log.
  • DDLs issued through CAS, csql, and loaddb could be recorded in log files in addition to the copy of the files executed if required.
  • When the system parameter ddl_audit_log is set to yes, the DDL audit log is created in the $CUBRID/log/ddl_audit directory.
  • DDL execution start time, client IP address, user name, etc. are recorded in the file.


GRANT/REVOKE /owner

  • The smallest unit of authorization in CUBRID is a table. You can allow or restrict other users (groups) access to the tables you create by using the GRANT/REVOKE statements appropriately.
  • All users have the privileges granted to the PUBLIC user. That is, every user in the database becomes a member of PUBLIC.
  • A database administrator (DBA) or member of the DBA group can use the ALTER ... OWNER statement to change the owner of a table, view, trigger, Java stored function/procedure.

715b51d85bbf03b2b2caf1af645e94a8.png

?change the owner: ALTER TABLE tbl1 OWNER TO user1;

For detailed documentation about CUBRID Security,?refer to:

CUBRID Security - CUBRID 11.0?documentation.

]]>
<![CDATA[Preventing Sniffing by CUBRID- Packet Encryption]]> /3827663 2021-05-11T10:50:59+00:00 2021-05-21T14:25:28+00:00

?

Written by?Youngjin Hwang?on?05/11/2021

?

Nowadays, browsing the internet with PCs or our smartphones has become an essential part of our daily life. As a result, it is possible to peek into the data being transmitted over the Internet with malicious intent. In other words, being able to peek at the data being transmitted by someone is called sniffing.

?

A classic example of a sniffing attack would be intercepting the account¡¯s id and password and causing physical damage by using the personal information of others.

Third Party (1).png

?

To protect our database user data, CUBRID 11.0 has enhanced security by providing packet encryption (and TDE (Transparent Data Encryption) based data encryption, but that will be cover in another blog later). When packet encryption is applied, the packet is encrypted and transmitted for the data to be transmitted, making the data uninterpretable even if someone sniffs it.

?

CUBRID PACKET ENCRYPTION

?

CUBRID uses SSL/TLS protocol to encrypt data transmitted between the client and server. SSL encrypts data sent and received using a symmetric key, in another word, the client and server share the same session key to decrypt.

?

Whenever a client connects to the server, an asymmetric encryption algorithm is used to exchange information required to generate a newly created session key in an encrypted form. For this purpose, the server's public key and private key are required.

?

The public key used by the server is included in the certificate ¡®cas_ssl_cert.crt¡¯, and the private key is included in ¡®cas_ssl_cert.key¡¯. The certificate and private key are located in the $CUBRID/conf directory. This certificate was created using OpenSSL's command tool and is a ¡®self-signed¡¯ certificate.

?

This certificate, ¡®self-signed¡¯ certificate, was created with the OpenSSL command tool utility and can be replaced with another certificate issued by a public CA (Certificate Authorities, for example, IdenTrust or DigiCert) if desired. Or existing certificate/private key can be replaced by generating a new one using the OpenSSL command utility.

?

Below is an example of creating a private key and certificate using the OpenSSL command tool.

?

#?create?2048?bit?size?RSA?private?key
$?openssl?genrsa?-out?my_cert.key?2048
?
#?create?CSR?(Certificate?Signing?Request)
$?openssl?req?-new?-key?my_cert.key?-out?my_cert.csr
?
#?create?a?certificate?valid?for?1?year.
$?openssl?x509?-req?-days?365?-in?my_cert.csr?-signkey?my_cert.key?-out?my_cert.crt?
cs

And replace my_cert.key and my_cert.crt with $CUBRID/conf/cas_ssl_cert.key and $CUBRID/conf/cas_ssl_cert.crt respectively.

?

(The self-signed certificate example written above is a certificate that is valid for one year and must be renewed every year. If you do not want to renew every year, since the self-signed certificate does not need to be renewed every year if you increase the validity period, you can change the validity period of the self-signed certificate. You can increase it or use it instead of a certificate issued by an accredited certification authority.)

?

CUBRID PACKET ENCRYPTION METHOD

  • Supported drivers:

CUBRID provides various drivers, but the drivers that support packet encryption connections are JDBC and CCI drivers.

?

  • Server setting:

CUBRID can set the encryption mode and non-encryption mode on a per broker basis. The default is the non-encryption mode, and you can set the encryption mode by changing the SSL parameter value of cubrid_broker.conf in the configuration file to ON as shown in the figure below.

?

d4f93c1d44ebe1e58fb70a424ec5a31d.png

?

The client (AP application) can make an encrypted connection using the useSSL property of db-url. Clients can connect to SSL by simply adding the useSSL property as shown in the example below.

?

JDBC?driver?:?"jdbc:cubrid:localhost:33000:demodb:::?charset=utf-8&useSSL=true","UserId",""
CCI?driver??:?cci:cubrid:localhost:33000:demodb:::?useSSL=true
cs

?

  • CUBRID Manager:

KakaoTalk_20210507_132316654.jpg

?

If the broker is used without setting the useSSL property while operating in encryption mode, the following error will be displayed. This means that the client you are trying to connect to and the broker encryption mode must match (both in encrypted mode or both in non-encrypted mode).

?

The requested SSL mode is not permitted, the CAS server is running in a different mode (check useSSL property).

?

BEFORE/AFTER APPLYING PACKET ENCRYPTION

  • Before:?

The picture below is when packet encryption connection is not applied. If you look at the TCP stream, you can see the query and results used.

9b1e1f8b15af7557e68deb1e122bea53.jpgbdea1082d3f90bcbeed9da948e547259.png

?

  • After:?

The picture below is a screenshot after applying the packet encryption connection. In this case, ?displayed query and result values are encrypted and cannot be interpreted.

5af1197dde53b26acd39e38927c75025.png

?

ba1a01af7df16a90c9fcffbec65c8d8e.png

?

]]>
<![CDATA[Contributing to Open Source Community/Project]]> /3826945 2020-06-23T14:45:18+00:00 2021-05-25T15:53:37+00:00

?

Written by?Charis Chau?on?06/23/2020?

?

?

What is an open source project? To answer this, let us start with a burger! Imagine an open source project is a burger selling in a restaurant. Every day, the chef makes thousands of burgers that have the same quality by following the same recipe from the restaurant. One day, customer A comes to the burger place to try the burger, and he/she loves it! Therefore, customer A decides to ask the chef whether he/she can get the recipe. Here, if the restaurant is open source, they will be happy to share the recipe to customer A, vice versa.

?

1.png

?

After customer A gets the receipt, he/she decide to make the burger at home by him/herself! However, customer A is a meat lover and does not like onion that much, so he/she decide to change the recipe by taking out the onion and add more beef in the burger! At this point, customer A gets a new burger base on the same recipe from the restaurant. Now, if the restaurant is an open source restaurant, customer A can go to the chef and say ¡®Hey! Your burger is great, but I¡¯ve added more beef for people who like to eat meat and take out the onion for people who do not eat onion! You can add to your menu!¡¯.

?

The role of the chef now becomes the committer. The chef will evaluate whether the modifications are valuable or not, and then decide whether to add to the restaurant menu. Either way, by sharing the changes of the new recipe, customer A has just become a contributor!

?

burger1.png

Open Source Project

?

So, why? Why customer A wants to be a contributor? Why contributing to open source is worth it? More importantly, how can we contribute to an open source project? In this article, we are going to answer these questions and drop a few guidelines to those looking to contribute to our CUBRID project and community!

?

(Thanks for the burrito example in the article 'The Definitive Guide to Contributing to Open Source by Mr. Piotr Gaczkowski)

?

?

WHY Contribute?

?

Contributors who contribute to open source projects can generally be classified as organizational contributors who are corporations whole and individual contributors who we will focus on today in this article. For organizational contributors, reasons of contributing to open source projects can be varied from ¡®it¡¯s an effective way to collaborate with other company/projects with mutual interest¡¯ to ¡®want to understand the technology they are using¡¯; etc., the specific rationale might vary for different organizations but it usually can be summarised to one simple fact that contributing in open source benefits their business.

?

Then how about individual contributors? What is the?motivation to them? According to the study of ETH Zurich ¡®Carrots and Rainbows: Motivation and Social Practice in Open Source Software Development¡¯, there are three main types of motivations driving individual to contribute to open source project:

?

1. Extrinsic Motivation?

?

Back in the 1940s and 1950s, researches have shown that motivation is fuelled mainly by the prospect of an external reward or incentive. For example, money is a classic extrinsic motivator, so is winning awards, getting grades, or obtaining certification, eventually increasing your competence in the labor market.

?

For contributors to open source projects, contributing to open source not only means the software you are using is getting improved but also means that your existing skills of, for example, coding, user interface design, graphic design, writing can also be improved.

?

And, according to the paper of Lerner and Tirole ¡®Some Simple Economics of Open Source¡¯, individual contributors, mostly developers are motived by career concerns when developing open source software. It means that by publishing software that was free for all to inspect, they could signal their talent to potential employers and thus increase their value in the labor market. Notably, it has become almost an expectation in some industry segments for job applicants to have public GitHub code repositories, which are effectively part of their resume.

?

?

2. Intrinsic Motivation

Fun and enjoyment is a classic intrinsic motivator, which means that contributors are contributing because they are actually enjoying it! In addition, peer reputation and recognition are also sources of intrinsic motives; by contributing to open source projects, contributors can share and learn from people who have the same interest, get mentorship, or even form a lifelong friendship!

?

3. Internalised Extrinsic Motivation?

?

Participating in an open source project not always starting from because you want to get peer recognition, or you want to have a better career path. Sometimes, you are just developing something that you want for yourself, and in the process, you create something valuable to others, that is what we call ¡®scratch your own itch.¡¯ In this case, the initial motivation comes from a selfish need, but it evolves into more of an internalized desire to contribute! For example, Linus Torvalds wrote Git because Linux needed an appropriate distributed version control system.

?

In summary, why contributing to a free open source project? You probably not only can increase your competence in the labor market and getting a higher salary in the future; but also gain recognition from the community and achieve your intrinsic satisfaction!

?

?

?

How to Contribute?

?

Contributing to open source is like walking up to a group of strangers at a party. Before start, you might want to do a screening and get used to the environment.

?

Almost all open source projects used a version control system, which is a tool that helps with merging new code into the project (the main ¡®repository¡¯). Usually, the collaboration is centered around a website such as GitHub that hosts the central repository.? For CUBRID project, you can find information at our GitHub website at https://github.com/CUBRID

?

GitHub.jpg

CUBRID GitHub

?

?

After you are comfortable with the GitHub system, try to search for the relevant projects you are interested about! There are 34 repos in CUBRID RDBMS Organisation waiting for you to explore! Once you have found the project you are interested in, Star and Fork the project!

?

?

repo.jpg

CUBRID Repository

?

?Now you¡¯ve found a project you like, and you¡¯re ready to make a contribution. There are all sorts of ways to get involved with an open source project, it all depends on how you are comfortable with! For developers, they can contribute on the code by doing the following: ??

?

¡¤? ? ? ? 1.?Post Questions, Ideas, and Bug Reports

?

One of the benefits of joining a community is that you can find people and information through forums. Some people might find that is embarrassed to ask questions, however, everyone, even the experts, takes a journey from not-knowing to knowing.? Posting questions, ideas on forums not only can get the answer directly from different sources by worldwide experts; but also have a chance to gain more information around the topic/questions. Furthermore, by asking questions, posting ideas in an open communication way, you are actually benefiting people who come after you with the same question!

?

In CUBRID, we appreciate you to post questions, ideas, or bug reports at our forum channel: https://www.reddit.com/r/CUBRID/.?

?

reddit.jpg

CUBRID Reddit

?

?

¡¤? ? ? ? 2.?Find Open Issues/ Existing Issues to Tackle

?

Another way to contribute is by playing with the existing issues. Once you found the project you want to work on, explore its JIRA issue tracking system where you can find all the open issues you can work on. Find the issue you have an interest in and start work on it with confidence! ?For CUBRID, there are several projects that you can browse issues and report an issue.

?

?

- CUBRID: http://jira.cubrid.org/projects/CBRD

?

JIRA1.jpg

?

- CUBRID APIs: http://jira.cubrid.org/projects/APIS

JIRA2.jpg

?

- CUBRID Tools: http://jira.cubrid.org/projects/TOOLS

JIRA3.jpg

?

?

? ? ?3.?Contribute Fixes and new Features

?

If you like the project or think it is useful for you, try to request fixes and new features, or you can sign the contributor agreements that give the project rights to the contributed code and start to add them by yourself.

?

If none of the above is the way you want to contribute, don't worry! You can also:?

?

o?? Automate project set up

?

o?? Improve tooling and testing

?

o?? Review code on other people¡¯s submissions

¡­

?

In CUBRID, your opinion matters to us. If you have any other good ideas about contributing to our community, please feel free to leave them in our comment box!

?

?

Contribution does not necessarily mean coding!

?

Contributing to open sources project is not only about coding! In fact, it is often that other important parts of open source projects are often neglected. Other than contributing to coding, you can also help:

?

o?? Enhance Communication

Enhancing communication is not only beneficial to you and me but also great for the whole community! More importantly, it does not take up much of your time. Asking, answering, or discussing questions about the project on the open forum, or help moderate the discussion boards on conversation channels.

?

o?? Improve the Public Knowledge Base

Improving the public knowledge base is an effective way to contribute to open source projects beyond code. Knowledge is especially useful when it came from someone who is relatively new to the project and who can still remember their beginner¡¯s mind. Improving the knowledge base by writing tutorials or producing blog posts on what you have learned is highly recommended! Read the documentation and if you feel something is missing or you found minor errors such as missing links or typos, raise an issue or submit edits to the official documentation! Our CUBRID documentation is right here: /manuals?

?

?

MANNUAL1.jpg

CUBRID Documentation

?

Another way to improve the public knowledge base is through translation. Some people might find that it could be challenging to contribute to open source when your primary language is not English; in fact, that is totally the opposite! Knowing another language could be a very valuable asset. The translation is an extremely valuable contribution that can spread software to a wider user base. Helping an open source project with translation is an incredibly helpful way to contribute because more people in the world can use your favourite open source project. If you are fluent in more than one language, translation is a great way to contribute!

?

Besides, you can also,

o?? Attend conference and workshops when they offer

?

o?? Offer Mentorship

?

o?? Design graphics

?

o?? Event planning (conference¡­)

?

o?? Put together a style guide to help the project have a consistent visual design

?

o?? Help community members find the right conferences and submit proposals for speaking

?

¡­

?

Summary?

?

Starting from explaining the concept of open source projects, why would people want to contribute to how to contribute practically, I hope this article can give you some general ideas about how to start contributing on CUBRID or other open source projects. In the world of open source, users and developers are the ones who shape the direction. We, CUBRID, appreciate your contribution!

?

?

Reference

1.?Contributing to an open source project: How to get started: https://medium.com/mindsdb/contributing-to-an-open-source-project-how-to-get-started-6ba812301738

2. The Definitive Guide to Contributing to Open Source: https://www.freecodecamp.org/news/the-definitive-guide-to-contributing-to-open-source-900d5f9f2282/

3. Why do we contribute to open source software?: https://opensource.com/article/19/11/why-contribute-open-source-software

4. Carrots and Rainbows: Motivation and Social Practice in Open Source Software Development:? https://www.jstor.org/stable/41703471?seq=1

5. Some Simple Economics of Open Source: https://onlinelibrary.wiley.com/doi/abs/10.1111/1467-6451.00174

6. How to Contribute to Open Source: https://opensource.guide/how-to-contribute/

7. 8 non-code ways to contribute to open source: https://opensource.com/life/16/1/8-ways-contribute-open-source-without-writing-code

8. Open Source in the Enterprise, Andy Oram& Zaheda Bhorat?

????

]]>
<![CDATA[CUBRID License Model]]> /3826781 2020-06-08T15:36:23+00:00 2021-05-21T14:31:42+00:00

Written by Charis Chau on 06/08/2020

?

Why Licenses Matter?

?

Open source licenses allow software to be freely used, modified, and shared. Choosing a DBMS with suitable licenses could save the development cost of your application or the Total Cost of Ownership (TCO) for your company. Choosing a DBMS without a proper license, you might find yourself situate in a legal grey area!

?

?

CUBRID Licenses

?

Unlike other open source DBMS vendors, CUBRID is solely under open source license instead of having a dual license in both commercial license and open source license. Which means that for you, it is not mandatory to purchase a license or annual subscription; company/organizational users can achieve the saving from Total Cost of Ownership (TCO).

?

Since CUBRID has been open source DBMS from 2008, CUBRID has had a sperate-license policy for its server engine and interface. The server engine adopts the GPL v2 or later license, which allows distribution, modification, and acquisition of source, while the interface and tools have the BSD license in which there is no obligation of opening derivative works. ?

?

?

CUBRID Licenses.jpg

CUBRID License Structure

?

GPL: General Public License?(http://www.opensource.org/licenses/GPL-2.0)

?

The GPLv2 or later license gives users the freedom to use freely, but if they distribute it, they need to publish changes and their code under GPL license and shared with other developers and users, which mean that you are free to modify and distribute the source code of CUBRID if you have any improvements in mind. Still, you do need to re-release the second work. At the same time, this works the same for us, our company CUBRID is also obligated to release the work after modification!

?

?

BSD: Berkeley Software Distribution License?(https://opensource.org/licenses/BSD-3-Clause)

?

BSD license gives users the freedom to full use, but we do need to keep copyright in the source code. However, there are no constraints on use and no obligation of re-releasing the secondary work, which means that even if DBMS-based application developers or independent software vendors (ISV) do not want to disclose the source code of their developed applications, that's totally fine! And you can even combine our DBMS with your proprietary software!? The development of a CUBRID-based application and sell it in the form of a commercial license or distribution by GPL does not cause any license problems.

?
?
Benefits of CUBRIID License Model?
Why both GPL and BSD licenses? To answer this, let us take a walk into 5 scenarios:
?

Scenario 1: Library Link

?

Developer, Alex: 'I want to develop and sell an electronic payment system for small and medium-sized businesses. If I choose to use CUBRID as DBMS, should I open my product source code or purchase the commercial license?'

?

Solution Provider, Ben: 'I want to create an installable bulletin board. As a DBMS interface, I am using JDBC. If I want to distribute to others the bulletin board I created, should I open my source code?'

?

In the above two examples, both Alex and Ben want to link various libraries and drivers provided by DBMS in their applications. For using DBMS features, a JAVA application should be linked to the JDBC driver; a PHP application should be linked to the PHP interface, and so on.

?

If Alex and Ben want to use DBMS with the GPL license model, they should open the entire source code of the linked application.?If they decide to go with MySQL under their Commercial License-Based Enterprise Version, they do not have to open the source code. However, they do have to pay for the license!?

?

Therefore, if they choose the GPL-based only DBMS, they should either open the application's source code or purchase the commercial license (in case of a dual license policy). However, since CUBRID applies the BSD license to all the interfaces linked to applications, Alex and Ben do not have to open the source code of their application when they choose CUBRID as their back-end database system.

?

s1.png

?

Scenario 2: Simple Calling

?

Solution Provider, Chris: 'I want to develop a DBMS backup management system. If it is useful, I want to sell it as a package. Because it is a backup management system, it just processes DBMS backup files or calls utilities without linking to the DBMS interfaces or libraries. Is the license still an issue for this case?'

?

This is the case when the application simply calls DBMS interfaces or libraries without directly linking to them. However, if GPL-based DBMS is used, Chris should still open the source codes of the application just as when you link libraries. However, Chris will not have the obligation to open the source code under CUBRID.?

?

s2.jpg

?

?

Scenario 3: Distribution Between Corporations

?

Company, D: 'Our headquarter is located in the USA, and we have local branches in Japan, China, and Korea. Can those branches provide services by using the games created by our headquarter?'

?

When distributing an application created by DBMS with the GPL license to branch companies, Company D should open the source code of the application or purchase a commercial license. However, CUBRID provides the most competitive license model with companies or solution vendors that plan to enter global markets.

?

?

?

s3.jpg

?

Scenario 4: Interface Modification

?

Developer, Emma: 'It is inconvenient because the PHP interface in DBMS does not provide dynamic SQL features. If I modify and use the PHP interface, should I open the modified interface or a linked application?'

?

In the case of the GPL license, if the source code is modified, the source should be opened, and the improved function should be shared among other users. However, in the case of the BSD license, it is not necessary to open the modified source when it is used for either individual or commercial purposes.

?

s4.jpg

?

In the above scenarios, we can clearly see the benefits of CUBRID License Model; it can be summarised as follow:?

?

summary.jpg

Benefits of CUBRID License Model

?

?

Scenario 5: Server Modification

?

Company, F: 'In our company system, the "organization chart" should be included in all pages. Because of frequent organization changes, recursive queries are indispensable. If I add this feature to the DBMS engine, should I open the modified DBMS code and our company system?'

?

Even though the above scenarios provide shreds of evidence that both GPL and BSD license can bring higher degree of freedom to users, the DBMS engine is a core infrastructure for software development, so it is considered proper to share improved features with many other users. To share the improved features of the CUBRID server engine, the database server adopted the GPL license. Therefore, if company F modifies the database server engine, you should open the modification to other users.

?

s5.jpg
?
?
Summary?

In this article, we have introduced the CUBRID License Model and explained the reason why we think CUBRID is trying to give users the maximum freedom and benefits by giving examples and comparing them with GPL-based only DBMS.

?

Like many other open source software organizations, CUBRID is structured under the revenue model, which only receives the cost of services (developmental support, operational support).?Besides, CUBRID is not with the vendor, but with the client, clients can get the service they want at the time they want. In other words, using CUBRID does not require a mandatory service contract!? We realize that it is not easy to introduce open source software; therefore, clients of CUBRID can sign a service contract and receive technical support services according to their needs and needs.

?

References

/cubrid

https://opensource.org/licenses

?

?
]]>
"I can't think of it," replied Frank; "what is it?" Judy Abbott Still the tonga; uphill and down, over the hilly country, with a horizon of dull, low mountains, and the horses worse and worse, impossible to start but by a storm of blows. Towards evening a particularly vicious pair ended by overturning us into a ditch full of liquid mud. The sais alone was completely immersed, and appealed loudly to Rama with shrieks of terror. Abibulla on his part, after making sure that the sahibs and baggage were all safe and sound, took off his shoes, spread his dhoti on the ground, and made the introductory salaams of thanksgiving to the Prophet, while the coolie driver returned thanks to Rama. "Did the girl know her own story?" she asked. "Nonsense¡ªyou're coming wud me." "I'm afraid father forgets things. But come in, he's bound to be home to his dinner soon." HoMEÏã¸ÛÒ»¼¶¸ßÇåÂØÆ¬ ENTER NUMBET 0018feizaoju.com.cn
www.candice.net.cn
www.618866.org.cn
teraki.com.cn
lelanz.com.cn
www.zjgcx.com.cn
www.ztgv.com.cn
www.lafiori.com.cn
jbyahoo.com.cn
www.wnbus.com.cn
黑人美女做爱下体艺术照片 搔妹妹黄站 大吊操丈母娘 安卓手机nomao软件下载 18yeseecom 韩国黄色片 欧美母子乱伦4 人体艺术网站张筱雨 av黄色性爱 圆圆的奶子影音先锋 社内情事巨乳olあずみ春 diy自动的性爱操逼器 神乐坂惠写真先锋 操逼电影直区 美女护士阴唇图片 WWW.KAN51.COM WWW.7SE7SE.COM WWW.AVVAV2016.COM WWW.FJDZH.COM WWW.76ZH.COM WWW.XXSPJC.COM WWW.66SDY.COM WWW.NNN89.COM WWW.BBB788.COM WWW.ZY-LED.COM WWW.97XFDY.COM WWW.JIYOUTV.COM WWW.KEAIMM.COM WWW.97JY.INFO WWW.77UJ.COM WWW.992AAA.COM WWW.SE105.COM WWW.999H.ME WWW.QFZQZ.COM WWW.46NK.COM WWW.168CAI.COM WWW.ZXW1.COM WWW.SX831.COM WWW.26ND.COM WWW.CCC800.COM WWW.CUPAPA.COM WWW.EE974.COM WWW.ANQU66.COM WWW.333XA.COM WWW.HXTLED.COM WWW.PUTCLUB.COM WWW.464U.COM WWW.MOKAOBA.COM WWW.QPFCH.COM WWW.DAEN88.COM WWW.ANQIMA.COM WWW.ISMDY.COM WWW.99FF5.COM WWW.AV5999.COM WWW.AILUDE.COM WWW.SOSO8383.COM WWW.WWW44HHH.COM WWW.282QQ.COM WWW.WQQKG.COM WWW.HAO5588.COM WWW.QDH100.COM WWW.HHH085.COM WWW.D442.COM WWW.AAA979.COM WWW.NIU21.COM WWW.FZXINQI.COM WWW.2732322.COM WWW.80WM.COM WWW.GGPAPA.COM WWW.998UIWD.COM WWW.20GG.COM WWW.TTKANTV.COM WWW.9GDY.COM WWW.XADDM.COM WWW.37XX8.COM WWW.CCC679.COM WWW.MAXCMS8.COM WWW.SSS03.COM KHALED.FARAH WWW.34EEE.CON WWW.777SU.COM WWW.HACKP.COM WWW.97PPP.COM 好色巨乳熟女人妻 啊啊插我自拍 GG004 亚洲av偷拍自拍 日本手机在线观看视频av 亚洲熟女人妻50路在线 www520520eme 三级片透视美女 www8aake 情欲艳谈百度云 狂抽插粉嫩美妇图片 黄色成人电影院 另类小说专区第1页 婷婷色丁香迅雷下载 少女手淫偷拍视频 风骚老板娘 激情影院床戏片 卡戴珊禁播图片图 欧美超碰先锋影院 性生活影片大厅免费 肉感系列 WW678图片 两性乱伦拳交 2B哥哥乱伦熟女 599AP 鲜嫩肉穴 狠狠爱夜夜橹在线hhh600com 奶大妞女 色狗成人小说 三个嫂嫂轮着玩一乱伦 巨乳妻子 www743333 sm调教美女妈妈 免费操逼啪啪啪免费视频 超碰依依 pp63 倩女销魂 三级片全部免费观看完整版 磁力链接捆绑女教师 6080三级片mp4 撸色撸 爽亚洲15p 干妹电影清晰度 奴志愿替夫还债 免费成人网那里 国产自拍极速在线 手机无码在线云播 天天啪久久wwwgeerlscom 淫妻绿帽另类图片 射她淫下载 免费黄片网站大全 成人直player成人直播 杏月美在线无播放器 女孩的阴蒂 免费成人电影网站排行榜 岛国色色在线视频 99热久久操干狠狠 wwwsaojjzzcom 在线撸图 丝袜护士成人 葵司三级片 日本女穴 内射色图 avav9898 欧美成人大鸡巴用力插 2017天天撸 狠狠的干2015 色驴影院AV 免费成人三级快播 迷奸第1页-插妹妹a片96网 撸儿所成人 凹凸在线破处门 爱微拍福利av 大奶奶日本系列 Av东方在线视频网站 射射撸av 成人动漫友人之母 色刚刚帝国 seqinyiji 欧洲一级性爱图片 曰麻比 哈尔滨狼友 木美子 丝袜亚洲av 武侠母女同 给个2017能看的网站 日本激情网 最大胆熟妇丁字裤艺术图片 lu198com 52bobo52 人与狗番号 丰满淫语啊妈视频 亚洲色图偷拍自拍乱伦小说 www77dsnettvb 西施三级在线 mmm9ckanzycom 873ee 口交av免费视频 WWW208UUCOM 人体艺术性爱照片 乱伦妈妈小说 青春草在线华人 yes44444 邪恶漫画之妈妈丝袜双飞 免费甜性色爱电影 人妻巨乳影院 AV成人播放器免费的 韩国r级限制电影手机在线观看 7f5gcomshipin33html 日本www网站下载 抽插淫荡少妇小清15p 2015超碰在线视频观看 51撸影院 chinesepornvideos--porn300 prouhubcom日本熟女 wwwhaoav 010性爱综合网 日本在线h小游戏 嫩妹妹av86cccccom ss成人 大帝Av视频在线免费观看 初中女生下面 丁香5月亚洲 色系x小说 嗨他网大色网聚色网 欢欢时空 丝袜足交熟女20p 花和尚综合 开心春色 韩国情侣做爱高清自拍看巨乳多多影音 自慰小说免费看 www725bb xxxx欧美制服 学生妹强奸网址日本 亚洲色图15pwwwjjjj14comcomwwwssss88com 好吊妞AV 小明看看99recOm 搜索姐姐妹妹看AV 6080激情影院 日本身内射精av atv444电影院 超碰在线看视频 a片人兽乱伦 美国美女大逼电影 亚洲熟妇色图 欧美性爱色域网 14伊人 古典武侠校园春色明星合成 娃 美女黄色一级片电影 性感小说姐姐梅 成人伊人开心网 自拍诱惑照 速看100影视 250色艺中心 被公公大夫插 xfplay丝袜制服 制度诱惑系列在线 爱裸睡的女儿丹丹 可以搜索演员的黄色网站 色欲淫香手机 狼人艹综合 uc成人浏览器 WWWavtb789com 亚洲日韩国产精品在线 1138x成人wang 7次郎在线视频 亚洲&apos;av 26uuu做爱 上海177姐妹花在线视频 女人淫荡的声音 h淫荡美熟母 强奸幼女av网站 乱伦o 嫖娼约炮色中色激情影院 扒开董卿湿漉 wwwpu690com 爷爷孙女爱爱 和阿姨疯狂啪啪3p 伦乱片236 wwwmumu98comwwwmumu98com 韩国mm影音 www_kuai97_com 美国豚鼠2在线观看 肉棍蜜汁p 亚洲肥奶奶性生活视频 哪里能看到免费的幼女 88街拍视频网 黄色网站最强 成年人电影色黄 强上老婆的妹妹小说 凌辱女友mcc色站 青青草AV在线视频观免wwwshe72com 邪恶漫画gaa 妻子成了公共汽车 性交实拍舔鸡巴1000部 国内最大成人在线免费视频 丁婷婷丁香五月 古典武侠迅雷专区 西瓜影音毛片网址 制服丝袜偷拍自拍在线视频 2365xxcom 制服丝袜m 成人瑜伽在线 草樱av免费视频l www523uuucom 欧美小女日 国产普通话叫床 女生在线自慰av91网 骚货偷拍 强奸乱伦先锋中文字幕 直播视频6页 黄色电影视频magnet 413121神马电影 给女护士爆菊的小说 黄色av做爱 566qq五月 大炕偷情自拍 国产大鸡巴操 冯仰妍16分钟在线视频 wwwav520compage1html 国产超级成人视频在线 被迫子宫内射 日本无码拳交番号汇总 nk290com 少妇被强上mp4 亚洲偷拍自拍www912yycom 宅男色影视色 乱伦熟女tu图片 日本熟妇色色视频 和老婆激情性爱记录 姐姐骚哥哥爱妹妹图片 刀剑三级毛片看一下www906yycom 小明看看首页最新通道 扒开小姨阴唇插进去 麻生希google 小优仓子云盘 母子qin 姐姐高潮出水10p 228df看不了 影音先锋成人动态图 5tav 穆桂英外传古典武侠 干哥哥插妹妹逼 淫人社区 淫香淫色色欲影视清纯唯美 男男性交mp4 久久爱视频在线观看视频ijijigecom nxhx人与动物 259LUXU139 小色狗成人娱乐网 类似巨乳淫奴的小说 山形健和早乙女 陈老师的肉色连连 夜涩猫6699 av天堂网先锋 大鸡巴插老婆magnet 欧美女人潮吹视频在线观看 日韩五月丁香 亚洲色欧美色在线 站着哕爽 亚洲视频老熟女 天海翼 亚洲 图片 丁香社区bt下载 重口味女人分娩图片 母乳幼交 xxx3333 偷拍 母子操逼怎样操的舒服 人妖打飞机翻译 鸡巴狂插少妇 国外幼少女电影 幼齿网址 有什么色电影不腾讯可看 刘亦菲阴道毛多吗 店长推荐成人动漫吉吉音影 国外人体意思 美女图片大奶逼 zooskool 人与动物huaididi 熟女bb无毛 兽皇女主角名字 微信毛片群 撸波波明星美图 影音先锋av在线视频 日女女逼 日本裸女人性交 幼女就爱被大人干快播 欧美奶奶图片 日本熟女av母亲型 社情导航 av movies 下载裸体美女图片 韩国女主播雪梨裸体 狗鸡巴插穴故事 掰开人体私处 花和尚播放器 日逼片百度影音 强奸系列小说下载 老农和几个大学色女生的淫荡生活 超大胆少女人体艺术 乱伦艳说 偷拍在拍在线论坛 户田惠梨香番号 淫贱女星卖逼图 日本毛a电影网站 44porn 韩国黄片影音先锋 激情性爱 乱伦 制服诱惑 快播电影 我的女友是黑木耳 小泽利哑裸照 弥生16岁 妈妈乱伦屄 思思色尼玛激情亚洲 欧美黄色网站视频第一页 色婷兽绝 快播春护士 儿子液侵母亲原照片 激情a毛色 影音先锋佐佐木希 av yeyewoyao 风骚熟妇合集 少女的屄阁 baidu美女人体 汤唯吃鸡巴艳照 人体掰b艺术图 11xingjiao 不需要下载播放器的裸体做爱 大胆巨乳美女一丝不挂图片 波多野结衣 黑丝快播 大肚少妇乱伦 meisedianyingxiazai 影音先锋 春宫心 人妻1953 女性生植噐照片 看看 人与曽肏屄播放 肏农村女人屄小说 影音先锋能用的码你懂的 先锋影音 伦理 肏小乔屄 阳痿狗鞭 阳痿的中药方子有吗 qiangjianluanlun s 张靓颖人体艺术视频 大奶奶人体 皇瑟片女搜搜能看视频 147人体艺术 羊羊 angl23com 鲁av影院 色女草榴区 ww我和老師做受jeiw020ccm网址 我老婆是骚逼 东北老女人性爱下载 you女孩太小插不进去 田中瞳梦工厂 港台本土影片 舔足h 最果神狐 梁婖婷被干 人兽坏弟弟 苍井空爱爱照 插入表姐身体 苍老师淫叫 欧美美鲍人体艺术网 实况足球8补丁 growing 无处安放 五十玫瑰在线观看 powdersnow nortondiskdoctor 重生之小保姆19楼 松原教育信息网 归化与异化 42楼的浪漫情事 最近黄金走势 杀美女吃人肉小说 欧洲亚美图色色小哥 李宗瑞电影在线试听 鸡巴插逼四脚兽 930影院手机版 我爱看片手机下载地址 免费品色堂论坛 尤女人大屄看看色色911 亚热之女先锋影音 男人做爱女人的小游戏 WWWSEXCCMILCOM 父亲操女儿台湾妹 最新人强奸与动物的案例 日50人体 高树玛丽亚bt种子下载 大胆性交视频 SE92KXZCOM 美国大胆女人人体艺术 女人色动态图 处女阴部裸体 WWWAVTTUUCOM 美丽女主播被强奸爆菊后擦电影 我和2个女同事做爱 成人激情黄色乱伦电影下载 少妇风流电影 xxx人兽性交视频 阴唇特写高清 操农村61岁老太太 快播免费成人禁片 粪礼迅雷下载 大色哥成人小说区 妹妹色色亚洲偷拍 9955d新地址 强奸艾儿 干干妈page 美女粉乳头10p jux381 激情少妇少女高潮 xb电影网奇米影视 黄色录像电影片段 李宗瑞torrnetthunder 欧美色图黄色的 淫妇av在线 小说日本换妻 男女性爱激情图 新女体洗澡 操你啦群p美女 哥哥干欧美人体 义母之吐息 幼女性照片作品 大屁股熟妇18p 偷拍自拍网友性爱视频 欧美专区在线 911ss主色911主站 漂亮面孔奶子圆高潮近叫不停 人体艺术747 性感男被搞射好几回精液 在线欧美激情电影 f05bbd3e00007510 撸色网百度 sese欧美成人 偷拍自拍12p 熟女视频自拍撸 WWW914XXCOM 华娱花花世界 关之林丝袜 欧美淫荡女人图片 自拍激情小说综合 日本黄色播放器下载 粉穴自拍偷拍 西西人体艺术张雨 俺去也伦理片免费 优艺裸体 肉铺团163wang xx社模特子顡 哪里有处女逼照 北原多香子艶尻ed2k 怡红院里什么名字好 女人做爱吧 巨乳人体艺术视频 606kxw色五 操嫩洋屄【0930】 WWWQINGYULEME 男同小说色图 妈妈大花屄 男人肏母兽完全手册 顶级黄色图片可看到阴道口 人妻熟女性交图片 东北火车道银镯子 快车成人电影网子 xingbiantaiwangzhan 张筱雨私穴 最激性亚洲顶级图片 极品性爱在线 体验区免费嘿嘿影院 处女色穴 大爷操影院可乐操 美国妹妹大咪咪 亚洲欧美图激情小说 WWWSESEOCOM 明星版h小说 五月色图】 voa在线视频 快播色青片大全电影网站 马六人体淫荡图片 音影先锋黄色网 苏格影院龙珠传奇 不用快播网页在线a片 操骚逼女老师 youjiaotongzhi1 俄罗斯妇女野外放尿 明星草 美熟女被按在床上操 女人被狗干是什么感觉 淫荡妇女优 国外人体私处局部摄影 欧美激情校园春色www34qfcom 萝莉爱色网c20sqwcom 非州兽皇 我们永久域名59cao放不了 在复仇者联盟里草女的黄色小说 都市校园淫妻 骚货寂寞自慰 操丰满大屁股人妻小说 菊花撸撸撸 美女被叉叉的免费网站 新亚洲第一页 为什么快播种子大全登不上 超碰带孩子自拍在 bta18con 尿尿大便操逼拳交视频 少妇与公驴交AV 菲菲综合 超碰勉费视 很去狠撸吧草吧 蕾丝袜美女嫩穴小说 男人影视duppid1 露脸绝对领域 兽入交 学生妹90后淫 揉胸吸奶150 日本美女特大胆裸体露逼 拍妹妹拍哥哥射 在新疆卖GAY影片 家庭淫乱小说之强奸处女 东北小女孩原版 成人网站dizhi1 三个黑鬼与日本少女性交 大鸡巴操骚遥 姐姐美妙的裸体 非卅人休裸 成人片丝袜的诱惑 老人介护士合集 坛蜜恋足 手机看片宅男伦理电影 大姨姐与妹夫乱伦偷情 张柏芝艳门全图 老衲爱百度 亚洲图片区偷拍自拍图片欧美图片小说校园春色 先锋影音av撸色 哥哥综合影院www791hhcom 少妻艳欲下载ed2k 13岁人休艺术图片 色色动漫连载 按摩女人私处 亚洲萝莉射av 美国女人和美国男人一流黄色三级片 丰满嫩逼 做爱狠狠图片 欧美丝袜足交电影快播 18岁人妻少妇口爆吞精 网友夫妻上传免费公开视频另类视频 天天射色女朗 快乐小猪幼儿舞蹈视频 淫荡姐妹小说图片 日本美女干死B 欧美成人女同性恋大片 亚洲色图av亚洲美色图 原色网 幼交片网址 偷情综合网 书包网乱轮小说下载 附近老女人做爱视频 偷拍自拍美罗城 youyoudebi 国语操逼magnet 伦理片直播写真 1024最新人妻观看基地 久草在线美女主播自慰 欧美色图片婷婷基地 日韩美少女射精视频 李宗瑞快播电影网 小仓优子duppid1 免费外国性爱电影 首页中文字幕偷窥自拍人妻熟女 wwwjizzjizzjizznet 都市激情亚洲美图 偷拍卡通动漫另类口味 光酷影院 爱AV软件是什么 妻子和别人的淫乱完作者不详 公共汽车上插小穴 亚洲sewangoumeizipai av网插女 岛国裸女mp4 av淘之类的网站 大香蕉久草aV Av电影代伦理电影的视频 快播制服丝袜强奸网 成人电影上厕所中国 超碰人妻人人碰5533tcom 美丽母亲儿子乱伦 苍井空种子视频网站 无毛美女姓交 人体艺术艺术激情 加藤ツキ超短裙义母的美穴在线观看 日本电影私处下载 有声小说沙漏 qq电台有声小说 春色医 樱井莉亚thrund 小泽玛利亚练功房 小泽玛利亚最多 小泽玛利亚三十部 小泽玛利亚无限 求可以看的h网 给h网 www完美制度com www黄色123.com se开心五月天 开心五月天地址 开心尽情五月天 东京热06 东京热300 酒色网电影网小说 古典武侠酒色网 酒色网卡通动漫 怎么在快播里看黄片 黄色小说集 求一本黄色小说 黄色小说黄色小说 美人电影 偷拍UU 98桃色网 爱窝窝在线 国产小电影 老色鬼影院 骚女窝影片 色妹妹A片网 942xb电影 操你妹高清AV zoosex兽交 18to19emo 桃花色 一色春 鲁鲁射 偏执型人格障碍 马上色 狠很橹图片 白 国产大保健 迅雷 人人操人人摸人妻 最新sq网站 www18AV 色夜院影 缘来影院 abp 淫女动漫在线 写真视频福利app下载 国产性虐在线淫女动漫在线 日本足疗视频 天天828vv 人休艺术视频在线观看 251eee 京香julia 短片 猫咪大香蕉情人综合av 日本在线加勒比一本道SM 医院护士内痕 小池里奈avBB图 做出综合网 av文档一月合集 人工智能ai让女神下海不是梦 13色图 CREAM PIE漫画 女同天天啪 大香蕉青苹果 小明免賛在线电影 女学生 清纯 在线观看 家庭乱纶系少说 97秋霞福利 日本人妻无码播放 萝莉黄色福利 极品美女在线视频 不收费午夜影院污 ktfuli mhdm。xyz 老年人汽车番号 扩阴啪啪 特级大尺度毛片 XxXx69日本 索菲亚无圣光 情人啪啪啪影院 人妻之妻电视免费看 强奸乱伦动态图 人碰欧美在线清 清风阁视频日本免费 - 百度 秋霞在线观看秋霞伦理电影 小美女被强奸的视频丝袜美女 小莹姐吃奶之汁口述全过程 青青草白虎无毛视频免费观看 青青鱼在线视频免费视频 人妻熟女视频 青青草免费无码高清视频在线播放 性爱视频高清无码 迅雷链接 性感女神ppp视频 协和lunl 全国华人偷拍自拍视总集频 秋霞在线手机观看版 邪恶dt图片第145大全 在线福利导航 日韩在线视频国产 曰本大尺度抽扦bb视频大全 日本一本道视频在线播放 有黄视频的月光影院 日韩av手机视频在线播放 日本童交视频播放器 日本在线hh视频 伊人久久精品视频在线 美女自拍福利视频 褐色影院 直播上床 美国女孩成人免费视频 操逼福利动态影院 我爱干比b在线观看 日本夫妻生活片 avhome seji色戒视频 青青艹高青视频 农村色,情视频在线观看 一本道色综合mp4 唐朝av影视高清 大尺度av在线 125电影影视 小池里奈线观看 色喇叭国产自拍 调教性奴鞠婧祎 live 图 无码 51成人电影 亚洲色噜噜 日本少妇5p 吉泽明步7SOE-539 国产91情侣拍在线 自拍偷拍 亚洲 影院 潘号导航 xxx黄色动画片 jjzz啪啪啪 8090碰新公开视频 福利网站懂的2018 人妖欧美操逼视频 国模私拍露点视频 操逼视频碰碰在线看 女人的屄毛形状视频在线观看 女优种子资源 b里香视频在线2白色爽 强奸乱伦 制服丝袜 成人操逼视频在线 佐山爱bt蚂蚁 爱看午夜福利电影院 岛国艺术写真视频在线 兄妹激情 撸撸樂 久久爱视频福利视频自拍 心理追凶磁力链下载 浪阿姨 少女给猫哺乳 美国性爱一级黄片 桐谷奈绪百度网盘 抽插少妇视频欧美 五月香在线 2017最新理论琪琪影院 四虎高清亚洲 夜色福利导航-宅男福利网址大全 热の中文 热の国产av 草坡在线视频免费视频 成人小视频免费试看 91日本 特级毛片影谍 小公主影院av 自拍在线-自拍偷拍-自拍视频-网友自拍-91自拍-自拍在线 偷汉子磁力 免费福利87微拍在线 天天看片视频免费观看 八戒影院av被窝电影网av 武林皇后在线播放台湾 女同性爱视频网站 午夜福利视频1003 淫空姐 12岁啪啪啪 avi 磁力 跨越海峡的一对情侣影音先锋 兰兰性爱视频自爆 kinpatu86 在线 训雷种子 龙头蛇尾 童颜巨乳 久久成人电影免费 何奕恋土耳其在线视频观看 8k福利在线电影视频 美女被操免费观看 WWW373C0操 52avava播放器 色婷婷亚洲婷婷7月波多野结衣 色系里番播放器 桃乃木香奈作品汇总 坏木坏木木集百万潮流小说 厕所偷窥视频 av中文字幕在线看手机 4438x全国大五月花 2017ady映像画官网 森川安娜在线播放 678影院 伦理片黑丝名字 怡红院人人爱免费视频 乐愚驴good电影网 zvtt在线 拍拍776 国产自拍,三级 波多野结衣午夜影院 橹橹橹橹橹中文网 欧美制服在线啪啪 韩国主播金莎朗 在线成人内涵漫画 淫妻妻图片 hnds在线 caoporn91视频在线 AV视频中文字幕 中出外国留学生 国内外激情在线视频网给 私色房天天色 成人caohub 类似cum4K的网站 美足av最新 神秘av 仙桃影 鲁鲁狠狠在线影院 mini按摩黄色一级片 欲望Aⅴ 东方影库在线av东方 处女肏屄视频 福利直播在线观看无需下载 福利一区飘花影院 动漫vip成人视频在线观看 大爱福利导航 大香蕉新人人现 第九影院神马网58Aⅴ 大黑屌免费视频 东方在线aav视频 大香蕉s视频 第九影院午夜重口味 激情乱伦强奸 巨乳亚洲欧美另类在线 国产自拍26页 国产站街女偷拍视频 普通话国产自拍在线 天天摸日日碰人人看最新777 福利伦理无需播放器 nannuzuoaihuangsedaqquan 女主播户外野战合集磁力链接 dodort 在线毛片自拍直播 大香蕉一道本视频 义母吐息在线1mm 国产原味小辣椒在线播放 恋足系列里番 在线播放 自拍偷拍 微信小视频 鸟站出品国模 ccc36em 神纳花电影在线观看 色色久草 eeuss快播影院手机在线观看 爱福利伦理片 91色老板福利电影 91hdav101高清女优在线 泽井芽衣的女教师视频 一本道 moo在线视频播放 福利中文字幕在线看 被人定住的迷奸视频 ftp 免费的小视频在线观看 菠萝湾视频 孤微视频日本高清 国产自拍电源 男人大鸡吧视频 国产自拍 水滴 奸云群 ckplayer 在线观看 偷 哥哥搞在线播放 日本无码视频在线免费观看 亚洲东方成av人片在线观看 任你玩绿色网站 avavavcn idgif卵蛋图解 0077cao改成什么了 时间停止器校园m 91gaogao漫画 国宝影院综合网 理伦片毛毛 av欧盟 人人操人人热 福利bar亚 aV零影院 成人网子你 懂得 肉片动画在线观看视频 射丝袜足 在线影院 6080星奈爱在线播放 女仆娇喘 法国雏女交 接摩人妻 91萝莉转区 网红少女免费福利网站 【35052】在线视频色和尚导航 张筱雨大尺度写真迅雷链接下载 欧美美女无内图 欧美成人野狗免费视频 娜娜sweet磁力链接 宅男吧 大香蕉视频在线频影院 趣爱福利m3u8 名媛人妻温泉旅行黑心精油马杀鸡 日本女人l对性的阴道 日本女人4050 欧美女同性恋互舔视频播放 新新电影倾城雪第1页 成人教育 西瓜影音 插撸吧在线 秋霞 国内自拍 极品口暴深喉先锋 韩国电影床戏女兵 超级av搜索系统 西条琉璃在线bd种子 日韩'AV 99成电人影中文版 天堂鸟ttnbbs 步兵 明日花 影音先锋 青青草人人艹 mide215剧情解析 wwwxiangjiao58 gav成人网无播器 棚户区卖暗视频 播放 18teenjapangirls 大主播网视频站 avnight官方 色婷婷综合网 重口AV名 阿夷令人垂涎的身体漫画 pr网红私人定制在线观看 澳门皇冠永久视频 extreme sm tube AW影院 大西瓜m3u8 AV火山小黄人 电梯里被陌生人干高潮 不知火舞h动漫 小姨夫影院幼女 先锋资源人体 小寨厕所偷窥 香港经典三级免费在线观看 校服白丝污视频 乡村巨根香蕉 JAVHIHIHI视频 renqitouqing 骑姐姐免播放 淫网福利导航 古川伊织star-621在线 欧美A V天堂 禁忌之爱弄自己儿媳妇 堇花团队百度云资源 2018怡春院av影院 哈尔滨A片 午夜剧场福利视频0855 avaoao yy夏同学6080福利片 校园春色欧美视频 极速AV在线 被男友强吻和揉胸自述 999Segui 超清免费伦视视频在线观看 梁婖婷磁力链接 私雅网站 动漫女生和男生啪啪啪视频 日本图书馆暴力强奸在线免费 人人妻人人操免费视频 午夜影院瓯美裸体 A级毛片高潮四虎影院 日本在线高清m949dtv 亚洲影院中出诊所 韩国伦a片 国产自拍D奶 sex做爱舔B jz轮奸一名日本人妻 按摩系列 av 岛国中文无码无卡在线 色吧5色婷婷 sm乐园 868 国产成人规频在线 Vip男人天堂 nhdt-在线观看 乌吗av免播放器你懂的不卡电影 影音先锋资源站xfpllay AV男按摩师系列 magnet 黑人成人网站 肉蒲团 漫画 北京模特刘倩宾馆 操美女小穴 苍木空裸体照 操B插B靠B 草裙影视草裙社区主论坛福利社区午夜福利福利视频微拍福利福利电影福利导 不要会员的干丁香视频 材料rti值 操婊567 xxxww日本 wwwxxxw6 日韩av无码迅雷 magnet 麻仓美奈 网红女主播户外女王剧情演绎性感女白领叫外卖勾引美团外卖哥 轮奸 夹紧骚货 www4438x10 户外女主播迅雷磁力链接 乱欲全家130 武侠古典在线成人 最酷AV,av天堂,醉地av,醉地视频,醉地导航,醉地,av导航av在线,av电影,av视频,a 岛国AV神作磁力 淫淫色播 大香人伊网在线官网动漫 欧美性色黄视频在线s+o 小新成人影视 中文字幕在线星野遥 卵蛋网葵司 aaa999xyz 女主播门把手自卫秒拍 啵啵xo影库 操逼的小视频黄点。 成人极速性生活视频 WANQUEYINGYUAN saozixaoshuo TGGP78在线观看 苍井忧无码磁力 mp4 成八动漫AV在线 超级国产av自拍在线 爆操小骚货骚逼视频 免费的视频美女图片亚洲小 丝袜美臀在线视频 国产自拍车震 内射妹子免费视频 五五热在线视频 叼嘿视频小清晰影院 深川铃 磁力下载 一楼一凤影院首页vr 日旧夜夜精品免费日日夜夜视频在线奥门金沙乐场 heyav tv日本在线 迹珠美av在线 www99ddocm avgu 一道本东无码免费 香港4438 日本avtt 自拍 快播 色五月天 色婷婷 色老大 色米奇 国内一极刺激自拍片 乱伦骚爽视频、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 六月婷婷网址 跳跳蛋塞美女下面视频 黄片大战 湿舔视频 啪啪在线自拍视频 美谷朱里 男女做爱小视频黄片 vod60视频 午夜福利十二点日本一本道 猪猪爱爱剧场 老湿机影院免费观看十分钟t 乱伦视频影院 速播影院在线观看 最新2019极品爆乳女神私人玩物VIP版 后λ视频 倫理在線視頻 哥干美女l2b feexx BT亚洲熟女在线播放 4455第四色 456电影在钱 97色色来在线观看视频 国产系医生护士搞在线 国产自操 含羞草成人短片在线观看 不用VIP的午夜 爆乳寡妇替欠债亡夫用身体肉偿 本道久在线综合8b网 彩乃奈奈中文字幕在线 被偷拍的女主播中文 国产手机福利人人干 上海性战3 在线啪啪拍视频 美利坚自拍偷拍 人与狗福利视频 磁力搜索~老狼 3D动漫番号 色妻视频观看 干老太体内射精視频 乱伦 激情 pp6s视频 天堂网_avmp4 苍木玛娜教师伦理电影 自拍白虎 东京热一本道av无码百度云 伦理片逍遥谷 小玉私拍视频在线播放 操女友视频在线 97国产早早 XO影院在线直播 44480影院 亚洲成人手机网站 江疏影流出视频种子 快播视视频在线观看 琪琪影院在线视频 play sss欧美完整版 佐伯雪莱 福利视频在线 [无码中文]有m感的苗条美人~做 成人街射你视频 更好看的黄色毛片 楼梯小姐在线观看 佐伯奈奈合集磁力 色妞ppp 裸舞在线网站 伦理片天堂eeuss电影 美国人与兽性生活手机版 论理小视频线观看 毛片黄色午夜啪啪啪 伦理电影自拍福利 少妇的福利 乱交在线视频 毛毛比较多身材不错肤白美乳 卵蛋guf 色喇叭色大香蕉 色姑娘棕色姑娘综合站 毛片免费强奸 极品魔鬼身材女神被满身毛 青山菜菜iv 极品色婷婷影院 激情五月丁香婷婷人人 网络色色Av新片 福利视频午夜小说自拍 偷拍,自拍在线 舒服抚摸揉捏蓓蕾舔阴蒂图片 小岛南ZAIXIAN 五月天婷图片大全 美国伦理电影哥迅雷下载 下载 雷颖菲qq空间 日本捆绑调教 强奸乱伦影音先锋影片 暗怕棚户区小姐卖b视频 暴奸秘书电影 明日花绮罗cos嘉米 连体袜系列番号 我要打飞 机com2019 日本语性别视频 PornhubGav 导航地址发布 lunli 91苏州模特 人妻生活前篇 sigua555 91蛋叔奔驰第二部 日本成人av电影 黄图男人丁丁一进一出真人视频 欧美曰韩A视频 黄片无码网止 欧美H资源 黑丝袜美女和帅哥啪啪啪视频 朋友推荐县城保健会所新来的小媚技术不错要提前几天才能预约到720p高清 皇网无码 棚户区站街女暗拍洗脚准备开草门被踹开隔壁一对完事的要过来观摩妹子被吓坏了 黑人大鸡吧插逼啪啪啪视频 欧洲无码中字bt 猪肉佬小树林战野鸡视频 韩国1024手机在线播放 肛交视频免费性交 母孑性交 在线观看伦理国产自拍 内外双射激情片段合集 176大长腿野模空乘制服各种性感丝袜情趣大胆私拍2V视频 射影师糟蹋模特BB用扒皮的 韩国三级黄色伦理视频在线免费观看 蜜av 色播五月亚洲综合网站 - 百度 SIRO-3203 thunder AV在线论坛 有哪些口味比较轻的av 娇喘视频激情影院 玉洁全身推油视频 日本岛国中文字幕网站 小美女美乳跳绳 H番动漫在线观看粉鲍鱼 汉庭酒店叫骚 星野明 magnet 春药 国产 magnet 韩国车震视频大全爱奇艺 欧美尻屄视频 菜菜爱电影院 老头操逼免费视频 男人插88嫂骚视频女人9 木村夏菜子无码视频在线观看 国产叶美视频 国模无圣光写真线视频 国产主播自拍磁力链接bt种子下载 内裤哥郭静在线 新视觉影l院p7 二级黄片在线观看 神马你懂的的视频 迷奸超级美女视频迅雷磁力链接 神马影院福利视频88 YY4480阿婴免费观看 chunsetangchao 91boss宝马肉丝 在线 探路者 秘婷婷 欧美激情另类重口 yyyfuli 3Pvideo 桔子影院jm2222午夜 熊猫娜娜龙虾视频下载 wwweeeem AV怡红院 色蒲团 广州柳州莫青视频在线 色妞香蕉 www路52dvd路com aaaa555 在线Av800 在线观看亚洲偷拍视频 10 风吟鸟唱在线 域名升级 ffrrr 欣赏女人阴户图像视频 免费黄视频在线观看 凹凸视频线观看免费 肇庆白沙公园野战视频 chuangshangpapashiping 老头干处女体内射精视频 禁止的爱小第九影院 操狗bi 少女狠狠扣p撸 两性做爱高清写真 19p 优佳人体艺术摄影 蓝光wuma 色詀 优酷里面的丝袜诱惑花心男叫什么名字 澳圳性爱 经典三级1页电影 沦理片在线网 苍井空人人体 中国性交比赛图片 欧美午夜大胆人体艺术 操逼五月天欧美妈妈8888 那里有女人阴道艺术图片 日本人体艺术小穴图片 1级爿快播 轻舔丝袜 日本成人黄色动漫 干妈妈色区 超淫荡粗口脏话自拍在线播放 父女做爱电影快播 大奶子黑丝qovd 日本插逼激情 小说成人母子 喜欢给男人撸鸡鸡的女人qq号码 91四房播播 老熟女家庭乱伦a片 求在线直播黄色网址 很很 se 干90后丝袜女 舔骚逼网 成人视频包射网 人体艺术epub www66riricom 藤冲有关的电视剧 回家被哥哥强奸 最新黄色游戏 日本人体艺术手机图 zuoaitupianquanlou 日本女孩小嫩穴摄影 三八人体图片基地 狗狗巨乳美女裸体人体艺术 马六大胆美鲍人体 免费av女同姓恋视频 用影音先锋看的香港台湾成人网站 mama231 求一个可以用吉吉播放器看的网站 qingsexiaos 幼女艺术体操 每晚小姨骗我上床 日韩成人学生妹无码电影吉吉影音 宫藤新一的性福生活 黑人大吊快播av 天然大奶美女被操 dy东京热 幼群交快播 美女拨开小穴大胆照 我把岳母操的狂叫 亚洲图片小说网 关于鸡巴的故事 熟逼图片 密桃子成熟33gp 亚洲色图小肉穴 野战春色视频 拳宗不知火舞公园夜战 pingse论坛 涩情网站网中文字幕 五月天 va999资源网 美女美臀美穴艺术 女人粉嫩屄全图 欧美视频色七七影院 恋之欲室 百度云 泰国美女美穴图 wwwre999com 幼女海滩性爱 影音先锋 日本人体艺术绿色 最新日本无码av在线观看 连裤袜慧姐小说 女同性爱技巧淫淫网 大鸡吧肏屄里了 kk色色网 孕妇乱伦影视 nnn91色欲影视 看明星裸体 少女激情性爱图片 欧美裸体美女肏屄图 三级伦理艺术片 情电影52521 视频 WWW_850QQ_COM 屄【p】 2012rrcom 波多野结衣被射精图 WWW_778AAA_COM 欧美乱伦老肥胖女人df 美女列车伦理电影 李宗瑞那部好看 西西力人体艺术 干漂亮小媳妇 成人亚洲快播 奇米re666 最新先锋强奸乱伦 捆绑阴茎虐待刑法 干黑袜丝女乳交 日本男人干欧美女孩 国模巴拉拉大胆人体艺术图片 后庭教程 我和嫂子的做爱故事 波霸电影 日本杨幂种子 插淫逼图片 淫女色文 家庭乱伦网址 乱伦强奸偷么看 乱伦性爱无码中文字幕 亚洲sse色图 WWW_LUO999_COM 08人体艺术网 骚妇掰屁股p 影音先锋梁祝艳谈网站 WWW_VIPKUAIBO_COM 欧美逼毛 骚屄浪奶 要干a片网 黑人操妇女 沈阳淘乐新天地影城 3ipad 魅影小说 玄关狭长 山海传说 脱肛吃什么药 激情另类套图 超极度性感日本靓女人体 13日本大胆人体艺术 迅雷下载a片的网站 看人与狗性交的网站 nvyinshengzhiqi 张筱雨魅惑爱人体 chengrendianyingguankan 粉嫩小骚屄屄 继母爱图片 女人爱操逼怎么办 狠狠影院下载 爱爱jj发综合网 骚妇被操出白浆 蛇妖美女人体艺术 茜木铃 女人为出名用一层纱来遮挡身体 99bt核工厂成人 小说享受泰国浴 绝色骚货浴室自拍 为岳母舔阴 大月日本美少妇人体艺术 激情撸色天天草 35人体艺术图片 搡大白逼 林心如脱光衣服做爱视频 操操淫乱穴 色狼和丝袜妈妈 日本男幼影片种子 WWW_AAA_COML 性爱白色丝袜 及度强奸 蝴蝶色播 色哥撸成人xiazai 人体艺体术网 美国大尺度阴道摄影 兽交高清下载 色网站怎么都上不去了 漂亮女大学生在学校里被黑人学生干了的性爱文章 人体艺术草 乡村淫汉 我日了教师图片 挠脚心的小说 刘涛三级影音先锋 水树玉高清图 欧美丝袜svs视频 亚洲色图入江纱绫 成人性教育漫画图片 草小学妹 寂寞少妇极品美鲍人体艺术图片 人体艺术qvodthunderftp 色b姐 丝袜熟女人妻电影 WWW_12SE_COM 最新情路扣扣对话 俄罗斯大吊qvod 尻妣视频 王陆晴西西人体艺术图 菌の黑汁 乡下老夫妻扫墓坟前做爱高清偷拍 大便chaodongtaitupian 阴茎插入女人阴道文章 各大影院网站 rtys照片 WWWAA66ZZCOM 岳阳县荣家湾东风路的妓院打炮要好多钱 贺媳英 中学屄吧 dabimn 最新激情黄色图片小说网站 好色女成人网在线视频 偷拍熟女露鲍 国外天体海滩视频 鸡吧上起个火结子 av幼女种子 中国熟妇性交 日本哪个是白虎女优 熟女视频在线视频 自拍偷拍女女 和黑丝女老师做爱中文字幕 嫁去国外的淫荡少妇被阿根廷老外操高潮 人体艺术图片之舔阴艺术 骚妹妹蝴蝶色色成人网 jioingwuyue 日本美臀片 丝袜乖乖美女 70路熟女交尾 狗和人做爱的卡通 清纯唯美789 视频偷拍逼 美国性爱俱乐部 看老婆和别人做爱 陵辱2穴人生初中出快播 最大胆的摄影艺术 大自由门 深液操大逼 美女的色穴18p WWW78WWW38BOBOCOM 红苹果56女生视频90后 吕婉柔李宗瑞 天天干夜撸 影音先锋高清五十路 欧美成人色图片 肉色丝袜脚超清 狼国色人体 西西大胆激情视频艺术 h级爿 阴就插入小穴 无吗bt种子 三奷乱里五月 巩国兰穿花衣图片 性感女妺妹 强奸性感教师图片 淫色姐姐激情电影 caoporn用什么视频播放器 我用黄瓜套套插自己 性吧sex自拍偷拍 少女少妇幼女性爱 幼女强势进入 欧洲女人体局部高清 老农夫不准打灰机电影 美女图片b照 第一色房 宝玉冒雨回到怡红院 操穴骚穴骚屄插入 丰乳先锋影音 欧美裸体熟妇 五月天大胆美女人体 十次啦亚洲av 五月母子乱论小说 性感白屄人体 欧美孕妇裸体写真 骚穴内射骚逼 山田麻衣子电影么名字 新婚处女儿媳柔佳雅君 妹妹的小穴p 朴妮唛做爱动态图 杠交美女被干 加勒比女海盗torrent 丝袜美女被插插视频 五月天激情网迅雷下载 有动漫色图的网页 l浪起来色色综合 可以直接看黄色电影的网站 爱人体静雨 av网站求给地址李毅 银河护卫队2天天影院 妹妹的da骚逼 黄色8090视频 狠狠射专区 狠狠搜美女 裸女巨乳骚穴大图 人妻凌辱图 强奸熟母 色淫网撸撸 人与人性行为大全搜狗影视 WWW12GAOCOM 欧美大屁股黑珍珠 妹妹骑日 女马交配 色姐操逼网 东南亚少女10p muziluanlei 美丽人妻熟女爱爱图 能看见美女黑洞图片逼 撙士15p 人与狗熊交配 与外国男人激情性爱 台湾大禾丽 成人世界李宗瑞 少妇乱交30p WWW32ZTCOM 快播无码亚洲电影网 小泽玛利亚裸阴 footjobjanpenese足 内容有学生的av网站 风骚美女穿脱丝袜全过程 亚洲色图校园春色激情小说五月婷婷 干死日日b 2015最新操 激情淫乱色网站 清蒸花凤琴系列 亚洲色狼网友 av亚洲天堂网20l7 色喜大胆人体 都市武侠古典校园 亚洲请色音影先锋 成人网站有声 同性伦理聚合 swww99aaww 全国最大的日b网站 久热巨乳裸女 超碰少妇的诱惑 北京人体艺术网 北川瞳人体 东京地下女子影音先锋 熟女人妻变态另类手机在线 三个妻子的污漫画 小骚妻肉便器 步兵爱情电影院 春暖花开大香焦av在线 淫荡骚岳母色图 欧美色图男女乱伦 哪个网站能看到大阴茎 快播日韩av插件 成人欧美第一页在线伦理 浪b网 电驴插嫩逼逼 kkyyzssmagnet 快播骚岳母 印度av无弹影院 毒蛇av影院青 2017成人电影云播放 gay黄网 色波小说 萝莉社区luoli85 儿童爱爱网站 私爱阁AV747com 厕拍在哪搜 乱伦强奸小说吸奶 口交网撸很很撸很干www78p78info 狠撸欧美嫩逼 性吧电台网址 930影城色色影城 肉叉烧包洪金宝 日日干夜夜射天天啪365ahnet 猎男别动队在线 婷色艺术 sese97快播成人电影片 撸淫乱a9av7comwww1kkkkkcomwwwaaa366com 日本做爱大胆人体艺术 16p人与狗 淫乱绝世唐门 老公操死我嗷嗷叫 国产老人做爱在线播放 wwwzz姐姐 大学生做爱偷拍自拍在线小视频 三季带片 近亲分类影片 动漫AV中文字幕迅雷下载链接 狗日女人的真爽好大好舒服小说 刘安琪三级无码 苍井空潦草av片 美女乱轮小说 偷拍自拍欧美色图另类图片萝莉幼女 扩阴器多少钱一个 涩情成人免费播放器 美女人大胆性交猛图 深爱激情四房播 日本片偷拍两儿子和继母一起洗澡 23p啊啊哦哦用力快点 国产调教师 幼爱uu插图 狐狸成人电影 超碰视频con操逼www310zycom 林由奈电影在线手机 b13区2百度影音 超碰链接 桃源AV 射逼逼网 激情五淫激情ssj0comwww2wwwwwcom 校园春色淫荡人妻幼交 快插玩 成人动man 快播初美理音 小学生偷拍妈妈洗澡 xn漫画 宅男福利影院改叫什么了 操死女人逼 无毒成人网址中文字幕 超碰在线巨乳专区 欧美重口味人兽性交 邻家阿姨叫我添她下面 gav无播放器成人网 日日撸百度 婷婷成人网成人网站 中年妇女性爱激情图片 美白丈母娘乱伦 狂操公主嫩穴 欧美非主流性交 亚洲美女色诱图 澳门威尼斯人去去妹 性爱自拍色图片 父亲替女儿解决性 大鸡吧插嫩逼小说 色欲色撸 哪里看欧美乱伦 舔大学美脚微博 久久日在线观看免费923yycom 工口h漫画虐杀桃花岛 羌女阴部大全美16P性爱图片 妻孑的深喉感觉 五月少女艳情大奶妹 果敢成人激情网多多影音 狂插护士的大鸡巴 mCC色色白虎逼图片 www992ZyZC0m资源 超级明星大淫乱 共妻小洁哥去射 抠逼叫床 超蹦公开在线直播 在线视频偷拍自拍情侣丝袜欧美色图 哥哥色受美利坚合众国 东方4V伊甸园 guomoHD 狠狠啕蝶谷 三级黄色添下体 操射有声小说 wwwxxx人妖谢精 中文字幕风间儿子 zhaixiankanhuangpian www03meicon 高个三级片看看 六哥影视登陆 五月婷婷狼 louxuetu 一本道有码a片 性色图在线视频 大鸡巴操小屁眼 第一成人基地 丰满嫂子五月天 cengrenjiqingxingai 明星裸艺术 欧美色惰图片 wwwsusu62som 成人激情无限综合网 色哥看AⅤ 亚洲偷拍肉丝美女 99久久免费热在线精品动漫 哈起吗伦理 狂插空姐淫穴 靠比真人版 狠狠搞视频在线 5355ddcou 大香蕉亚州色图 亚洲图片自拍偷拍日韩伦理 狠狠插影院 亚洲标清成人在线动漫电影 av毛片无码片 韩国成人在线视频观看 无毛人体艺术照片 偷拍窥拍888 童话村av 美女性交欧美在线视频 国内成人偷拍电影院 sA片 艳舞性爱片 免费的黄色网站0 黄san 另类小说52AVav 超碰厕所偷拍在线 哥哥撸妈妈 牛牛碰免费啪啪视频 黄色资源最新地址 【vaaainfo】 骚穴看看 激情网址五月天 狠狠cao在线视频观看 大嫂撸 黄色图片观看 宅男色影视gggg69 先锋资源玖玖爱草第一页 夕草在绕资源站 汽车之家 处女一级做爱片 能看调教图片的网站 瑶瑶美鲍 中国美女外阴裸露 成人影院操P 国产av高清自拍 国产小妖精自慰视频 偷拍自拍区台妹 884aacn 哥哥撸xxx 漫画人体小穴 翁媳操逼乱伦 色哥我日女儿 巨乳丝袜操逼 3七tp人体摄影艺术网 五月天四房间播播电影 露b色图 撸撸射操逼电影 男女交配高清视频直l播频直播 A片套图 暴力虐待亚洲色图 234XXXX 卡通图片美腿丝袜亚洲色图 淫淫插插插玩穴 中文字幕黄色电影网谁知道 爱液操大鸡巴 wwwpp398comVR 儿子日妈妈阴道 动漫鬼作 WWW77baocom 3366mp3com 丝袜骚妇影音先锋 huangsecaoxue mmm9ckanzycom 天天射综合网偷拍自拍 第四色婷婷奇米影视 a片资源免费吧 大爷操作影院388sesecom 亚州欧美另类专 欧美双飞在线视频 亚洲处女网 草榴掰阴偷拍自拍 手机看片亚洲第一色 激情性爱小说网亚洲色图 曹颖三级照片快播 超频视频第一页 欧美久草色 成人套图黄 黄片日本magnet 美国十次博客 激情骚妇15p 优果网电影在线观看 大鸡巴操逼真人版的使劲操色色影院 japanfreevideoshome国产 欧美偷拍自拍偷窥 成年人五月天b网 美乳少妇尽情享受抽插的快感 幼女蜜穴女儿 学生妹被强奸免费在线看 一部女生被插jj的完整黄片 女儿浪叫 澉情五月网vv99vvcom 嗯啊不要 操逼声音 wwwpu311commbdbaiducomfifjpzeoycn 淫荡少妇被轮奸 卡通动漫淫 0088aaa上女朋友的闺蜜 x77135com 无极影院美腿丝袜 法国极品在线看 欧美色图lav 趁着儿子不在家让媳妇为自己服务下7M视频网网罗成人在线视频精品资源 人妻丝袜中出 www980 caobiwangseqiqi 骚老湿av 巨乳美女的奶水 光腚女人 迪丽热巴小穴 精品套图奇米影视 850黄色网站人与兽交配视频 移动成人你射精 成人看片自慰免费视频在线观看视频 伊人网伊人影院在线 后入女优P 午夜免费频道最新最热 www色comwww821kxwcom 霸上留守村妇 青青草有声 夫妻调教女奴 wwwfuliqq wwwliwu077com 免费的黄色电影 云插 慰安妇真实无码图片 日本妈妈的淫荡图 黄色乱伦电影av 澳门金沙动漫成人av 手机看片1024国内甚地 熟人妻网 大色网站av www944ffcomcn 我爱撸撸网 WWWavtb789com 我爱人体艺术图wwwwoairenticom 美腿丝袜迅雷下载 亚洲欧洲校园另类心灵捕手 rbd565在线HD www969ppcom百度 91自拍za 好色上美ol 热带夜手机在线播放 色色在线综合网站 第章熟女双飞 怡红院首页4000hhcom 香瓜妹最新地址 岛国A片免费 成人电影插插插 日本美女色穴图片 家庭乱世小说txt图片 日本色虎网 美子与公猪杂交产子 母子乱伦强奸小姨子 丁香五月小说网 欧州亚州偷拍图片 欲淫强奸亚洲激情 亚洲白虎B图集 俺去射成人网 大黑驴冰冰小说 使劲操骚逼 haole56789 大秀天堂下载 天天影视手机版 美女拷臂动态图 freehmovie动漫 熟女露脸激情自拍 成人激情图片,电影mmmnn7777 换母俱乐部 野人性交电影 geyesecn 失踪的小美幼完全版小说 japanyellowmovie 亚洲最大的成人网站wwwahhqgovcn 欧美吧夫妻 88coco最新网址 93年身材纤细妹妹抱着操才爽 情sei小说 柳岩操逼视频 教师夫妻的交换 美女光定高清图片 htppdddke9pw 内射翘臀少妇视频 韩国操逼怎么叫 推女郎青青草 成人A片小说 搜索女同人体 亚洲人体100 日本少女性交射精视频 葡京热任我鲁免费视频www25popocom 图片区我x要x你xx 韩国黄色的三级片 午夜成人性交生活 越南妹子多少钱玩一次 日本少女激情电影兽欲 最新乱伦比较黄的肉文 av调教视频在线观看 都市激情8899 caopron在线大香蕉 淫乐公馆 泷泽萝拉超碰在线 淫男乱女小说 日女人B洞小说 www点sesev点 3344VB 天堂avtt2017手机 黄色成人快播器 不用播放器观看成人电影网站 潢色片电彰 色7xavcom 你懂的zoos 美女撸撸视频插逼 请君撸angelababy 千人斩萝莉 韩国女主播黑丝叉叉 在线免费观看优色 在线巨乳美女视频网站 丝袜美腿居家熟妇 偷偷盗拍 泰国色哥 cheng成人动画 制服女人的性器官 色色偷动漫 强奸乱伦影音先锋第12页 自慰喷潮在线播放 先锋资源www7xfzy 在线有码1页 亚洲伦理在线无码电影 色色网老年裸体 在电影院偷情舔逼 小明看看黄色色 坏孩子A片番号 幼女的世界 开心四房快播 色厕所偷拍p 鼓楼色你懂得 欧美性交视频AV在线 最好看十大无码AV 一本道协和电影 成人激情12P 童交hentai 激情山村 肉感爆乳妈妈 偷拍自拍实拍 看图秘密app 影音先锋制服丝袜偷拍 东京热图片站 免费的av小电影网站 www路tu550 xxx苍井空黄片 老师插俱乐部 v色成人影院热热色 类似ked9的网站 猛操侄女的骚逼 之美丽人妖空姐黄色另类性乐趣 肉欲女医生 男人资源高清无码 WWW_WWUUSSS_COM 哪里看av影片 色妹妹25 偷拍学生妹自拍走光露穴毛 李宗瑞种子下载谁有 欧美性在线人3 外国人大屄大奶 地下歌舞团黑酒吧演出 猛男以超快速度不间断最后干的女友高潮长叫一声 操逼对人体有哪些好处 日韩爱情电影快播 色亚洲吉吉 做爱好图片 大胆时装秀千千影院 都市激情 综合网站 爷爷孙女性爱乱伦 美女动态图片都不穿 月亮女孩人体 抗日红杏夜色贵族 写真个人 张婉婉做爱白浆都操出来了 亚洲爽图馒头b 西西人体给力人体网 知性 激情五月成人 操逼图片 美女图片 国产三级伦理电影 美女老师操逼 淫妻小说日本做爱 99大胆人艺体图片 骚骚妈妈萧楠小说 欧美熟女乱伦15p 男友是黑人阴茎太大 女性人体艺术成人用品 色五网迅雷下载 哪里能看撸片 肏屄露屄图 色擦擦色图 成人 南宁极品美女 欧美成人在线视频无需播放器 蜜桃成熟 骚货 在百度种输那几个英文字母可以看裸照 异地恋对象各种勾搭怎么办 熟成人电影 韩国美女护士人体艺术 最新乱伦强奸迷奸小说网 小泉真希 美鲍 人体艺术图片搞鸡 www骚碰 女主播琴雨全集 11岁美女巨乳图片 幼女的资源第1页 古田美穗亚洲电影 好色妻降临 快播 欧美动物av sm性图片 穿着网袜人体艺术 淫荡老姨妈和我乱伦 外国的性交视频a 人妖乱伦强奸电影 同色电影网 自拍屄特写 日本美女兽交 第一会所骚穴 美美奶子裸体照 强奸理乱伦 毛片短视频 骚货护士图片 和妈妈玩脱衣游戏 乱伦小说 屄1图片 人妻1953 国产操逼片 人与曽肏屄播放 操自己女儿的逼小说 人体艺术a4u套图 偷拍工公园男女激情图 caodapigu 操大屁股女人 女生宿舍偷拍性爱 暴风影音偷拍自拍36ccc 对操图片 成人小说视影 欧美女王另类调教视频 性交生殖器动感观 qvod 女儿的奶水 亚洲色女露逼全裸图片 美女裸照种子 国模人体艺术大全 屄逼肉 高清视频成人写真 吉吉影音幼女片地址 八少女大胆裸体照片 女厕 露脸 成人捣逼 拳交 兽交 重口 日本少妇私处图 h狠狠搜 女人白虎屄 人和鬼做爱 父女做爱的自述 94蜜桃色图片小说 自拍偷拍激情艳照 偷拍自拍撸撸色明星陈慧琳 成人动漫电影小说 亚洲激色图 越狱第二季高清下载 太原回收冬虫夏草 心理学与生活下载 禧阁古装 感知农场 北京公交车线路 艾灸视频 WWWWWJOUJIZZCOM WWWWXRBCOM 爸爸鸡巴插我屄里教我做 日本性虐待漫画 透明裤衩美女看见屄开口丝袜 岛国肉片在线看 美女裸模劈腿露阴毛照 色色公公与好儿媳 美国人家庭性爱乱伦春暖花开 黑人体艺 www亚洲色图com 童话村徐锦江 池田小可ed2k 美女操干 这老外在泰国专干孕妇 插你妹仓木麻衣 金发空姐性交 色老头色图 黄色乱伦性奴小说 国产群交视频 7788sesewang 为什么男人都色总摸我 朴妮唛没马图片 臭逼成人网 大屁股淫妇也疯狂 WWWQL028COM 空中剧场相中xian 长相超赞的欧美白发天使女郎床上大胆人体 我和小姐乱伦 567pm 兽交影片先锋 美女毛片a 日本熟女人妻黄色网站 3级激情小说 在线美女成人电影 大肉棒插新娘小穴免费小说 四房播播成人网 WWWMEIZYWCOM 毛毛逼网 形形色色六月天 亚洲淑女老妈视频 小说激情的少妇和狗 亚洲av人与兽 成人电泓网 淫淫网色吧26uuu 日屄找谁 苍井空绿色大战 正在播放幼岁交快播 wuyuetdvd 由赖心美 小任的调教 乱伦大鸡吧操逼故事 欧美专区在线 和女仆干真爽电影 裸体体艺术 脚插入美女的小穴 肏赤峰情人屄 人体写真阴道i 内射妈妈乱伦电影 风暴成人网站 f05bbd3e00007510 口述女人操逼 影音色中色成人人影院 成年骚女人 孕妇阴外艺术 快播强奸少女小说 操闺女逼小说 422sss 人体艺术夏冰百度 小早川玲子诱惑美腿教师影音先锋 春暖花开性吧有你亚洲无码视频 成人在线专区 wagasetu 禁片人与动物 寻找日本乱伦家庭黄色小说 屌配屄毛 偷拍自拍东方色图 美女做热爱性交口交 qisedaohangchengrenwang 柯南zonghewang 明星美图视频 小说骚女骆白 av音影先锋 黑人空姐种子 内射中出肏屄 口交口爆性爱 rentiyshu 嫩逼会所 哪里有欧美高清性感图啊 人体图艺术片大全 人体淫秽性交色图 加山なつこ无码流出 李宗瑞性侵视频全集久久 三级色黄色片图片 菲律宾三级片 日韩女同色图 四房快播狂插美女 av男人电影天堂dg286com 哪里有阿娇种子 有免费的操逼视频吗 美女写真内射 西瓜影院图片图库 快播少女裸体艺术表演 如月教师快播 操屄小说视频 蒙古女人的性欲故事 本地偷拍自拍 女人黑木耳wwwgzjnetcom 欧美av美图天堂网 少女小骚逼照片 农夫新导航不准打灰机 苍井空AV全集在线播放一本道东京热 24报偷拍自拍 换妻母子 美国一级毛带基地d 樱花族luntan 空姐干爹 解梦淫妻网 妹妹爱液横流 色婷色婷婷五月丁香 曰本少女曰夜射 熟女乱入10p 欧美图片日韩自拍偷拍 亚洲性l大爷视频av 美国大片操 妹妹主播 淫乱熟女艺术 cctuo wwwAVKUTV 干少女肥屁股小说 古装电影日逼 白虎美女色区 幼幼片微信群 家庭乱伦综合 无码免费中文字幕wwwhhxxoo1com 哪里能看最新东京热 抽插揉捏少妇小梅 欧美阿v女星播放 18岁以下禁止视频myoukucom 伦理片和姐姐野战 2017港台三级最新网站 快播成人中文字幕 插姐姐奶 18禁图片干比 www撸撸射亚洲人 操插瘤护e?1?7?1?7流水 wwwbaiducomwwwbbb077com 公公公公操操媳妇嫩b 桃花宝典极夜著豆瓜网 厕所里的肉肉 激烈抽插漂亮大奶妹 先锋影音av撸色 疯airav安卓 黑鲍老女人 13岁人休艺术图片 chengrenxingjiaoba 韩国玫瑰主播 邪恶帝国肉番全彩变态 插了进去妈妈a片 处女人体艺术阴部下体 在线点播长电影 wwwcaoppp9com 群p门 撸一撸幼女性交视频 少妇的qq或微信 外国姨蕾丝水 老阿姨包吹www91qq1com 美乳诱惑美女 撸一撸强奸乱伦电影 日本大奶大屁股电影 成人小说sis 舔阴猛人网站 色尼姑全亚洲 好屌干qk青娱乐 下载邪恶姐弟小说 谁知道色五月网址 美国黄色pnt miaomixia 青草快播全集 大咪咪色图网 龙骧亚洲色图美腿丝 男人插美女护士私处视频 男主播飞机自拍 pengchao 黄色一本道a片 大奶子干妈给撸着鸡巴 网页搜索午夜大片 坠落女友九九 wwwhaorenshuoc 台湾明星teresa 女厕所系列网站 极品美足猫色网19 插妈妹妹综合 h人妻女友短篇小说 农村少妇裸体写真艺术图 色播五月天 开心网 有声小说叫床 有声小说神医 最春色小说 大陆春色 樱井莉亚dvd 小泽玛利亚紫色 波多野结衣图片 求火影h网 无毒无弹窗h网 开心播播网日韩五月天 东京热天使 东京热0108 东京热jpgfs2you 快播酒色成人网 安也去也酒色网 9492酒色网 波野结衣av影音先锋 悦来客栈 采色区谁有E 插骚逼电影 屋屋色影视 小骚女影视 AV色站导航 开心激情影视 你淫我射电影 人间风月影院 人来色成人网 色JJ电影网 性乐汇色高清 淫荡AV美女 高清无缓冲影院 赤裸宫殿谁有E谁有G 美妇骚穴成人电影 法证先锋2 日日夜夜 葡萄干 公开caoporn 新农夫 色之综合 免费无码不卡动漫 音影先锋 2019 色色资源 唐人电影1号站 偷拍影院东京热日本 无码中字 人妻中字 强奸中字 闷骚欧美在线影院 谷露影院日韩 蜜Av 性漫画在线免费观看 magnet 蓝色导航地址雅虎 美女ppp小黄视频大全 76,kkkk,com 色五月综合缴猜 4438x打不开换什么 古墓丽影香奈儿在线观看下载链接 天天一鲁 gay pornhub video chitu 日本大尺度黄片视频网址 中出视频456 四虎在线影院 magnet 秋山雫视频写真 性生活抽插视频播放 拳交的美女裸体视频 晓晓影视av 秋霞伦理电影网中文板 犬交福利 邪恶e漫画口供无遮挡了3d 日人人555 日本三级高清视频 影音先锋在线视频 与洋妞大羊女做爰的免费视频 日日啪夜夜爽天天干2017 樱井步 骑乘 玉桃园毛片 日本午夜成人一本道 日本性虐电影百度云 656影视 美女的下面怎么长黑 天昊影院理论片 在线的午夜成人av影院 フェラハメりっぷす-01分 美女主播菲菲福利视频 小蛮腰xxmmyy 视频全集 avhome 黄瓜视频福利地址 狼人在线播放视频中文 韩国vip福利在线播放 大型AV 日韩高清av在线 亚洲 小明看看 神马电影dy888午夜4k4k 欧美色女郎 4438怎么播放不了 老鸭窝移动网站 天海翼秘密女捜査官协和影视 心心影院 福利 京香人妻动漫 驾照家教轮流操爆20女学生 av2017手机版天堂网在线观看 国产主播热舞4000部在线视频 强奸少妇 magnet xxx|4性交视频 秀美白脚趾视频 大香 蕉伊人免费视频 西西国模吧 波多野结衣d∨d在线中文亚洲无码无码视频 乡下小学女生的性生活视频 模特被扒光 在线视频 啪啪免费国产视频 男奴舔美女高跟鞋视频 走光偷拍青青草免费视频 77777电影院院 少妇白洁有声小说 大牛电影福利电影 高清无码偷拍磁力链接 下载 色一色午夜夫妻影院 兄妹激情 曰本阿V无码 2fc夜色猫视频在线观看 ee亲 a片mp4午夜影院 灰丝少妇zaixian 邪恶少漫画大全4399漫画集 日本综艺节目在线78看 无码潮吹电影影音先锋 在线影音 素人搭讪开房!性交偷拍流出影像 1能不能看一看A片 成人小视频免费试看 青娱乐视频极品视觉盛宴 英国色色 卵蛋网MIDE 国产3龙2凤群p直播视频 395UaGG 亚洲不卡视频大全 青青草欧美做爱视频 白丝袜萝莉足交 四虎影院aV在线20l8 jj无码激情视频播放 免费做爱云户作小视频 国产社区在线自拍视频 偷亚洲在线视频观看 淫妻艳姨 玩弄吃乳头视频 午夜月光影院黄片 中文字慕大香蕉免费视频 A4U官网 冲田杏梨影手机在线 javbbus 老司机成人网站4388 福利女同视频在线 美里有纱影音先锋漂亮女教师 男恩妃南非黑人同志在一起做爱的片子 黑木耳福利 富二代在线福利視频 拔插在线公开 午夜影院av神马影院 费的韩国伦理片 超碰青娱乐导航在线 AV天堂5018 km302c0m www++t828++win 偷拍走光成人 图片 好国产自拍 色色色天堂 午夜电影伦理人与动物 朝鲜高清在线色视频 足控电影有哪些 aikoiijima caoporn原纱央莉 岛国三级磁力链接 magnet 西野翔 夫目前犯 正在播放 白石茉莉奈免费观看 猫味网站 极品呦呦集合 jjzzz欧美 铃原爱蜜莉电影下载 ftp 上原亚衣av片 26uuu亚洲电影最新电影网站 小明看看正版 caopron\ 长梓泽免费视频 等一次玩这么会喷潮的女人视频 金荷娜丝袜视频 gav成人不用下载 六点成人 www3131dd 静香的欲望漫画 香港成人夜色影 ai宅男影院 色爱热 鲁鲁狠狠在线影院 saoyi8 国产自拍视频崛起 电车痴汉 立花瑠莉 福利视频偷拍 大啪噜 大肥女视频@StopFuck 东方va免费进入免费观看视频 粉嫩欧妹 大波妹 福利 国模 视频 在线 大香蕉在緌人妻 xsm 影音先锋 大香蕉草逼视频 动漫伦理 璃莎 yuoijzz日本在线播放 日本高清hav 日本嫩泬插ji 韩国少妇丰乳翘臀视频 女主播魔仙迅雷 超爽影园 桃花园宅男视频 九哥操逼以 邪恶影院黄色 日本交尾无码 磁力链 下载 久久自拍视频在线观看 欧美骚逼视频 我和阿姨乱伦视频 四虎0202 在线aⅴ福利网 av小学生黄片 雅情会首页在线 4438x全国最大成年 本库子 正在播放喉奥 女捜査官波多野结衣mp4 东方成人正确网站 五月樱桃唇bd 自拍透拍五月 闫凤娇全套无码magnet eeuss快播影院手机在线观看 欧美成人凹凸视频播放 小仓优子露私处视频 有色视频 大学情侣自拍视频在线 xlyy100 厕所自拍偷拍超碰 国产自拍精品黑丝 男女日bb的视频播放器 影音先锋主播勾引 神马影院欧美无码 青青草免费导航在线视频 看着我的女友变淫荡 mp4 狂欲a片 一本道色戒 wpvr-108 先锋影音 国产白领,迅雷 magnet 【国产】漂亮華裔小美眉白老外大長屌插嘴十幾分鐘 射的滿臉都是点击播放【巨乳,重 九尾狐狸m视频在线种子 56popoc0m 莉莉影院在线啪啪视频 桃大桥未久在线 中学生嗳嗳网站 我女朋友视频最新地址 欧美俱乐部的视频 人人曹b 大尺度av vvvv999 无码高清av 996re在线中国偷拍视频 久热 操逼人兽com 中文字幕女优磁性连接 www502rr,com 国产高清情吕视屏网 波野多结衣护士是什么名字 米奇影视777在线视频 国产骚妇卡戴珊视频在线 石榴社区先锋在线视频 国产98G奶 制服下的名器丁雪倩 无码轮奸BT magnet 磁力扒 涩涩的网址 sssXXX欧美 天天曹天天插天天摸 日本好色妻 强奸乱伦zaixianguankan 番号水杯里面下药 饭冈加纳子在线播放 赵得三日张爱玲 免費高清視頻一色佬 午夜呃福利 妹子bb超粉嫩,绝对是个极品逼 灌肠欧美在线观看 在线Av,41saO,COm Tom天堂 四房播播婷婷电影网 舔着空姐的小穴 嗯嗯香港毛片 大贯杏里AV资源 WWW,XXBBmon 美国艳星taya 在线视频 欧美电影 xart 啪啪啪电影漫画 ssni141在线 思妍白衣小仙女被邻居强上 用什么搜索草榴 大香蕉亚洲人妻小说 莉哥不雅视频 好屏日视频53sao com 尼可基德曼三级 弱气乙女网盘文件 av淘宝2o19淘你喜欢 布兰迪爱 美女主播和炮友啪啪直播对白清晰 线国产幼偷拍视频100 小早川怜子和江波亮在线观看 小萝莉影院福利 先锋视频玖资源站 性爱直播磁力链接 小明成人在线漫画观看 性感空姐啪啪啪 香i巷黄色片 香奈儿·普雷斯顿级网站 性交ⅩxⅩ视频 b站可可味成人在线视频 国产在线fenbaoyu 女人乳环阴蒂环强奸 月夜影院av 一级黄色大香蕉片 制服四虎 汤不热流出极品白肤美粉嫩逼逼小 三级片免播放器 gav 欧美日一本道 - 百度 - 百度 - 百度 - 百度 3344fmcom欧美电影 超碰任你干免费在线 老司机色播影院普通用户 汤姆影院tam四虎影库 魔鬼身材七尺爆乳又大又白 亚洲 偷拍99ses 小明首发看看 正在播放真实强奸 完整 毛片捆绑束缚视频 宫交h灌满浓精 juy707 magnet 日月影视啪啪啪 二级黄片在线播放 香港按摩高清手机视频直播 pandra迅雷 免费下载A片的链接 女优做爱动态 日韩A片高清视频 AK第一精品福利资源导航 美人女教师的诱惑授业魅惑性技-里美 黄页连接免费福利视频 无尽另类在线视频 国产啪啪爱爱在线小视频 乡村寻艳王upu av搜搜福利 激情综合 西瓜影音 6688新视觉影院 狼窝窝影院高清视频 立花美凉资源在线播放 擼擼色綜合 土库影院 日本三级av论里2017 爆米花网性交 草草青视频在线中文字幕 app 仓井空系列种子磁力链接 被鸡巴干到出水的视频 草裙影视草裙社区主论坛福利社区午夜福利福利视频微拍福利福利电影福利导 国外XXX免费直播 猜人游戏在线播放影院 国外服务器手机看大片58天 啵啵视院 videoboy按摩 luobiyouyou 色色发宗合香蕉网 黄色日本三级片播放 av午夜网站 陈冠希钟欣桐视频磁力 国产成人综合4438 susu85网站改成什么了 宇都宫紫苑 在线电影 大贯杏里KDG一020 程x大人 死侍2在线观看莉莉影院 羔羊医生 magnet AV番号电影网 欧美番号 欲望保姆 AV新加坡资源 红涛阁av影院 蝌蚪窝在线视频观看午夜剧场 蝌蚪窝被封 2乱色 人工智能ai迪丽热巴在线播放 vedios SOD时间禁止器 爆乳无码出中出 magnet va中文字幕高清无码 成人aⅤ影视 v2ba萌白酱 苍井空在线精品视频 wwse560info 成人黄色自拍啪啪网 超级对碰视频在线观看 插下面的在线视频 成年亚洲免费手机视频 v ip eeusssvv 69saocom 嗯嗯轻点视频 美女自卫在线视频手机视频 国模黎萍超大尺度私拍 飘香影阁 女人视频av 亲娱乐 男人裸体黄色一级 身材很棒的大奶主播漏奶漏逼自慰开车 熟女福利电影 日本无码成人电影一本道 qkonzr87936 日本女人,淫荡视频 张紫妍磁力 美女训恋足奴会所 颜射大奶在线播放 先锋影音北条麻妃 亚洲偷拍91风月 日本东方aⅴ 天天影视色最新一色 李毅啪啪啪视频 戏精刘婷 在线 九哥操逼丨ㄥ 绿茶福利视频导航在线观看 54jb 在线小女破处性视频 www19rt 女教师 仙桃tv 天堂鸟影院av动漫 午夜成人在线直播 magnet 网红啪啪啪视频大全 韩国激情主播 AV美女女优性感宝贝视频 强奸洛天依视频 18r在线影院 最懂男人影院啪啪 丝袜少妇3p在线视频 av黄片免费网站 一本到道视频 卖来的女人迅雷下载 mp4 高老庄影院在线视频 在线视频直播 中文无码色视频 操空姐网站在线 韩国美女主播杰西卡视频 用嘴就能让你爽 被窝电影网酒店偷拍 肏我在线播放 波多野结衣丝袜福利视频 国产自拍女上位 苍井宫无码电影 韩国极品情侣家中 操逼爱奇艺 百度男人综合vA 色宗一本道 aotushipinzaixianguankan 狠狠胔大香蕉视频 午夜快成播 依依在线Aⅴ 情龟电影 闪电奇迹裸体 先锋国内口爆 范群侦上司 sex love ooxx 免费成人斤 九州AV免费成人 UUZIYUANWANG 播色屋a v久久 国语黄片a片 wwwchc2017av 牛牛免费视7755com 【开心五月】,深爱五月,大色窝,丁香五月,五月婷婷 立足于美利坚合众国鲁 外国兽交视频 董美香无码链接 magnet jiuboyinyuan 董美香在线中文字幕 日韩福利盒子拍拍拍 做爱无码磁力链接 mp4 无码区成人在线视频 啪啪秀自拍 A片 午夜影院 696人体 日韩新葡萄金无码视频 把96年白嫩美臀小情人带到宾馆肆意蹂躏穿衣服照样操 日本毛片一本道 视频 日本黄色群 激情邪恶大香蕉 伊人久久五十路 大桥未久 耻辱中出授业 三级香片 网红原味小辣椒VIP视频 www774jj 美脚をしゃぶり尽くす~ 梨花在线播放 色狼窝视频 色巨乳国产在线 强奸内射 在线观看 秋霞在线新纶 鸡鸡插bb的视频 极品网红女喝高了和粉丝啪啪 极品外围女模特拍摄时被2个摄影师勾引疯狂操 井上瞳在线播放 强吻小视频软件不用下载在线观看 三百元的性交动画 无码在线偷拍 四虎视频在线澳门皇冠 日本一级A片做爱片 足交鸣人漫画 3d里番动漫链接 小岛南ZAIXIAN 主播裸聊迅雷无码种子 8k 厄运小姐 免免福利视频 思思操干 神马影院1000合集 国产SM精品白富美富姐浴室玩弄漂亮女奴 伦奸学园磁力链接迅雷下载 magnet 绿巨人》AV版 正在草她老公打电话来一边草一边打 51pao 男人日女逼只流水 抠逼萝莉 欧美肥胖学生性交视频 好了Av成人免费视频 花果山福利视频区 碰碰播放器 女人屋福利视频免 花花公子在线视频 黄片国产免费的完整 黄色老人强奸美女抽插美女 欧美?iαeosαsexo孕妇 朋友推荐县城保健会所新来的小媚技术不错要提前几天才能预约到720p高清 梓由衣在线观看, 9200dy 日本最骚的波多野结衣 网友最新自拍在线狗添水 视频 日本一本道日韩欧 www92kkdycon 日本第一福利影院 曰本A片 日本福利影院500 先是激烈后是呆萌 迷恋为所欲为,看点很多。 非洲成年a片 俺去啦视频最新官网 酒井千波肛交 heshenshenzuoai 漏点福利视频 中川美铃在线伦理 孕妇番号 ftp 婷婷深爱五月视频在线观看 vk视频 骑女马 真崎航番号 色色免费在线综合视频 亚洲禽流氓冒险与绫 人人澡夜夜澡 AV高清AV天堂 今日新鲜事片毛片 长泽梓吃粪 完熟 av 卵蛋芽森滴 gvg 326在线观看 星球大战h剧场 麻仓优在线观看奇特影院 怡红院一大香蕉猫视频 红怡阁h jjzzkk 欲火难耐电影琪琪影院手机在线观看 日本av韩国av 种子A片 mvsd291樱木优希音在线 euss电影天堂2012 4438咱们看不了 9988xxav 白白色小明看看成人 情趣制服无码 mp4 偷拍视频毛片 无码插逼视频 色屌丝 欧美 视频 天天曰天天看操逼 熟妇乱伦在线播放 外交部长的娇妻的电影 soe878 亚洲一本道免费观看看 一本道第1页 在线人人妻福利免费视频播放 好看的亚洲无码。 伦理片福利国产短片 动漫啪啪网 国产自拍17啪啪啪 韩国盗窃撮全集视频 尼姑吧福利影视 尼玛影院伦理我不卡 男人桶女人阴口视频 国模王芳人体艺术套图 男女勃起抽插拔射视频 国内美女直播福利 国外无码ay免费视频 k8伦理剧情 男主拿鱼打女主,高宝宝 gvg448中文字幕 草榴影院 西瓜影音 澳门自拍偷拍视频 模特大尺度高清视频 香港伦理片抓色狼 not far 宅男免费福利视屏网址 另类综合性 日本性爱BBB视频 超碰人妻做爱视频 欧美激情另类重口 国产情侣激情视频自拍 丝袜美脚影视影院 84porn在线 黄图视屏高清免费观看网址 宫部凉花 福利 日本一本道在线无行v 成年区在线电影 wwwxo8xo8 初川南个人资源 自拍网5x社会最新 手机五月丁人网 a阿vvt天堂2014在线 tubicao 蓝尺润在线 妹纸你拍就拍被搞得跟贞子一样吓人 一本道久久日本视频v 动漫无码伦理片在线观看 四虎 小穴 日日批视频免费播放器收看 自拍视频内射 女明星漏三点视频磁力 性爱 在线视频 西西里高清模特艺术图 l撸就色 狂操护士15p 把鸡巴插入妈妈的阴道 草漂亮熟女 丁香五月色洛洛中文网 苏琪的人体写真 自拍老妇女操逼视频性爱 刘可颖被老外干快播截图 性感裸体美女性交图 撸撸色涩 苍井空湖南 插死骚屄妈妈 肏婶骚屄 迅雷在线草裙 短片无码mp4 黄色三级小说 人体艺术韩国高中女生 韩国比较色的剧 人妻色插 五月天电影人与狗 美女么自己鸡巴 日韩女优丝袜自卫 666大胆人体艺术 撸撸色色屄 农村骚丈母娘小说 88uuu影qvcd 东莞图片大合集下载 五月天婷婷快播 亚洲熟女淫色图 人体艺术波谷绘狗 少妇嫩逼性交图片 鼎美女朴妮唛狠狠插 跟老妈玩足交 极品白富美爆操15p 日幼发育12p 日日来插逼 想和你上床三邦车视 人体艺术电影在线看 淫荡乱季 大姨和妈妈乱交