亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? memtableeh.pas

?? ehlib31控件包
?? PAS
?? 第 1 頁 / 共 5 頁
字號:
{*******************************************************}
{                                                       }
{                     EhLib vX.X                        }
{                                                       }
{            TMemTableEh component (Build 4)            }
{                                                       }
{      Copyright (c) 2003 by Dmitry V. Bolshakov        }
{                                                       }
{*******************************************************}

unit MemTableEh;

{$I EHLIB.INC}

interface

uses Windows, SysUtils, Classes, Controls, DB,
{$IFDEF EH_LIB_6} Variants, {$ENDIF}
{$IFDEF EH_LIB_5} Contnrs, {$ENDIF}
  ToolCtrlsEh, DBCommon;

type

  TCustomMemTableEh = class;

  TRecDataValues = array of Variant;
  PRecValues = ^TRecDataValues;

  TMemBlobData = string;
  TMemoryRecordEh = class;
  TLoadMode = (lmCopy, lmAppend);
  TCompareRecords = function (Item1, Item2: PRecValues): Integer of object;

  TRecordsListEh = class;

  TRecordsListNotification =
    (rlnRecAddedEh, rlnRecChangedEh, rlnRecDeletedEh, rlnListChangedEh,
     rlnRecMarkedForDelEh);

  TRecordsListNotificatorDataEventEh =
    procedure (MemRec: TMemoryRecordEh; Index: Integer; Action: TRecordsListNotification) of object;

  TRecIdEh = LongWord;

{ TMemoryRecordEh }

  TMemoryRecordEh = class(TPersistent)
  private
    FChangeCount: Integer;
    FChanged: Boolean;
    FData: PRecValues;
    FMemoryData: TCustomMemTableEh;
    FOldData: PRecValues;
    FRecordsList: TRecordsListEh;
    FTmpOldRecValue: PRecValues;
    FUpdateIndex: Integer;
    FUpdateStatus: TUpdateStatus;
    FID: TRecIdEh;
    function GetAttached: Boolean;
    function GetIndex: Integer;
    procedure SetUpdateStatus(const Value: TUpdateStatus);
  protected
    procedure SetIndex(Value: Integer);
  public
    constructor Create(MemoryData: TCustomMemTableEh); reintroduce; overload;
    destructor Destroy; override;
    procedure BeginEdit;
    procedure EndEdit(Changed: Boolean);
    procedure MergeChanges;
    procedure RevertRecord;
    procedure RefreshRecord(RecValues: TRecDataValues);
    property Attached: Boolean read GetAttached;
    property Data: PRecValues read FData;
    property Index: Integer read GetIndex write SetIndex;
    property MemoryData: TCustomMemTableEh read FMemoryData;
    property RecordsList: TRecordsListEh read FRecordsList;
    property ID: TRecIdEh read FID;
    property UpdateStatus: TUpdateStatus read FUpdateStatus write SetUpdateStatus;
  end;

  TMemoryRecordEhClass = class of TMemoryRecordEh;

{ TRecordsListNotificatorEh }

  TRecordsListNotificatorEh = class
  private
    FOnDataEvent: TRecordsListNotificatorDataEventEh;
    FRecordsList: TRecordsListEh;
    procedure SetRecordsList(const Value: TRecordsListEh);
  protected
    procedure DataEvent(MemRec: TMemoryRecordEh; Index: Integer; Action: TRecordsListNotification); virtual;
    procedure RecordAdded(MemRec: TMemoryRecordEh; Index: Integer); virtual;
    procedure RecordChanged(MemRec: TMemoryRecordEh; Index: Integer); virtual;
    procedure RecordDeleted(MemRec: TMemoryRecordEh; Index: Integer); virtual;
    procedure RecordListChanged; virtual;
    property RecordsList: TRecordsListEh read FRecordsList write SetRecordsList;
  public
    constructor Create;
    destructor Destroy; override;
    property OnDataEvent: TRecordsListNotificatorDataEventEh read FOnDataEvent write FOnDataEvent;
  end;

  {TRecordsListEh}

  TRecordsListEh = class(TObjectList)
  private
    FCachedUpdates: Boolean;
    FDeltaList: TList;
    FItemClass: TMemoryRecordEhClass;
    FNewRecId: TRecIdEh;
    FNotificators: TList;
    FRecValCount: Integer;
//    FRecListById: TList;
    function GetRec(Index: Integer): TMemoryRecordEh;
    function GetRecValues(RecNo: Integer): TRecDataValues;
    function GetValue(RecNo, ValNo: Integer): Variant;
    procedure SetCachedUpdates(const Value: Boolean);
    procedure SetRec(Index: Integer; const Value: TMemoryRecordEh);
    procedure SetRecValCount(const Value: Integer);
    procedure SetRecValues(RecNo: Integer; const Value: TRecDataValues);
    procedure SetValue(RecNo, ValNo: Integer; const Value: Variant);
  protected
    function NewRecId: TRecIdEh;
    procedure AddNotificator(RecordsList: TRecordsListNotificatorEh);
    procedure InitRecord(RecValues: PRecValues);
    procedure Notify(MemRec: TMemoryRecordEh; Index: Integer; Action: TRecordsListNotification); reintroduce; virtual;
    procedure PersistDeleteRecord(Index: Integer);
    procedure RemoveNotificator(RecordsList: TRecordsListNotificatorEh);
  public
    constructor Create;
    destructor Destroy; override;

    function AddRecord(Rec: TMemoryRecordEh): Integer;
    function NewRecord: TMemoryRecordEh;
    procedure RevertRecord(Index: Integer);
    procedure CancelUpdates;
    procedure RefreshRecord(Index: Integer; RecValues: TRecDataValues);
    procedure Clear; override;
    procedure DeleteRecord(Index: Integer);
    procedure InsertRecord(Index: Integer; Rec: TMemoryRecordEh);
    procedure QuickSort(L, R: Integer; Compare: TCompareRecords);
    procedure SortData(SortList: TList; Compare: TCompareRecords);
    property CachedUpdates: Boolean read FCachedUpdates write SetCachedUpdates;
    property Rec[Index: Integer]: TMemoryRecordEh read GetRec write SetRec; default;
    property RecValCount: Integer read FRecValCount write SetRecValCount;
    property RecValues[RecNo: Integer]: TRecDataValues read GetRecValues write SetRecValues;
    property Value[RecNo, ValNo: Integer]: Variant read GetValue write SetValue;
  end;

{ TFilteredRecordsListEh }

  TFilteredRecordsListEh = class(TObject)
  private
    FCachedUpdates: Boolean;
    FCachedUpdatesLockCount: Integer;
    FCatchChanged: Boolean;
    FFilteredRecsList: TList;
    FRecordsList: TRecordsListEh;
    FRLNotificator: TRecordsListNotificatorEh;
    function GetCount: Integer;
    function GetOldRecVals(Index: Integer): PRecValues;
    function GetRec(Index: Integer): TMemoryRecordEh;
    function GetRecValCount: Integer;
    function GetRecValues(RecNo: Integer): TRecDataValues;
    function GetValue(RecNo, ValNo: Integer): Variant;
    procedure SetCachedUpdates(const Value: Boolean);
    procedure SetRec(Index: Integer; const Value: TMemoryRecordEh);
    procedure SetRecValCount(const Value: Integer);
    procedure SetRecValues(RecNo: Integer; const Value: TRecDataValues);
    procedure SetValue(RecNo, ValNo: Integer; const Value: Variant);
  protected
    FMemTable: TCustomMemTableEh;
    function CreateDeltaDataSet: TCustomMemTableEh;
    function FetchRecord(Rec: TMemoryRecordEh): Boolean;
    function FilterRecord(MemRec: TMemoryRecordEh; Index: Integer): Boolean; virtual;
    procedure Notify(MemRec: TMemoryRecordEh; Index: Integer; Action: TRecordsListNotification); virtual;
    procedure RefreshFilteredRecsList;
    procedure RLDataEvent(MemRec: TMemoryRecordEh; Index: Integer; Action: TRecordsListNotification);
  public
    constructor Create(MemTable: TCustomMemTableEh);
    destructor Destroy; override;
    function AddRecord(Rec: TMemoryRecordEh): Integer;
    function ApplyUpdate(OldRecValues, NewRecValues: PRecValues; UpdateKind: TUpdateKind; TargetDataSet: TDataSet; OutRecValues: PRecValues): Integer;
    function ApplyUpdates(MaxErrors: Integer; TargetDataSet: TDataSet): Integer; virtual;
    function FindRecId(RecId: TRecIdEh): Integer;
    function NewRecord: TMemoryRecordEh;
    procedure CancelUpdates;
    procedure DeleteRecord(Index: Integer);
    procedure InsertRecord(Index: Integer; Rec: TMemoryRecordEh);
    procedure LockCachedUpdates;
    procedure MergeChangeLog;
    procedure RevertRecord(Index: Integer);
    procedure RefreshRecord(Index: Integer; RecValues: TRecDataValues);
    procedure UnlockCachedUpdates;
    property CachedUpdates: Boolean read FCachedUpdates write SetCachedUpdates;
    property Count: Integer read GetCount;
    property OldRecVals[Index: Integer]: PRecValues read GetOldRecVals;
    property Rec[Index: Integer]: TMemoryRecordEh read GetRec write SetRec; default;
    property RecValCount: Integer read GetRecValCount write SetRecValCount;
    property RecValues[RecNo: Integer]: TRecDataValues read GetRecValues write SetRecValues;
    property Value[RecNo, ValNo: Integer]: Variant read GetValue write SetValue;
  end;

{ TMasterDataLinkEh }

  TMasterDataLinkEh = class(TDetailDataLink)
  private
    FDataSet: TDataSet;
    FFieldNames: string;
    FFields: TList;
    FOnMasterChange: TNotifyEvent;
    FOnMasterDisable: TNotifyEvent;
    procedure SetFieldNames(const Value: string);
  protected
    function GetDetailDataSet: TDataSet; override;
    procedure ActiveChanged; override;
    procedure CheckBrowseMode; override;
    procedure LayoutChanged; override;
    procedure RecordChanged(Field: TField); override;
  public
    constructor Create(DataSet: TDataSet);
    destructor Destroy; override;
    property FieldNames: string read FFieldNames write SetFieldNames;
    property Fields: TList read FFields;
    property OnMasterChange: TNotifyEvent read FOnMasterChange write FOnMasterChange;
    property OnMasterDisable: TNotifyEvent read FOnMasterDisable write FOnMasterDisable;
  end;

{ TCustomMemTableEh }

  TMasterDetailSideEh = (mdsOnSelfEh, mdsOnProviderEh);

  TMTUpdateActionEh = (uaFailEh, uaAbortEh, uaSkipEh, uaRetryEh, uaApplyEh, uaAppliedEh);

  TMTUpdateRecordEventEh = procedure(DeltaDataSet: TDataSet; UpdateKind: TUpdateKind;
    var UpdateAction: TMTUpdateActionEh) of object;

  TMTFetchRecordEventEh = procedure(PacketDataSet: TDataSet; var ProviderEOF,
    Applied: Boolean) of object;

  TMTRefreshRecordEventEh = procedure(PacketDataSet: TDataSet; var Applied: Boolean)
    of object;

  TCustomMemTableEh = class(TDataSet, IMemTableEh, IUnknown)
  private
    FActive: Boolean;
    FAutoInc: Longint;
    FDataRecordSize: Integer;
    FDetailFieldList: TList;
    FDetailFields: String;
    FDetailMode: Boolean;
    FInstantBuffer: PChar;
    FInstantReadCurRow: Integer;
    FFetchAllOnOpen: Boolean;
    FKeyFields: String;
    FMasterDetailSide: TMasterDetailSideEh;
    FMasterValues: Variant;
    FOnFetchRecord: TMTFetchRecordEventEh;
    FOnUpdateRecord: TMTUpdateRecordEventEh;
    FOrderByList: TList;
    FParams: TParams;
    FProviderDataSet: TDataSet;
    FProviderEOF: Boolean;
    FReadOnly: Boolean;
    FRecBufSize: Integer;
    FRecordPos: Integer;
    FRecords: TFilteredRecordsListEh;
    FFilterExpr: TExprParser;
    function FindFieldData(Buffer: Pointer; Field: TField): Pointer;
    function GetCachedUpdates: Boolean;
    function GetDataFieldsCount: Integer;
    function GetInstantReadCurRow: Integer;
    function GetMasterFields: String;
    function GetMasterSource: TDataSource;
    function IsRecordInFilter(RecValues: PRecValues): Boolean;
    procedure ClearRecords;
    procedure InitBufferPointers(GetProps: Boolean);
    procedure RefreshParams;
    procedure SetCachedUpdates(const Value: Boolean);
    procedure SetDetailFields(const Value: String);
    procedure SetKeyFields(const Value: String);
    procedure SetMasterDetailSide(const Value: TMasterDetailSideEh);
    procedure SetMasterFields(const Value: String);
    procedure SetMasterSource(const Value: TDataSource);
    procedure SetParams(const Value: TParams);
    procedure SetParamsFromCursor;
    procedure SetProviderDataSet(const Value: TDataSet);
    procedure SortData(SortList: TList);
  protected
    FInstantReadMode: Boolean;
    FMasterDataLink: TMasterDataLinkEh;

    procedure RecreateFilterExpr;
    procedure DestroyFilterExpr;

{$IFNDEF EH_LIB_5}
    function BCDToCurr(BCD: Pointer; var Curr: Currency): Boolean; override;
    function CurrToBCD(const Curr: Currency; BCD: Pointer; Precision,
      Decimals: Integer): Boolean; override;
{$ENDIF}
    function AllocRecordBuffer: PChar; override;
    function CompareRecords(Item1, Item2: PRecValues): Integer; virtual;
    function DoFetchRecords(Count: Integer): Integer;
    function GetActiveRecBuf(var RecBuf: PChar): Boolean; virtual;
    function GetBlobData(Field: TField; Buffer: PChar): TMemBlobData;
    function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
    function GetBookmarkStr: TBookmarkStr; override;
    function GetCanModify: Boolean; override;
    function GetRecNo: Integer; override;
    function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
    function GetRecordCount: Integer; override;
    function GetRecordSize: Word; override;
    function IsCursorOpen: Boolean; override;
    function LocateProviderRec: Boolean; virtual;
    function UpdateRecord(DeltaDataSet: TDataSet; UpdateKind: TUpdateKind; RefreshRecord: Boolean): Integer; virtual;
    procedure ClearCalcFields(Buffer: PChar); override;
    procedure CloseBlob(Field: TField); override;
    procedure CopyBuffer(FromBuf, ToBuf: PChar);
    procedure CreateFields; override;
    procedure DataEvent(Event: TDataEvent; Info: Longint); override;
    procedure DoOnNewRecord; override;
    procedure DoOrderBy(const OrderByStr: String); virtual;
    procedure FieldValueToVarValue(FieldBuffer: Pointer; var VarValue: Variant; Field: TField);
    procedure FreeRecordBuffer(var Buffer: PChar); override;
    procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
    procedure InitFieldDefsFromFields;
    procedure InitRecord(Buffer: PChar); override;
    procedure InternalAddRecord(Buffer: Pointer; Append: Boolean); override;
    procedure InternalClose; override;
    procedure InternalDelete; override;
    procedure InternalFirst; override;
    procedure InternalGotoBookmark(Bookmark: TBookmark); override;
    procedure InternalHandleException; override;
    procedure InternalInitFieldDefs; override;
    procedure InternalInitRecord(Buffer: PChar); override;
    procedure InternalInsert; override;
    procedure InternalLast; override;
    procedure InternalOpen; override;
    procedure InternalPost; override;
    procedure InternalRefresh; override;
    procedure InternalSetToRecord(Buffer: PChar); override;
    procedure MasterChange(Sender: TObject);
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
    procedure OpenCursor(InfoQuery: Boolean); override;
    procedure RecordToBuffer(Rec: PRecValues; Buffer: PChar);
    procedure SetAutoIncFields(Buffer: PChar); virtual;
    procedure SetBlobData(Field: TField; Buffer: PChar; Value: TMemBlobData);
    procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
    procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
    procedure SetFieldData(Field: TField; Buffer: Pointer); override;
    procedure SetFiltered(Value: Boolean); override;
    procedure SetMemoryRecordData(Buffer: PChar; ARecValues: PRecValues); virtual;
    procedure SetOnFilterRecord(const Value: TFilterRecordEvent); override;
    procedure SetRecNo(Value: Integer); override;
    procedure UpdateDetailMode(AutoRefresh: Boolean);
    procedure UpdateThroughProvider(MemRec: TMemoryRecordEh; NewBuffer: PChar; UpdateKind: TUpdateKind; RecPos: Integer);
    procedure VarValueToFieldValue(VarValue: Variant; FieldBuffer: Pointer; Field: TField);
    property DataFieldsCount: Integer read GetDataFieldsCount;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    function ApplyUpdates(MaxErrors: Integer): Integer; virtual;
    function BookmarkValid(Bookmark: TBookmark): Boolean; override;
    function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Integer; override;
    function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
    function DefaultFetchRecord(PacketDataSet: TDataSet; var ProviderEOF: Boolean): Integer;
    function DefaultUpdateRecord(DeltaDataSet: TDataSet; UpdateKind: TUpdateKind; RefreshRecord: Boolean): Integer; virtual;
    function FetchRecords(Count: Integer): Integer;
    function FindRec(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Integer;
    function GetCurrentRecord(Buffer: PChar): Boolean; override;
    function GetFieldData(Field: TField; Buffer: Pointer): Boolean; override;
    function InstantReadIndexOfBookmark(Bookmark: TBookmark): Integer;
    function InstantReadRowCount: Integer;
    function IsSequenced: Boolean; override;
    function LoadFromDataSet(Source: TDataSet; RecordCount: Integer; Mode: TLoadMode): Integer;
    function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; override;
    function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant; override;
    function SaveToDataSet(Dest: TDataSet; RecordCount: Integer): Integer;
    function UpdateStatus: TUpdateStatus; override;
    procedure CancelUpdates;
    procedure CopyStructure(Source: TDataSet);
    procedure EmptyTable;
    procedure InstantReadEnter(RowNum: Integer);
    procedure InstantReadLeave;
    procedure FetchParams;
    procedure MergeChangeLog;
    procedure SortByFields(const SortByStr: string);
    procedure RefreshRecord;
    procedure RevertRecord;
    procedure SetFilterText(const Value: string); override;

    property CachedUpdates: Boolean read GetCachedUpdates write SetCachedUpdates default False;
    property DetailFields: String read FDetailFields write SetDetailFields;
    property InstantReadCurRow: Integer read GetInstantReadCurRow;
    property FetchAllOnOpen: Boolean read FFetchAllOnOpen write FFetchAllOnOpen default False;
    property KeyFields: String read FKeyFields write SetKeyFields;
    property MasterDetailSide: TMasterDetailSideEh read FMasterDetailSide write SetMasterDetailSide default mdsOnSelfEh;
    property MasterFields: String read GetMasterFields write SetMasterFields;
    property MasterSource: TDataSource read GetMasterSource write SetMasterSource;
    property Params: TParams read FParams write SetParams;
    property ProviderDataSet: TDataSet read FProviderDataSet write SetProviderDataSet;
    property ProviderEOF: Boolean read FProviderEOF;
    property ReadOnly: Boolean read FReadOnly write FReadOnly default False;
    property OnUpdateRecord: TMTUpdateRecordEventEh read FOnUpdateRecord write FOnUpdateRecord;
    property OnFetchRecord: TMTFetchRecordEventEh read FOnFetchRecord write FOnFetchRecord;
  end;

{ TMemBlobStreamEh }

  TMemBlobStreamEh = class(TStream)
  private
    FBuffer: PChar;
    FCached: Boolean;
    FDataSet: TCustomMemTableEh;
    FField: TBlobField;
    FMode: TBlobStreamMode;
    FModified: Boolean;
    FOpened: Boolean;
    FPosition: Longint;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲在线成人精品| 欧美午夜一区二区三区| 夜夜嗨av一区二区三区| 欧美mv和日韩mv的网站| 色一情一乱一乱一91av| 精品亚洲免费视频| 综合欧美一区二区三区| 欧美一区二区三区四区视频| 国产91精品一区二区麻豆亚洲| 亚洲色图第一区| 亚洲免费在线视频| 欧美国产日韩一二三区| 日韩免费一区二区| 日韩一区二区电影| 51精品久久久久久久蜜臀| 色嗨嗨av一区二区三区| 9人人澡人人爽人人精品| 福利一区在线观看| 国产传媒一区在线| 国产suv一区二区三区88区| 狠狠色狠狠色合久久伊人| 美女一区二区久久| 精品一区二区免费视频| 韩国精品一区二区| 国产一区二区在线看| 国产精品夜夜嗨| 不卡电影免费在线播放一区| 波多野结衣在线一区| 91影视在线播放| 欧美天天综合网| 这里只有精品99re| 欧美成人三级在线| 中文一区在线播放| 一区二区三区**美女毛片| 亚洲国产日韩精品| 久久国产乱子精品免费女| 精品一区二区三区免费| 99精品在线观看视频| 欧美日韩一本到| 国产亚洲精品超碰| 亚洲国产精品天堂| 国产在线播放一区三区四| 99精品国产99久久久久久白柏| 欧美日韩大陆在线| 中文字幕一区二区三区四区| 亚洲午夜久久久久久久久久久| 免费不卡在线视频| 91香蕉国产在线观看软件| 欧美一级欧美三级在线观看| 中文字幕日本乱码精品影院| 丰满放荡岳乱妇91ww| 色综合久久中文综合久久97| 精品国产三级电影在线观看| 亚洲天堂免费看| 国产成人自拍在线| 日韩三级电影网址| 亚洲午夜电影网| 99re热这里只有精品免费视频| 69久久夜色精品国产69蝌蚪网| 亚洲欧洲中文日韩久久av乱码| 国产一区二区主播在线| 制服丝袜中文字幕一区| 天涯成人国产亚洲精品一区av| 91丝袜国产在线播放| 国产精品色哟哟网站| 韩国女主播成人在线| 日韩精品在线一区二区| 免费人成在线不卡| 69堂成人精品免费视频| 三级亚洲高清视频| 欧美一区二区三区视频在线观看| 一区二区三区在线免费播放| 成人免费高清视频在线观看| 亚洲精品一区二区三区精华液| 毛片一区二区三区| 精品国产制服丝袜高跟| 国产精品一线二线三线| 国产视频一区二区在线观看| 国产aⅴ综合色| 18欧美亚洲精品| 欧美人妇做爰xxxⅹ性高电影| 亚洲国产综合视频在线观看| 欧美精品粉嫩高潮一区二区| 久久成人久久爱| 国产精品情趣视频| 欧美视频三区在线播放| 亚洲成a人v欧美综合天堂下载| 欧美精品一二三| 精品在线视频一区| 国产精品欧美一级免费| 欧美制服丝袜第一页| 久久精品999| 亚洲欧洲av色图| 欧美一区二区三区视频免费| 国产大陆a不卡| 天堂成人免费av电影一区| 久久久精品免费观看| 95精品视频在线| 久久精品国产99国产| 中文字幕一区二区三区在线不卡 | 亚洲免费视频成人| 日韩欧美亚洲另类制服综合在线| 成人精品一区二区三区四区| 亚洲成人免费在线观看| 中文字幕 久热精品 视频在线| 欧美日韩国产首页在线观看| 国产成人久久精品77777最新版本| 亚洲精品成人在线| 久久精品视频一区二区三区| 欧美精品日韩一区| 欧美三级电影网站| 91视视频在线直接观看在线看网页在线看| 午夜精品123| 亚洲超碰97人人做人人爱| 国产精品美女www爽爽爽| 久久久久久久久久久99999| 欧美日韩高清影院| 这里只有精品免费| 欧美精品黑人性xxxx| 欧美疯狂做受xxxx富婆| 91精品国产全国免费观看 | 懂色av一区二区三区免费观看| 蜜臀久久99精品久久久久久9| 亚洲狠狠爱一区二区三区| 免费一级片91| 国产一区二区三区视频在线播放| 美女诱惑一区二区| 国产一区二区三区香蕉 | 久久精品夜色噜噜亚洲aⅴ| 久久综合九色欧美综合狠狠 | 久久九九国产精品| 国产精品高潮呻吟久久| 一区二区三区**美女毛片| 亚洲v中文字幕| 激情偷乱视频一区二区三区| 国产一区二区免费看| 色综合天天天天做夜夜夜夜做| 色综合欧美在线| 日韩情涩欧美日韩视频| 久久夜色精品国产噜噜av| 日韩一区在线免费观看| 亚洲激情图片qvod| 麻豆精品久久精品色综合| 国产高清久久久| 欧美日韩免费电影| 精品国产在天天线2019| 亚洲欧美日本在线| 国产麻豆精品theporn| 一本久久a久久免费精品不卡| 日韩亚洲欧美在线| 亚洲日本中文字幕区| 日韩avvvv在线播放| 欧美在线制服丝袜| 国产亚洲制服色| 日本在线不卡视频| 色综合久久天天综合网| 国产午夜亚洲精品午夜鲁丝片| 亚洲成a人在线观看| av电影在线观看完整版一区二区| 日韩欧美中文一区| 亚洲国产综合在线| 91麻豆文化传媒在线观看| 久久这里都是精品| 三级欧美在线一区| 欧美男男青年gay1069videost | 蜜桃av一区二区| 欧美蜜桃一区二区三区| 亚洲综合在线视频| 91在线看国产| 日韩一区中文字幕| 99热在这里有精品免费| 国产女同互慰高潮91漫画| 美国精品在线观看| 26uuu欧美| 国产精品综合久久| 欧美韩国日本一区| 成人黄色小视频在线观看| 国产精品网站导航| 97成人超碰视| 亚洲成人一区二区| 欧美精品乱人伦久久久久久| 亚洲成av人**亚洲成av**| 欧美一级理论片| 韩国欧美国产一区| 成人欧美一区二区三区白人| 欧美在线观看一二区| 另类的小说在线视频另类成人小视频在线 | 懂色中文一区二区在线播放| 国产精品网曝门| 欧美色综合久久| 精彩视频一区二区| 亚洲视频一二三| 51久久夜色精品国产麻豆| 国产精品一区2区| 一卡二卡欧美日韩| 在线不卡a资源高清| 国产成人高清在线| 亚洲国产精品久久不卡毛片| 2021国产精品久久精品| kk眼镜猥琐国模调教系列一区二区|